From 111792599cf4acea7ef39ed7bb714c0232b30691 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Sun, 19 Apr 2026 23:49:00 -0400 Subject: [PATCH] fix(configurator): margin % stored as fraction so widget='percentage' formats right Phase D8 compute was returning x_fc_margin_percent already-multiplied by 100, but the 'percentage' widget in the SO form multiplies again for display. Result was 10000% instead of 100%. Store as 0.0-1.0 fraction; widget handles the multiplier. Caught during UAT on S00066. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../fusion_plating_configurator/models/sale_order.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fusion_plating/fusion_plating_configurator/models/sale_order.py b/fusion_plating/fusion_plating_configurator/models/sale_order.py index 7d01b3b2..939255b5 100644 --- a/fusion_plating/fusion_plating_configurator/models/sale_order.py +++ b/fusion_plating/fusion_plating_configurator/models/sale_order.py @@ -486,19 +486,23 @@ class SaleOrder(models.Model): @api.depends('order_line.price_subtotal', 'amount_untaxed') def _compute_margin(self): - """Simple margin: untaxed total minus rolled-up cost from coating configs.""" + """Simple margin: untaxed total minus rolled-up cost from coating configs. + + x_fc_margin_percent is stored as a fraction (0.0 - 1.0) so the + widget='percentage' formats it correctly (a 100% margin reads + as 100%, not 10000%). + """ for rec in self: cost = 0.0 for line in rec.order_line: if line.x_fc_coating_config_id: - # If coating_config has a cost field, use it; otherwise 0. cost_per_unit = getattr( line.x_fc_coating_config_id, 'unit_cost', 0.0, ) or 0.0 cost += cost_per_unit * (line.product_uom_qty or 0) rec.x_fc_margin_amount = (rec.amount_untaxed or 0) - cost rec.x_fc_margin_percent = ( - (rec.x_fc_margin_amount / rec.amount_untaxed * 100.0) + (rec.x_fc_margin_amount / rec.amount_untaxed) if rec.amount_untaxed else 0.0 )