ERPNext v16 - Manufacturing (Versi BMP)
Jantung operasional pabrik parfum. Bila modul lain mencatat "apa yang terjadi" (beli, jual, simpan), modul ini mencatat "bagaimana barang dibuat" - transformasi RM menjadi Bulk lalu menjadi FG. Di sinilah nomor Batch lahir, HPP (COGS) barang jadi terbentuk lewat cost roll-up, dan resep rahasia (BOM) dilindungi dengan field-level permission yang ketat.
Peta dokumen:

Chapter 0 - Struktur & Cross-check
-
- Grup struktur ↔ doctype utama (erpnext/manufacturing/doctype/)

0.2 Kesimpulan struktur
Manufaktur parfum di BMP adalah operasi 2-level yang bersih:

Titik kritis yang membedakan parfum dari manufaktur umum:
- Batch lahir di Bulk, bukan di FG - karena kualitas ditentukan saat mixing, bukan saat filling.
- Maturing (WIP) adalah fase waktu, bukan fase mesin - 7+ hari diam di Maturing Zone, bukan di mesin.
- BOM adalah resep rahasia - operator produksi tidak boleh lihat qty & rate komponen (Chinese Wall).
- Cost roll-up dua tahap - RM→Bulk→FG, dengan overhead mixing & filling masuk valuasi.
0.3 Register Delta v16 (Manufacturing)
- Batch generation otomatis saat Stock Entry Manufacture submit (dari naming series).
- Overhead calculation via BOM Operation - time_in_mins × hour_rate masuk ke additional_costs di Stock Entry, otomatis menambah valuasi Bulk/FG.
- Scrap / by-product handling - sisa bulk, drum bekas alkohol bisa dicatat sebagai scrap_item dengan valuasi rendah atau nol.
- Production Plan dengan multi-level explosion - dari Sales Order bisa explode sampai ke RM (BOM1 → BOM2).
Chapter A - Masters (BOM & turunannya)
Mesin apa: Resep dan formula - aset intelektual paling berharga di pabrik parfum. BOM (Bill of Materials) adalah dokumen yang menentukan: apa saja komponen, berapa banyak, di tahap mana dikonsumsi, berapa lama prosesnya, dan berapa overhead yang masuk. Di BMP, BOM diperlakukan sebagai dokumen rahasia dengan field-level permission ketat: hanya Owner & R&D yang boleh lihat detail qty & rate; operator produksi hanya melihat kode BOM & instruksi kerja.
Perilaku per doctype:
1. BOM (erpnext/manufacturing/doctype/bom/) - master formula.
Atribut penentu perilaku:
- item = produk yang dihasilkan (Bulk atau FG).
- quantity = output qty standar (misal: 100 liter Bulk, atau 1 botol 100ml FG).
- is_active, is_default - satu item bisa punya beberapa BOM (varian resep); yang default dipakai auto-explode saat Work Order dibuat.
- rm_cost_as_per = Valuation / Price List / Valuation or Price - menentukan rate komponen saat BOM dibuat (snapshotted, tidak auto-update).
- with_operations = toggle apakah ada overhead (mixing time, filling time) yang masuk valuasi.
- transfer_material_against = Work Order atau Stock Entry - apakah bahan dipindah manual (Stock Entry for Manufacture) atau otomatis (backflush saat Manufacture entry).
Perilaku kunci:
- Submit = frozen snapshot - setelah submit, qty/rate komponen menjadi referensi; perubahan BOM = versi baru, bukan edit in-place.
- Cost roll-up otomatis - saat submit, sistem menghitung: sum(komponen qty × rate) + sum(operations time × hour_rate) = total cost → cost per unit output.
- Chinese Wall access - field rate dan qty di child BOM Item hanya visible untuk role Owner & R&D; Operator Produksi hanya melihat item_code dan instruksi kerja. Ini adalah pertahanan terakhir terhadap kebocoran formula.
2. BOM Item - child table komponen.
Field per baris:
- item_code - komponen (RM, Bulk, Packaging).
- qty - jumlah per output BOM.
- rate - harga per unit komponen (snapshot saat BOM dibuat; bisa di-override saat WO).
- uom - satuan (liter, kg, pcs, gram).
- source_warehouse - warehouse default tempat komponen diambil.
- operation (opsional) - tahap produksi di mana komponen dikonsumsi (untuk BOM2: "Filling", "Capping", "Labeling").
- scrap_item flag - untuk by-product (drum bekas, sisa cairan).
Aturan khas BMP:
- BOM1 (Bulk): semua komponen adalah RM.
- BOM2 (FG): komponen pertama = Bulk (dengan rate dari cost roll-up BOM1); komponen berikutnya = Packaging.
- Bulk di BOM2 tidak punya rate manual - rate-nya = hasil cost roll-up BOM1 (dihitung otomatis).
3. BOM Operation - child table tahap produksi + overhead.
Field per baris:
- operation - nama tahap ("Mixing", "Filling", "Capping", "Labeling", "Packaging").
- workstation - mesin/area tempat tahap dilakukan (misal: "Mixer 200L", "Filling Line 1").
- time_in_mins - durasi standar.
- hour_rate - biaya overhead per jam (listrik + tenaga kerja + depresiasi mesin).
- operating_cost = time_in_mins/60 × hour_rate (otomatis).
Perilaku untuk parfum:
- BOM1 (Bulk): biasanya satu operation = "Mixing" (4+ jam). Maturing bukan operation (karena tidak ada mesin yang aktif); maturing adalah status WIP di warehouse.
- BOM2 (FG): beberapa operations = Filling, Capping, Labeling, Packaging - masing-masing dengan waktu & overhead.
Lintas domain:
- Ke Stock (Chapter A & B): Item yang jadi BOM harus is_stock_item = Yes (kecuali jasa); Bulk = item dengan is_stock_item = Yes + warehouse type Work In Progress.
- Ke Quality (Chapter 0 Quality): BOM1 output (Bulk) wajib melewati Quality Inspection sebelum status Maturing; BOM2 output (FG) wajib QC fisik sebelum masuk FG Store.
- Ke Accounting (Chapter A): Cost roll-up BOM memberi valuation_rate ke Stock Entry Manufacture → menulis GL Stock-in-Hand dengan nilai yang jujur (RM cost + overhead).
- Ke Production Plan (Chapter C): BOM di-explode recursively; Production Plan untuk FG akan otomatis menghitung kebutuhan Bulk, lalu kebutuhan RM.
- Ke Selling (Chapter D Sales): Saat Sales Order dibuat, Production Plan membaca BOM default FG → menghitung lead time (7+ hari maturing + filling time) → memberi delivery date realistis ke customer.
Edge case
- BOM edited saat WO aktif - Work Order yang sudah dibuat membawa snapshot BOM versi lama; perubahan BOM hanya berlaku untuk WO baru. Ini mencegah "resep berubah di tengah produksi".
- Rate komponen fluktuatif - Fragrance Oil harganya USD-pegged; BOM dibuat dengan rate IDR saat itu. Saat WO dijalankan, admin bisa pilih Valuation Rate (actual moving average) atau Price List Rate (kontrak) - selisih masuk ke Purchase Price Variance di Accounting.
- Multi-level BOM recursion - ERPNext support BOM-in-BOM (BOM2 referensi BOM1). Di BMP kita flatten jadi 2 level eksplisit supaya cost roll-up lebih mudah diaudit dan tidak ada infinite loop.
- Operator lihat detail BOM - kebocoran formula adalah risiko terbesar pabrik parfum. Chinese Wall (field-level permission) adalah pertahanan teknis, tapi harus dilengkapi SOP: workstation produksi tidak boleh ada akses ke ERP; instruksi kerja dicetak terpisah tanpa qty/rate.
- BOM komponen tidak ada di stock - Work Order tidak bisa di-submit (atau submit dengan warning); Production Plan akan flag item yang perlu dibeli dulu.
- Output qty ≠ BOM quantity - BOM dibuat untuk 100 liter Bulk; realitas mixing bisa 98 atau 102 liter. Stock Entry Manufacture mengizinkan deviasi; selisih masuk ke Production Variance Account (expense).
- Scrap/by-product tidak tercatat - drum bekas alkohol atau sisa bulk yang terbuang tanpa dicatat = valuasi Bulk terlalu tinggi (karena cost-nya tidak dikurangi scrap value). Wajib catat scrap_item walau rate = 0.
Delta v16 (subset register)
- Batch generation otomatis saat Manufacture entry submit.
- Overhead via BOM Operation + additional_costs di Stock Entry.
- Production Plan multi-level explosion.
- Scrap item handling formal.
Catatan scope BMP
- Adopsi penuh: BOM + BOM Item + BOM Operation dengan 2 level (Bulk → FG), Work Order, Production Plan.
- Keputusan desain (Chinese Wall): field rate & qty di BOM Item field-level restricted ke role Owner & R&D. Operator Produksi hanya lihat kode BOM + instruksi kerja tercetak. Ini adalah implementasi teknis dari filosofi "formula adalah rahasia dagang".
- Tolak / Buang: Job Card (routing kompleks tidak perlu), Downtime Entry (mesin mixing sederhana), Subcontracting Order/Receipt (CPKB melarang maklon), Blanket Order.
- Adaptasi: Cost roll-up default = Valuation Rate (moving average RM); opsi Price List Rate untuk produksi dengan kontrak harga tetap.
- Integrasi Quality wajib: Bulk output tidak boleh masuk Maturing Zone tanpa Quality Inspection Accepted; FG output tidak boleh masuk FG Store tanpa QC fisik Accepted. Gate ini adalah hard block sistem untuk menjamin CPKB compliance.
Chapter B - Siklus Produksi (Work Order, Manufacture Entry, Maturing)
Mesin apa: lalu lintas transformasi fisik. Bila Chapter A adalah "resep", Chapter B adalah dapurnya: dokumen-dokumen yang memindahkan nilai dari RM → WIP (Bulk) → FG, melahirkan identitas batch, dan menjahit overhead ke valuasi. Polanya memakai mesin universal Stock (Stock Entry) yang dikendalikan oleh perintah produksi (Work Order) - dengan tiga lapis gerbang khas BMP: QC = hard gate, waktu = soft gate, inheritance = validasi identitas.
Siklus 4 tahap (satu batch Bulk)

Perilaku per doctype:
1. Work Order (WO) (erpnext/manufacturing/doctype/work_order/) - perintah produksi per batch.
- Atribut penentu: production_item (Bulk atau FG), qty, bom_no, fg_warehouse, wip_warehouse, source_warehouse, planned_start_date.
- Submit = snapshot BOM: child required_items di-explode dari BOM saat submit; perubahan BOM sesudahnya tidak menyentuh WO berjalan (melindungi "resep tidak berubah di tengah produksi").
- Status lifecycle: Draft → Submitted → Not Started → In Process → Completed → (Stopped/Closed) ⚠️.
- Child operations ikut dari BOM Operation (Mixing untuk WO-Bulk; Filling/Capping/Labeling/Packaging untuk WO-FG). Karena Job Card dibuang, pencatatan waktu operasi dilakukan ringan di level WO: tombol Start/Finish per operasi yang menyimpan timestamp - bahan baku SOP advisory, bukan routing formal.
- allow_overproduction ⚠️ kecil untuk Bulk (±2%) - cairan menyusut/menguap; angka 0 akan memblokir realitas lapangan.
2. Material Transfer for Manufacture - Stock Entry bertipe transfer terhadap WO: memindah RM dari RM Store → Mixing Area (atau Packaging → Staging Area). Belum konsumsi: nilai tetap stok, hanya pindah lokasi. Ini disiplin fisik: bahan yang ada di area mixing adalah bahan yang benar-benar akan dicampur.
3. Stock Entry - Manufacture (WO-Bulk) - momen kelahiran Bulk.
- Submit = SLE out RM (dari Mixing Area) + SLE in Bulk ke Maturing Zone + GL perpetual (perpindahan antar akun stok; overhead masuk valuasi).
- additional_costs (listrik mixer, tenaga kerja, depresiasi mesin dari operations time × hour_rate) menambah valuasi Bulk - inilah separuh pertama cost roll-up.
- Batch lahir di sini: auto-create via naming series (mis. BULK-2026-0007) + manufacturing_date = tanggal submit + expiry_date auto-hitung (mfg + shelf life legal, compliance only).
- Batch status awal = QC Pending - batch tidak bisa dikonsumsi apa pun sampai Quality Inspection (organoleptik: aroma vs master sample, kejernihan, kadar alkohol) berstatus Accepted → status berubah Maturing + maturing_start_date dicatat. Ini hard gate CPKB.
- Output ≠ qty WO = selisih masuk Production Variance Account; scrap (sisa cairan, drum bekas) wajib dicatat sebagai scrap_item walau rate 0 agar valuasi Bulk jujur.
4. Stock Entry - Manufacture (WO-FG) - momen filling/packaging + inheritance.
- required_items berisi Bulk (batch-managed) + Packaging. Pemilihan batch Bulk wajib.
- Validasi inheritance: satu Stock Entry FG yang mengonsumsi dua batch Bulk berbeda = diblokir (nomor label harus bermakna tunggal). FG batch auto-set = batch Bulk yang dikonsumsi - bukan naming series baru; manufacturing_date & expiry_date FG diturunkan dari Bulk (label konsisten dengan cairan di dalamnya); tanggal filling dicatat sebagai field audit terpisah ⚠️ custom.
- Soft gate maturing: saat entry dibuat, sistem menghitung umur batch Bulk sejak maturing_start_date. Bila < standar (7 hari dari Quality Procedure): warning "Ageing baru X hari (SOP 7 hari)" + alasan kompensasi wajib (mis. "pengadukan ekstra 3×/hari") → sistem auto-membuat Non Conformance tertaut ke batch, lalu proses boleh lanjut. Tanpa alasan = blokir. Ini pola "soft gate + audit trail" yang terkunci - pabrik tidak pernah berhenti, deviasi tidak pernah tak tercatat.
- Soft gate mixing bekerja sama di tahap 2: Finish Mixing sebelum durasi standar BOM = warning + catatan kompensasi wajib → Non Conformance.
- Submit = SLE out Bulk (mengurangi saldo batch: 150L → 100L → …) + SLE in FG ke Quarantine-FG menunggu QC fisik (volume, seal, label) Accepted → FG Store. Separuh kedua cost roll-up: valuasi FG = porsi Bulk + packaging + overhead filling.
- Konsumsi parsial lintas run alami: batch Bulk yang sama dipakai run 1, 2, 3 sampai saldo 0 → status Exhausted.
5. Stopped Work Order - batch yang gagal total (mis. QC menolak Bulk setelah investigasi): WO di-Stop; bahan terlanjur dikonsumsi mendarat di variance/scrap; batch Bulk berstatus Rejected dan tidak pernah bisa dikonsumsi. Jejak tetap utuh untuk audit.
Lintas domain
- Quality (hard gate): Quality Inspection wajib Accepted untuk (a) Bulk sebelum status Maturing, (b) FG sebelum FG Store. Tanpa itu, batch tidak pernah muncul di selector konsumsi.
- Quality (deviasi): Non Conformance menerima rekaman otomatis dari soft gate (mixing & maturing) - rumah "controlled deviation" CPKB.
- Stock: semua gerakan menulis SLE; warehouse zoning (RM Store / Mixing Area / Maturing Zone / Packaging Store / FG Store / Quarantine) adalah pagar lokasi; bundle menyimpan identitas.
- Accounting: perpetual GL menulis perpindahan nilai RM→WIP→FG; additional_costs = jembatan overhead ke valuasi; variance account menampung selisih; COGS FG kelak jujur karena membawa biaya mixing + filling.
- Selling: FG yang "layak jual" di mata Sales = status batch Accepted + lokasi FG Store - definisi ini diwariskan ke dokumen Sales.
Edge case
- Dua batch Bulk dalam satu run filling = diblokir; bila bisnis kelak benar-benar perlu blending, aturannya harus didesain ulang (label multi-batch), bukan dilonggarkan diam-diam.
- Operator memaksa konsumsi batch QC Pending = hard block dengan pesan jelas ("Batch menunggu QC - hubungi QA"), bukan error teknis.
- Deviasi tanpa alasan = blokir; soft gate tanpa mandatory reason = governance bolong (pola sama dengan expired override di Stock Chapter C).
- Backflush based-on: policy BMP = konsumsi berbasis Material Transferred (disiplin fisik), bukan auto-BOM ⚠️ (backflush_based_on); konsekuensinya bahan yang lupa ditransfer tidak akan terkonsumsi sistem - stok vs aktual bocor; mitigasi: SOP transfer sebelum mixing + Stock Reconciliation berkala.
- Cancel Stock Entry Manufacture = jalur rapuh: batch FG harus dilepas, saldo batch Bulk pulih, status batch kembali - validasi cancel wajib server-side (pola kerusakan klasik lapisan identitas, Stock Chapter C).
- Timestamp mixing tidak tercatat (lupa tekan Start) = SOP advisory buta; mitigasi: Start wajib sebelum Finish (Finish menolak bila Start kosong).
- Rate snapshot vs valuasi aktual: required_items membawa rate snapshot BOM; konsumsi nyata memakai valuation rate berjalan - selisihnya wajar, tapi laporan "standar vs aktual" harus ada (Chapter D) agar drift harga fragrance oil terlihat.
Delta v16 (subset register)
- Presisi conversion_factor 9 desimal menyentuh baris WO & Stock Entry (cairan: liter ↔ kg konversi density ⚠️).
- Validasi allowance diperketat di settings (overproduction).
- Perbaikan permission/validasi di sekitar batch bundle & manufacture entry.
Catatan scope BMP
- Adopsi penuh: Work Order + snapshot BOM, Material Transfer for Manufacture, Stock Entry Manufacture (backflush berbasis transfer), additional_costs overhead, scrap handling, Stopped WO.
- Keputusan desain BMP (custom first-class): lifecycle status batch (QC Pending → Maturing → Ready/Consumed → Exhausted/Rejected); batch inheritance FG←Bulk dengan validasi single-batch; expiry auto-calc compliance-only; soft gate mixing/maturing dengan Non Conformance otomatis; hard gate hanya QC.
- Tolak: Job Card, Downtime Entry (pencatatan waktu cukup timestamp Start/Finish di operasi WO).
- Policy settings: backflush_based_on = Material Transferred ⚠️; overproduction allowance Bulk ±2% (susut cair), FG ±1%.
Chapter C - Perencanaan (Production Plan)
Mesin apa: MRP (Material Requirements Planning) - mesin yang menjawab satu pertanyaan operasional terberat: "Untuk memenuhi permintaan bulan depan, apa yang harus saya produksi, apa yang harus saya beli, dan kapan semuanya harus mulai?" Ia membaca permintaan (SO/forecast/reorder), me-ledak-kan BOM dua level (FG → Bulk → RM), mengurangkan stok yang ada (termasuk WIP yang sedang maturing), lalu melahirkan dua keluaran: rencana Work Order dan Material Request pembelian - semuanya bertanggal mundur dari tanggal butuh.
Perilaku per doctype:
1. Production Plan (erpnext/manufacturing/doctype/production_plan/) - dokumen perencanaan submittable.
Input permintaan (tiga sumber, wajib berlabel):
- Sales Order - tarik SO terbuka (make-to-order: pesanan distributor/B2B besar).
- Material Request - menyerap MR auto-reorder dari Stock (make-to-stock: FG yang reorder level-nya tertembus).
- Baris manual (forecast) - untuk demand marketplace B2C yang tidak hidup sebagai SO individual (rekap CSV harian = historis, bukan komitmen); owner menargetkan qty produksi per SKU per periode.
- Anti-double-count: setiap baris permintaan menyimpan sumbernya (SO-xxx / MR-xxx / Forecast); satu SKU yang muncul dari dua sumber wajib dikonsolidasikan atau salah satu dihapus - edge case paling mahal di perencanaan.
Proses MRP (saat "Get Items for MR" dijalankan):
- Explode BOM2: demand FG 1.000 botol → butuh Bulk X liter + botol/cap/stiker/box sesuai BOM.
- Explode BOM1: Bulk X liter → butuh alkohol/fragrance oil/aquadest/additives sesuai BOM.
- Kurangi setiap level dengan stok tersedia (Bin actual − reserved) + planned receipts (WO terbuka - termasuk batch Bulk yang sedang maturing di Maturing Zone; ia adalah rencana penerimaan yang sah).
- Sisa netto = dasar keluaran: item buatan sendiri (Bulk, FG) → child Work Order plan; item beli (RM, packaging) → child Material Request plan dengan required_date mundur mengikuti lead time beli.
Backward scheduling - logika tanggal yang membuat plan jujur: ERPNext menjadwalkan mundur memakai lead_time_days per item. Agar mesin native ini jujur untuk parfum, BMP meng-encode realitas proses ke dalam lead time master:
- Bulk.lead_time_days = 9 (1 hari mixing + 7 hari maturing + 1 hari buffer QC)
- FG.lead_time_days = 1-2 (filling + capping + labeling + QC fisik)
- RM beli: lead_time_days per item (alkohol lokal 2-3 hari; fragrance oil indent bisa 14-30 hari ⚠️ konfig)
Contoh mundur dari satu demand:

Tanpa MRP, angka "27-Aug" itu hidup di kepala owner. Dengan Production Plan, ia lahir otomatis setiap kali plan dijalankan.
Keluaran (aksi setelah review):
- Make Work Order - melahirkan WO-Bulk & WO-FG bertanggal sesuai jadwal (snapshot BOM terjadi di sini, Chapter B).
- Make Material Request - melahirkan MR pembelian bertanggal required_date; purchasing tinggal meneruskan ke PO (Purchase Chapter B).
- Plan tetap draft sampai dilepas = ruang what-if: jalankan, lihat shortage, geser qty/tanggal, jalankan ulang - tidak ada yang terlanjur tercipta.
2. Capacity check khas BMP (soft gate, konsisten filosofi kita): ERPNext tidak punya finite-capacity scheduling ⚠️. Bottleneck nyata pabrikmu = tangki mixing (100L/200L) × jam mixing. BMP menambah validasi lunak di atas plan: total volume Bulk terencana per tanggal vs kapasitas harian terkonfigurasi (mis. 2 tangki × 3 batch/hari ≈ 400-600L ⚠️ konfig). Kelebihan = warning + alasan, bukan blokir - sama seperti ageing 3 hari: pabrik boleh memaksakan lembur/shift tambahan, tapi pemaksaan itu terlihat dan tercatat.
3. Dua mode replenishment per SKU (kebijakan, bukan teknis):
- Mass market SKU (perputaran cepat): make-to-stock - reorder level + safety stock di Item; auto-reorder melahirkan MR yang diserap plan.
- Niche SKU (polarisasi, lambat): make-to-order / forecast kecil - mencegah modal mengendap di botol yang laku 5/bulan (konsisten wawasan "niche ≠ dead stock" di Stock Chapter E).
Lintas domain
- Selling: plan memberi janji tanggal yang realistis - sales tidak boleh menjanjikan 20-Sep bila plan menunjukkan mixing harus mulai kemarin; lead time awareness mengalir balik ke customer.
- Buying: MR bertanggal = purchasing tahu kapan PO harus terbit, bukan hanya berapa; fragrance oil ber-lead-time panjang (indent) terlihat lebih dulu.
- Stock: Bin & projected quantity = bahan baku perhitungan; warehouse zoning menentukan source_warehouse per komponen; safety stock & reorder = pemicu make-to-stock.
- Quality: buffer QC sudah tertanam di lead time Bulk (1 hari dari 9) - perencanaan mengasumsikan SOP penuh (7 hari maturing); deviasi (ageing 3 hari) hanya mempercepat aliran internal, tidak pernah menjadi dasar janji ke customer. Plan by SOP, deviate only when needed.
- Accounting: tidak menulis apa pun - plan murni perencanaan; komitmen finansial baru lahir saat MR→PO (Buying) dan WO→konsumsi (Chapter B).
Edge case
- Double-count demand (SO + forecast untuk botol yang sama) = overproduction diam-diam; mitigasi: label sumber per baris + konsolidasi wajib sebelum release.
- lead_time_days basi = jadwal bohong. Bila maturing diubah kebijakan (mis. jadi 10 hari untuk formula baru), Bulk.lead_time_days wajib ikut diubah - plan hanya sejujur master data-nya.
- Fragrance oil indent/backorder di distributor: lead time beli melonjak di luar lead_time_days; mitigasi: safety stock lebih tinggi untuk oil ber-lead-time panjang + flag "indent" di Item.
- Plan basi vs eksekusi: BOM berubah atau stok bergerak antara plan dan release → angka shortage tidak lagi benar; mitigasi: re-run plan sebelum release bila plan berumur > N hari ⚠️ konfig.
- Kapasitas dilewati terus-menerus = bottleneck tersembunyi yang "dimaafkan" sistem; mitigasi: laporan frekuensi override kapasitas per bulan - pola yang sama dengan laporan deviasi Non Conformance.
- Forecast marketplace volatil (viral/campaign) = akurasi rendah; mitigasi disiplin proses: plan mingguan, horizon 4-6 minggu, safety stock hanya untuk SKU mass market.
- WO/MR hasil plan di-cancel parsial = plan kehilangan jejak "mana yang sudah dilepas"; status per baris plan (Pending/Released) wajib dirawat ⚠️.
Delta v16 (subset register)
- Presisi conversion_factor 9 desimal menyentuh qty hasil explode (liter ↔ kg density) - relevan karena explode BOM1 bekerja dalam campuran satuan.
- Perbaikan validasi/permission minor di sekitar Production Plan ⚠️; tidak ada perubahan mesin inti (MRP tetap explode + netting + backward scheduling sederhana).
Catatan scope BMP
- Adopsi penuh: Production Plan dengan tiga sumber permintaan berlabel, multi-level explosion (FG→Bulk→RM), netting stok+WIP, keluaran WO plan + MR plan, draft-untuk-what-if.
- Keputusan desain BMP: maturing+QC di-encode ke lead_time_days Bulk (=9) dan FG (=1-2) - mesin native ERPNext menjadi jujur tanpa menulis scheduler custom; ini adaptasi master data, bukan kode.
- Keputusan desain BMP (custom lunak): capacity check tangki per hari = warning + alasan (soft gate); label sumber demand anti-double-count; laporan frekuensi override kapasitas.
- Tunda: finite-capacity scheduling engine & drag-drop scheduler (kebutuhan enterprise; pabrik 2-3 tangki cukup dengan warning + akal sehat owner).
- Kebijakan operasional: mass market = make-to-stock (reorder+safety stock); niche = make-to-order/forecast kecil; plan mingguan, horizon 4-6 minggu.
Chapter D - Reports
Mesin apa: proyeksi atas ledger manufaktur - membaca WO, BOM, SLE, dan Quality untuk menjawab empat pertanyaan pemilik pabrik: "berapa yang kita hasilkan vs rencana?", "bisa bikin sekarang tidak?", "WO ini macet di mana?", dan "batch ini datang dari mana, pergi ke mana?" - plus dua lensa khas BMP: standar vs aktual (apakah resep masih jujur?) dan ledger deviasi (apakah SOP kita masih ditaati?).
Perilaku per laporan (di erpnext/manufacturing/report/):
- Production Analytics - agregasi WO selesai per item/periode: qty diproduksi, planned vs actual, ketepatan jadwal. Bagi pabrikmu: liter Bulk & botol FG per bulan. Angka waktunya hanya sejujur disiplin timestamp Start/Finish di operasi WO (Chapter B).
- BOM Explorer - ledakan BOM sebagai tree interaktif: pilih FG → tampil Bulk + packaging → ledakkan Bulk ke RM. Alat R&D/Owner memverifikasi struktur resep dua level. Role-gated: versi penuh (qty+rate) hanya Owner/R&D; operator melihat struktur dengan kode internal saja - Chinese Wall hidup juga di laporan.
- BOM Stock Report - "dengan stok sekarang, BOM ini bisa jadi berapa unit?": minimum antar komponen (qty tersedia ÷ kebutuhan per unit) ⚠️. Cek kelayakan sebelum planning; wajib membaca available qty (bukan reserved, bukan QC-pending) atau memberi keyakinan palsu.
- Work Order Stock Report - per WO: dibutuhkan vs ditransfer vs dikonsumsi. Pandangan operasional harian: WO mana yang macet menunggu bahan.
- Batch Traceability - jawaban audit CPKB dalam satu layar: masukkan Batch → rantai penuh lot supplier (PR) → RM dikonsumsi → Bulk (Stock Entry Manufacture, timestamp mixing, hasil QC) → run filling (FG mewarisi batch) → DN/SI ke customer. Memperluas Serial and Batch Traceability (Stock Chapter E) dengan lapisan WO/QC - inilah laporan yang dibuka saat BPOM bertanya.
- Standard vs Actual Cost (lensa BMP) - BOM cost (snapshot) vs biaya produksi aktual (valuasi + additional_costs + variance). Mengungkap dua sumber drift yang wajib dibedakan: rate variance (harga fragrance oil naik) vs quantity variance (yield turun / susut naik) - pembeda yang sama disiplinnya dengan "selisih kurs vs kenaikan harga" di Purchase.
- Deviation Ledger (BMP-native) - agregasi Non Conformance yang lahir dari soft gate: frekuensi deviasi per jenis (mixing lebih cepat, maturing dipotong, override kapasitas), per bulan, per kategori alasan. Pasangan wajib soft gate - tanpa agregasi, deviasi menjadi erosi SOP yang tak terlihat. Prinsipnya sama dengan Budget Variance (Accounting G): laporan yang mengubah "polisi" menjadi "alat belajar".
Lintas domain: membaca WO/BOM (Chapter A-B), Bin & SLE (Stock), Quality Inspection & Non Conformance (Quality), valuasi (Stock D / Accounting); BOM Explorer & Traceability dibatasi role; Deviation Ledger & override kapasitas menembus ke My Attention bila melewati ambang (pola yang sama dengan integrasi Stock Ageing/Shortage).
Edge case:
- Analytics hanya sejujur timestamp - operator lupa Start/Finish = durasi kosong; laporan menampilkan kosong apa adanya, tidak mengarang.
- BOM Stock Report memberi keyakinan palsu bila stok terlihat cukup tapi sudah direservasi WO lain atau berstatus QC Pending - laporan harus membaca available, bukan actual.
- Traceability berbohong bila inheritance dilanggar - validasi satu-batch-per-run (Chapter B) adalah pencegahan termurah; laporan hanya menampilkan apa yang sistem izinkan terjadi.
- Drift aktual disalahbaca sebagai "harga naik" padahal yield turun - maka laporan #6 memisah rate vs quantity variance, bukan satu angka gabungan.
- Deviation Ledger tanpa tindak lanjut = normalisasi deviasi; aturan praktis: alasan deviasi yang sama berulang N kali → SOP-nya yang direview, bukan deviasinya yang dimaklumi.
Delta v16 (subset register): traceability report diresmikan sebagai laporan bawaan (pola sama dengan Stock); optimasi performa report via snapshot - detail manufacturing-specific ⚠️.
Catatan scope BMP:
- Adopsi penuh: Production Analytics, BOM Explorer (role-gated), BOM Stock, WO Stock, Batch Traceability.
- Keputusan desain BMP: Standard vs Actual dengan pemisahan rate/quantity variance; Deviation Ledger sebagai agregasi Non Conformance - soft gate tanpa agregasi = kebijakan yang tidak bisa dievaluasi.
- Adaptasi UI: Deviation Ledger & override kapasitas muncul di My Attention saat melewati ambang - konsistensi pola landing page.
Chapter E - Manufacturing Settings
Mesin apa: ruang policy modul - single doctype (manufacturing_settings) yang tidak memproduksi apa pun, tapi menentukan boleh-tidaknya dan bagaimana seluruh aktivitas Chapter A-D terjadi. Pola yang sama dengan Accounts Settings dan Stock Settings - wujud modul Administration untuk domain manufaktur.
Perilaku per kelompok policy:
- Konsumsi & backflush: backflush_based_on = Material Transferred for Manufacture (keputusan BMP - disiplin fisik; auto-BOM ditolak). Konsekuensi yang harus dirawat: SOP "transfer dulu sebelum mixing" + Stock Reconciliation berkala. Mengganti policy ini di tengah riwayat = percampuran semantik konsumsi - keputusan satu arah, pola yang sama dengan perpetual vs periodic.
- Warehouse default: WIP default = Maturing Zone, FG default mengikuti zoning (Chapter B) - menyambungkan policy ke pagar lokasi tanpa user memilih manual ⚠️.
- Allowance produksi: overproduction Bulk ±2% (cairan menyusut/menguap - angka 0 akan memblokir realitas lapangan) dan FG ±1% ⚠️. Allowance adalah pagar, bukan izin: terlalu longgar = kebocoran tak terlihat.
- Kelahiran & warisan batch: auto-create batch via naming series saat Manufacture submit (item has_batch_no); batch inheritance FG ← Bulk default ON untuk item kategori parfum - satu-satunya pengecualian terhadap "batch baru per produksi", dengan validasi satu-batch-per-run sebagai penjaganya.
- SOP waktu (keputusan BMP, custom):
- standard_maturing_days default 7; override per-BOM (maturing_days di BOM1) menang atas global - jalur bagi formula dengan kebutuhan maturing berbeda (EDC kelak).
- Role-gated Owner/R&D; perubahan = peristiwa audit (siapa/kapan/dari/ke).
- Tidak retroaktif: WO menangkap nilai saat dibuat (snapshot, konsisten prinsip "policy tidak retroaktif" di semua modul).
- Standar waktu mixing tidak punya field sendiri - dibaca dari time_in_mins BOM Operation: satu sumber kebenaran, tidak ada angka kembar.
- Kapasitas (keputusan BMP, custom): konfigurasi kapasitas tangki per hari (bahan baku soft check Production Plan, Chapter C). Mengubah konfigurasi = peristiwa governance; angka terlalu rendah yang dibiarkan = warn fatigue (pola Budget G).
- Costing: sumber rate BOM default = Valuation Rate (moving average RM); update BOM cost automatically = OFF - snapshot disiplin; bila harga berubah signifikan, Owner menjalankan "recalculate BOM cost" secara eksplisit + audit, bukan pergeseran senyap.
Lintas domain: policy di sini menggerbangi Chapter B-C; warehouse default membaca zoning Stock; deviasi waktu mencatat ke Non Conformance (Quality); threshold deviasi menembus ke My Attention; snapshot costing memberi angka ke laporan Standard vs Actual (Chapter D).
Edge case:
- standard_maturing_days diubah saat ada batch sedang maturing → snapshot melindungi WO berjalan; hanya WO baru mengikuti standar baru - by design, bukan bug.
- backflush_based_on diganti setelah ada riwayat = semantik konsumsi bercampur; perlakukan sebagai keputusan satu arah dengan dokumentasi.
- BOM cost auto-update bila (keliru) dinyalakan = COGS historis bergeser senyap - alasan BMP menguncinya OFF.
- Settings terlihat oleh operator = standar resep bocor; akses settings ikut dibatasi Owner/R&D (Chinese Wall berlaku sampai ke ruang policy).
- Allowance terlalu longgar berbulan-bulan = selisih aktual-standar menumpuk tanpa alarm; Deviation Ledger & Standard vs Actual adalah jaringnya.
Delta v16 (subset register): doctype settings relatif stabil v14→v16; perbaikan validasi & permission minor ⚠️ - tidak ada perubahan mesin inti.
Catatan scope BMP:
- Adopsi: pola single doctype policy; warehouse default; allowance.
- Keputusan desain BMP: backflush = material transferred; overproduction Bulk 2% / FG 1%; standard_maturing_days + override BOM + audit + snapshot; soft capacity check; BOM cost snapshot (auto-update OFF); batch inheritance default ON untuk parfum.
- Tolak: finite-capacity scheduling engine; seluruh keluarga job card settings.