From 70fe10c214ba7399285b070397556f32006cafe4 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Fri, 17 Apr 2026 18:54:14 -0400 Subject: [PATCH] fix(configurator): money fields now show $ everywhere MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: pricing.rule records had currency_id=NULL because the default=lambda only applies on new records. Monetary fields without a currency silently render as plain numbers — no $ symbol. Fixes: 1. currency_id now required=True on fp.pricing.rule, fp.treatment, fp.customer.price.list, fp.quote.configurator, fusion.plating.quote.request — so it can never be missing going forward. 2. post_init_hook + matching backfill helper in fusion_plating_configurator/__init__.py pins the company currency on any existing records that were created before the required flag. Ran on upgrade → all 4 pricing.rule rows now have CAD/$. 3. Flipped two remaining Float money fields to Monetary: - fp.job.consumption.unit_cost and total_cost (were Float digits=4/2) - (mrp.workorder.x_fc_workcenter_cost_hour stays Float — it is a related field from core mrp.workcenter.costs_hour which is Float) 4. Every Monetary field reference in views now has explicit: widget="monetary" options="{'currency_field': 'currency_id'}" Previously Odoo's default rendering dropped the $ in some contexts. Touched: fp_pricing_rule_views (list + form), fp_treatment_views, fp_customer_price_list_views (already done), fp_quote_configurator_views (list + form shipping/delivery/calculated/override), fp_quote_request_views (list + form), fp_job_consumption_views, mrp_production_views job-costing group, direct-order wizard (already done earlier). 5. Unit / % suffix polish as we went: rush_surcharge_percent shows "%", default_duration_minutes shows "min" on treatment form, treatment list labels duration column. Verified: all 4 pricing rules now render "$0.45", "$0.85" etc; 62 records across 6 models all have currency_id populated; zero remaining Float $ fields in the codebase. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../models/fp_job_consumption.py | 16 +++++---- .../views/fp_job_consumption_views.xml | 16 +++++---- .../views/mrp_production_views.xml | 13 +++++--- .../fusion_plating_configurator/__init__.py | 33 +++++++++++++++++++ .../__manifest__.py | 2 ++ .../models/fp_customer_price_list.py | 2 +- .../models/fp_pricing_rule.py | 2 +- .../models/fp_quote_configurator.py | 2 +- .../models/fp_treatment.py | 1 + .../views/fp_pricing_rule_views.xml | 28 +++++++++++----- .../views/fp_quote_configurator_views.xml | 17 +++++++--- .../views/fp_treatment_views.xml | 16 ++++++--- .../models/fp_quote_request.py | 1 + .../views/fp_quote_request_views.xml | 10 +++--- 14 files changed, 116 insertions(+), 43 deletions(-) diff --git a/fusion_plating/fusion_plating_bridge_mrp/models/fp_job_consumption.py b/fusion_plating/fusion_plating_bridge_mrp/models/fp_job_consumption.py index b29a8acc..5842a32a 100644 --- a/fusion_plating/fusion_plating_bridge_mrp/models/fp_job_consumption.py +++ b/fusion_plating/fusion_plating_bridge_mrp/models/fp_job_consumption.py @@ -40,15 +40,17 @@ class FpJobConsumption(models.Model): uom_id = fields.Many2one( 'uom.uom', string='UoM', ) - unit_cost = fields.Float( - string='Unit Cost (snapshot)', digits=(12, 4), + currency_id = fields.Many2one( + 'res.currency', required=True, + default=lambda self: self.env.company.currency_id, + ) + unit_cost = fields.Monetary( + string='Unit Cost (snapshot)', currency_field='currency_id', help='Taken from product.standard_price at log time.', ) - total_cost = fields.Float( - string='Total Cost', compute='_compute_total_cost', store=True, digits=(12, 2), - ) - currency_id = fields.Many2one( - 'res.currency', default=lambda self: self.env.company.currency_id, + total_cost = fields.Monetary( + string='Total Cost', currency_field='currency_id', + compute='_compute_total_cost', store=True, ) logged_date = fields.Datetime( string='Logged', default=fields.Datetime.now, diff --git a/fusion_plating/fusion_plating_bridge_mrp/views/fp_job_consumption_views.xml b/fusion_plating/fusion_plating_bridge_mrp/views/fp_job_consumption_views.xml index d6969076..0af1a89e 100644 --- a/fusion_plating/fusion_plating_bridge_mrp/views/fp_job_consumption_views.xml +++ b/fusion_plating/fusion_plating_bridge_mrp/views/fp_job_consumption_views.xml @@ -12,10 +12,12 @@ - - + + + - @@ -38,9 +40,11 @@ - - - + + + diff --git a/fusion_plating/fusion_plating_bridge_mrp/views/mrp_production_views.xml b/fusion_plating/fusion_plating_bridge_mrp/views/mrp_production_views.xml index 985bcf47..b6e7ce3b 100644 --- a/fusion_plating/fusion_plating_bridge_mrp/views/mrp_production_views.xml +++ b/fusion_plating/fusion_plating_bridge_mrp/views/mrp_production_views.xml @@ -29,17 +29,22 @@ + widget="monetary" + options="{'currency_field': 'x_fc_currency_id'}"/> + widget="monetary" + options="{'currency_field': 'x_fc_currency_id'}"/> + widget="monetary" + options="{'currency_field': 'x_fc_currency_id'}"/> + widget="monetary" + options="{'currency_field': 'x_fc_currency_id'}"/> - - + + @@ -54,15 +56,23 @@ - - + + - - - - + + + + @@ -70,7 +80,7 @@ - + diff --git a/fusion_plating/fusion_plating_configurator/views/fp_quote_configurator_views.xml b/fusion_plating/fusion_plating_configurator/views/fp_quote_configurator_views.xml index 81a882d3..7c7b3fea 100644 --- a/fusion_plating/fusion_plating_configurator/views/fp_quote_configurator_views.xml +++ b/fusion_plating/fusion_plating_configurator/views/fp_quote_configurator_views.xml @@ -198,19 +198,23 @@ - - + + - + @@ -298,8 +302,11 @@ - - + + - + - + @@ -41,9 +42,14 @@ - - - + diff --git a/fusion_plating/fusion_plating_portal/models/fp_quote_request.py b/fusion_plating/fusion_plating_portal/models/fp_quote_request.py index cf7882fa..a4f47c54 100644 --- a/fusion_plating/fusion_plating_portal/models/fp_quote_request.py +++ b/fusion_plating/fusion_plating_portal/models/fp_quote_request.py @@ -102,6 +102,7 @@ class FpQuoteRequest(models.Model): currency_id = fields.Many2one( 'res.currency', string='Currency', + required=True, default=lambda self: self.env.company.currency_id, ) quoted_by_id = fields.Many2one( diff --git a/fusion_plating/fusion_plating_portal/views/fp_quote_request_views.xml b/fusion_plating/fusion_plating_portal/views/fp_quote_request_views.xml index c1c47044..1b673296 100644 --- a/fusion_plating/fusion_plating_portal/views/fp_quote_request_views.xml +++ b/fusion_plating/fusion_plating_portal/views/fp_quote_request_views.xml @@ -23,8 +23,9 @@ - - + + - +