Auto-generate RFID/NFC tags based on settings

This commit is contained in:
Arya Dwi Putra
2025-12-03 09:08:29 +07:00
parent a2b8376960
commit 32a4e4e191
2 changed files with 35 additions and 0 deletions

View File

@@ -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;
}
}

View File

@@ -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'],