15 KiB
Blueprint Manufacturing Business Category
Tujuan
Dokumen ini merancang penerapan business category untuk manufacturing agar pemisahan berlaku end-to-end pada:
- master produk bahan baku
- master produk jadi / by-product
- BoM
- Manufacturing Order
- raw material moves
- finished goods moves
- stock valuation
- journal valuation / costing
- overhead costing
- reporting per business category
Target implementasi mengikuti pola modul existing:
grt_business_category_basegrt_inventory_business_categorygrt_mrp_overhead_costinggrt_scadamanufacturing_serial_number
Dokumen ini sengaja memilih desain yang bisa diimplementasikan bertahap, aman untuk kondisi production saat ini: product dan BoM sudah ada, tetapi MO belum berjalan.
Ringkasan Keputusan Desain
Keputusan utama
- Manufacturing akan memakai modul baru:
grt_mrp_business_category. Business Categorymenjadi field eksplisit dimrp.bomdanmrp.production.stock.movemanufacturing tidak boleh lagi bergantung kepicking_id.business_category_idsaja.- Costing dan valuation manufacturing harus membawa
business_category_idlangsung dari move / MO. grt_mrp_overhead_costingakan diubah agar basis filter memakaimrp.production.business_category_id, bukanproduct.business_category_id.
Prinsip desain
- Satu transaksi manufacturing harus punya satu
business_category_idyang jelas. - Semua turunan transaksi harus mewarisi category yang sama: MO, raw move, finished move, SVL, journal valuation.
- Domain, validasi, dan record rule harus konsisten.
- Desain v1 mengutamakan segregasi yang kuat dan implementasi aman, bukan fleksibilitas maksimal.
Batasan Penting
Arsitektur business category yang sekarang di repo memakai product.template.business_category_id tunggal. Itu cocok untuk segregasi ketat, tetapi kurang ideal bila satu master bahan baku ingin dipakai lintas business category.
Karena itu untuk implementasi v1, kebijakan yang direkomendasikan adalah:
- setiap produk operasional punya satu
business_category_id - setiap BoM produksi punya satu
business_category_id - jika bahan baku yang sama dipakai beberapa business category, buat produk terpisah per business category
Contoh:
RM GULA - BC01RM GULA - BC02
Pendekatan ini paling konsisten dengan rule inventory yang sudah ada dan paling aman untuk costing, valuation, dan audit trail.
Catatan:
- desain shared-product lintas business category bisa dibuat pada fase lanjutan
- tetapi itu butuh perubahan lebih besar pada rule
product,stock.quant, danreplenishment
Modul Baru
Nama modul
grt_mrp_business_category
Dependency
mrpstock_accountgrt_business_category_basegrt_inventory_business_categorygrt_mrp_overhead_costing
Dependency opsional yang harus kompatibel
grt_scadamanufacturing_serial_number
Cakupan Model
1. mrp.bom
Tambahan field:
business_category_id = fields.Many2one('crm.business.category', required=True, ondelete='restrict', index=True)manufacturing_analytic_account_id = fields.Many2one(related='business_category_id.inventory_analytic_account_id', store=True, readonly=True)
Aturan:
- category harus satu company dengan BoM
- produk hasil BoM harus punya
business_category_idyang sama dengan BoM - seluruh
bom_line_ids.product_id.business_category_idharus sama dengan BoM - jika ada by-product, category harus sama dengan BoM
Alasan:
- BoM adalah resep per business category
- satu produk jadi bisa punya BoM berbeda per business category
2. mrp.production
Tambahan field:
business_category_id = fields.Many2one('crm.business.category', required=True, ondelete='restrict', tracking=True, index=True)manufacturing_analytic_account_id = fields.Many2one(related='business_category_id.inventory_analytic_account_id', store=True, readonly=True)mrp_team_id = fields.Many2one('mrp.team', tracking=True)
Aturan default:
- prioritas default dari
bom_id.business_category_id - jika belum ada BoM, fallback ke user
active_business_category_id - jika create dari warehouse / operation type, fallback ke
warehouse.business_category_id
Aturan validasi:
business_category_id.company_idharus sama dengancompany_idbom_id.business_category_idharus sama denganmrp.production.business_category_idproduct_id.business_category_idharus sama denganmrp.production.business_category_id- seluruh
move_raw_idsdanmove_finished_idsharus punyabusiness_category_idyang sama dengan MO - jika
mrp_team_iddipakai, team harus sama company dan sama business category
3. mrp.bom.line
Tambahan field:
business_category_id = fields.Many2one(related='bom_id.business_category_id', store=True, readonly=True)
Tidak perlu field edit terpisah.
Aturan:
product_id.business_category_idharus sama denganbom_id.business_category_id
4. stock.move
Perubahan paling penting di desain ini.
Field existing dari grt_inventory_business_category harus diubah dari related ke picking_id saja menjadi field stored yang bisa diisi dari beberapa sumber.
Target desain:
business_category_id = fields.Many2one('crm.business.category', compute='_compute_business_category_id', store=True, readonly=False, index=True)inventory_analytic_account_id = fields.Many2one(related='business_category_id.inventory_analytic_account_id', store=True, readonly=True)
Sumber nilai business_category_id:
picking_id.business_category_idraw_material_production_id.business_category_idproduction_id.business_category_id- warehouse / location fallback bila perlu
Aturan:
- raw move MO mewarisi dari
raw_material_production_id.business_category_id - finished move MO mewarisi dari
production_id.business_category_id - transfer biasa tetap mewarisi dari
picking_id.business_category_id
Konsekuensi:
- rule access
stock.moveexisting jadi aman untuk transaksi manufacturing - valuation dan reporting inventory bisa konsisten
5. stock.move.line
Tambahan field:
business_category_id = fields.Many2one(related='move_id.business_category_id', store=True, readonly=True, index=True)
Tujuan:
- memudahkan filter detail operation per category
- memudahkan audit lot/serial per category
6. stock.valuation.layer
Tambahan field:
business_category_id = fields.Many2one('crm.business.category', copy=False, index=True)inventory_analytic_account_id = fields.Many2one('account.analytic.account', copy=False)
Sumber nilai:
- dari
stock.move.business_category_id
Tujuan:
- valuation layer finished goods dan raw material consumption bisa dilaporkan per category
- overhead kapitalisasi bisa disandingkan dengan valuation layer dasar
7. account.move dan account.move.line
Gunakan field inventory existing bila memungkinkan:
account.move.inventory_business_category_idaccount.move.inventory_analytic_account_id
Tambahan perilaku:
- valuation journal hasil raw material consumption dan finished goods harus mengisi
inventory_business_category_id - journal item valuation harus mengisi analytic sesuai business category bila account bukan receivable/payable
Jika Odoo flow existing belum cukup, tambahkan helper override di stock.move untuk menyuntikkan:
inventory_business_category_idinventory_analytic_account_id
Tujuan:
- cost of consumption dan finished goods capitalization bisa ditelusuri per business category
8. mrp.workorder dan mrp.workcenter
Direkomendasikan untuk v1.1, bukan blocker v1.
Tambahan field:
mrp.workcenter.business_category_idopsionalmrp.workorder.business_category_idrelated ke production
Aturan:
- jika workcenter punya category, harus sama dengan MO
- jika kosong, workcenter dianggap shared service center
Model Baru mrp.team
Tujuan
Menyelaraskan manufacturing dengan pola team pada CRM, Sales, Purchase, Expense, dan Inventory.
Field utama
namecompany_idbusiness_category_iduser_idmember_idsactive
Fungsi
- membatasi user manufacturing per business category
- defaulting team pada MO
- sumber akses otomatis ke user
effective_business_category_ids
Propagasi Data
Alur master data
Business Category -> Product -> BoM -> MO -> Stock Move -> SVL -> Account Move
Rule propagasi detail
Product
- saat membuat product manufacturing, default category dari user active category
- company product mengikuti company category
BoM
- saat membuat BoM dari product, default category dari product
- domain product hanya menampilkan product dengan category yang sama
MO
- saat pilih product, sistem cari BoM dengan kombinasi:
product_tmpl_id/product_idcompany_idbusiness_category_id
- jika user memilih BoM, category MO ikut dari BoM
- jika category MO diubah, BoM yang tidak match harus direset
Raw Move
_get_move_raw_values()harus setbusiness_category_id = self.business_category_id.id- move hasil explode BoM harus tetap satu category dengan MO
Finished Move
_get_move_finished_values()atau hook sejenis harus setbusiness_category_id = self.business_category_id.id
By-product
- by-product move juga wajib ikut category MO
Stock Valuation
- valuation raw material consumption dan FG receipt wajib bawa category move
Record Rules
Model yang harus punya rule
mrp.bommrp.productionmrp.workordermrp.teamstock.movestock.move.linestock.valuation.layer
Prinsip rule
Format mengikuti modul existing:
- user hanya bisa baca/create/write record pada
effective_business_category_ids - manager manufacturing dapat full access dalam category miliknya
base.group_systemtetap full access per company
Catatan penting
Rule stock.move current dari inventory harus di-upgrade. Saat ini move manufacturing berisiko tidak terbaca karena category hanya related dari picking_id.
Form View dan UX
mrp.bom
Tambahkan:
- field
business_category_iddi header - search filter group by business category
- domain komponen hanya menampilkan product dengan category sama
mrp.production
Tambahkan:
- field
business_category_id - field
mrp_team_id - search filter business category
- group by business category
Pada raw materials dan finished moves:
- tampilkan
business_category_idreadonly untuk audit
Report
Tambahkan pivot / graph / search filter business category untuk:
- MO analysis
- production reporting
- valuation reporting bila ada custom report
Costing dan Value Flow
Raw material consumption
Saat MO consume bahan:
stock.moveraw material punyabusiness_category_iddari MO- SVL keluar bahan baku mewarisi category itu
- journal valuation keluar bahan baku memakai
inventory_business_category_id
Finished goods receipt
Saat MO selesai:
- finished move punya
business_category_iddari MO - SVL finished goods mewarisi category itu
- journal valuation masuk FG memakai
inventory_business_category_id
Overhead costing
Modul grt_mrp_overhead_costing perlu disesuaikan:
Yang harus diubah
- filter MO done harus memakai
mrp.production.business_category_id - bukan lagi
product_id.business_category_id
Dampak
- overhead period akan mencerminkan category operasi aktual
- tidak tergantung apakah product category dipakai sebagai master segregation atau tidak
Integrasi Dengan Modul Existing
grt_inventory_business_category
Perubahan wajib:
- ubah field
stock.move.business_category_id - review rule
stock.quant - review product rules bila nanti ada kebutuhan shared product lintas category
grt_mrp_overhead_costing
Perubahan wajib:
- basis filter MO ke
mrp.production.business_category_id - allocation line dan jurnal adjustment tetap kompatibel dengan inventory category
grt_scada
Kompatibilitas:
_get_move_raw_values()existing SCADA harus tetap berjalan- penambahan
business_category_iddi raw move harus merge, bukan overwrite - validasi SCADA equipment per MO tetap utuh
manufacturing_serial_number
Kompatibilitas:
- serial yang dibuat dari MO secara otomatis mewarisi company dari MO
- jika nanti perlu audit lebih dalam,
manufacturing.serialbisa ditambah field relatedbusiness_category_id
Strategi Migrasi
Kondisi awal production
- product sudah ada
- BoM sudah ada
- MO belum berjalan
Ini adalah kondisi yang paling aman untuk implementasi manufacturing business category.
Tahap 1. Persiapan master category
- pastikan semua
crm.business.categoryfinal - pastikan user access, default, dan active category benar
- pastikan warehouse sudah punya
business_category_id
Tahap 2. Backfill product
- identifikasi product manufacturing yang masih kosong category
- isi category sesuai business unit pemilik
- validasi company-category match
Tahap 3. Backfill BoM
- semua
mrp.bomexisting diisibusiness_category_id - default awal mengikuti finished product
- cek seluruh bom line agar komponen punya category sama
- jika ada komponen shared lintas BU, putuskan:
- duplicate product per BU, atau
- tunda sampai desain shared-product fase lanjut
Tahap 4. Aktivasi manufacturing category
- install
grt_mrp_business_category - upgrade
grt_inventory_business_category - upgrade
grt_mrp_overhead_costing - lakukan smoke test create-confirm-done MO
Tahap 5. Validasi accounting
Uji:
- raw material consumption
- finished goods receipt
- stock valuation layer
- account move valuation
- overhead allocation
Query Audit Yang Disarankan
Produk tanpa category
SELECT id, name, company_id
FROM product_template
WHERE active IS TRUE
AND business_category_id IS NULL;
BoM tanpa category
SELECT id, product_tmpl_id, product_id, company_id
FROM mrp_bom
WHERE business_category_id IS NULL;
BoM line beda category dengan header
SELECT
b.id AS bom_id,
b.business_category_id AS bom_category,
l.id AS bom_line_id,
pt.business_category_id AS component_category
FROM mrp_bom_line l
JOIN mrp_bom b ON b.id = l.bom_id
JOIN product_product pp ON pp.id = l.product_id
JOIN product_template pt ON pt.id = pp.product_tmpl_id
WHERE pt.business_category_id IS DISTINCT FROM b.business_category_id;
Fase Implementasi Yang Direkomendasikan
Fase A. Minimum safe implementation
Scope:
mrp.bommrp.productionstock.movestock.move.line- security rules MRP
- costing / valuation propagation
- patch
grt_mrp_overhead_costing
Outcome:
- segregation manufacturing sudah jalan end-to-end
Fase B. Operational hardening
Scope:
mrp.teammrp.workordermrp.workcenter- report business category manufacturing
Outcome:
- operasional user dan monitoring lebih rapi
Fase C. Advanced flexibility
Scope:
- desain shared raw material lintas business category
- relaksasi rule product dan quant bila dibutuhkan
Outcome:
- fleksibilitas lebih tinggi, tetapi kompleksitas juga naik
Rekomendasi Final
Untuk kasus saat ini, implementasi yang paling aman dan cepat adalah:
- bangun
grt_mrp_business_category - pakai segregasi ketat satu product satu business category
- backfill BoM sebelum MO pertama dibuat
- ubah propagation
stock.moveagar support manufacturing - patch
grt_mrp_overhead_costingagar filter berdasarkanmrp.production.business_category_id
Dengan pendekatan ini:
- raw material terpisah per business category
- finished goods terpisah per business category
- MO terpisah per business category
- costing dan valuation bisa ditelusuri per business category
- migrasi aman karena production belum punya MO aktif