ERPNext v16 - Purchase (Versi BMP)
Modul Purchase di BMP dirancang khusus untuk manufaktur parfum (CPKB Gol. B). Karena 90% pembelian adalah Raw Material (Alkohol, Fragrance Oil, Aquadest, Additives) dari supplier langganan (5-10 vendor), kita memangkas habis fitur "tender" yang rumit (RFQ, Supplier Quotation, Supplier Scorecard) dan memfokuskan modul ini pada dua hal yang benar-benar kritis bagi pabrikmu: Gerbang Mutu Masuk (Incoming QC) dan Akurasi Harga Modal (Landed Cost).
Peta dokumen:
| Chapter |
Isi |
Kedalaman |
| 0 |
Struktur & Cross-check |
✅ |
| A |
Masters & Parties (Supplier, grup, default pembelian) |
Penuh |
| B |
Siklus Transaksi (PO, PR, Landed Cost, QC Gate) |
Penuh (Lanjut) |
| C |
Buying Settings |
Policy |
| D |
Reports |
Sedang |
Chapter 0 - Struktur & Cross-check
0.1 Grup struktur ↔ doctype utama (erpnext/buying/doctype/)
| Grup |
Doctype |
Status di BMP |
| Parties |
supplier, supplier_group |
Adopsi Penuh |
| Siklus Komersial |
purchase_order (PO) |
Adopsi Penuh |
| Eksekusi Fisik |
purchase_receipt (PR) |
Adopsi Penuh (dengan QC Gate) |
| Penilaian Biaya |
landed_cost_voucher (LCV) |
Adopsi Penuh (Krusial) |
| Tender / Bidding |
request_for_quotation (RFQ), supplier_quotation |
Tolak / Sembunyikan (Supplier sudah langganan) |
| Governance |
supplier_scorecard |
Tolak (5-10 vendor tidak butuh scoring formal) |
| Settings |
buying_settings |
Adopsi |
0.2 Kesimpulan Struktur
Siklus beli di BMP sangat pendek dan langsung: Material Request (dari Produksi) ➔ Purchase Order ➔ Purchase Receipt (QC Gate) ➔ Purchase Invoice (Accounting). Tidak ada negosiasi harga per transaksi karena harga RM (terutama Fragrance Oil impor dan Alkohol) biasanya sudah dikontrak per periode atau mengikuti kurs.
Chapter A - Masters & Parties
Mesin apa: Kamus "siapa" penyedia bahan baku dan kemasan, serta aturan main dasar bertransaksi dengan mereka. Master di sini menentukan ke mana utang usaha (Account Payable) menempel di ledger, dan bagaimana pajak potong pungut (PPh 23) dihitung otomatis saat tagihan datang.
Perilaku per doctype:
- Supplier (erpnext/buying/doctype/supplier/) - master vendor. Atribut penentu perilaku:
- supplier_group: klasifikasi (mis. Importir Fragrance Oil, Supplier Alkohol Lokal, Supplier Kemasan, Jasa Ekspedisi).
- default_currency: mata uang tagihan (USD untuk oil impor, IDR untuk alkohol lokal).
- payment_terms: syarat bayar (mis. Net 30, CBD - Cash Before Delivery).
- tax_withholding_category: Krusial untuk jasa. Supplier ekspedisi atau jasa maintenance mesin akan otomatis dipotong PPh 23 saat Purchase Invoice dibuat (terhubung ke Accounting Chapter D).
- Default Payable Account: akun utang per company (biasanya Trade Payables).
- Supplier Group (erpnext/buying/doctype/supplier_group/) - tree (nested set). Berfungsi sebagai pewaris default (payment terms, tax withholding) saat Supplier baru dibuat. Pola copy-on-create (sama seperti Item Group / Cost Center).
- Item Purchasing Defaults (hidup di master Item, tapi dikelola dari perspektif Purchase):
- default_supplier: satu item bisa dipasok banyak vendor, tapi satu yang dijadikan default untuk auto-generate PO dari Material Request.
- lead_time_days: berapa lama barang datang setelah PO diterbitkan. Angka ini vital untuk modul Manufacturing nanti (menghitung mundur kapan harus pesan Fragrance Oil agar tidak telat mixing).
Lintas domain:
- Supplier adalah party di GL & Payment Ledger (Accounting).
- Item yang dibeli (RM/Packaging) adalah aset di Stock.
- Purchase Order dan Receipt menjadi induk bagi Invoice (Accounting) dan gerbang bagi Quality Inspection (Quality).
Edge case:
- Salah mata uang (Currency) di Supplier: PO dibuat dalam USD, tapi PR/SI di-input manual dalam IDR. Selisih kurs yang tidak terekam sistem akan membuat valuasi utang dan HPP bahan baku hancur.
- Supplier ganda untuk RM yang sama: Fragrance Oil "Rose" bisa dibeli dari Supplier A (Prancis) dan Supplier B (Lokal). Jika admin salah pilih Supplier di PO, sistem tetap jalan, tapi kualitas dan aroma batch produksi akan berubah total tanpa peringatan sistem (karena sistem tidak tahu perbedaan organoleptik). Ini murni mengandalkan kedisiplinan admin.
- PPh 23 lupa di-set di Supplier Jasa: Tagihan ekspedisi masuk full tanpa potongan pajak. Saat akhir tahun, akuntan harus membetulkan manual (koreksi pajak) yang merepotkan.
Delta v16 (subset register sebelumnya):
- Validasi over-receipt allowance dipindah ke settings (lebih ketat).
- Payment Schedule due date dinamis mengalir dari PO ke Invoice (mempermuda pelacakan jatuh tempo utang).
Catatan scope BMP:
- Adopsi penuh: Supplier, Supplier Group, PO, dan integrasi dengan modul Quality (Incoming QC).
- Tolak / Sembunyikan dari UI: RFQ (Request for Quotation), Supplier Quotation, Supplier Scorecard, Blanket Order. Ini mengurangi cognitive load tim purchasing yang hanya perlu "Pesan barang ke supplier langganan, pastikan barang datang dan lulus QC, bayar tagihan".
- Adaptasi (Wawasan Domain): Supplier untuk Fragrance Oil (Impor) dan Alkohol (Lokal/Bea Cukai) wajib memiliki field custom atau catatan di deskripsi mengenai Nomor Izin Edar / MSDS (Material Safety Data Sheet) untuk keperluan audit CPKB Gol. B.
Chapter B - Siklus Transaksi (The 4 Purchasing Flows & QC Gates)
Mesin apa: Modul Purchase di BMP tidak lagi berfungsi sebagai "mesin tender" (karena RFQ/Scorecard dibuang), melainkan sebagai mesin eksekusi & gerbang mutu (Gateway). Siklus beli di sini sangat pendek, repetitif, dan langsung menembus ke 3 modul lain: Stock (untuk penerimaan fisik), Quality (untuk gerbang inspeksi CPKB), dan Accounting (untuk pencatatan utang & pajak).
Karena rantai pasok pabrik parfummu sangat spesifik, sistem membagi siklus transaksi ke dalam 4
Jalur Pembelian (Purchasing Flows) yang memiliki perilaku dan gerbang QC berbeda:
1. Jalur RM Cairan (Alkohol & Fragrance Oil)
Ini adalah jalur dengan nilai finansial tertinggi dan risiko mutu paling kritis.
- Purchase Order (PO):
- Admin pilih item (misal: Rose Absolute). Sistem membaca Item Price dalam USD dari katalog supplier (IFF/Givaudan/dll).
- Sistem auto-konversi ke IDR menggunakan Currency Exchange aktif hari itu.
- PO dicetak dan dikirim ke distributor lokal dalam Rupiah.
- Purchase Receipt (PR) + QC Gate:
- Barang tiba. Admin gudang buat PR. Stok masuk ke Warehouse: Quarantine (bukan langsung ke RM Store).
- Sistem mewajibkan pembuatan Quality Inspection dengan Template A (Organoleptik & Kimia Dasar). Parameter: Aroma (vs Master Sample), Warna, Kejernihan, Berat Jenis.
- Pass: Stok otomatis dipindah (via Stock Entry) dari Quarantine ke RM Store. Status batch = Accepted.
- Fail: Stok tertahan di Quarantine, memicu Non Conformance atau Return to Supplier.
- Purchase Invoice (PI):
- Finance input tagihan dari distributor lokal dalam IDR.
- Edge Case: Jika ada selisih Rupiah antara PO dan Invoice (akibat fluktuasi kurs atau kebijakan distributor), selisih dibukukan ke akun Purchase Price Variance, bukan Exchange Gain/Loss.
2. Jalur Packaging Kering (Botol, Cap, Stiker, Box)
Jalur dengan volume fisik besar, nilai per unit rendah, tapi sangat rentan terhadap cacat mekanis yang bisa merusak produk akhir (misal: botol bocor, ulir cap dol).
- Purchase Order (PO): Transaksi murni lokal dalam IDR.
- Purchase Receipt (PR) + QC Gate:
- Barang tiba. Stok masuk Quarantine.
- Sistem mewajibkan Quality Inspection dengan Template B (Fisik, Mekanik & Visual). Parameter: Leak test (botol dibalik), Thread fit (ulir cap), kualitas cetak stiker, ketebalan kaca.
- Pass: Stok masuk ke Warehouse: Packaging Store.
- Purchase Invoice (PI): Input tagihan lokal, PPN Masukan 11% otomatis terhitung.
3. Jalur Jasa (Ekspedisi, Maintenance Mesin, Cleaning Service)
Jalur untuk pembelian yang tidak berwujud fisik (tidak ada stok yang masuk ke gudang).
- Purchase Order (PO): Opsional (bisa langsung loncat ke PI untuk transaksi kecil/rutin).
- Purchase Invoice (PI) + Pajak:
- Karena tidak ada barang fisik, tidak ada PR dan tidak ada QC Gate.
- Finance input PI langsung ke akun beban (Expense).
- Sistem wajib menerapkan Tax Withholding Category (PPh 23) secara otomatis di baris invoice. Nilai yang dibayar ke vendor adalah Nilai Invoice dikurangi PPh 23.
4. Jalur Aset / Mesin (via Broker Borongan)
Jalur khusus untuk pembelian mesin (Mixing 100L/200L, Filling, Capping) yang disurvei langsung ke China tapi transaksinya via Forwarder/Broker lokal di Indonesia.
- Purchase Order (PO): Dibuat atas nama Broker Lokal dalam IDR (All-in price).
- Purchase Receipt (PR) + Technical Check:
- Mesin tiba di pabrik.
- Penting: Ini bukan ranah QC Parfum (BPOM/QA). Inspeksi dilakukan oleh Tim Teknis/Maintenance menggunakan checklist kelengkapan mesin (voltase, dimensi, sparepart). Tidak ada Quality Inspection Template CPKB di sini.
- Purchase Invoice (PI) & Asset Capitalization:
- Finance input PI.
- Karena invoice dari broker sudah "All-in" (termasuk jasa impor, bea masuk, pajak), Landed Cost Voucher (LCV) TIDAK DIGUNAKAN.
- Nilai total invoice langsung dikapitalisasi ke modul Asset sebagai Fixed Asset, dan sistem otomatis menjadwalkan penyusutan (depresiasi) bulanan.
Lintas Domain (Cross-Domain Integration)
- Ke Quality (Wajib CPKB): PR untuk RM dan Packaging tidak akan bisa diselesaikan (status Completed) tanpa adanya Quality Inspection yang berstatus Accepted. Ini adalah Hard-Gate sistem untuk mencegah bahan baku cacat masuk ke produksi.
- Ke Stock (Inventory): PR otomatis menulis Stock Ledger Entry (SLE). Untuk parfum, field Batch No dan Manufacturing Date (dari supplier) wajib diinput di baris PR untuk menjamin traceability IFRA/CPKB.
- Ke Accounting: PI otomatis membuat Journal Entry (Hutang Usaha di Kredit, Stok/Beban/Aset di Debit) dan memotong PPh 23 untuk jasa.
Edge Case & Aturan Pragmatis
- Katalog USD vs Realisasi IDR: Admin purchasing tidak boleh mengetik manual harga Rupiah di PO jika item sudah punya Item Price USD. Sistem yang harus menghitung. Ini mencegah human error salah ketik nol yang berakibat fatal pada HPP.
- Toleransi Kuantitas (Over-Receipt): Supplier cairan (Molindo) seringkali mengirim dengan selisih timbangan (misal: pesan 1000 kg, datang 1002 kg). Buying Settings harus mengizinkan toleransi over-receipt (misal 2-5%) khusus untuk item kategori RM Cairan, agar PR tidak terblokir hanya karena selisih timbangan truk.
- Barang Reject: Jika QC menolak batch Fragrance Oil, barang tidak boleh di-write-off (karena mahal). Barang harus dikembalikan ke supplier (Debit Note / Purchase Return) dan PI disesuaikan.
Chapter C - Buying Settings (Policy)
Mesin apa: ruang policy sisi beli - single doctype (buying_settings) + keluarga template pajak. Seperti kembarannya di Selling/Stock, chapter ini tidak menggerakkan barang, tapi menentukan boleh-tidaknya seluruh aliran di Chapter B. Bedanya dengan ERP generik: hampir semua policy di sini kita setel mengikuti satu fakta domain - supplier langganan, harga kontrak, transaksi IDR dengan katalog USD.
Perilaku per policy:
- PO/PR required sebelum PI ⚠️ - toggle global "apakah Purchase Invoice wajib merujuk PO/PR". Realitas BMP: barang fisik (RM, packaging, aset) wajib ber-PO (audit trail + gerbang QC), tapi jasa (ekspedisi, maintenance) boleh PI langsung. Karena toggle ERPNext global dan tidak bisa membedakan jenis item, BMP memindah validasi ini ke level tipe item: item service = PI langsung diizinkan; item stock/asset = PI tanpa PO ditolak.
- Maintain same rate = OFF - di ERP generik ini ON agar rate PI = rate PO. Di bisnismu ini harus OFF: rate PO lahir dari konversi katalog USD × kurs hari-PO, sedangkan invoice distributor bisa memakai kurs versi mereka. Selisihnya nyata dan legal - maka selisih dibukukan ke akun Purchase Price Variance (keputusan BMP), bukan dipaksa nol oleh sistem.
- Over-receipt allowance - truk Molindo hampir tidak pernah tepat 1.000 kg; timbangan berkata 1.002. Default allowance kecil (2-5% ⚠️) + override per item untuk RM cair, agar PR tidak terblokir oleh selisih timbangan. Kebalikannya (under-receipt) tetap harus sadar - qty diterima = qty yang dibayar.
- Allow multiple items per PO - ON; satu PO bisa campur beberapa fragrance oil dari distributor yang sama.
- Dua mekanisme pajak yang hidup berdampingan:
- Purchase Taxes and Charges Template = PPN Masukan 11% (barang & jasa PKP).
- Tax Withholding Category di master Supplier = PPh 23 (jasa). Bukan template taxes - dua jalur yang berbeda, dan keduanya ✅ Tampil sesuai Peta Menu.
- Terms & Conditions Template = Hide - B2C/marketplace tidak butuhTerms di PO; dinyalakan kelak bila B2B distributor lahir (konsisten Peta Menu Rev3).
- Policy khas BMP (custom, bukan field bawaan):
- Default warehouse PR = Quarantine untuk item stock - barang tidak pernah mendarat langsung di RM/Packaging Store; rilis hanya via Quality Inspection Accepted (Chapter B).
- Rate auto-pull guard: bila item punya Item Price, rate PO tidak boleh diketik manual tanpa konfirmasi role - mencegah salah-ketik nol pada bahan bernilai tinggi.
- Kurs basi = warning: Currency Exchange yang tidak diperbarui > N hari ⚠️ memicu peringatan saat PO dibuat - tidak memblokir, hanya menagih kesadaran (pola soft-gate yang sama dengan Manufacturing).
Edge case:
- Toggle global vs realitas per-tipe-item (policy #1) = alasan BMP memindah validasi ke level item; mengandalkan toggle global = jasa selalu melanggar atau barang selalu lolos tanpa PO.
- maint_same_rate OFF tanpa guard = admin bisa salah ketik rate tanpa rem - mitigasinya policy #7 (auto-pull + konfirmasi).
- Allowance over-receipt terlalu longgar = stok & hutang menggelembung diam-diam; allowance adalah pagar, bukan izin bebas.
- Withholding category terlupa di supplier jasa = PPh 23 tidak terpotong = koreksi pajak akhir tahun yang menyakitkan (pengulangan sengaja dari Chapter A - ini kegagalan paling mahal di modul ini).
- Selisih kurs dibukukan ke PPV, tapi akuntan baru membacanya sebagai "harga naik" - laporan PPV harus dipisah dari analisis tren harga USD agar tidak menyesatkan negosiasi.
Delta v16 (subset register): validator allowance dipindah/diperketat di settings; payment schedule due date dinamis mengalir PO→PI; presisi conversion factor 9 desimal menyentuh baris PO.
Catatan scope BMP: adopsi penuh Buying Settings + dua mekanisme pajak; Hide: Terms & Conditions; keputusan BMP: PPV account, quarantine default, rate guard, kurs-basi warning, validasi PO per tipe item.
Chapter D - Reports
Mesin apa: mata purchasing - proyeksi untuk tiga pertanyaan: berapa tren harga bahanku, berapa utangku ke siapa, apa yang sedang jalan menuju gudang. Semuanya pembacaan atas PO/PR/PI, bukan penyimpan data.
Perilaku per laporan:
- Item-wise Purchase History - laporan terpenting modul ini untuk owner/R&D: riwayat harga per item per supplier per tanggal. Di bisnismu ia punya pekerjaan khusus: memisahkan tren harga global (USD) dari realisasi kas (IDR) - kenaikan Rp bisa berarti kurs naik, bukan supplier naik harga; keputusan budgeting fragrance oil bergantung pada pembacaan yang benar.
- Supplier Ledger - hutang per supplier; bahan baku cash-flow: kapan harus bayar IFF vs kapan dana cair dari marketplace.
- Purchase Order Analysis - pipeline barang jalan: PO terbuka, sebagian diterima, terlambat datang; membaca lead_time_days vs realita - input bagi perencanaan produksi (Manufacturing).
- Purchase Analytics - agregat bulanan per item group; melihat pergeseran komposisi belanja (mis. share biaya packaging naik).
- Lintas modul (bukan milik Buying tapi dipakai bersama): AR/AP Aging (Accounting), Batch Traceability (Quality/Stock - lot supplier → RM → Bulk → FG), Item Price Stock tidak relevan (Hide).
Edge case:
- Laporan harga membaca IDR saja = ilusi inflasi saat kurs melemah; BMP menampilkan kolom referensi USD berdampingan ⚠️ custom.
- PO Analysis jujur hanya sejauh lead_time_days diisi di master item - garbage in, garbage out.
- Supplier Ledger vs AP Aging harus rekonsiliasi; selisih = biasanya PI tanpa PO atau payment reconciliation terlambat.
Catatan scope BMP: ✅ Tampil: Item-wise Purchase History (dengan kolom USD referensi), Supplier Ledger, PO Analysis, Purchase Analytics; laporan selebihnya Hide sesuai Peta Menu.