Tower: upload laundry_management 19.0.19.0.4 (via marketplace)
This commit is contained in:
@@ -0,0 +1,75 @@
|
|||||||
|
"""Phase 1 financial model migration.
|
||||||
|
|
||||||
|
Before: laundry_order.amount_paid was blindly copied from pos_order.amount_paid,
|
||||||
|
which includes Customer Account / pay-later payments. Every deferred sale
|
||||||
|
appeared fully paid → amount_due was always 0 → Settle Dues was non-functional.
|
||||||
|
|
||||||
|
After: amount_paid_cash + amount_deferred are computed from pos_payment rows,
|
||||||
|
classified by pos_payment_method.split_transactions. amount_due is recomputed
|
||||||
|
as amount_deferred - amount_settled.
|
||||||
|
|
||||||
|
This script rebuilds the split for every existing laundry.order by replaying
|
||||||
|
its linked pos_order's payment history.
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def migrate(cr, version):
|
||||||
|
if not version:
|
||||||
|
return
|
||||||
|
|
||||||
|
_logger.info('laundry_management: rebuilding financial split for existing orders')
|
||||||
|
|
||||||
|
# Ensure the new columns exist (ORM will have added them, but be defensive)
|
||||||
|
cr.execute("""
|
||||||
|
ALTER TABLE laundry_order
|
||||||
|
ADD COLUMN IF NOT EXISTS amount_paid_cash numeric DEFAULT 0,
|
||||||
|
ADD COLUMN IF NOT EXISTS amount_deferred numeric DEFAULT 0;
|
||||||
|
""")
|
||||||
|
|
||||||
|
# Rebuild amount_paid_cash / amount_deferred per laundry order
|
||||||
|
# from pos_payment rows classified by pos_payment_method.split_transactions.
|
||||||
|
cr.execute("""
|
||||||
|
WITH classified AS (
|
||||||
|
SELECT
|
||||||
|
lo.id AS lo_id,
|
||||||
|
COALESCE(SUM(CASE WHEN pm.split_transactions = FALSE THEN pp.amount ELSE 0 END), 0) AS cash,
|
||||||
|
COALESCE(SUM(CASE WHEN pm.split_transactions = TRUE THEN pp.amount ELSE 0 END), 0) AS deferred
|
||||||
|
FROM laundry_order lo
|
||||||
|
LEFT JOIN pos_payment pp ON pp.pos_order_id = lo.pos_order_id
|
||||||
|
LEFT JOIN pos_payment_method pm ON pm.id = pp.payment_method_id
|
||||||
|
GROUP BY lo.id
|
||||||
|
)
|
||||||
|
UPDATE laundry_order lo
|
||||||
|
SET amount_paid_cash = c.cash,
|
||||||
|
amount_deferred = c.deferred,
|
||||||
|
amount_settled = COALESCE(lo.amount_settled, 0)
|
||||||
|
FROM classified c
|
||||||
|
WHERE c.lo_id = lo.id;
|
||||||
|
""")
|
||||||
|
|
||||||
|
# amount_due is a stored compute (amount_deferred - amount_settled).
|
||||||
|
# Populate it directly here so the values are correct before the ORM
|
||||||
|
# recomputes (ORM recompute on install will overwrite with same result).
|
||||||
|
cr.execute("""
|
||||||
|
UPDATE laundry_order
|
||||||
|
SET amount_due = GREATEST(
|
||||||
|
COALESCE(amount_deferred, 0) - COALESCE(amount_settled, 0),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
""")
|
||||||
|
|
||||||
|
cr.execute("""
|
||||||
|
SELECT COUNT(*),
|
||||||
|
SUM(amount_paid_cash),
|
||||||
|
SUM(amount_deferred),
|
||||||
|
SUM(amount_due)
|
||||||
|
FROM laundry_order
|
||||||
|
""")
|
||||||
|
row = cr.fetchone()
|
||||||
|
_logger.info(
|
||||||
|
'laundry_management migration: %s orders — cash=%.2f, deferred=%.2f, due=%.2f',
|
||||||
|
row[0] or 0, row[1] or 0.0, row[2] or 0.0, row[3] or 0.0,
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user