diff --git a/app/Http/Controllers/AssetMaintenanceController.php b/app/Http/Controllers/AssetMaintenanceController.php new file mode 100644 index 0000000..14db406 --- /dev/null +++ b/app/Http/Controllers/AssetMaintenanceController.php @@ -0,0 +1,61 @@ +latest()->paginate(20); + $assets = Asset::orderBy('code')->get(); + + return view('assets.maintenances', compact('maintenances', 'assets')); + } + + public function store(Request $request): RedirectResponse + { + $data = $request->validate([ + 'asset_id' => ['required', 'uuid', 'exists:assets,id'], + 'performed_at' => ['nullable', 'date'], + 'description' => ['required', 'string', 'max:255'], + 'vendor' => ['nullable', 'string', 'max:255'], + 'cost' => ['nullable', 'numeric', 'min:0'], + 'status' => ['required', 'string'], + 'notes' => ['nullable', 'string'], + ]); + + AssetMaintenance::create($data); + + return back()->with('success', 'Data perawatan berhasil dicatat.'); + } + + public function update(Request $request, AssetMaintenance $asset_maintenance): RedirectResponse + { + $data = $request->validate([ + 'asset_id' => ['required', 'uuid', 'exists:assets,id'], + 'performed_at' => ['nullable', 'date'], + 'description' => ['required', 'string', 'max:255'], + 'vendor' => ['nullable', 'string', 'max:255'], + 'cost' => ['nullable', 'numeric', 'min:0'], + 'status' => ['required', 'string'], + 'notes' => ['nullable', 'string'], + ]); + + $asset_maintenance->update($data); + + return back()->with('success', 'Data perawatan berhasil diperbarui.'); + } + + public function destroy(AssetMaintenance $asset_maintenance): RedirectResponse + { + $asset_maintenance->delete(); + + return back()->with('success', 'Data perawatan dihapus.'); + } +} diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 348203b..097fc5e 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -102,4 +102,9 @@ class Asset extends Model { return $this->hasMany(AssetAudit::class); } + + public function maintenances() + { + return $this->hasMany(AssetMaintenance::class); + } } diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php new file mode 100644 index 0000000..41a901d --- /dev/null +++ b/app/Models/AssetMaintenance.php @@ -0,0 +1,32 @@ + 'datetime', + 'cost' => 'decimal:2', + ]; + + public function asset() + { + return $this->belongsTo(Asset::class); + } +} diff --git a/database/migrations/2025_12_07_000000_create_asset_maintenances_table.php b/database/migrations/2025_12_07_000000_create_asset_maintenances_table.php new file mode 100644 index 0000000..2017cea --- /dev/null +++ b/database/migrations/2025_12_07_000000_create_asset_maintenances_table.php @@ -0,0 +1,28 @@ +uuid('id')->primary(); + $table->foreignUuid('asset_id')->constrained('assets')->cascadeOnDelete(); + $table->timestamp('performed_at')->nullable(); + $table->string('description'); + $table->string('vendor')->nullable(); + $table->decimal('cost', 15, 2)->nullable(); + $table->string('status')->default('completed'); // planned, in_progress, completed + $table->text('notes')->nullable(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('asset_maintenances'); + } +}; diff --git a/resources/views/assets/maintenances.blade.php b/resources/views/assets/maintenances.blade.php new file mode 100644 index 0000000..9c4242e --- /dev/null +++ b/resources/views/assets/maintenances.blade.php @@ -0,0 +1,143 @@ +@extends('layouts.master') + +@section('content') +
+ +| Aset | +Tanggal | +Deskripsi | +Vendor | +Biaya | +Status | +Catatan | +Aksi | +
|---|---|---|---|---|---|---|---|
| {{ $item->asset?->code }} - {{ $item->asset?->name }} | +{{ optional($item->performed_at)->format('d/m/Y') ?: '-' }} | +{{ $item->description }} | +{{ $item->vendor ?: '-' }} | +{{ $item->cost ? number_format($item->cost, 2, ',', '.') : '-' }} | +{{ $item->status }} | +{{ $item->notes ?: '-' }} | ++ + + | +
| Belum ada data perawatan. | |||||||