D
Engineering

Orders

Koleksi Orders — order state, shipping, payment, address, follow-up config per metode. proof_pending_verification menahan reminder. payment_method dideklarasikan dua kali.

Koleksi Orders menyimpan order state, shipping, payment, address, dan follow-up config. Field followup_step melacak checkpoint percakapan, proof_pending_verification menahan reminder tertentu.

Model

models/orders.js:197 — orderSchema, mongoose.model("Orders", orderSchema).

Field utama

FieldTipeCatatan
idStringPrimary key (UUID) — require: true
order_numberStringrequire: true
device_idStringDevice WhatsApp + order scope
customer_idStringCustomer scope
sequenceNumberRawan race — latest value + increment tanpa atomic counter
payment_methodStringDideklarasikan dua kali (lihat di bawah)
store_idStringTenant scope
total_priceNumberDefault 0 — jumlah item snapshot, belum termasuk shipping bila code pemanggil menambah shipping terpisah
constraint_customerStringDefault null
team_idStringrequire: true
progress_orderStringrequire: true
progress_follow_upStringrequire: true
order_viaStringDefault "whatsapp"
followup_stepStringDefault null — checkpoint aktif (lihat di bawah)
last_follow_up_dateDaterequire: true
last_progress_orderStringrequire: true
statusStringDefault "pending" — pending, process, cancel
payment_statusStringDefault "unpaid" — unpaid, paid
ratingNumberDefault 0
proof_transactionStringDefault null — URL bukti transfer
proof_pending_verificationBooleanDefault false — menahan reminder tertentu
message_statusObjectwelcome, follow_up_1–follow_up_4
utm_source … utm_contentStringUTM tracking
created_at, updated_atDateMongoose timestamps

Shipping

js
shipping: {
  name, description, etd,            // String, default null
  service, code, resi,               // String, default null
  cost: Number, default null,
  courier: Schema.Types.Mixed,       // default null
}

Addresses

js
addresses: {
  id: Number, default null,
  province, city, district, subdistrict, postal_code, village, address: String
}

variant_product

js
variant_product: {
  name_variant, sku, id: String,
  harga_normal, hpp, stok, harga_spesial, berat: Number,
}

Follow-up config (followUp)

followUpSchema (models/orders.js:6-195) — Mustache template per metode pembayaran:

CheckpointSub-keyFungsi
welcomebank_transfer, cod, epaymentPesan welcome + detail order
order_detailsamaPesanan detail
follow_up_1–follow_up_4samaReminder bertahap
processingsamaPembayaran diterima, proses packing
completedsamaPesanan selesai
up_sellingsamaPromo
redirectsamaRedirect ke admin

Setiap sub-key memiliki:

FieldTipeCatatan
textStringMustache template — {{product_name}}, {{total_price}}, {{bank_accounts}}, dll.
imageStringDefault null — optional attachment URL
otomatic_sendBooleanDefault false

Follow-up checkpoint valid

Checkpoint yang aktif di setOrderFollowup:

CheckpointButuh order?
call_to_order❌
ask_product_qty❌
ask_shipping_address✅
ask_shipping_method✅
ask_payment_method✅
confirm_order✅
payment_reminder✅

Lihat Order Flow untuk detail alur.

message_status

js
message_status: {
  welcome: String,         // default null
  follow_up_1: String,     // default null
  follow_up_2: String,     // default null
  follow_up_3: String,     // default null
  follow_up_4: String,     // default null
}

Inkonsistensi yang diketahui

Relasi

RelasiField
Orders → Order_Itemsorder_items.order_id = orders.id (custom string, bukan _id)
Orders → customersorders.customer_id = customers.id
Orders → cartsvia customer_id (cart dihapus saat checkout)
Orders → agentsvia store_id + agent context

Cara akses di service

js
// service/order.js
const order = await Order.findOne({ id: orderNumber, store_id: storeId });
const items = await OrderItem.find({ order_id: order.id });

Kembali ke