From 403364a6ad339e238e125c898315ece517dd2dfd Mon Sep 17 00:00:00 2001 From: Arya Dwi Putra Date: Wed, 3 Dec 2025 08:36:50 +0700 Subject: [PATCH] Add sample import CSV and support image download --- app/Http/Controllers/AssetController.php | 26 +++++++++++++++++++++++- public/samples/assets_import_sample.csv | 6 ++++++ resources/views/assets/index.blade.php | 7 ++++++- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 public/samples/assets_import_sample.csv diff --git a/app/Http/Controllers/AssetController.php b/app/Http/Controllers/AssetController.php index 623e00d..8891084 100644 --- a/app/Http/Controllers/AssetController.php +++ b/app/Http/Controllers/AssetController.php @@ -256,6 +256,7 @@ class AssetController extends Controller 'quantity' => (int) ($row['quantity'] ?? 1), 'available_quantity' => (int) ($row['available_quantity'] ?? $row['quantity'] ?? 1), 'is_pool' => !empty($row['is_pool']), + 'image_url' => $row['image_url'] ?? null, ], 'target_id' => $targetId, ]; @@ -279,16 +280,39 @@ class AssetController extends Controller foreach ($rows as $row) { if ($row['status'] === 'invalid') { $invalid++; continue; } $payload = $row['payload']; + $imageUrl = $payload['image_url'] ?? null; + unset($payload['image_url']); + + $assetModel = null; if ($row['target_id']) { Asset::where('id', $row['target_id'])->update($payload); + $assetModel = Asset::find($row['target_id']); $updated++; } else { if (!$payload['code']) { $payload['code'] = 'IMP-'.Str::upper(Str::random(6)); } - Asset::create($payload + ['qr_token' => Str::uuid()]); + $assetModel = Asset::create($payload + ['qr_token' => Str::uuid()]); $created++; } + + // Download image jika disediakan + if ($assetModel && $imageUrl) { + try { + $resp = \Illuminate\Support\Facades\Http::get($imageUrl); + if ($resp->ok()) { + $path = "assets/{$assetModel->id}/import-".Str::random(6).".jpg"; + \Illuminate\Support\Facades\Storage::disk('public')->put($path, $resp->body()); + \App\Models\AssetPhoto::create([ + 'asset_id' => $assetModel->id, + 'path' => $path, + 'is_primary' => $assetModel->photos()->count() === 0, + ]); + } + } catch (\Throwable $e) { + // abaikan error download agar import tetap lanjut + } + } } return back()->with('success', "Import selesai. Create: {$created}, Update: {$updated}, Invalid: {$invalid}"); diff --git a/public/samples/assets_import_sample.csv b/public/samples/assets_import_sample.csv new file mode 100644 index 0000000..6693ddc --- /dev/null +++ b/public/samples/assets_import_sample.csv @@ -0,0 +1,6 @@ +code,name,serial_number,status,category,location,rfid_tag,nfc_tag,is_consumable,quantity,available_quantity,is_pool,image_url +AST-90001,Laptop Dell XPS 13,SN-XPS-90001,Active,Laptop,Warehouse,RFID-10001,NFC-10001,0,1,1,0,https://images.unsplash.com/photo-1517336714731-489689fd1ca8?auto=format&fit=crop&w=800&q=80 +AST-90002,Printer HP LaserJet,SN-HP-90002,Active,Printer,Warehouse,RFID-10002,NFC-10002,0,1,1,0,https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?auto=format&fit=crop&w=800&q=80 +AST-90003,Kursi Ergonomis,SN-CHAIR-90003,Active,Furniture,Office A,RFID-10003,NFC-10003,0,10,10,1,https://images.unsplash.com/photo-1433838552652-f9a46b332c40?auto=format&fit=crop&w=800&q=80 +AST-90004,Tinta Printer Hitam,,Active,Consumable,Warehouse,,,1,50,50,0,https://images.unsplash.com/photo-1504384308090-c894fdcc538d?auto=format&fit=crop&w=800&q=80 +AST-90005,Router Mikrotik CCR,SN-RT-90005,Active,Network,Data Center,RFID-10005,NFC-10005,0,1,1,0,https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format&fit=crop&w=800&q=80 diff --git a/resources/views/assets/index.blade.php b/resources/views/assets/index.blade.php index c03af95..1fab8d8 100644 --- a/resources/views/assets/index.blade.php +++ b/resources/views/assets/index.blade.php @@ -325,7 +325,12 @@
@csrf