diff --git a/app/Http/Controllers/AssetAuditController.php b/app/Http/Controllers/AssetAuditController.php new file mode 100644 index 0000000..141ae54 --- /dev/null +++ b/app/Http/Controllers/AssetAuditController.php @@ -0,0 +1,29 @@ +validate([ + 'status' => ['required', 'string', 'in:matched,missing,damaged'], + 'notes' => ['nullable', 'string'], + 'location_id' => ['nullable', 'uuid', 'exists:asset_locations,id'], + 'audited_at' => ['nullable', 'date'], + ]); + + $this->assets->audit($asset, $data); + + return back()->with('success', 'Audit aset berhasil dicatat.'); + } +} diff --git a/app/Models/Asset.php b/app/Models/Asset.php index ff0b48c..348203b 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -97,4 +97,9 @@ class Asset extends Model { return $this->hasMany(AssetDisposal::class); } + + public function audits() + { + return $this->hasMany(AssetAudit::class); + } } diff --git a/app/Models/AssetAudit.php b/app/Models/AssetAudit.php new file mode 100644 index 0000000..da8b277 --- /dev/null +++ b/app/Models/AssetAudit.php @@ -0,0 +1,35 @@ + 'datetime', + ]; + + public function asset() + { + return $this->belongsTo(Asset::class); + } + + public function location() + { + return $this->belongsTo(AssetLocation::class, 'location_id'); + } +} diff --git a/app/Services/Asset/AssetService.php b/app/Services/Asset/AssetService.php index 83ede0f..d48dbce 100644 --- a/app/Services/Asset/AssetService.php +++ b/app/Services/Asset/AssetService.php @@ -8,6 +8,7 @@ use App\Services\System\SystemSettingService; use App\Models\AssetStatus; use App\Models\AssetMovement; use App\Models\AssetDisposal; +use App\Models\AssetAudit; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; @@ -188,4 +189,25 @@ class AssetService return $asset; }); } + + /** + * Catat audit aset untuk memastikan kesesuaian fisik vs sistem. + */ + public function audit(Asset $asset, array $data): AssetAudit + { + return DB::transaction(function () use ($asset, $data) { + $audit = AssetAudit::create([ + 'asset_id' => $asset->id, + 'status' => $data['status'], + 'notes' => $data['notes'] ?? null, + 'audited_by' => auth()->id(), + 'audited_at' => $data['audited_at'] ?? now(), + 'location_id' => $data['location_id'] ?? $asset->asset_location_id, + ]); + + $this->logHistory($asset, 'audit', 'Audit aset', $audit->toArray()); + + return $audit; + }); + } } diff --git a/database/migrations/2025_12_06_000000_create_asset_audits_table.php b/database/migrations/2025_12_06_000000_create_asset_audits_table.php new file mode 100644 index 0000000..b3ac9b8 --- /dev/null +++ b/database/migrations/2025_12_06_000000_create_asset_audits_table.php @@ -0,0 +1,27 @@ +uuid('id')->primary(); + $table->foreignUuid('asset_id')->constrained('assets')->cascadeOnDelete(); + $table->string('status')->default('matched'); // matched, missing, damaged + $table->text('notes')->nullable(); + $table->uuid('audited_by')->nullable(); + $table->timestamp('audited_at')->nullable(); + $table->foreignUuid('location_id')->nullable()->constrained('asset_locations')->nullOnDelete(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('asset_audits'); + } +}; diff --git a/resources/views/assets/show.blade.php b/resources/views/assets/show.blade.php index 4ce2049..7c385b3 100644 --- a/resources/views/assets/show.blade.php +++ b/resources/views/assets/show.blade.php @@ -201,4 +201,75 @@ + +
| Waktu | +Status | +Lokasi | +Catatan | +
|---|---|---|---|
| {{ optional($audit->audited_at)->format('d/m/Y H:i') ?: '-' }} | +{{ ucfirst($audit->status) }} | +{{ $audit->location?->name ?: '-' }} | +{{ $audit->notes ?: '-' }} | +
| Belum ada audit. | +|||