| Field draft |
Tipe |
Wajib |
Katalog (catalog_products) |
Validasi |
name |
teks |
Ya |
name |
tidak boleh kosong |
brand |
teks |
Tidak |
brand |
|
variant |
teks |
Tidak |
variant |
|
gtin14 |
teks (8/12/13/14 digit) |
Tidak |
gtin14 (14 digit) |
panjang + check digit; unik di katalog |
netContent |
{ value, unit } |
Tidak |
net_content_value, net_content_unit |
value > 0; unit ∈ GRM, KGM, MLT, LTR, H87; berpasangan |
packageFamily |
enum |
Tidak |
package_family |
bottle, jar, can, carton, case, pouch, sachet, tray, cup, other, unknown |
tradeItemLevel |
enum |
Ya (bawaan each) |
trade_item_level |
each, multipack, case, other |
categoryId |
id kategori |
Tidak |
category_id (tabel product_categories) |
harus kategori yang ada; dua tingkat |
aliases |
daftar teks |
Tidak |
tabel product_aliases (scope shared) |
maks 30; huruf besar-kecil sama; minimal 2 huruf |
notes |
teks |
Tidak |
tidak disalin |
hanya dalam draft |
Disimpan sebagai JSON bersih (dipotong, dibatasi panjangnya) di details_json. Semua bagian opsional.
| Bagian |
Isi |
productNames |
official, line, language |
weight |
netValue, netUnit, printedText, grossValue, grossUnit, drainedValue |
serving |
sizeValue, sizeUnit, servingsPerPack, householdMeasure |
ingredients |
text, contains[], mayContain[], allergenStatement, components[] |
nutrition |
basis, energyTotalKcal, energyFromFatKcal, rows[] (label, amount, unit, akgPercent), vitaminsMinerals[], akgNote, source |
manufacturer |
producedBy, address, country, packedBy, distributedBy, importedBy |
contact |
serviceName, phone, email, website |
permits |
bpomNumber, bpomVerified, halalStatus, halalNumber, halalBody, halalVerified, sni, sniNumber, pirtNumber |
packaging |
type, material, recyclingCode, lengthMm, widthMm, heightMm, casePackQty, symbols[] |
usage |
preparation, storage, shelfLife, dateCodeInfo |
barcode |
text, type |
claims |
daftar teks |
| Isian |
Nilai yang diterima |
Satuan berat (netUnit, grossUnit, sizeUnit) |
GRM, KGM, MLT, LTR, H87 |
| Satuan gizi |
g, mg, mcg, kkal, kJ, mL, %, IU |
Acuan gizi (basis) |
per_serving, per_100g, per_100ml, per_pack |
| Status halal |
bersertifikat, tidak_halal, tidak_ada_logo, tidak_diketahui |
Satuan tidak dikenal ditolak dengan pesan berbahasa Indonesia. Angka boleh memakai koma desimal.
| Field |
Batas |
Keterangan |
misc |
60 pasangan { key, value } |
kunci maks 60, nilai maks 600 huruf |
miscNote |
5000 huruf |
catatan bebas |
| total detail + misc |
60 KB |
|
Jumlah foto bebas dan satu label boleh dipakai berkali-kali (tidak ada batas satu foto per sisi).
| Kolom |
Keterangan |
side |
depan, belakang, kiri, kanan, atas, bawah; unik per draft |
r2_key |
catalog-photos/<draftId>/<sisi>-<sha12>.<ekstensi> |
mime, bytes, sha256 |
JPEG/PNG/WebP, maks 8 MB, hash untuk deteksi duplikat dan embedding |
product_id |
diisi saat Publish; sebelumnya hanya terhubung ke draft |
| Field |
Nilai |
id |
UUID baru |
locale |
id-ID |
identity_status |
checksum_valid bila ada GTIN, selain itu candidate |
revision |
1 |
status |
published |
| detail, misc, foto |
disalin / dihubungkan ke produk baru |
| Field |
Keterangan |
contained_product_id, contained_qty |
Hubungan karton → botol |
| Sumber dan bukti per atribut |
Belum ada tabel/UI; gunakan nutrition.source atau Data tambahan |
Bagian physical, components, hierarchy, handling, structure, provenance, market, dan observation di details dijelaskan di Data Packaging Intelligence. Berkas tambahan disimpan di tabel product_media (kind foto/dokumen, media_type, r2_key, mime, bytes, sha256, draft_id, product_id).
| Tabel |
Keterangan |
product_categories |
id (slug), parent_id (null = utama), name, sort_order, external_refs (JSON { bpom, openFoodFacts, other }). Dua tingkat |
catalog_product_revisions |
Satu baris per suntingan produk terbit: product_id, revision (revisi sebelum disunting), snapshot_json (produk, detail, alias), edited_by, created_at |
| Perubahan |
Keterangan |
product_photos.side |
Label bebas (bukan lagi satu per sisi); note opsional. Kolom unik (draft_id, side) dihapus |
catalog_products.pack_label |
Jenis varian jumlah: renceng, pak, inner, dus, karton, bundle, paket, lainnya (kosong untuk produk satuan) |
contained_product_id + contained_qty |
Varian menunjuk produk satuan dan jumlah isinya |
trade_item_level |
Varian: multipack (renceng/pak/inner/bundle/paket), case (dus/karton), other |
Draft variants[] |
{ packLabel, containedQty, gtin14?, name? }; menjadi produk katalog saat Publish |