4.9 KiB
4.9 KiB
Purchase Realization Design
Tujuan
Menyediakan model data dan alur kalkulasi untuk melacak satu purchase dari:
- pembelian awal
- receipt menjadi lot
- washing
- regrade / mix / split
- regular sale
- consignment
- office buyout
sampai status akhir purchase dapat dinyatakan CLOSED dan laba/rugi agent dapat dihitung final.
Prinsip
Purchase Analysistetap dipakai sebagai snapshot awal pembelian.Purchase Realizationdipakai sebagai hasil aktual setelah barang bergerak dan terjual.- Setiap lot harus bisa dilacak asal purchase-nya, termasuk jika hasil mix atau regrade.
- Setiap event yang memengaruhi qty atau nilai harus menulis jurnal realization.
Model Baru
lot_purchase_allocations
Menyimpan komposisi asal purchase untuk setiap lot.
Contoh:
- Lot
LOT-Aberasal 100% dari purchaseP-1 - Lot
LOT-Bhasil mix dariP-140% danP-260%
Maka LOT-B memiliki 2 allocation rows.
Kolom penting:
lot_idpurchase_idpurchase_line_idsource_typesource_ref_idqty_allocatedcost_total_allocatedunit_cost_snapshotagent_id_snapshotprofit_share_scheme_id_snapshot
purchase_realization_entries
Ledger event yang memengaruhi hasil akhir purchase.
Kolom penting:
purchase_idlot_idallocation_idevent_typereference_typereference_idoccurred_atqty_inqty_outqty_shrinkageamount_costamount_revenueamount_expenseamount_profitagent_share_percent_snapshotagent_amount
Event type awal yang direkomendasikan:
OPENING_COSTWASHING_COSTWASHING_SHRINKAGETRANSFORMATION_SHRINKAGESALE_REVENUESALE_RETURNSALE_SHRINKAGECONSIGNMENT_REVENUECONSIGNMENT_RETURNCONSIGNMENT_SHRINKAGEOFFICE_BUYOUT_REVENUEOFFICE_BUYOUT_TRANSFER_OUTSTOCK_ADJUSTMENT_LOSSSTOCK_ADJUSTMENT_GAINMANUAL_ADJUSTMENT
purchase_realization_summaries
Cache summary per purchase untuk kebutuhan UI dan closing.
Kolom penting:
statusqty_openingqty_remainingqty_soldqty_returnedqty_shrinkagecost_opening_totalcost_additional_totalrevenue_totalprofit_loss_totalagent_share_percentagent_profit_totalclosed_at
Status yang direkomendasikan:
OPENPARTIALREADY_TO_CLOSECLOSED
Aturan Alokasi
Purchase submit
- Buat lot seperti implementasi saat ini.
- Buat 1 allocation row per lot:
source_type = PURCHASEqty_allocated = lot.original_qtycost_total_allocated = qty * unit_cost
- Buat 1 realization entry:
event_type = OPENING_COST
Washing selesai
- Allocation lot tidak berubah.
- Jika ada biaya cuci, tulis
WASHING_COST. - Jika ada susut, tulis
WASHING_SHRINKAGE. - Semua entry dibagi ke purchase asal berdasarkan allocation aktif lot tersebut.
Transformation / regrade / mix
- Baca allocation dari semua source lots.
- Bentuk allocation baru pada output lots dengan distribusi proporsional terhadap qty / cost input.
- Jika ada processing loss, buat
TRANSFORMATION_SHRINKAGE. - Output lot mewarisi allocation campuran dari input.
Regular sale close
- Baca allocation lot pada line yang dijual.
- Revenue aktual dibagi ke purchase asal sesuai allocation.
- Tulis:
SALE_REVENUESALE_RETURNSALE_SHRINKAGE
Consignment close
- Perlakuan sama seperti regular sale, tetapi sumber event adalah consignment line.
Office buyout
Untuk purchase lama:
- Tulis
OFFICE_BUYOUT_REVENUE qty_outsebesar qty yang dibeli kantoramount_revenue = qty * buyout_unit_price
Untuk lot baru hasil buyout:
- Buat allocation baru yang menunjuk purchase buyout / jalur kantor
- Setelah itu hasil jual berikutnya tidak lagi menjadi hak agent lama
Rumus Summary
cost_opening_total= total opening costcost_additional_total= washing cost + biaya tambahan + adjustmentrevenue_total= sale + consignment + office buyoutprofit_loss_total = revenue_total - cost_opening_total - cost_additional_totalagent_profit_total = akumulasi agent_amountatau fallbackprofit_loss_total * share_agent / 100
Rule Closing Purchase
Purchase dapat CLOSED jika seluruh qty asal purchase sudah terselesaikan menjadi salah satu:
- terjual
- susut
- dibuyout kantor
- habis masuk transformasi dan seluruh descendant lots-nya selesai
Artinya closing harus melihat seluruh lineage lot, bukan hanya lot awal purchase.
Scope Implementasi Bertahap
Tahap 1
- Tambah schema baru
- Isi allocation + opening realization saat purchase submit
- Tambah summary recalculation dasar
Tahap 2
- Integrasi office buyout
- Integrasi washing cost dan shrinkage
Tahap 3
- Integrasi transformation / mix / regrade allocation propagation
Tahap 4
- Integrasi regular sale dan consignment revenue realization
Tahap 5
- UI
Purchase Realization - closing otomatis
Tahap 6
- JIT sale, jika nanti ingin ditautkan ke lineage purchase