Modul produk mengelola katalog merchant: produk fisik & digital, varian, stok, kategori, dan image upload ke S3.
File kunci
| File | Baris | Peran |
|---|
app/Http/Controllers/ProductController.php | 2.348 | CRUD produk + varian + image + soft-delete + duplicate |
app/Models/Product.php | 74 | Model utama, soft-delete |
app/Models/ProductVariant.php | 28 | Varian “tipe” (warna/ukuran) |
app/Models/ItemProduct.php | 34 | Kombinasi varian → stock |
app/Models/Stock.php | 29 | Stok per item_product |
app/Models/Category.php | 26 | Kategori 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, weight → integer.
Controller method utama
| Method | Fungsi |
|---|
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:
| Method | Path | Fungsi |
|---|
| GET | /product | Index |
| GET | /product/create | Form buat |
| GET | /product/edit/{id} | Form edit |
| POST | /product/store | Simpan |
| POST | /product/update/{id} | Update |
| DELETE | /product/destroy/{id} | Hapus |
| GET | /product/image-download | Download dari S3 |
API (routes/api.php:150)
Prefix /products:
| Method | Path | Fungsi |
|---|
| POST | /products/duplicate | Duplikasi |
| DELETE | /products/destroy_check/{id} | Soft-delete batch |
| PATCH | /products/restore | Restore |
| POST | /products/update/{id} | Update (API) |
| POST | /products/update-stock-product | Update stok |
| POST | /products/update_product_device | Tukar device |
Frontend
| File | Baris |
|---|
Index.vue | 3.890 |
CreateEdit.vue | 4.692 |
Checkout/Create.vue | 2.631 |
Checkout/Edit.vue | 2.358 |
Integrasi
| Service | Untuk |
|---|
| AWS S3 | Upload image produk & varian |
| Engine Bot | via tellAi() setelah destroy/restore (sinkronisasi) |
Temuan
- Soft-delete grace period 1 minggu —
destroy_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 production —
use function PHPUnit\Framework\isEmpty; di :37
- Campur aduk bahasa field —
harga_normal/hpp/stok (ID) vs price_sale/stock (EN)