mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-02 16:13:22 +00:00
refactor: move Sales Invoice GL row builders onto the composer
Relocates all 11 Sales Invoice-specific GL entry builders from the document onto SalesInvoiceGLComposer, operating on self.doc. The perpetual-inventory super().get_gl_entries() call becomes super(SalesInvoice, doc).get_gl_entries(). Shared bucket-A helpers (get_gl_dict, make_discount_gl_entries, etc.) remain on AccountsController for now, invoked via self.doc, until all doctypes use a composer. No behavior change: Phase 0 snapshots and the SI tests covering perpetual inventory, POS, write-off, returns, fixed assets, internal transfer and loyalty all stay green.
This commit is contained in:
@@ -71,8 +71,8 @@ Characterization tests snapshotting `gl_entries` output for representative trans
|
||||
### Phase 1 — Extract `gl_validator.py` (lowest risk) — DONE
|
||||
Moved the 6 pure list-level validators to `erpnext/accounts/services/gl_validator.py`; `general_ledger.py` imports and calls them at the existing call sites (no behavior change). A consolidated `gl_validator.validate(gl_entries)` facade is deferred — the current checks run at different points (make_gl_entries / save_entries per-entry / make_reverse_gl_entries), so collapsing them into one call would alter ordering. Verified: all 12 Phase-0 snapshots byte-identical.
|
||||
|
||||
### Phase 2 — Pilot composer on Sales Invoice only
|
||||
Create `BaseGLComposer` + `SalesInvoiceGLComposer`; lift bucket-A helpers from `accounts_controller`; move SI's `get_gl_entries` body into `.compose()`; old method becomes a thin shim. Do not over-generalise the base from one example.
|
||||
### Phase 2 — Pilot composer on Sales Invoice only — DONE
|
||||
Added `BaseGLComposer` (minimal: holds `self.doc`) and `SalesInvoiceGLComposer`. SI's `get_gl_entries` is a thin shim delegating to `SalesInvoiceGLComposer(self).compose()`. All 11 SI-specific row builders (make_customer/tax/item/internal_transfer/pos/loyalty/write_off/rounding GL entries, stock_delivered_but_not_billed, get_gl_entries_for_fixed_asset, get_gle_for_change_amount) moved onto the composer and operate on `self.doc`. The `super().get_gl_entries()` stock-expense call became `super(SalesInvoice, doc).get_gl_entries()` (MRO-faithful). Bucket-A shared helpers (`get_gl_dict`, `make_discount_gl_entries`, `make_precision_loss_gl_entry`, `set_transaction_currency_and_rate_in_gl_map`, `get_tax_amounts`, `get_amount_and_base_amount`) **stay on the controller** — they're still called via `self.doc` and only lift to `BaseGLComposer` once all doctypes use composers (can't move while other doctypes inherit them). Verified: 12 snapshots + 10 existing SI tests (perpetual `super()`, POS change, write-off, returns, fixed-asset disposal/regain, internal transfer, loyalty) all green.
|
||||
|
||||
### Phase 3 — Second doctype: Purchase Invoice (base earns its shape)
|
||||
Add `PurchaseInvoiceGLComposer`; reshape `BaseGLComposer` from what SI + PI *actually* share. Two real consumers is the minimum to size the abstraction — prevents premature abstraction.
|
||||
|
||||
Reference in New Issue
Block a user