diff --git a/app/Exports/ArrayReportExport.php b/app/Exports/ArrayReportExport.php
new file mode 100644
index 0000000..23ee815
--- /dev/null
+++ b/app/Exports/ArrayReportExport.php
@@ -0,0 +1,24 @@
+headings;
+ }
+
+ public function collection(): Collection
+ {
+ return collect($this->rows);
+ }
+}
diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php
new file mode 100644
index 0000000..8759e82
--- /dev/null
+++ b/app/Http/Controllers/ReportController.php
@@ -0,0 +1,206 @@
+only([
+ 'date_from','date_to','asset_status_id','asset_class_id','asset_category_id',
+ 'asset_location_id','department_id','asset_user_id','person_in_charge_id','warranty_id'
+ ]);
+
+ $query = Asset::with(['status','class','category','location','department','user','personInCharge','warranty'])
+ ->when($filters['date_from'] ?? null, fn($q,$v)=>$q->whereDate('created_at','>=',$v))
+ ->when($filters['date_to'] ?? null, fn($q,$v)=>$q->whereDate('created_at','<=',$v))
+ ->when($filters['asset_status_id'] ?? null, fn($q,$v)=>$q->where('asset_status_id',$v))
+ ->when($filters['asset_class_id'] ?? null, fn($q,$v)=>$q->where('asset_class_id',$v))
+ ->when($filters['asset_category_id'] ?? null, fn($q,$v)=>$q->where('asset_category_id',$v))
+ ->when($filters['asset_location_id'] ?? null, fn($q,$v)=>$q->where('asset_location_id',$v))
+ ->when($filters['department_id'] ?? null, fn($q,$v)=>$q->where('department_id',$v))
+ ->when($filters['asset_user_id'] ?? null, fn($q,$v)=>$q->where('asset_user_id',$v))
+ ->when($filters['person_in_charge_id'] ?? null, fn($q,$v)=>$q->where('person_in_charge_id',$v))
+ ->when($filters['warranty_id'] ?? null, fn($q,$v)=>$q->where('warranty_id',$v));
+
+ $assets = $query->paginate(20)->withQueryString();
+
+ if ($request->get('export') === 'excel') {
+ $rows = $query->get()->map(fn($a)=>[
+ $a->code,
+ $a->name,
+ $a->status?->name,
+ $a->category?->name,
+ $a->location?->name,
+ $a->department?->name,
+ $a->user?->name,
+ $a->personInCharge?->name,
+ $a->warranty?->name,
+ $a->created_at?->format('d/m/Y'),
+ ])->toArray();
+ return Excel::download(new ArrayReportExport([
+ 'Kode','Nama','Status','Kategori','Lokasi','Departemen','Pengguna','PIC','Garansi','Dibuat'
+ ], $rows), 'asset-report.xlsx');
+ }
+
+ if ($request->get('export') === 'pdf') {
+ $data = $query->get();
+ $pdf = Pdf::loadView('reports.exports.assets', compact('data'));
+ return $pdf->download('asset-report.pdf');
+ }
+
+ return view('reports.assets', [
+ 'assets' => $assets,
+ 'filters' => $filters,
+ 'statuses' => AssetStatus::orderBy('name')->get(),
+ 'classes' => AssetClass::orderBy('name')->get(),
+ 'categories' => AssetCategory::orderBy('name')->get(),
+ 'locations' => AssetLocation::orderBy('name')->get(),
+ 'departments' => Department::orderBy('name')->get(),
+ 'users' => AssetUser::orderBy('name')->get(),
+ 'pics' => PersonInCharge::orderBy('name')->get(),
+ 'warranties' => Warranty::orderBy('name')->get(),
+ ]);
+ }
+
+ public function movements(Request $request)
+ {
+ $filters = $request->only(['date_from','date_to','asset_id','asset_location_id','department_id','asset_user_id']);
+ $query = AssetMovement::with(['asset','toLocation','toDepartment','toUser','fromLocation','fromDepartment','fromUser'])
+ ->when($filters['date_from'] ?? null, fn($q,$v)=>$q->whereDate('performed_at','>=',$v))
+ ->when($filters['date_to'] ?? null, fn($q,$v)=>$q->whereDate('performed_at','<=',$v))
+ ->when($filters['asset_id'] ?? null, fn($q,$v)=>$q->where('asset_id',$v))
+ ->when($filters['asset_location_id'] ?? null, fn($q,$v)=>$q->where('to_location_id',$v))
+ ->when($filters['department_id'] ?? null, fn($q,$v)=>$q->where('to_department_id',$v))
+ ->when($filters['asset_user_id'] ?? null, fn($q,$v)=>$q->where('to_asset_user_id',$v));
+
+ $items = $query->paginate(20)->withQueryString();
+
+ if ($request->get('export') === 'excel') {
+ $rows = $query->get()->map(fn($m)=>[
+ $m->performed_at?->format('d/m/Y H:i'),
+ $m->asset?->code,
+ $m->fromLocation?->name,
+ $m->toLocation?->name,
+ $m->fromDepartment?->name,
+ $m->toDepartment?->name,
+ $m->fromUser?->name,
+ $m->toUser?->name,
+ $m->notes,
+ ])->toArray();
+ return Excel::download(new ArrayReportExport([
+ 'Waktu','Aset','Dari Lokasi','Ke Lokasi','Dari Dept','Ke Dept','Dari User','Ke User','Catatan'
+ ], $rows), 'asset-movement-report.xlsx');
+ }
+
+ if ($request->get('export') === 'pdf') {
+ $data = $query->get();
+ $pdf = Pdf::loadView('reports.exports.movements', compact('data'));
+ return $pdf->download('asset-movement-report.pdf');
+ }
+
+ return view('reports.movements', [
+ 'items' => $items,
+ 'filters' => $filters,
+ 'assets' => Asset::orderBy('code')->get(),
+ 'locations' => AssetLocation::orderBy('name')->get(),
+ 'departments' => Department::orderBy('name')->get(),
+ 'users' => AssetUser::orderBy('name')->get(),
+ ]);
+ }
+
+ public function disposals(Request $request)
+ {
+ $filters = $request->only(['date_from','date_to','asset_id','status']);
+ $query = AssetDisposal::with('asset')
+ ->when($filters['date_from'] ?? null, fn($q,$v)=>$q->whereDate('disposed_at','>=',$v))
+ ->when($filters['date_to'] ?? null, fn($q,$v)=>$q->whereDate('disposed_at','<=',$v))
+ ->when($filters['asset_id'] ?? null, fn($q,$v)=>$q->where('asset_id',$v))
+ ->when($filters['status'] ?? null, function ($q, $v) {
+ $v === 'reversed' ? $q->whereNotNull('reversed_at') : $q->whereNull('reversed_at');
+ });
+
+ $items = $query->paginate(20)->withQueryString();
+
+ if ($request->get('export') === 'excel') {
+ $rows = $query->get()->map(fn($d)=>[
+ $d->disposed_at?->format('d/m/Y H:i'),
+ $d->asset?->code,
+ $d->reason,
+ $d->notes,
+ $d->reversed_at ? 'Reversed' : 'Active',
+ ])->toArray();
+ return Excel::download(new ArrayReportExport([
+ 'Waktu','Aset','Alasan','Catatan','Status'
+ ], $rows), 'asset-disposal-report.xlsx');
+ }
+
+ if ($request->get('export') === 'pdf') {
+ $data = $query->get();
+ $pdf = Pdf::loadView('reports.exports.disposals', compact('data'));
+ return $pdf->download('asset-disposal-report.pdf');
+ }
+
+ return view('reports.disposals', [
+ 'items' => $items,
+ 'filters' => $filters,
+ 'assets' => Asset::orderBy('code')->get(),
+ ]);
+ }
+
+ public function audits(Request $request)
+ {
+ $filters = $request->only(['date_from','date_to','asset_id','status','location_id']);
+ $query = AssetAudit::with(['asset','location'])
+ ->when($filters['date_from'] ?? null, fn($q,$v)=>$q->whereDate('audited_at','>=',$v))
+ ->when($filters['date_to'] ?? null, fn($q,$v)=>$q->whereDate('audited_at','<=',$v))
+ ->when($filters['asset_id'] ?? null, fn($q,$v)=>$q->where('asset_id',$v))
+ ->when($filters['status'] ?? null, fn($q,$v)=>$q->where('status',$v))
+ ->when($filters['location_id'] ?? null, fn($q,$v)=>$q->where('location_id',$v));
+
+ $items = $query->paginate(20)->withQueryString();
+
+ if ($request->get('export') === 'excel') {
+ $rows = $query->get()->map(fn($a)=>[
+ $a->audited_at?->format('d/m/Y H:i'),
+ $a->asset?->code,
+ $a->status,
+ $a->location?->name,
+ $a->notes,
+ ])->toArray();
+ return Excel::download(new ArrayReportExport([
+ 'Waktu','Aset','Status','Lokasi','Catatan'
+ ], $rows), 'asset-audit-report.xlsx');
+ }
+
+ if ($request->get('export') === 'pdf') {
+ $data = $query->get();
+ $pdf = Pdf::loadView('reports.exports.audits', compact('data'));
+ return $pdf->download('asset-audit-report.pdf');
+ }
+
+ return view('reports.audits', [
+ 'items' => $items,
+ 'filters' => $filters,
+ 'assets' => Asset::orderBy('code')->get(),
+ 'locations' => AssetLocation::orderBy('name')->get(),
+ ]);
+ }
+}
diff --git a/composer.json b/composer.json
index 2231382..498715a 100644
--- a/composer.json
+++ b/composer.json
@@ -7,8 +7,10 @@
"license": "MIT",
"require": {
"php": "^8.2",
+ "barryvdh/laravel-dompdf": "^3.1",
"laravel/framework": "^12.0",
"laravel/tinker": "^2.10.1",
+ "maatwebsite/excel": "^3.1",
"simplesoftwareio/simple-qrcode": "^4.2",
"spatie/laravel-permission": "^6.23"
},
diff --git a/composer.lock b/composer.lock
index 80fccfc..b088545 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "8e274f02586454d3ccd47f03aefeeb47",
+ "content-hash": "4fd66f4ef52725dd969263736387ca3c",
"packages": [
{
"name": "bacon/bacon-qr-code",
@@ -60,6 +60,83 @@
},
"time": "2022-12-07T17:46:57+00:00"
},
+ {
+ "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.12.3",
@@ -189,6 +266,162 @@
],
"time": "2024-02-09T16:56:22+00:00"
},
+ {
+ "name": "composer/pcre",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+ "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<1.11.10"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.12 || ^2",
+ "phpstan/phpstan-strict-rules": "^1 || ^2",
+ "phpunit/phpunit": "^8 || ^9"
+ },
+ "type": "library",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-12T16:29:46+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
+ "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.4"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ }
+ ],
+ "time": "2025-08-20T19:15:30+00:00"
+ },
{
"name": "dasprid/enum",
"version": "1.0.7",
@@ -482,6 +715,161 @@
],
"time": "2024-02-05T11:56:58+00:00"
},
+ {
+ "name": "dompdf/dompdf",
+ "version": "v3.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/dompdf.git",
+ "reference": "db712c90c5b9868df3600e64e68da62e78a34623"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db712c90c5b9868df3600e64e68da62e78a34623",
+ "reference": "db712c90c5b9868df3600e64e68da62e78a34623",
+ "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.4"
+ },
+ "time": "2025-10-29T12:43:30+00:00"
+ },
+ {
+ "name": "dompdf/php-font-lib",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/php-font-lib.git",
+ "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
+ "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6"
+ },
+ "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.1"
+ },
+ "time": "2024-12-02T14:37:59+00:00"
+ },
+ {
+ "name": "dompdf/php-svg-lib",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/php-svg-lib.git",
+ "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
+ "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0",
+ "sabberworm/php-css-parser": "^8.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5"
+ },
+ "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.0"
+ },
+ "time": "2024-04-29T13:26:35+00:00"
+ },
{
"name": "dragonmantank/cron-expression",
"version": "v3.4.0",
@@ -614,6 +1002,67 @@
],
"time": "2025-03-06T22:45:56+00:00"
},
+ {
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.19.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf",
+ "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0"
+ },
+ "require-dev": {
+ "cerdic/css-tidy": "^1.7 || ^2.0",
+ "simpletest/simpletest": "dev-master"
+ },
+ "suggest": {
+ "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
+ "ext-bcmath": "Used for unit conversion and imagecrash protection",
+ "ext-iconv": "Converts text to and from non-UTF-8 encodings",
+ "ext-tidy": "Used for pretty-printing HTML"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ],
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "exclude-from-classmap": [
+ "/library/HTMLPurifier/Language/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
+ "keywords": [
+ "html"
+ ],
+ "support": {
+ "issues": "https://github.com/ezyang/htmlpurifier/issues",
+ "source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0"
+ },
+ "time": "2025-10-17T16:34:55+00:00"
+ },
{
"name": "fruitcake/php-cors",
"version": "v1.3.0",
@@ -2110,6 +2559,339 @@
],
"time": "2024-12-08T08:18:47+00:00"
},
+ {
+ "name": "maatwebsite/excel",
+ "version": "3.1.67",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/SpartnerNL/Laravel-Excel.git",
+ "reference": "e508e34a502a3acc3329b464dad257378a7edb4d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/e508e34a502a3acc3329b464dad257378a7edb4d",
+ "reference": "e508e34a502a3acc3329b464dad257378a7edb4d",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^3.3",
+ "ext-json": "*",
+ "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0",
+ "php": "^7.0||^8.0",
+ "phpoffice/phpspreadsheet": "^1.30.0",
+ "psr/simple-cache": "^1.0||^2.0||^3.0"
+ },
+ "require-dev": {
+ "laravel/scout": "^7.0||^8.0||^9.0||^10.0",
+ "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0",
+ "predis/predis": "^1.1"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Excel": "Maatwebsite\\Excel\\Facades\\Excel"
+ },
+ "providers": [
+ "Maatwebsite\\Excel\\ExcelServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Maatwebsite\\Excel\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Patrick Brouwers",
+ "email": "patrick@spartner.nl"
+ }
+ ],
+ "description": "Supercharged Excel exports and imports in Laravel",
+ "keywords": [
+ "PHPExcel",
+ "batch",
+ "csv",
+ "excel",
+ "export",
+ "import",
+ "laravel",
+ "php",
+ "phpspreadsheet"
+ ],
+ "support": {
+ "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
+ "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.67"
+ },
+ "funding": [
+ {
+ "url": "https://laravel-excel.com/commercial-support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/patrickbrouwers",
+ "type": "github"
+ }
+ ],
+ "time": "2025-08-26T09:13:16+00:00"
+ },
+ {
+ "name": "maennchen/zipstream-php",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maennchen/ZipStream-PHP.git",
+ "reference": "9712d8fa4cdf9240380b01eb4be55ad8dcf71416"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/9712d8fa4cdf9240380b01eb4be55ad8dcf71416",
+ "reference": "9712d8fa4cdf9240380b01eb4be55ad8dcf71416",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "ext-zlib": "*",
+ "php-64bit": "^8.3"
+ },
+ "require-dev": {
+ "brianium/paratest": "^7.7",
+ "ext-zip": "*",
+ "friendsofphp/php-cs-fixer": "^3.16",
+ "guzzlehttp/guzzle": "^7.5",
+ "mikey179/vfsstream": "^1.6",
+ "php-coveralls/php-coveralls": "^2.5",
+ "phpunit/phpunit": "^12.0",
+ "vimeo/psalm": "^6.0"
+ },
+ "suggest": {
+ "guzzlehttp/psr7": "^2.4",
+ "psr/http-message": "^2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ZipStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paul Duncan",
+ "email": "pabs@pablotron.org"
+ },
+ {
+ "name": "Jonatan Männchen",
+ "email": "jonatan@maennchen.ch"
+ },
+ {
+ "name": "Jesse Donat",
+ "email": "donatj@gmail.com"
+ },
+ {
+ "name": "András Kolesár",
+ "email": "kolesar@kolesar.hu"
+ }
+ ],
+ "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+ "keywords": [
+ "stream",
+ "zip"
+ ],
+ "support": {
+ "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
+ "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/maennchen",
+ "type": "github"
+ }
+ ],
+ "time": "2025-07-17T11:15:13+00:00"
+ },
+ {
+ "name": "markbaker/complex",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MarkBaker/PHPComplex.git",
+ "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+ "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+ "squizlabs/php_codesniffer": "^3.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Complex\\": "classes/src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Baker",
+ "email": "mark@lange.demon.co.uk"
+ }
+ ],
+ "description": "PHP Class for working with complex numbers",
+ "homepage": "https://github.com/MarkBaker/PHPComplex",
+ "keywords": [
+ "complex",
+ "mathematics"
+ ],
+ "support": {
+ "issues": "https://github.com/MarkBaker/PHPComplex/issues",
+ "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
+ },
+ "time": "2022-12-06T16:21:08+00:00"
+ },
+ {
+ "name": "markbaker/matrix",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MarkBaker/PHPMatrix.git",
+ "reference": "728434227fe21be27ff6d86621a1b13107a2562c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
+ "reference": "728434227fe21be27ff6d86621a1b13107a2562c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpdocumentor/phpdocumentor": "2.*",
+ "phploc/phploc": "^4.0",
+ "phpmd/phpmd": "2.*",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+ "sebastian/phpcpd": "^4.0",
+ "squizlabs/php_codesniffer": "^3.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matrix\\": "classes/src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Baker",
+ "email": "mark@demon-angel.eu"
+ }
+ ],
+ "description": "PHP Class for working with matrices",
+ "homepage": "https://github.com/MarkBaker/PHPMatrix",
+ "keywords": [
+ "mathematics",
+ "matrix",
+ "vector"
+ ],
+ "support": {
+ "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
+ "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
+ },
+ "time": "2022-12-02T22:17:43+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",
@@ -2612,6 +3394,112 @@
],
"time": "2024-11-21T10:39:51+00:00"
},
+ {
+ "name": "phpoffice/phpspreadsheet",
+ "version": "1.30.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+ "reference": "fa8257a579ec623473eabfe49731de5967306c4c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fa8257a579ec623473eabfe49731de5967306c4c",
+ "reference": "fa8257a579ec623473eabfe49731de5967306c4c",
+ "shasum": ""
+ },
+ "require": {
+ "composer/pcre": "^1||^2||^3",
+ "ext-ctype": "*",
+ "ext-dom": "*",
+ "ext-fileinfo": "*",
+ "ext-gd": "*",
+ "ext-iconv": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "ext-xml": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "ext-zip": "*",
+ "ext-zlib": "*",
+ "ezyang/htmlpurifier": "^4.15",
+ "maennchen/zipstream-php": "^2.1 || ^3.0",
+ "markbaker/complex": "^3.0",
+ "markbaker/matrix": "^3.0",
+ "php": ">=7.4.0 <8.5.0",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "dev-main",
+ "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0",
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "mitoteam/jpgraph": "^10.3",
+ "mpdf/mpdf": "^8.1.1",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpstan/phpstan": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^8.5 || ^9.0",
+ "squizlabs/php_codesniffer": "^3.7",
+ "tecnickcom/tcpdf": "^6.5"
+ },
+ "suggest": {
+ "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+ "ext-intl": "PHP Internationalization Functions",
+ "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+ "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+ "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maarten Balliauw",
+ "homepage": "https://blog.maartenballiauw.be"
+ },
+ {
+ "name": "Mark Baker",
+ "homepage": "https://markbakeruk.net"
+ },
+ {
+ "name": "Franck Lefevre",
+ "homepage": "https://rootslabs.net"
+ },
+ {
+ "name": "Erik Tilt"
+ },
+ {
+ "name": "Adrien Crivelli"
+ }
+ ],
+ "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+ "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+ "keywords": [
+ "OpenXML",
+ "excel",
+ "gnumeric",
+ "ods",
+ "php",
+ "spreadsheet",
+ "xls",
+ "xlsx"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
+ "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.1"
+ },
+ "time": "2025-10-26T16:01:04+00:00"
+ },
{
"name": "phpoption/phpoption",
"version": "1.9.3",
@@ -3390,6 +4278,72 @@
],
"time": "2024-04-27T21:32:50+00:00"
},
+ {
+ "name": "sabberworm/php-css-parser",
+ "version": "v8.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
+ "reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d8e916507b88e389e26d4ab03c904a082aa66bb9",
+ "reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41",
+ "rawr/cross-data-providers": "^2.0.0"
+ },
+ "suggest": {
+ "ext-mbstring": "for parsing UTF-8 CSS"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "9.0.x-dev"
+ }
+ },
+ "autoload": {
+ "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/v8.9.0"
+ },
+ "time": "2025-07-11T13:20:48+00:00"
+ },
{
"name": "simplesoftwareio/simple-qrcode",
"version": "4.2.0",
diff --git a/resources/views/layouts/components/main-sidebar.blade.php b/resources/views/layouts/components/main-sidebar.blade.php
index c11e1ed..d0862d4 100644
--- a/resources/views/layouts/components/main-sidebar.blade.php
+++ b/resources/views/layouts/components/main-sidebar.blade.php
@@ -161,6 +161,34 @@
+
+
Laporan
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Web Apps
diff --git a/resources/views/reports/assets.blade.php b/resources/views/reports/assets.blade.php
new file mode 100644
index 0000000..e53e89d
--- /dev/null
+++ b/resources/views/reports/assets.blade.php
@@ -0,0 +1,39 @@
+@php
+ $filtersView = view('reports.partials.asset_filters', compact('filters','statuses','classes','categories','locations','departments','users','pics','warranties'));
+@endphp
+
+@extends('reports.layout', ['title' => 'Laporan Aset', 'subtitle' => 'Filter by status, lokasi, PIC, pengguna, garansi', 'filtersView' => $filtersView])
+
+@section('content')
+ @parent
+
+
+
+
+ | Kode | Nama | Status | Kategori | Lokasi | Dept | User | PIC | Garansi | Dibuat |
+
+
+
+ @forelse($assets as $asset)
+
+ | {{ $asset->code }} |
+ {{ $asset->name }} |
+ {{ $asset->status?->name }} |
+ {{ $asset->category?->name }} |
+ {{ $asset->location?->name }} |
+ {{ $asset->department?->name }} |
+ {{ $asset->user?->name }} |
+ {{ $asset->personInCharge?->name }} |
+ {{ $asset->warranty?->name }} |
+ {{ optional($asset->created_at)->format('d/m/Y') }} |
+
+ @empty
+ | Data tidak ditemukan. |
+ @endforelse
+
+
+
+
+ {{ $assets->links() }}
+
+@endsection
diff --git a/resources/views/reports/audits.blade.php b/resources/views/reports/audits.blade.php
new file mode 100644
index 0000000..35a95a4
--- /dev/null
+++ b/resources/views/reports/audits.blade.php
@@ -0,0 +1,34 @@
+@php
+ $filtersView = view('reports.partials.audit_filters', compact('filters','assets','locations'));
+@endphp
+
+@extends('reports.layout', ['title' => 'Laporan Audit', 'subtitle' => 'Filter per tanggal, status, lokasi', 'filtersView' => $filtersView])
+
+@section('content')
+ @parent
+
+
+
+
+ | Waktu | Aset | Status | Lokasi | Catatan |
+
+
+
+ @forelse($items as $item)
+
+ | {{ optional($item->audited_at)->format('d/m/Y H:i') ?: '-' }} |
+ {{ $item->asset?->code }} - {{ $item->asset?->name }} |
+ {{ ucfirst($item->status) }} |
+ {{ $item->location?->name }} |
+ {{ $item->notes ?: '-' }} |
+
+ @empty
+ | Data tidak ditemukan. |
+ @endforelse
+
+
+
+
+ {{ $items->links() }}
+
+@endsection
diff --git a/resources/views/reports/disposals.blade.php b/resources/views/reports/disposals.blade.php
new file mode 100644
index 0000000..947a7be
--- /dev/null
+++ b/resources/views/reports/disposals.blade.php
@@ -0,0 +1,34 @@
+@php
+ $filtersView = view('reports.partials.disposal_filters', compact('filters','assets'));
+@endphp
+
+@extends('reports.layout', ['title' => 'Laporan Disposal', 'subtitle' => 'Filter per tanggal, status reverse', 'filtersView' => $filtersView])
+
+@section('content')
+ @parent
+
+
+
+
+ | Waktu | Aset | Alasan | Catatan | Status |
+
+
+
+ @forelse($items as $item)
+
+ | {{ optional($item->disposed_at)->format('d/m/Y H:i') ?: '-' }} |
+ {{ $item->asset?->code }} - {{ $item->asset?->name }} |
+ {{ $item->reason ?: '-' }} |
+ {{ $item->notes ?: '-' }} |
+ {{ $item->reversed_at ? 'Reversed' : 'Active' }} |
+
+ @empty
+ | Data tidak ditemukan. |
+ @endforelse
+
+
+
+
+ {{ $items->links() }}
+
+@endsection
diff --git a/resources/views/reports/exports/assets.blade.php b/resources/views/reports/exports/assets.blade.php
new file mode 100644
index 0000000..7ecd716
--- /dev/null
+++ b/resources/views/reports/exports/assets.blade.php
@@ -0,0 +1,23 @@
+
+
+
+ | Kode | Nama | Status | Kategori | Lokasi | Dept | User | PIC | Garansi | Dibuat |
+
+
+
+ @foreach($data as $asset)
+
+ | {{ $asset->code }} |
+ {{ $asset->name }} |
+ {{ $asset->status?->name }} |
+ {{ $asset->category?->name }} |
+ {{ $asset->location?->name }} |
+ {{ $asset->department?->name }} |
+ {{ $asset->user?->name }} |
+ {{ $asset->personInCharge?->name }} |
+ {{ $asset->warranty?->name }} |
+ {{ optional($asset->created_at)->format('d/m/Y') }} |
+
+ @endforeach
+
+
diff --git a/resources/views/reports/exports/audits.blade.php b/resources/views/reports/exports/audits.blade.php
new file mode 100644
index 0000000..2d3c000
--- /dev/null
+++ b/resources/views/reports/exports/audits.blade.php
@@ -0,0 +1,18 @@
+
+
+
+ | Waktu | Aset | Status | Lokasi | Catatan |
+
+
+
+ @foreach($data as $a)
+
+ | {{ optional($a->audited_at)->format('d/m/Y H:i') }} |
+ {{ $a->asset?->code }} |
+ {{ ucfirst($a->status) }} |
+ {{ $a->location?->name }} |
+ {{ $a->notes }} |
+
+ @endforeach
+
+
diff --git a/resources/views/reports/exports/disposals.blade.php b/resources/views/reports/exports/disposals.blade.php
new file mode 100644
index 0000000..1a0505a
--- /dev/null
+++ b/resources/views/reports/exports/disposals.blade.php
@@ -0,0 +1,18 @@
+
+
+
+ | Waktu | Aset | Alasan | Catatan | Status |
+
+
+
+ @foreach($data as $d)
+
+ | {{ optional($d->disposed_at)->format('d/m/Y H:i') }} |
+ {{ $d->asset?->code }} |
+ {{ $d->reason }} |
+ {{ $d->notes }} |
+ {{ $d->reversed_at ? 'Reversed' : 'Active' }} |
+
+ @endforeach
+
+
diff --git a/resources/views/reports/exports/movements.blade.php b/resources/views/reports/exports/movements.blade.php
new file mode 100644
index 0000000..c444cf9
--- /dev/null
+++ b/resources/views/reports/exports/movements.blade.php
@@ -0,0 +1,22 @@
+
+
+
+ | Waktu | Aset | Dari Lokasi | Ke Lokasi | Dari Dept | Ke Dept | Dari User | Ke User | Catatan |
+
+
+
+ @foreach($data as $m)
+
+ | {{ optional($m->performed_at)->format('d/m/Y H:i') }} |
+ {{ $m->asset?->code }} |
+ {{ $m->fromLocation?->name }} |
+ {{ $m->toLocation?->name }} |
+ {{ $m->fromDepartment?->name }} |
+ {{ $m->toDepartment?->name }} |
+ {{ $m->fromUser?->name }} |
+ {{ $m->toUser?->name }} |
+ {{ $m->notes }} |
+
+ @endforeach
+
+
diff --git a/resources/views/reports/layout.blade.php b/resources/views/reports/layout.blade.php
new file mode 100644
index 0000000..7bd9bb8
--- /dev/null
+++ b/resources/views/reports/layout.blade.php
@@ -0,0 +1,34 @@
+@extends('layouts.master')
+
+@section('content')
+
+
+
+
+
+ {{ $filtersView }}
+
+
+
+
+@endsection
diff --git a/resources/views/reports/movements.blade.php b/resources/views/reports/movements.blade.php
new file mode 100644
index 0000000..cd44e45
--- /dev/null
+++ b/resources/views/reports/movements.blade.php
@@ -0,0 +1,34 @@
+@php
+ $filtersView = view('reports.partials.movement_filters', compact('filters','assets','locations','departments','users'));
+@endphp
+
+@extends('reports.layout', ['title' => 'Laporan Movement', 'subtitle' => 'Filter per tanggal, lokasi, dept, user', 'filtersView' => $filtersView])
+
+@section('content')
+ @parent
+
+
+
+
+ | Waktu | Aset | Dari | Ke | Catatan |
+
+
+
+ @forelse($items as $item)
+
+ | {{ optional($item->performed_at)->format('d/m/Y H:i') ?: '-' }} |
+ {{ $item->asset?->code }} - {{ $item->asset?->name }} |
+ {{ $item->fromLocation?->name ?: '-' }} / {{ $item->fromDepartment?->name ?: '-' }} / {{ $item->fromUser?->name ?: '-' }} |
+ {{ $item->toLocation?->name ?: '-' }} / {{ $item->toDepartment?->name ?: '-' }} / {{ $item->toUser?->name ?: '-' }} |
+ {{ $item->notes ?: '-' }} |
+
+ @empty
+ | Data tidak ditemukan. |
+ @endforelse
+
+
+
+
+ {{ $items->links() }}
+
+@endsection
diff --git a/resources/views/reports/partials/asset_filters.blade.php b/resources/views/reports/partials/asset_filters.blade.php
new file mode 100644
index 0000000..7d8ddde
--- /dev/null
+++ b/resources/views/reports/partials/asset_filters.blade.php
@@ -0,0 +1,86 @@
+
diff --git a/resources/views/reports/partials/audit_filters.blade.php b/resources/views/reports/partials/audit_filters.blade.php
new file mode 100644
index 0000000..a42569f
--- /dev/null
+++ b/resources/views/reports/partials/audit_filters.blade.php
@@ -0,0 +1,41 @@
+
diff --git a/resources/views/reports/partials/disposal_filters.blade.php b/resources/views/reports/partials/disposal_filters.blade.php
new file mode 100644
index 0000000..83d2723
--- /dev/null
+++ b/resources/views/reports/partials/disposal_filters.blade.php
@@ -0,0 +1,31 @@
+
diff --git a/resources/views/reports/partials/movement_filters.blade.php b/resources/views/reports/partials/movement_filters.blade.php
new file mode 100644
index 0000000..f4a24b0
--- /dev/null
+++ b/resources/views/reports/partials/movement_filters.blade.php
@@ -0,0 +1,50 @@
+
diff --git a/routes/web.php b/routes/web.php
index 4541c00..55da7e0 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -20,6 +20,7 @@ use App\Http\Controllers\AssetController;
use App\Http\Controllers\AssetTransactionController;
use App\Http\Controllers\AssetAuditController;
use App\Http\Controllers\AssetTransactionPageController;
+use App\Http\Controllers\ReportController;
use App\Http\Controllers\Controller;
Route::get('/', function () {
@@ -58,3 +59,7 @@ Route::post('assets/{asset}/audits', [AssetAuditController::class, 'store'])->na
Route::get('asset-movements', [AssetTransactionPageController::class, 'movements'])->name('asset-movements.index');
Route::get('asset-disposals', [AssetTransactionPageController::class, 'disposals'])->name('asset-disposals.index');
Route::get('asset-audits', [AssetTransactionPageController::class, 'audits'])->name('asset-audits.index');
+Route::get('reports/assets', [ReportController::class, 'assets'])->name('reports.assets');
+Route::get('reports/movements', [ReportController::class, 'movements'])->name('reports.movements');
+Route::get('reports/disposals', [ReportController::class, 'disposals'])->name('reports.disposals');
+Route::get('reports/audits', [ReportController::class, 'audits'])->name('reports.audits');