Atualização README entre outros

This commit is contained in:
2026-03-13 12:49:01 +00:00
parent 0d6eaa501e
commit 9384c43f2a
16 changed files with 1465 additions and 380 deletions

View File

@@ -1,5 +1,5 @@
![Logo](https://www.cloudessential.tech/Logo%20site%20v2.png)
![Logo](https://cloudessential.tech/assets/logo-cloud-essential-D_wtjG9m.png)
## EAP - Essential Automation Platform

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Http\Controllers\Api\v1;
use App\Http\Controllers\Controller;
use App\Models\clientes;
use App\Models\clientes_relatorios_mensal;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class relatorio_chamados extends Controller
{
public function salvar_relatorio(Request $request)
{
foreach ($request->all() as $item) {
$cliente = clientes::where('name', $item['customerName'])->first();
if ($cliente) {
$relatorio = new clientes_relatorios_mensal();
$relatorio->id_cliente = $cliente->id;
$relatorio->horas_utilizadas = array_sum(
array_column($item['registros'], 'cr13a_horasutilizadas')
);
$relatorio->chamados = json_encode($item['registros']);
$relatorio->save();
}
}
return response()->json([
'success' => true,
'message' => 'Relatório recebido com sucesso',
'data' => $request->all(),
], 201);
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ClientesContratosController extends Controller
{
//
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ClientesRelatoriosMensalController extends Controller
{
//
}

View File

@@ -40,4 +40,9 @@ class clientes extends Model
{
return $this->hasMany(clientes_grupos::class, 'id_cliente', 'id');
}
public function contratos()
{
return $this->hasMany(clientes_contratos::class, 'cliente_id');
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class clientes_contratos extends Model
{
//
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class clientes_relatorios_mensal extends Model
{
//
}

View File

@@ -7,6 +7,7 @@
"license": "MIT",
"require": {
"php": "^8.2",
"barryvdh/laravel-dompdf": "^3.1",
"guzzlehttp/guzzle": "^7.10",
"laravel/breeze": "^2.3",
"laravel/framework": "^12.0",

524
composer.lock generated
View File

@@ -4,8 +4,85 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "3b9fe38f5d50cbc876c4b821c09d6c9c",
"content-hash": "8daa8e625b1a4f30f19d27ea0fe5aa02",
"packages": [
{
"name": "barryvdh/laravel-dompdf",
"version": "v3.1.1",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-dompdf.git",
"reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d",
"reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d",
"shasum": ""
},
"require": {
"dompdf/dompdf": "^3.0",
"illuminate/support": "^9|^10|^11|^12",
"php": "^8.1"
},
"require-dev": {
"larastan/larastan": "^2.7|^3.0",
"orchestra/testbench": "^7|^8|^9|^10",
"phpro/grumphp": "^2.5",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"PDF": "Barryvdh\\DomPDF\\Facade\\Pdf",
"Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf"
},
"providers": [
"Barryvdh\\DomPDF\\ServiceProvider"
]
},
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"Barryvdh\\DomPDF\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "A DOMPDF Wrapper for Laravel",
"keywords": [
"dompdf",
"laravel",
"pdf"
],
"support": {
"issues": "https://github.com/barryvdh/laravel-dompdf/issues",
"source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.1"
},
"funding": [
{
"url": "https://fruitcake.nl",
"type": "custom"
},
{
"url": "https://github.com/barryvdh",
"type": "github"
}
],
"time": "2025-02-13T15:07:54+00:00"
},
{
"name": "brick/math",
"version": "0.14.1",
@@ -377,6 +454,161 @@
],
"time": "2024-02-05T11:56:58+00:00"
},
{
"name": "dompdf/dompdf",
"version": "v3.1.5",
"source": {
"type": "git",
"url": "https://github.com/dompdf/dompdf.git",
"reference": "f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/dompdf/zipball/f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496",
"reference": "f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496",
"shasum": ""
},
"require": {
"dompdf/php-font-lib": "^1.0.0",
"dompdf/php-svg-lib": "^1.0.0",
"ext-dom": "*",
"ext-mbstring": "*",
"masterminds/html5": "^2.0",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"ext-gd": "*",
"ext-json": "*",
"ext-zip": "*",
"mockery/mockery": "^1.3",
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
"squizlabs/php_codesniffer": "^3.5",
"symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
},
"suggest": {
"ext-gd": "Needed to process images",
"ext-gmagick": "Improves image processing performance",
"ext-imagick": "Improves image processing performance",
"ext-zlib": "Needed for pdf stream compression"
},
"type": "library",
"autoload": {
"psr-4": {
"Dompdf\\": "src/"
},
"classmap": [
"lib/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1"
],
"authors": [
{
"name": "The Dompdf Community",
"homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
}
],
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
"homepage": "https://github.com/dompdf/dompdf",
"support": {
"issues": "https://github.com/dompdf/dompdf/issues",
"source": "https://github.com/dompdf/dompdf/tree/v3.1.5"
},
"time": "2026-03-03T13:54:37+00:00"
},
{
"name": "dompdf/php-font-lib",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/dompdf/php-font-lib.git",
"reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a6e9a688a2a80016ac080b97be73d3e10c444c9a",
"reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11 || ^12"
},
"type": "library",
"autoload": {
"psr-4": {
"FontLib\\": "src/FontLib"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "The FontLib Community",
"homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md"
}
],
"description": "A library to read, parse, export and make subsets of different types of font files.",
"homepage": "https://github.com/dompdf/php-font-lib",
"support": {
"issues": "https://github.com/dompdf/php-font-lib/issues",
"source": "https://github.com/dompdf/php-font-lib/tree/1.0.2"
},
"time": "2026-01-20T14:10:26+00:00"
},
{
"name": "dompdf/php-svg-lib",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/dompdf/php-svg-lib.git",
"reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/8259ffb930817e72b1ff1caef5d226501f3dfeb1",
"reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^7.1 || ^8.0",
"sabberworm/php-css-parser": "^8.4 || ^9.0"
},
"require-dev": {
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11"
},
"type": "library",
"autoload": {
"psr-4": {
"Svg\\": "src/Svg"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0-or-later"
],
"authors": [
{
"name": "The SvgLib Community",
"homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md"
}
],
"description": "A library to read, parse and export to PDF SVG files.",
"homepage": "https://github.com/dompdf/php-svg-lib",
"support": {
"issues": "https://github.com/dompdf/php-svg-lib/issues",
"source": "https://github.com/dompdf/php-svg-lib/tree/1.0.2"
},
"time": "2026-01-02T16:01:13+00:00"
},
{
"name": "dragonmantank/cron-expression",
"version": "v3.6.0",
@@ -2219,6 +2451,73 @@
],
"time": "2025-11-18T12:17:23+00:00"
},
{
"name": "masterminds/html5",
"version": "2.10.0",
"source": {
"type": "git",
"url": "https://github.com/Masterminds/html5-php.git",
"reference": "fcf91eb64359852f00d921887b219479b4f21251"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251",
"reference": "fcf91eb64359852f00d921887b219479b4f21251",
"shasum": ""
},
"require": {
"ext-dom": "*",
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.7-dev"
}
},
"autoload": {
"psr-4": {
"Masterminds\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Matt Butcher",
"email": "technosophos@gmail.com"
},
{
"name": "Matt Farina",
"email": "matt@mattfarina.com"
},
{
"name": "Asmir Mustafic",
"email": "goetas@gmail.com"
}
],
"description": "An HTML5 parser and serializer.",
"homepage": "http://masterminds.github.io/html5-php",
"keywords": [
"HTML5",
"dom",
"html",
"parser",
"querypath",
"serializer",
"xml"
],
"support": {
"issues": "https://github.com/Masterminds/html5-php/issues",
"source": "https://github.com/Masterminds/html5-php/tree/2.10.0"
},
"time": "2025-07-25T09:04:22+00:00"
},
{
"name": "monolog/monolog",
"version": "3.9.0",
@@ -3490,6 +3789,86 @@
},
"time": "2025-09-04T20:59:21+00:00"
},
{
"name": "sabberworm/php-css-parser",
"version": "v9.3.0",
"source": {
"type": "git",
"url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
"reference": "88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949",
"reference": "88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949",
"shasum": ""
},
"require": {
"ext-iconv": "*",
"php": "^7.2.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0",
"thecodingmachine/safe": "^1.3 || ^2.5 || ^3.4"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "1.4.0",
"phpstan/extension-installer": "1.4.3",
"phpstan/phpstan": "1.12.32 || 2.1.32",
"phpstan/phpstan-phpunit": "1.4.2 || 2.0.8",
"phpstan/phpstan-strict-rules": "1.6.2 || 2.0.7",
"phpunit/phpunit": "8.5.52",
"rawr/phpunit-data-provider": "3.3.1",
"rector/rector": "1.2.10 || 2.2.8",
"rector/type-perfect": "1.0.0 || 2.1.0",
"squizlabs/php_codesniffer": "4.0.1",
"thecodingmachine/phpstan-safe-rule": "1.2.0 || 1.4.1"
},
"suggest": {
"ext-mbstring": "for parsing UTF-8 CSS"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "9.4.x-dev"
}
},
"autoload": {
"files": [
"src/Rule/Rule.php",
"src/RuleSet/RuleContainer.php"
],
"psr-4": {
"Sabberworm\\CSS\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Raphael Schweikert"
},
{
"name": "Oliver Klee",
"email": "github@oliverklee.de"
},
{
"name": "Jake Hotson",
"email": "jake.github@qzdesign.co.uk"
}
],
"description": "Parser for CSS Files written in PHP",
"homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser",
"keywords": [
"css",
"parser",
"stylesheet"
],
"support": {
"issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
"source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v9.3.0"
},
"time": "2026-03-03T17:31:43+00:00"
},
{
"name": "symfony/clock",
"version": "v7.3.0",
@@ -5979,6 +6358,149 @@
],
"time": "2025-09-27T09:00:46+00:00"
},
{
"name": "thecodingmachine/safe",
"version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/thecodingmachine/safe.git",
"reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19",
"reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.4",
"phpstan/phpstan": "^2",
"phpunit/phpunit": "^10",
"squizlabs/php_codesniffer": "^3.2"
},
"type": "library",
"autoload": {
"files": [
"lib/special_cases.php",
"generated/apache.php",
"generated/apcu.php",
"generated/array.php",
"generated/bzip2.php",
"generated/calendar.php",
"generated/classobj.php",
"generated/com.php",
"generated/cubrid.php",
"generated/curl.php",
"generated/datetime.php",
"generated/dir.php",
"generated/eio.php",
"generated/errorfunc.php",
"generated/exec.php",
"generated/fileinfo.php",
"generated/filesystem.php",
"generated/filter.php",
"generated/fpm.php",
"generated/ftp.php",
"generated/funchand.php",
"generated/gettext.php",
"generated/gmp.php",
"generated/gnupg.php",
"generated/hash.php",
"generated/ibase.php",
"generated/ibmDb2.php",
"generated/iconv.php",
"generated/image.php",
"generated/imap.php",
"generated/info.php",
"generated/inotify.php",
"generated/json.php",
"generated/ldap.php",
"generated/libxml.php",
"generated/lzf.php",
"generated/mailparse.php",
"generated/mbstring.php",
"generated/misc.php",
"generated/mysql.php",
"generated/mysqli.php",
"generated/network.php",
"generated/oci8.php",
"generated/opcache.php",
"generated/openssl.php",
"generated/outcontrol.php",
"generated/pcntl.php",
"generated/pcre.php",
"generated/pgsql.php",
"generated/posix.php",
"generated/ps.php",
"generated/pspell.php",
"generated/readline.php",
"generated/rnp.php",
"generated/rpminfo.php",
"generated/rrd.php",
"generated/sem.php",
"generated/session.php",
"generated/shmop.php",
"generated/sockets.php",
"generated/sodium.php",
"generated/solr.php",
"generated/spl.php",
"generated/sqlsrv.php",
"generated/ssdeep.php",
"generated/ssh2.php",
"generated/stream.php",
"generated/strings.php",
"generated/swoole.php",
"generated/uodbc.php",
"generated/uopz.php",
"generated/url.php",
"generated/var.php",
"generated/xdiff.php",
"generated/xml.php",
"generated/xmlrpc.php",
"generated/yaml.php",
"generated/yaz.php",
"generated/zip.php",
"generated/zlib.php"
],
"classmap": [
"lib/DateTime.php",
"lib/DateTimeImmutable.php",
"lib/Exceptions/",
"generated/Exceptions/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHP core functions that throw exceptions instead of returning FALSE on error",
"support": {
"issues": "https://github.com/thecodingmachine/safe/issues",
"source": "https://github.com/thecodingmachine/safe/tree/v3.4.0"
},
"funding": [
{
"url": "https://github.com/OskarStark",
"type": "github"
},
{
"url": "https://github.com/shish",
"type": "github"
},
{
"url": "https://github.com/silasjoisten",
"type": "github"
},
{
"url": "https://github.com/staabm",
"type": "github"
}
],
"time": "2026-02-04T18:08:13+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "v2.3.0",

301
config/dompdf.php Normal file
View File

@@ -0,0 +1,301 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Settings
|--------------------------------------------------------------------------
|
| Set some default values. It is possible to add all defines that can be set
| in dompdf_config.inc.php. You can also override the entire config file.
|
*/
'show_warnings' => false, // Throw an Exception on warnings from dompdf
'public_path' => null, // Override the public path if needed
/*
* Dejavu Sans font is missing glyphs for converted entities, turn it off if you need to show and £.
*/
'convert_entities' => true,
'options' => [
/**
* The location of the DOMPDF font directory
*
* The location of the directory where DOMPDF will store fonts and font metrics
* Note: This directory must exist and be writable by the webserver process.
* *Please note the trailing slash.*
*
* Notes regarding fonts:
* Additional .afm font metrics can be added by executing load_font.php from command line.
*
* Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must
* be embedded in the pdf file or the PDF may not display correctly. This can significantly
* increase file size unless font subsetting is enabled. Before embedding a font please
* review your rights under the font license.
*
* Any font specification in the source HTML is translated to the closest font available
* in the font directory.
*
* The pdf standard "Base 14 fonts" are:
* Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique,
* Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique,
* Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic,
* Symbol, ZapfDingbats.
*/
'font_dir' => storage_path('fonts'), // advised by dompdf (https://github.com/dompdf/dompdf/pull/782)
/**
* The location of the DOMPDF font cache directory
*
* This directory contains the cached font metrics for the fonts used by DOMPDF.
* This directory can be the same as DOMPDF_FONT_DIR
*
* Note: This directory must exist and be writable by the webserver process.
*/
'font_cache' => storage_path('fonts'),
/**
* The location of a temporary directory.
*
* The directory specified must be writeable by the webserver process.
* The temporary directory is required to download remote images and when
* using the PDFLib back end.
*/
'temp_dir' => sys_get_temp_dir(),
/**
* ==== IMPORTANT ====
*
* dompdf's "chroot": Prevents dompdf from accessing system files or other
* files on the webserver. All local files opened by dompdf must be in a
* subdirectory of this directory. DO NOT set it to '/' since this could
* allow an attacker to use dompdf to read any files on the server. This
* should be an absolute path.
* This is only checked on command line call by dompdf.php, but not by
* direct class use like:
* $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output();
*/
'chroot' => realpath(base_path()),
/**
* Protocol whitelist
*
* Protocols and PHP wrappers allowed in URIs, and the validation rules
* that determine if a resouce may be loaded. Full support is not guaranteed
* for the protocols/wrappers specified
* by this array.
*
* @var array
*/
'allowed_protocols' => [
'data://' => ['rules' => []],
'file://' => ['rules' => []],
'http://' => ['rules' => []],
'https://' => ['rules' => []],
],
/**
* Operational artifact (log files, temporary files) path validation
*/
'artifactPathValidation' => null,
/**
* @var string
*/
'log_output_file' => null,
/**
* Whether to enable font subsetting or not.
*/
'enable_font_subsetting' => true,
/**
* The PDF rendering backend to use
*
* Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and
* 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will
* fall back on CPDF. 'GD' renders PDFs to graphic files.
* {@link * Canvas_Factory} ultimately determines which rendering class to
* instantiate based on this setting.
*
* Both PDFLib & CPDF rendering backends provide sufficient rendering
* capabilities for dompdf, however additional features (e.g. object,
* image and font support, etc.) differ between backends. Please see
* {@link PDFLib_Adapter} for more information on the PDFLib backend
* and {@link CPDF_Adapter} and lib/class.pdf.php for more information
* on CPDF. Also see the documentation for each backend at the links
* below.
*
* The GD rendering backend is a little different than PDFLib and
* CPDF. Several features of CPDF and PDFLib are not supported or do
* not make any sense when creating image files. For example,
* multiple pages are not supported, nor are PDF 'objects'. Have a
* look at {@link GD_Adapter} for more information. GD support is
* experimental, so use it at your own risk.
*
* @link http://www.pdflib.com
* @link http://www.ros.co.nz/pdf
* @link http://www.php.net/image
*/
'pdf_backend' => 'CPDF',
/**
* html target media view which should be rendered into pdf.
* List of types and parsing rules for future extensions:
* http://www.w3.org/TR/REC-html40/types.html
* screen, tty, tv, projection, handheld, print, braille, aural, all
* Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3.
* Note, even though the generated pdf file is intended for print output,
* the desired content might be different (e.g. screen or projection view of html file).
* Therefore allow specification of content here.
*/
'default_media_type' => 'screen',
/**
* The default paper size.
*
* North America standard is "letter"; other countries generally "a4"
*
* @see CPDF_Adapter::PAPER_SIZES for valid sizes ('letter', 'legal', 'A4', etc.)
*/
'default_paper_size' => 'a4',
/**
* The default paper orientation.
*
* The orientation of the page (portrait or landscape).
*
* @var string
*/
'default_paper_orientation' => 'portrait',
/**
* The default font family
*
* Used if no suitable fonts can be found. This must exist in the font folder.
*
* @var string
*/
'default_font' => 'sans-serif',
/**
* Image DPI setting
*
* This setting determines the default DPI setting for images and fonts. The
* DPI may be overridden for inline images by explictly setting the
* image's width & height style attributes (i.e. if the image's native
* width is 600 pixels and you specify the image's width as 72 points,
* the image will have a DPI of 600 in the rendered PDF. The DPI of
* background images can not be overridden and is controlled entirely
* via this parameter.
*
* For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI).
* If a size in html is given as px (or without unit as image size),
* this tells the corresponding size in pt.
* This adjusts the relative sizes to be similar to the rendering of the
* html page in a reference browser.
*
* In pdf, always 1 pt = 1/72 inch
*
* Rendering resolution of various browsers in px per inch:
* Windows Firefox and Internet Explorer:
* SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:?
* Linux Firefox:
* about:config *resolution: Default:96
* (xorg screen dimension in mm and Desktop font dpi settings are ignored)
*
* Take care about extra font/image zoom factor of browser.
*
* In images, <img> size in pixel attribute, img css style, are overriding
* the real image dimension in px for rendering.
*
* @var int
*/
'dpi' => 150,
/**
* Enable embedded PHP
*
* If this setting is set to true then DOMPDF will automatically evaluate embedded PHP contained
* within <script type="text/php"> ... </script> tags.
*
* ==== IMPORTANT ==== Enabling this for documents you do not trust (e.g. arbitrary remote html pages)
* is a security risk.
* Embedded scripts are run with the same level of system access available to dompdf.
* Set this option to false (recommended) if you wish to process untrusted documents.
* This setting may increase the risk of system exploit.
* Do not change this settings without understanding the consequences.
* Additional documentation is available on the dompdf wiki at:
* https://github.com/dompdf/dompdf/wiki
*
* @var bool
*/
'enable_php' => false,
/**
* Rnable inline JavaScript
*
* If this setting is set to true then DOMPDF will automatically insert JavaScript code contained
* within <script type="text/javascript"> ... </script> tags as written into the PDF.
* NOTE: This is PDF-based JavaScript to be executed by the PDF viewer,
* not browser-based JavaScript executed by Dompdf.
*
* @var bool
*/
'enable_javascript' => true,
/**
* Enable remote file access
*
* If this setting is set to true, DOMPDF will access remote sites for
* images and CSS files as required.
*
* ==== IMPORTANT ====
* This can be a security risk, in particular in combination with isPhpEnabled and
* allowing remote html code to be passed to $dompdf = new DOMPDF(); $dompdf->load_html(...);
* This allows anonymous users to download legally doubtful internet content which on
* tracing back appears to being downloaded by your server, or allows malicious php code
* in remote html pages to be executed by your server with your account privileges.
*
* This setting may increase the risk of system exploit. Do not change
* this settings without understanding the consequences. Additional
* documentation is available on the dompdf wiki at:
* https://github.com/dompdf/dompdf/wiki
*
* @var bool
*/
'enable_remote' => true,
/**
* List of allowed remote hosts
*
* Each value of the array must be a valid hostname.
*
* This will be used to filter which resources can be loaded in combination with
* isRemoteEnabled. If enable_remote is FALSE, then this will have no effect.
*
* Leave to NULL to allow any remote host.
*
* @var array|null
*/
'allowed_remote_hosts' => null,
/**
* A ratio applied to the fonts height to be more like browsers' line height
*/
'font_height_ratio' => 1.1,
/**
* Use the HTML5 Lib parser
*
* @deprecated This feature is now always on in dompdf 2.x
*
* @var bool
*/
'enable_html5_parser' => true,
],
];

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('clientes_contratos', function (Blueprint $table) {
$table->id();
$table->foreignId('cliente_id')->constrained('clientes')->cascadeOnDelete();
$table->integer('horas_contratadas');
$table->string('contrato');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('clientes_contratos');
}
};

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('clientes_relatorios_mensals', function (Blueprint $table) {
$table->id();
$table->foreignId('id_cliente')->nullable()->constrained('clientes')->cascadeOnDelete();
$table->integer('horas_utilizadas');
$table->json('chamados');
$table->json('melhorias')->nullable();
$table->longText('nota_consultor')->nullable();
$table->longText('observacao_consultor')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('clientes_relatorios_mensals');
}
};

BIN
dump.rdb

Binary file not shown.

View File

@@ -1,230 +1,331 @@
@extends('theme.default')
@section('page.title', $cliente->name)
@section('content')
<div class="page-title">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('clientes') }}">
<svg width="16" height="16" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M2.125 6.375L8.5 1.41667L14.875 6.375V14.1667C14.875 14.5424 14.7257 14.9027 14.4601 15.1684C14.1944 15.4341 13.8341 15.5833 13.4583 15.5833H3.54167C3.16594 15.5833 2.80561 15.4341 2.53993 15.1684C2.27426 14.9027 2.125 14.5424 2.125 14.1667V6.375Z"
stroke="var(--bs-body-color)" stroke-linecap="round" stroke-linejoin="round" />
<path d="M6.375 15.5833V8.5H10.625V15.5833" stroke="var(--bs-body-color)" stroke-linecap="round"
stroke-linejoin="round" />
</svg>
Clientes
</a>
</li>
<li class="breadcrumb-item active" aria-current="page">{{ $cliente->name }}</li>
</ol>
</nav>
</div>
<div class="page-title">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('clientes') }}">
<svg width="16" height="16" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M2.125 6.375L8.5 1.41667L14.875 6.375V14.1667C14.875 14.5424 14.7257 14.9027 14.4601 15.1684C14.1944 15.4341 13.8341 15.5833 13.4583 15.5833H3.54167C3.16594 15.5833 2.80561 15.4341 2.53993 15.1684C2.27426 14.9027 2.125 14.5424 2.125 14.1667V6.375Z"
stroke="var(--bs-body-color)" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.375 15.5833V8.5H10.625V15.5833" stroke="var(--bs-body-color)"
stroke-linecap="round"
stroke-linejoin="round"/>
</svg>
Clientes
</a>
</li>
<li class="breadcrumb-item active" aria-current="page">{{ $cliente->name }}</li>
</ol>
</nav>
</div>
<div class="container-fluid">
<div class="row align-items-stretch">
<div class="col-xl-3">
<div class="card h-80">
<div class="card-body">
<div class="text-center mb-3">
<img src="{{ $cliente->logotipo }}" class="avatar avatar-lg mb-2 logo-avatar" alt="">
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item px-0">
<span>Contato Principal</span>
<h6 class="m-0">demo123@gmail.com</h6>
</li>
<li class="list-group-item px-0">
<h6 class="m-0">Tenant ID</h6>
@if (isset($cliente->cred))
<span>{{ $cliente->cred['id_tenant'] }}</span>
@else
<span>Não Cadastrado</span>
@endif
</li>
<li class="list-group-item px-0">
<h6 class="m-0">Client ID</h6>
@if (isset($cliente->cred))
<span>{{ $cliente->cred['id_client'] }}</span>
@else
<span>Não Cadastrado</span>
@endif
</li>
<li class="list-group-item px-0">
<h6 class="m-0">Secret ID</h6>
@if (isset($cliente->cred))
<span>{{ $cliente->cred['id_secret'] }}</span>
@else
<span>Não Cadastrado</span>
@endif
</li>
</ul>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row align-items-stretch">
<div class="col-xl-3">
<div class="card h-80">
<div class="card-body">
<div class="text-center mb-3">
<img src="{{ $cliente->logotipo }}" class="avatar avatar-lg mb-2 logo-avatar" alt="">
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item px-0">
<span>Contato Principal</span>
<h6 class="m-0">demo123@gmail.com</h6>
</li>
<li class="list-group-item px-0">
<h6 class="m-0">Tenant ID</h6>
@if (isset($cliente->cred))
<span>{{ $cliente->cred['id_tenant'] }}</span>
@else
<span>Não Cadastrado</span>
@endif
</li>
<li class="list-group-item px-0">
<h6 class="m-0">Client ID</h6>
@if (isset($cliente->cred))
<span>{{ $cliente->cred['id_client'] }}</span>
@else
<span>Não Cadastrado</span>
@endif
</li>
<li class="list-group-item px-0">
<h6 class="m-0">Secret ID</h6>
@if (isset($cliente->cred))
<span>{{ $cliente->cred['id_secret'] }}</span>
@else
<span>Não Cadastrado</span>
@endif
</li>
</ul>
</div>
</div>
</div>
<div class="col-xl-9">
<div class="card h-80">
<div class="card-body">
<div class="text-center mb-3">
<h4>Informações</h4>
</div>
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-body overflow-hidden">
<div class="row gx-5 gy-3">
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center">
<h2 class="text-purple my-0 fs-3 me-2">
@php
use \App\Models\clientes_usuarios;
$quantidadeusuarios = clientes_usuarios::where('principalType', 'user')->where('id_cliente', $cliente->id)->count();
@endphp
{{ $quantidadeusuarios}}
</h2>
</div>
<span>Usuários</span>
</div>
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center ">
<h2 class="text-purple my-0 fs-3 me-2">{{ $cliente->grupos()->count() }}
</h2>
</div>
<span>Grupos</span>
</div>
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center">
<h2 class="text-purple my-0 fs-3 me-2">
{{ $cliente->sitesSharepoint()->count() }}
</h2>
</div>
<span>Sharepoint</span>
</div>
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center">
<h2 class="text-purple my-0 fs-3 me-2">
{{ $cliente->dominios()->count() }}
</h2>
</div>
<span>Domínios</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row align-items-stretch">
<div class="col-xl-6">
<div class="card h-auto">
<div class="card-header border-0 py-3">
<h4 class="card-title">Top 10 Sites Sharepoint</h4>
</div>
<div class="card-body p-0 table-card-body pb-2">
<div class="table-responsive">
<table id="paymentHistoryTable" class="table table-sm-responsive">
<thead class="table-light">
<tr>
<th class="mw-100">Displayname</th>
<th class="mw-100">Storage</th>
</tr>
</thead>
@php
use App\Models\clientes_sharepoint;
$sitesSharepoint = clientes_sharepoint::where('id_cliente', $cliente->id)->orderBy('storage_gb', 'desc')->limit(10)->get();
@endphp
<tbody class="text-nowrap">
@foreach ($sitesSharepoint as $siteSharepoint)
<tr>
<td><a href="{{ $siteSharepoint->webUrl }}"> {{ $siteSharepoint->displayName }}
</a>
</td>
@if (isset($siteSharepoint->storage_gb))
<td>{{ $siteSharepoint->storage_gb }} GB</td>
@else
<td><span class="badge badge-sm badge-danger light">Sem Relatório</span></td>
@endif
<div class="col-xl-9">
<div class="card h-80">
<div class="card-body">
<div class="text-center mb-3">
<h4>Informações</h4>
</div>
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-body overflow-hidden">
<div class="row gx-5 gy-3">
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center">
<h2 class="text-purple my-0 fs-3 me-2">
@php
use \App\Models\clientes_usuarios;
$quantidadeusuarios = clientes_usuarios::where('principalType', 'user')->where('id_cliente', $cliente->id)->count();
@endphp
{{ $quantidadeusuarios}}
</h2>
</div>
<span>Usuários</span>
</div>
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center ">
<h2 class="text-purple my-0 fs-3 me-2">{{ $cliente->grupos()->count() }}
</h2>
</div>
<span>Grupos</span>
</div>
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center">
<h2 class="text-purple my-0 fs-3 me-2">
{{ $cliente->sitesSharepoint()->count() }}
</h2>
</div>
<span>Sharepoint</span>
</div>
<div class="col-xl-3 col-sm-4 col-6 border-end">
<div class="d-flex align-items-center">
<h2 class="text-purple my-0 fs-3 me-2">
{{ $cliente->dominios()->count() }}
</h2>
</div>
<span>Domínios</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="text-center mb-3">
<h4>Contratos</h4>
</div>
<div class="row">
<div class="col-xl-12">
<div class="card shadow-sm border-0">
<div class="card-header bg-white border-0 pb-0">
<h5 class="mb-0">Utilização dos Contratos</h5>
<small class="text-muted">Acompanhe o consumo de horas de cada contrato</small>
</div>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-xl-6">
<div class="card h-auto">
<div class="card-header border-0 py-3">
<h4 class="card-title">Divergências de Domínios</h4>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table align-middle table-hover">
<thead class="table-light">
<tr>
<th style="width: 25%;">Contrato</th>
<th style="width: 75%;">Utilização</th>
</tr>
</thead>
<tbody>
@foreach($cliente->contratos as $contrato)
@php
$horas_utilizadas = 140; // valor fixo por enquanto
$horas_contratadas = $contrato->horas_contratadas ?? 0;
<div class="card-body p-0 table-card-body pb-2">
<div class="table-responsive">
<table class="table table-sm align-middle text-nowrap mb-0">
<thead class="table-light">
<tr>
<th>Domínio</th>
<th>Tipos Divergentes</th>
<th>Status</th>
</tr>
</thead>
$porcentagem_utilizada = $horas_contratadas > 0
? round(($horas_utilizadas / $horas_contratadas) * 100)
: 0;
<tbody>
@php
$possuiDivergencia = false;
@endphp
if ($porcentagem_utilizada < 60) {
$cor = 'bg-success';
$status = 'Baixa utilização';
} elseif ($porcentagem_utilizada < 80) {
$cor = 'bg-warning';
$status = 'Atenção';
} else {
$cor = 'bg-danger';
$status = 'Alta utilização';
}
@foreach ($cliente->dominios as $dominio)
@if ($dominio->tipos_divergentes->isNotEmpty())
@php $possuiDivergencia = true; @endphp
$largura_barra = min($porcentagem_utilizada, 100);
@endphp
<tr>
{{-- Domínio --}}
<td class="fw-semibold">
{{ $dominio->id_domain }}
</td>
<tr>
<td>
<div class="fw-semibold text-dark">
{{ $contrato->contrato }}
</div>
<small class="text-muted">
{{ $status }}
</small>
</td>
{{-- Tipos divergentes --}}
<td>
@foreach ($dominio->tipos_divergentes as $tipo)
<span class="badge bg-danger me-1" data-bs-toggle="tooltip"
data-bs-placement="top" data-bs-html="true"
title="{!! nl2br(e($dominio->tooltipPorTipo($tipo))) !!}">
<td>
<div class="d-flex justify-content-between mb-1">
<small class="text-muted">
{{ $horas_utilizadas }}h usadas de {{ $horas_contratadas }}h contratadas
</small>
<small class="fw-semibold text-dark">
{{ $porcentagem_utilizada }}%
</small>
</div>
<div class="progress rounded-pill shadow-sm"
style="height: 22px; cursor: pointer;"
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Horas contratadas: {{ $horas_contratadas }}h | Horas utilizadas: {{ $horas_utilizadas }}h | Utilização: {{ $porcentagem_utilizada }}%">
<div class="progress-bar progress-bar-striped progress-bar-animated {{ $cor }} rounded-pill"
role="progressbar"
style="width: {{ $largura_barra }}%;"
aria-valuenow="{{ $porcentagem_utilizada }}"
aria-valuemin="0"
aria-valuemax="100">
</div>
</div>
<div class="mt-2">
<small class="text-muted">
Contratadas: <strong>{{ $horas_contratadas }}h</strong>
&nbsp;|&nbsp;
Utilizadas: <strong>{{ $horas_utilizadas }}h</strong>
&nbsp;|&nbsp;
Consumo: <strong>{{ $porcentagem_utilizada }}%</strong>
</small>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row align-items-stretch">
<div class="col-xl-6">
<div class="card h-auto">
<div class="card-header border-0 py-3">
<h4 class="card-title">Top 10 Sites Sharepoint</h4>
</div>
<div class="card-body p-0 table-card-body pb-2">
<div class="table-responsive">
<table id="paymentHistoryTable" class="table table-sm-responsive">
<thead class="table-light">
<tr>
<th class="mw-100">Displayname</th>
<th class="mw-100">Storage</th>
</tr>
</thead>
@php
use App\Models\clientes_sharepoint;
$sitesSharepoint = clientes_sharepoint::where('id_cliente', $cliente->id)->orderBy('storage_gb', 'desc')->limit(10)->get();
@endphp
<tbody class="text-nowrap">
@foreach ($sitesSharepoint as $siteSharepoint)
<tr>
<td>
<a href="{{ $siteSharepoint->webUrl }}"> {{ $siteSharepoint->displayName }}
</a>
</td>
@if (isset($siteSharepoint->storage_gb))
<td>{{ $siteSharepoint->storage_gb }} GB</td>
@else
<td><span class="badge badge-sm badge-danger light">Sem Relatório</span>
</td>
@endif
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-xl-6">
<div class="card h-auto">
<div class="card-header border-0 py-3">
<h4 class="card-title">Divergências de Domínios</h4>
</div>
<div class="card-body p-0 table-card-body pb-2">
<div class="table-responsive">
<table class="table table-sm align-middle text-nowrap mb-0">
<thead class="table-light">
<tr>
<th>Domínio</th>
<th>Tipos Divergentes</th>
<th>Status</th>
</tr>
</thead>
<tbody>
@php
$possuiDivergencia = false;
@endphp
@foreach ($cliente->dominios as $dominio)
@if ($dominio->tipos_divergentes->isNotEmpty())
@php $possuiDivergencia = true; @endphp
<tr>
{{-- Domínio --}}
<td class="fw-semibold">
{{ $dominio->id_domain }}
</td>
{{-- Tipos divergentes --}}
<td>
@foreach ($dominio->tipos_divergentes as $tipo)
<span class="badge bg-danger me-1" data-bs-toggle="tooltip"
data-bs-placement="top" data-bs-html="true"
title="{!! nl2br(e($dominio->tooltipPorTipo($tipo))) !!}">
{{ $tipo }}
</span>
@endforeach
</td>
@endforeach
</td>
{{-- Status --}}
<td>
{{-- Status --}}
<td>
<span class="badge bg-danger-subtle text-danger">
Divergente
</span>
</td>
</tr>
@endif
@endforeach
</td>
</tr>
@endif
@endforeach
@if (!$possuiDivergencia)
<tr>
<td colspan="3" class="text-center text-muted py-4">
Nenhuma divergência encontrada
</td>
</tr>
@endif
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@if (!$possuiDivergencia)
<tr>
<td colspan="3" class="text-center text-muted py-4">
Nenhuma divergência encontrada
</td>
</tr>
@endif
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@section('scripts')
<script>
@@ -238,6 +339,14 @@
});
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
[...tooltipTriggerList].forEach(function (tooltipTriggerEl) {
new bootstrap.Tooltip(tooltipTriggerEl);
});
});
</script>

View File

@@ -20,197 +20,199 @@
<body>
<!-- Start - Preloader -->
<div id="preloader">
<div class="lds-ripple">
<div></div>
<div></div>
</div>
<!-- Start - Preloader -->
<div id="preloader">
<div class="lds-ripple">
<div></div>
<div></div>
</div>
<!-- End - Preloader -->
</div>
<!-- End - Preloader -->
<!-- Start - Main Wrapper -->
<div id="main-wrapper">
<!-- Start - Main Wrapper -->
<div id="main-wrapper">
<!-- Start - Nav Header -->
<div class="nav-header">
<a href="{{ route('dashboard') }}" class="brand-logo" aria-label="Brand Logo">
</a>
</div>
<!-- End - Nav Header -->
<!-- Start - Nav Header -->
<div class="nav-header">
<a href="{{ route('dashboard') }}" class="brand-logo" aria-label="Brand Logo">
</a>
</div>
<!-- End - Nav Header -->
<!-- Start - Sidebar Chat Box -->
<!-- Start - Sidebar Chat Box -->
<!-- End - Sidebar Chat Box -->
<!-- End - Sidebar Chat Box -->
<!-- Start - Header -->
<div class="header">
<div class="header-content">
<nav class="navbar navbar-expand">
<div class="collapse navbar-collapse justify-content-between">
<div class="header-left">
</div>
<ul class="navbar-nav header-right">
<li class="nav-item notification_dropdown d-none d-sm-flex">
<a class="nav-link dz-fullscreen" href="javascript:void(0);" aria-label="Fullscreen">
<svg id="icon-full" viewBox="0 0 24 24" width="20" height="20"
stroke="var(--bs-body-color)" stroke-width="2" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path
<!-- Start - Header -->
<div class="header">
<div class="header-content">
<nav class="navbar navbar-expand">
<div class="collapse navbar-collapse justify-content-between">
<div class="header-left">
</div>
<ul class="navbar-nav header-right">
<li class="nav-item notification_dropdown d-none d-sm-flex">
<a class="nav-link dz-fullscreen" href="javascript:void(0);" aria-label="Fullscreen">
<svg id="icon-full" viewBox="0 0 24 24" width="20" height="20"
stroke="var(--bs-body-color)" stroke-width="2" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path
d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"
style="stroke-dasharray: 37, 57; stroke-dashoffset: 0;"></path>
</svg>
<svg id="icon-minimize" width="20" height="20" viewBox="0 0 24 24" fill="none"
stroke="var(--bs-body-color)" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" class="feather feather-minimize">
<path
</svg>
<svg id="icon-minimize" width="20" height="20" viewBox="0 0 24 24" fill="none"
stroke="var(--bs-body-color)" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" class="feather feather-minimize">
<path
d="M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3"
style="stroke-dasharray: 37, 57; stroke-dashoffset: 0;"></path>
</svg>
</a>
</li>
<li class="nav-item dropdown header-profile-dropdown">
<a class="nav-link" href="javascript:void(0);" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
<div class="profile-head">
<div class="profile-media">
<img src="{{ asset('assets/images/tab/1.jpg') }}" alt="">
</div>
<div class="header-info">
<h6 class="author-name">{{ Auth::user()->name }}</h6>
<small>{{ Auth::user()->email }}</small>
</svg>
</a>
</li>
<li class="nav-item dropdown header-profile-dropdown">
<a class="nav-link" href="javascript:void(0);" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
<div class="profile-head">
<div class="profile-media">
<img src="{{ asset('assets/images/tab/1.jpg') }}" alt="">
</div>
<div class="header-info">
<h6 class="author-name">{{ Auth::user()->name }}</h6>
<small>{{ Auth::user()->email }}</small>
</div>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<div class="py-2 d-flex px-3">
<img src="{{ asset('assets/images/tab/1.jpg') }}"
class="avatar avatar-sm rounded-circle" alt="">
<div class="ms-2">
<h6 class="mb-0">{{ Auth::user()->name }}</h6>
<small>Web Designer</small>
</div>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<div class="py-2 d-flex px-3">
<img src="{{ asset('assets/images/tab/1.jpg') }}"
class="avatar avatar-sm rounded-circle" alt="">
<div class="ms-2">
<h6 class="mb-0">{{ Auth::user()->name }}</h6>
<small>Web Designer</small>
</div>
</div>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="{{ route('horizon.index') }}" target="_blank"><i
</li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="{{ route('horizon.index') }}" target="_blank"><i
class="fa-solid fa-chart-area text-primary me-1"></i> Horizon</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li>
<a href="#" class="dropdown-item"
onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18"
viewBox="0 0 24 24" fill="none" stroke="var(--bs-danger)"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="var(--bs-danger)"
d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>
<polyline stroke="var(--bs-danger)" points="16 17 21 12 16 7">
</polyline>
<line x1="21" y1="12" x2="9" y2="12"></line>
</svg>
<span class="ms-2 text-danger">Logout</span>
</a>
<li>
<hr class="dropdown-divider">
</li>
<li>
<a href="#" class="dropdown-item"
onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18"
viewBox="0 0 24 24" fill="none" stroke="var(--bs-danger)"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="var(--bs-danger)"
d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>
<polyline stroke="var(--bs-danger)" points="16 17 21 12 16 7">
</polyline>
<line x1="21" y1="12" x2="9" y2="12"></line>
</svg>
<span class="ms-2 text-danger">Logout</span>
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST"
class="d-none">
@csrf
</form>
<form id="logout-form" action="{{ route('logout') }}" method="POST"
class="d-none">
@csrf
</form>
</li>
</ul>
</li>
</ul>
</div>
</nav>
</div>
</li>
</ul>
</li>
</ul>
</div>
</nav>
</div>
<!-- End - Header -->
<!-- Start - Sidebar Navigation -->
<div class="deznav">
<div class="deznav-scroll">
<ul class="metismenu" id="menu">
<li class="menu-title" data-i18n="CloudEssential">CloudEssential</li>
<li>
<a href="{{ route('dashboard') }}" aria-expanded="false">
<div class="menu-icon">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 14.0673C7.4407 14.0673 4.41309 14.6034 4.41309 16.7501C4.41309 18.8969 7.4215 19.4521 10.986 19.4521C14.5313 19.4521 17.5581 18.9152 17.5581 16.7693C17.5581 14.6234 14.5505 14.0673 10.986 14.0673Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 11.0054C13.3126 11.0054 15.1983 9.11881 15.1983 6.79223C15.1983 4.46564 13.3126 2.57993 10.986 2.57993C8.65944 2.57993 6.77285 4.46564 6.77285 6.79223C6.76499 9.11096 8.63849 10.9975 10.9563 11.0054H10.986Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div>
<span class="nav-text" data-i18n="Dashboard">Dashboard</span>
</a>
</li>
<li>
<a href="{{ route('clientes') }}" aria-expanded="false">
<div class="menu-icon">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 14.0673C7.4407 14.0673 4.41309 14.6034 4.41309 16.7501C4.41309 18.8969 7.4215 19.4521 10.986 19.4521C14.5313 19.4521 17.5581 18.9152 17.5581 16.7693C17.5581 14.6234 14.5505 14.0673 10.986 14.0673Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 11.0054C13.3126 11.0054 15.1983 9.11881 15.1983 6.79223C15.1983 4.46564 13.3126 2.57993 10.986 2.57993C8.65944 2.57993 6.77285 4.46564 6.77285 6.79223C6.76499 9.11096 8.63849 10.9975 10.9563 11.0054H10.986Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div>
<span class="nav-text" data-i18n="Clientes">Clientes</span>
</a>
</li>
</ul>
</div>
</div>
<!-- End - Header -->
<!-- Start - Sidebar Navigation -->
<div class="deznav">
<div class="deznav-scroll">
<ul class="metismenu" id="menu">
<li class="menu-title" data-i18n="CloudEssential">CloudEssential</li>
<li>
<a href="{{ route('dashboard') }}" aria-expanded="false">
<div class="menu-icon">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 14.0673C7.4407 14.0673 4.41309 14.6034 4.41309 16.7501C4.41309 18.8969 7.4215 19.4521 10.986 19.4521C14.5313 19.4521 17.5581 18.9152 17.5581 16.7693C17.5581 14.6234 14.5505 14.0673 10.986 14.0673Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 11.0054C13.3126 11.0054 15.1983 9.11881 15.1983 6.79223C15.1983 4.46564 13.3126 2.57993 10.986 2.57993C8.65944 2.57993 6.77285 4.46564 6.77285 6.79223C6.76499 9.11096 8.63849 10.9975 10.9563 11.0054H10.986Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<span class="nav-text" data-i18n="Dashboard">Dashboard</span>
</a>
</li>
<li>
<a href="{{ route('clientes') }}" aria-expanded="false">
<div class="menu-icon">
<svg width="22" height="22" viewBox="0 0 22 22" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 14.0673C7.4407 14.0673 4.41309 14.6034 4.41309 16.7501C4.41309 18.8969 7.4215 19.4521 10.986 19.4521C14.5313 19.4521 17.5581 18.9152 17.5581 16.7693C17.5581 14.6234 14.5505 14.0673 10.986 14.0673Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M10.986 11.0054C13.3126 11.0054 15.1983 9.11881 15.1983 6.79223C15.1983 4.46564 13.3126 2.57993 10.986 2.57993C8.65944 2.57993 6.77285 4.46564 6.77285 6.79223C6.76499 9.11096 8.63849 10.9975 10.9563 11.0054H10.986Z"
stroke="#888888" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<span class="nav-text" data-i18n="Clientes">Clientes</span>
</a>
</li>
</ul>
</div>
<!-- End - Sidebar Navigation -->
<!-- Start - Content Body -->
<main class="content-body">
@yield('content')
</main>
<!-- End - Content Body -->
<!-- Start - Footer -->
<div class="footer">
<div class="copyright text-center">
<p class="mb-0">Copyright © Developed by <a href="https://cloudessential.tech/" target="_blank">Felipe
Aquino</a> 2025 - <span class="current-year"></span></p>
</div>
</div>
<!-- End - Footer -->
</div>
<!-- End - Main Wrapper -->
<!-- End - Sidebar Navigation -->
<!-- Start - Content Body -->
<main class="content-body">
@yield('content')
</main>
<!-- End - Content Body -->
<!-- Start - Footer -->
<div class="footer">
<div class="copyright text-center">
<p class="mb-0">Copyright © Developed by <a href="https://cloudessential.tech/" target="_blank">Felipe
Aquino</a> 2025 - <span class="current-year"></span></p>
</div>
</div>
<!-- End - Footer -->
</div>
<!-- End - Main Wrapper -->
<!-- Start - Page Scripts -->
<script src="{{ asset('assets/vendor/jquery/dist/jquery.min.js') }}"></script>
<script src="{{ asset('assets/vendor/bootstrap/dist/js/bootstrap.bundle.min.js') }}"></script>
<script src="{{ asset('assets/vendor/bootstrap-select/dist/js/bootstrap-select.min.js') }}"></script>
<script src="{{ asset('assets/vendor/metismenu/dist/metisMenu.min.js') }}"></script>
<script src="{{ asset('assets/vendor/@yaireo/tagify/dist/tagify.js') }}"></script>
<!-- Script For Dropzone -->
<script src="/assets/vendor/dropzone/dropzone.min.js"></script>
<!-- Script For Multiple Languages -->
<script src="{{ asset('assets/vendor/i18n/i18n.js') }}"></script>
<script src="{{ asset('assets/js/translator.js') }}"></script>
<!-- Script For Custom JS -->
<script src="{{ asset('assets/js/deznav-init.js') }}"></script>
<script src="{{ asset('assets/js/custom.js') }}"></script>
@yield('scripts')
<!-- End - Page Scripts -->
<!-- Start - Page Scripts -->
<script src="../assets/js/sidebar-menu.js"></script>
<script src="../assets/js/config.js"></script>
<script src="{{ asset('assets/js/jquery-3.5.1.min.js')}}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather.min.js') }}"></script>
<script src="{{ asset('assets/js/icons/feather-icon/feather-icon.js') }}"></script>
<script src="{{ asset('assets/vendor/jquery/dist/jquery.min.js') }}"></script>
<script src="{{ asset('assets/vendor/bootstrap/dist/js/bootstrap.bundle.min.js') }}"></script>
<script src="{{ asset('assets/vendor/bootstrap-select/dist/js/bootstrap-select.min.js') }}"></script>
<script src="{{ asset('assets/vendor/metismenu/dist/metisMenu.min.js') }}"></script>
<script src="{{ asset('assets/vendor/@yaireo/tagify/dist/tagify.js') }}"></script>
<script src="{{asset('/assets/vendor/dropzone/dropzone.min.js')}}"></script>
<script src="{{ asset('assets/vendor/i18n/i18n.js') }}"></script>
<script src="{{ asset('assets/js/translator.js') }}"></script>
<script src="{{ asset('assets/js/deznav-init.js') }}"></script>
<script src="{{ asset('assets/js/custom.js') }}"></script>
<script src="{{ asset('assets/js/bootstrap/popper.min.js') }}"></script>
<script src="{{ asset('assets/js/bootstrap/bootstrap.min.js') }}"></script>
<script src="{{ asset('assets/js/tooltip-init.js') }}"></script>
@yield('scripts')
</body>

View File

@@ -1,9 +1,11 @@
<?php
use App\Http\Controllers\Api\v1\relatorio_chamados;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\v1\user_details;
Route::prefix('v1')->group(function () {
route::post('user_details', [user_details::class, 'user_details']);
route::post('relatorio_chamados', [relatorio_chamados::class, 'salvar_relatorio']);
});