D
Engineering

Products

Koleksi Products — katalog, harga, variant, stock, shipping, digital attachment. Schema besar (291 baris) dengan followUp per metode. Read-only di engine-bot, writer di dazoapp.

Koleksi Products menyimpan katalog lengkap — harga, variant, stock, shipping dimensions, digital attachment, dan followUp config per metode pembayaran. Engine Bot membaca (read-only); writer utama adalah dazoapp.

Model

models/products.js:4 — productSchema, mongoose.model("Products", productSchema). Schema 291 baris — salah satu yang terbesar di repo.

Field utama

FieldTipeCatatan
idStringPrimary key (UUID)
store_idStringTenant scope
nameStringNama produk
product_codeStringSKU produk
urlStringURL produk
product_statusStringStatus
typeStringphysical / digital
normal_priceNumberHarga normal
price_sale_statusBooleanStatus harga sale
price_saleNumberDefault null — harga sale
hppNumberHarga pokok
price_typeStringTipe harga
stockNumberDefault 0
descriptionStringDefault null
attachment_linkStringLink digital product — dikirim ke customer saat payment success
redirect_textStringTeks redirect
redirect_whatsappStringDefault null
deviceStringDevice assignment
shortlinkStringShortlink
pixelStringDefault null — tracking pixel
botWelcomeStringDefault null
warehouse_idStringGudang
weight, width, length, heightNumberDimensi untuk ongkir

category_id

Array kategori:

js
category_id: [{
  id: String,
  name: String,
  value: String,    // untuk digital
  label: String,
}]

image

js
image: [{ name: String, default: null }]

variant_products

Array variant:

FieldTipeCatatan
name_variantStringDefault null
keyArrayDefault []
SKUStringDefault null
harga_normalNumberDefault 0
hppNumberDefault 0
harga_spesialNumberDefault 0
stokNumberDefault 0
statusBooleanDefault false
beratNumberDefault 0 — weight
setUtamaBooleanDefault false — variant utama
hasImageBooleanDefault false
idStringDefault null
imageArray[{ name: String }]

variant_images

js
variant_images: [{ variant: String, name: String }]

shipping

js
shipping: {
  weight, w, l, h: Number,           // dimensi
  otomatic_price_shipping: Number,
  shipping_type: String,
  otomatic: Array,
  flat: { price: Number },
  addresses: {
    id: Number,
    province, city, district, subdistrict, postal_code, address: String
  },
}

shippingForm

Field shippingForm (models/products.js:205-245) berisi form state Vue — isDirty, errors, hasError, processing, wasSuccessful, recentlySuccessful, __rememberable. Ini adalah state serialization frontend, bukan data bisnis. Dapat diabaikan saat query bisnis.

payment_method

js
payment_method: [{ name: String, status: Boolean, default: false }]

Array metode pembayaran yang aktif untuk produk.

followUp

followUpSchema (models/products.js:73-204) — struktur sama dengan Orders followUp, per metode (bank_transfer, cod, epayment) per checkpoint (welcome, order_detail, follow_up_1–follow_up_4, processing, completed, up_selling, redirect). Hanya field text (String, tanpa default).

rotatorData

js
rotatorData: {
  role: String,
  team: Array,
  distribution: Array,
  type_distribution: String,
}

CS rotator config per produk.

Read-only di engine-bot

Inkonsistensi yang diketahui

MasalahDetail
Product dipakai tanpa importSalah satu branch getProductCatalog (service/product.js) — akan throw ReferenceError
shippingForm Vue state di-persistField form state frontend terkirim ke backend dan tersimpan
deleted_at sebagai Stringmodels/products.js:277 — deleted_at: { type: String, default: null }, bukan Date

Kembali ke