diff --git a/app/Http/Controllers/DashboardsController.php b/app/Http/Controllers/DashboardsController.php index 5e0cf83..079de1e 100644 --- a/app/Http/Controllers/DashboardsController.php +++ b/app/Http/Controllers/DashboardsController.php @@ -3,13 +3,65 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; +use App\Models\Asset; +use App\Models\AssetStatus; +use App\Models\AssetLocation; +use App\Models\AssetMovement; +use App\Models\AssetDisposal; +use App\Models\AssetAudit; +use Carbon\Carbon; class DashboardsController extends Controller { public function index() { - return view('pages.dashboards.index'); + $now = Carbon::now(); + $last30 = $now->copy()->subDays(30); + + $totalAssets = Asset::count(); + $movementCount = AssetMovement::where('created_at', '>=', $last30)->count(); + $disposalCount = AssetDisposal::whereNull('reversed_at')->count(); + $auditIssues = AssetAudit::whereIn('status', ['missing','damaged'])->count(); + + $byStatus = AssetStatus::orderBy('name') + ->get() + ->map(function ($status) { + return [ + 'label' => $status->name, + 'value' => $status->assets()->count(), + ]; + }); + + $byLocation = AssetLocation::orderBy('name') + ->get() + ->map(function ($loc) { + return [ + 'label' => $loc->name, + 'value' => $loc->assets()->count(), + ]; + })->filter(fn($row) => $row['value'] > 0)->values(); + + $recentAudits = AssetAudit::with('asset') + ->latest() + ->take(5) + ->get(); + + $recentDisposals = AssetDisposal::with('asset') + ->latest() + ->take(5) + ->get(); + + return view('pages.dashboards.index', compact( + 'totalAssets', + 'movementCount', + 'disposalCount', + 'auditIssues', + 'byStatus', + 'byLocation', + 'recentAudits', + 'recentDisposals' + )); } } diff --git a/resources/views/pages/dashboards/index.blade.php b/resources/views/pages/dashboards/index.blade.php index 9849f01..2c9c2fc 100644 --- a/resources/views/pages/dashboards/index.blade.php +++ b/resources/views/pages/dashboards/index.blade.php @@ -9,44 +9,206 @@ @section('content') - -
-
-

Dashboard

-
-
-
- -
-
- - -
-
-
- +
+
+

Dashboard Aset

+

Ringkasan kesehatan aset, pergerakan, disposal, dan audit.

+
+
- -
-
-
-
- NOTE: -

Thank you for choosing our template.. if you want to create your own customised project take a refrence of our project and you can implement here.

-
-
-
+
+
+
+
+
+
+

Total Aset

+

{{ $totalAssets }}

- + + + +
+
+
+
+
+
+
+
+
+

Movement 30 hari

+

{{ $movementCount }}

+
+ + + +
+
+
+
+
+
+
+
+
+

Disposal Aktif

+

{{ $disposalCount }}

+
+ + + +
+
+
+
+
+
+
+
+
+

Audit Bermasalah

+

{{ $auditIssues }}

+
+ + + +
+
+
+
+
+ +
+
+
+
+
Distribusi Aset per Status
+
+
+ +
+
+
+
+
+
+
Distribusi Aset per Lokasi
+
+
+ +
+
+
+
+ +
+
+
+
+
Audit Terakhir
+
+
+
+ + + + + + + + + + + @forelse($recentAudits as $audit) + + + + + + + @empty + + @endforelse + +
AsetStatusWaktuCatatan
{{ $audit->asset?->code }} - {{ $audit->asset?->name }}{{ ucfirst($audit->status) }}{{ optional($audit->audited_at)->format('d/m/Y H:i') ?: '-' }}{{ $audit->notes ?: '-' }}
Belum ada data audit.
+
+
+
+
+
+
+
+
Disposal Terakhir
+
+
+
+ + + + + + + + + + + @forelse($recentDisposals as $disposal) + + + + + + + @empty + + @endforelse + +
AsetAlasanWaktuStatus
{{ $disposal->asset?->code }} - {{ $disposal->asset?->name }}{{ $disposal->reason ?: '-' }}{{ optional($disposal->disposed_at)->format('d/m/Y H:i') ?: '-' }} + @if($disposal->reversed_at) + Reversed + @else + Active + @endif +
Belum ada data disposal.
+
+
+
+
+
@endsection @section('scripts') - - + + @endsection