From efbaf711e64e36598534d28db6676aefd86ec2f1 Mon Sep 17 00:00:00 2001 From: Arya Dwi Putra Date: Tue, 2 Dec 2025 16:23:52 +0700 Subject: [PATCH] Add depreciation report with filters and export --- app/Http/Controllers/ReportController.php | 40 +++++++ .../views/reports/depreciations.blade.php | 100 ++++++++++++++++++ routes/web.php | 1 + 3 files changed, 141 insertions(+) create mode 100644 resources/views/reports/depreciations.blade.php diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 27cd9d8..df8977a 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -262,4 +262,44 @@ class ReportController extends Controller 'locations' => AssetLocation::orderBy('name')->get(), ]); } + + public function depreciations(Request $request) + { + $filters = $request->only(['asset_class_id','asset_category_id','asset_status_id']); + $query = Asset::with(['class','category','status','vendorContract']) + ->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_status_id'] ?? null, fn($q,$v) => $q->where('asset_status_id',$v)); + + $items = $query->paginate(config('system.ui.table_page_size', 20))->withQueryString(); + + if ($request->get('export') === 'excel') { + $rows = $query->get()->map(function($a){ + return [ + $a->code, + $a->name, + $a->class?->name, + $a->category?->name, + $a->status?->name, + $a->purchase_date?->format('d/m/Y'), + $a->cost, + $a->residual_value, + $a->useful_life_months, + $a->depreciation_method, + $a->bookValue(), + ]; + })->toArray(); + return Excel::download(new ArrayReportExport([ + 'Kode','Nama','Kelas','Kategori','Status','Tgl Beli','Cost','Residual','Umur (bln)','Metode','Nilai Buku' + ], $rows),'asset-depreciation.xlsx'); + } + + return view('reports.depreciations', [ + 'items' => $items, + 'filters' => $filters, + 'classes' => AssetClass::orderBy('name')->get(), + 'categories' => AssetCategory::orderBy('name')->get(), + 'statuses' => AssetStatus::orderBy('name')->get(), + ]); + } } diff --git a/resources/views/reports/depreciations.blade.php b/resources/views/reports/depreciations.blade.php new file mode 100644 index 0000000..2c65ae8 --- /dev/null +++ b/resources/views/reports/depreciations.blade.php @@ -0,0 +1,100 @@ +@extends('layouts.master') + +@section('content') +
+
+

Laporan Penyusutan Aset

+

Nilai buku, residual value, dan metode depresiasi per aset.

+
+ +
+ +
+
+
Filter
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ Reset +
+
+
+
+ +
+
+
Data Penyusutan
+
+
+
+ + + + + + + + + + + + + + + + + + @forelse($items as $item) + + + + + + + + + + + + + + @empty + + @endforelse + +
KodeNamaKelasKategoriStatusTgl BeliCostResidualUmur (bln)MetodeNilai Buku
{{ $item->code }}{{ $item->name }}{{ $item->class?->name ?: '-' }}{{ $item->category?->name ?: '-' }}{{ $item->status?->name ?: '-' }}{{ optional($item->purchase_date)->format('d/m/Y') ?: '-' }}{{ $item->cost ? number_format($item->cost,2,',','.') : '-' }}{{ $item->residual_value ? number_format($item->residual_value,2,',','.') : '-' }}{{ $item->useful_life_months ?? '-' }}{{ $item->depreciation_method }}{{ number_format($item->bookValue(),2,',','.') }}
Belum ada data.
+
+
{{ $items->links() }}
+
+
+@endsection diff --git a/routes/web.php b/routes/web.php index 3981360..95e49be 100644 --- a/routes/web.php +++ b/routes/web.php @@ -108,6 +108,7 @@ Route::middleware(['auth','maintenance.readonly','session.timeout','audit.reques Route::get('reports/movements', [ReportController::class, 'movements'])->name('reports.movements')->middleware('permission:reports.view'); Route::get('reports/disposals', [ReportController::class, 'disposals'])->name('reports.disposals')->middleware('permission:reports.view'); Route::get('reports/audits', [ReportController::class, 'audits'])->name('reports.audits')->middleware('permission:reports.view'); + Route::get('reports/depreciations', [ReportController::class, 'depreciations'])->name('reports.depreciations')->middleware('permission:reports.view'); Route::resource('asset-maintenances', AssetMaintenanceController::class)->only(['index','store','update','destroy']) ->middleware('permission:maintenance.manage');