Files
Odoo14Kanjabung/MANUFACTURING_BUSINESS_CATEGORY_BLUEPRINT.md

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_base
  • grt_inventory_business_category
  • grt_mrp_overhead_costing
  • grt_scada
  • manufacturing_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

  1. Manufacturing akan memakai modul baru: grt_mrp_business_category.
  2. Business Category menjadi field eksplisit di mrp.bom dan mrp.production.
  3. stock.move manufacturing tidak boleh lagi bergantung ke picking_id.business_category_id saja.
  4. Costing dan valuation manufacturing harus membawa business_category_id langsung dari move / MO.
  5. grt_mrp_overhead_costing akan diubah agar basis filter memakai mrp.production.business_category_id, bukan product.business_category_id.

Prinsip desain

  • Satu transaksi manufacturing harus punya satu business_category_id yang 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 - BC01
  • RM 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, dan replenishment

Modul Baru

Nama modul

  • grt_mrp_business_category

Dependency

  • mrp
  • stock_account
  • grt_business_category_base
  • grt_inventory_business_category
  • grt_mrp_overhead_costing

Dependency opsional yang harus kompatibel

  • grt_scada
  • manufacturing_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_id yang sama dengan BoM
  • seluruh bom_line_ids.product_id.business_category_id harus 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_id harus sama dengan company_id
  • bom_id.business_category_id harus sama dengan mrp.production.business_category_id
  • product_id.business_category_id harus sama dengan mrp.production.business_category_id
  • seluruh move_raw_ids dan move_finished_ids harus punya business_category_id yang sama dengan MO
  • jika mrp_team_id dipakai, 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_id harus sama dengan bom_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:

  1. picking_id.business_category_id
  2. raw_material_production_id.business_category_id
  3. production_id.business_category_id
  4. 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.move existing 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_id
  • account.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_id
  • inventory_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_id opsional
  • mrp.workorder.business_category_id related 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

  • name
  • company_id
  • business_category_id
  • user_id
  • member_ids
  • active

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_id
    • company_id
    • business_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 set business_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 set business_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.bom
  • mrp.production
  • mrp.workorder
  • mrp.team
  • stock.move
  • stock.move.line
  • stock.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_system tetap 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_id di 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_id readonly 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.move raw material punya business_category_id dari 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_id dari 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_id di 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.serial bisa ditambah field related business_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

  1. pastikan semua crm.business.category final
  2. pastikan user access, default, dan active category benar
  3. pastikan warehouse sudah punya business_category_id

Tahap 2. Backfill product

  1. identifikasi product manufacturing yang masih kosong category
  2. isi category sesuai business unit pemilik
  3. validasi company-category match

Tahap 3. Backfill BoM

  1. semua mrp.bom existing diisi business_category_id
  2. default awal mengikuti finished product
  3. cek seluruh bom line agar komponen punya category sama
  4. jika ada komponen shared lintas BU, putuskan:
    • duplicate product per BU, atau
    • tunda sampai desain shared-product fase lanjut

Tahap 4. Aktivasi manufacturing category

  1. install grt_mrp_business_category
  2. upgrade grt_inventory_business_category
  3. upgrade grt_mrp_overhead_costing
  4. 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.bom
  • mrp.production
  • stock.move
  • stock.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.team
  • mrp.workorder
  • mrp.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:

  1. bangun grt_mrp_business_category
  2. pakai segregasi ketat satu product satu business category
  3. backfill BoM sebelum MO pertama dibuat
  4. ubah propagation stock.move agar support manufacturing
  5. patch grt_mrp_overhead_costing agar filter berdasarkan mrp.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