D
Modul

Produk

CRUD produk fisik & digital, varian, stok, kategori, image S3, duplicate, soft-delete dengan grace period 1 minggu.

Modul produk mengelola katalog merchant: produk fisik & digital, varian, stok, kategori, dan image upload ke S3.

File kunci

FileBarisPeran
app/Http/Controllers/ProductController.php2.348CRUD produk + varian + image + soft-delete + duplicate
app/Models/Product.php74Model utama, soft-delete
app/Models/ProductVariant.php28Varian “tipe” (warna/ukuran)
app/Models/ItemProduct.php34Kombinasi varian → stock
app/Models/Stock.php29Stok per item_product
app/Models/Category.php26Kategori per store

Model Product

Field: store_id, name, product_code, url, description, product_status ('live'/'archive'), image (array {name,url}), stock, type ('physical'/'digital'), weight, normal_price, price_sale, hpp, redirect_text, redirect_whatsapp, device, shortlink (wa/{store.sequence}{product_code}), page_pixel, lead_pixel_event, followUp, category_id, variant_products (embed array), attachment_link (digital).

Casts: stock, price_sale, hpp, normal_price, weightinteger.

Controller method utama

MethodFungsi
store()Simpan produk baru + handle categories, pixel, variant, image S3
update()Update produk
duplicate()Duplikasi batch (maks 10)
destroy()Soft-delete
hardDeleteProduct()Force delete + hapus ItemProduct
restoreProduct()Restore soft-deleted
updateProductStatus()Update product_status
updateVariantsStock()Update stok varian
updateProductDevice()Tukar device WA per produk
productFeatureAccess()Cek quota produk dari store.features

Route

Web (routes/web.php:184)

Prefix /product:

MethodPathFungsi
GET/productIndex
GET/product/createForm buat
GET/product/edit/{id}Form edit
POST/product/storeSimpan
POST/product/update/{id}Update
DELETE/product/destroy/{id}Hapus
GET/product/image-downloadDownload dari S3

API (routes/api.php:150)

Prefix /products:

MethodPathFungsi
POST/products/duplicateDuplikasi
DELETE/products/destroy_check/{id}Soft-delete batch
PATCH/products/restoreRestore
POST/products/update/{id}Update (API)
POST/products/update-stock-productUpdate stok
POST/products/update_product_deviceTukar device

Frontend

FileBaris
Index.vue3.890
CreateEdit.vue4.692
Checkout/Create.vue2.631
Checkout/Edit.vue2.358

Integrasi

ServiceUntuk
AWS S3Upload image produk & varian
Engine Botvia tellAi() setelah destroy/restore (sinkronisasi)

Temuan

  • Soft-delete grace period 1 minggudestroy_check() set deleted_at = now + 1 week. Produk “terhapus” masih muncul di list aktif selama seminggu. Besar kemungkinan bug
  • updateProductDevice() tidak cek store_id (:2278) — potensi kebocoran antar merchant
  • Import PHPUnit di productionuse function PHPUnit\Framework\isEmpty; di :37
  • Campur aduk bahasa fieldharga_normal/hpp/stok (ID) vs price_sale/stock (EN)