diff --git a/app/Services/Asset/AssetService.php b/app/Services/Asset/AssetService.php index 131827b..761d0d3 100644 --- a/app/Services/Asset/AssetService.php +++ b/app/Services/Asset/AssetService.php @@ -36,6 +36,7 @@ class AssetService return DB::transaction(function () use ($data) { $data['code'] = $this->generateCode(); $data['qr_token'] = $data['qr_token'] ?? Str::uuid()->toString(); + $this->maybeAutoTag($data); // Hitung warranty_end jika ada warranty dan purchase_date if (!empty($data['purchase_date']) && empty($data['warranty_end'])) { @@ -64,6 +65,7 @@ class AssetService public function update(Asset $asset, array $data): Asset { return DB::transaction(function () use ($asset, $data) { + $this->maybeAutoTag($data, $asset); $asset->update($data); if ($this->settings->get('asset.qr_enabled', true)) { $this->generateQr($asset); @@ -309,4 +311,35 @@ class AssetService 'payload' => $payload, ]); } + + /** + * Generate RFID/NFC tag otomatis sesuai setting jika belum diisi. + */ + private function maybeAutoTag(array &$data, ?Asset $existing = null): void + { + $code = $data['code'] ?? $existing?->code ?? null; + if (!$code) { + return; + } + if ($this->settings->get('asset.rfid_auto_generate', false) && empty($data['rfid_tag'])) { + $data['rfid_tag'] = $this->uniqueTag("RFID-{$code}", 'rfid_tag', $existing?->id); + } + if ($this->settings->get('asset.nfc_auto_generate', false) && empty($data['nfc_tag'])) { + $data['nfc_tag'] = $this->uniqueTag("NFC-{$code}", 'nfc_tag', $existing?->id); + } + } + + private function uniqueTag(string $base, string $column, ?string $exceptId = null): string + { + $candidate = $base; + $counter = 1; + while ( + Asset::where($column, $candidate) + ->when($exceptId, fn($q) => $q->where('id', '!=', $exceptId)) + ->exists() + ) { + $candidate = "{$base}-" . (++$counter); + } + return $candidate; + } } diff --git a/database/seeders/SettingSeeder.php b/database/seeders/SettingSeeder.php index 0911c4f..6f5799d 100644 --- a/database/seeders/SettingSeeder.php +++ b/database/seeders/SettingSeeder.php @@ -34,6 +34,8 @@ class SettingSeeder extends Seeder ['key' => 'asset.consumable_enabled', 'value' => true, 'type' => 'boolean', 'group' => 'asset', 'description' => 'Aktifkan stok consumable/pool pinjaman'], ['key' => 'asset.rfid_required', 'value' => false, 'type' => 'boolean', 'group' => 'asset', 'description' => 'Wajibkan pengisian RFID ketika aset dibuat/di-update'], ['key' => 'asset.nfc_required', 'value' => false, 'type' => 'boolean', 'group' => 'asset', 'description' => 'Wajibkan pengisian NFC ketika aset dibuat/di-update'], + ['key' => 'asset.rfid_auto_generate', 'value' => true, 'type' => 'boolean', 'group' => 'asset', 'description' => 'Otomatis generate RFID jika kosong, menggunakan kode aset'], + ['key' => 'asset.nfc_auto_generate', 'value' => true, 'type' => 'boolean', 'group' => 'asset', 'description' => 'Otomatis generate NFC jika kosong, menggunakan kode aset'], ['key' => 'asset.qr_format', 'value' => 'svg', 'type' => 'string', 'group' => 'asset', 'description' => 'Format file QR (svg/png/pdf)'], ['key' => 'asset.qr_size', 'value' => 300, 'type' => 'integer', 'group' => 'asset', 'description' => 'Ukuran sisi QR dalam pixel'],