Add depreciation report with filters and export
This commit is contained in:
@@ -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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
100
resources/views/reports/depreciations.blade.php
Normal file
100
resources/views/reports/depreciations.blade.php
Normal file
@@ -0,0 +1,100 @@
|
||||
@extends('layouts.master')
|
||||
|
||||
@section('content')
|
||||
<div class="d-flex align-items-center justify-content-between mb-3 page-header-breadcrumb flex-wrap gap-2">
|
||||
<div>
|
||||
<h1 class="page-title fw-medium fs-20 mb-0">Laporan Penyusutan Aset</h1>
|
||||
<p class="text-muted mb-0">Nilai buku, residual value, dan metode depresiasi per aset.</p>
|
||||
</div>
|
||||
<div class="btn-list">
|
||||
<a href="{{ request()->fullUrlWithQuery(['export' => 'excel']) }}" class="btn btn-success btn-wave">Export Excel</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card custom-card">
|
||||
<div class="card-header">
|
||||
<div class="card-title mb-0">Filter</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form class="row g-2">
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Kelas</label>
|
||||
<select name="asset_class_id" class="form-select" onchange="this.form.submit()">
|
||||
<option value="">Semua</option>
|
||||
@foreach($classes as $c)
|
||||
<option value="{{ $c->id }}" @selected(($filters['asset_class_id'] ?? '')==$c->id)>{{ $c->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Kategori</label>
|
||||
<select name="asset_category_id" class="form-select" onchange="this.form.submit()">
|
||||
<option value="">Semua</option>
|
||||
@foreach($categories as $c)
|
||||
<option value="{{ $c->id }}" @selected(($filters['asset_category_id'] ?? '')==$c->id)>{{ $c->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Status</label>
|
||||
<select name="asset_status_id" class="form-select" onchange="this.form.submit()">
|
||||
<option value="">Semua</option>
|
||||
@foreach($statuses as $s)
|
||||
<option value="{{ $s->id }}" @selected(($filters['asset_status_id'] ?? '')==$s->id)>{{ $s->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 align-self-end">
|
||||
<a href="{{ route('reports.depreciations') }}" class="btn btn-link">Reset</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card custom-card mt-3">
|
||||
<div class="card-header">
|
||||
<div class="card-title mb-0">Data Penyusutan</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered align-middle text-nowrap">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Kode</th>
|
||||
<th>Nama</th>
|
||||
<th>Kelas</th>
|
||||
<th>Kategori</th>
|
||||
<th>Status</th>
|
||||
<th>Tgl Beli</th>
|
||||
<th>Cost</th>
|
||||
<th>Residual</th>
|
||||
<th>Umur (bln)</th>
|
||||
<th>Metode</th>
|
||||
<th>Nilai Buku</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($items as $item)
|
||||
<tr>
|
||||
<td>{{ $item->code }}</td>
|
||||
<td>{{ $item->name }}</td>
|
||||
<td>{{ $item->class?->name ?: '-' }}</td>
|
||||
<td>{{ $item->category?->name ?: '-' }}</td>
|
||||
<td>{{ $item->status?->name ?: '-' }}</td>
|
||||
<td>{{ optional($item->purchase_date)->format('d/m/Y') ?: '-' }}</td>
|
||||
<td>{{ $item->cost ? number_format($item->cost,2,',','.') : '-' }}</td>
|
||||
<td>{{ $item->residual_value ? number_format($item->residual_value,2,',','.') : '-' }}</td>
|
||||
<td>{{ $item->useful_life_months ?? '-' }}</td>
|
||||
<td class="text-uppercase">{{ $item->depreciation_method }}</td>
|
||||
<td>{{ number_format($item->bookValue(),2,',','.') }}</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr><td colspan="11" class="text-center text-muted">Belum ada data.</td></tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-3">{{ $items->links() }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user