From 050d3d06a7118b20514c2aa3544d881a3934ab66 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Sun, 19 Apr 2026 12:11:37 -0400 Subject: [PATCH] =?UTF-8?q?feat(plating):=20wire=20deferred=20UoM=20defaul?= =?UTF-8?q?ts=20=E2=80=94=20bake=20oven,=20bake=20window,=20coating,=20tan?= =?UTF-8?q?k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the company-level UoM defaults commit. Wires four more unit-bearing fields to inherit from res.company defaults at create-time. **1. fp.bake.oven** • New `target_temp_uom` (°F / °C) — defaults from company.x_fc_default_temp_uom. • View: target_temp_min / max now render with a unit picker on the same row instead of unitless floats. Rule of thumb: "350–380 °F". **2. fp.bake.window** • New `bake_temp_uom` — defaults from company.x_fc_default_temp_uom. • View: replaced hardcoded `°F` span with a live unit picker so the label matches whatever unit was actually recorded. **3. fp.coating.config** • New `bake_temperature_uom` — defaults from company. • Removed hardcoded "Bake Temperature (°F)" label; the field is now unit-agnostic and the unit travels with the value. **4. fp.tank.volume_uom** • Default now derives from company.x_fc_default_volume_uom via a small mapping (gal → gal_us, L → l, imp_gal → gal_imp). The selection itself stays the same — tanks already supported all common volume units; we just pre-pick the right one per company. **Verified end-to-end** (scripts/fp_uom_smoke2.py): • Switching company default to °C + Litres • New oven gets C ✓ • New bake window gets C ✓ • New coating config gets C ✓ • New tank gets `l` ✓ (mapped from company `L`) • Restored defaults afterwards Existing records keep their stored uom — no surprise mutation. Co-Authored-By: Claude Opus 4.7 (1M context) --- fusion_plating/fusion_plating/__manifest__.py | 2 +- .../fusion_plating/models/fp_tank.py | 8 ++- .../__manifest__.py | 2 +- .../models/fp_coating_config.py | 10 +++- .../fusion_plating_shopfloor/__manifest__.py | 2 +- .../models/fp_bake_oven.py | 7 +++ .../models/fp_bake_window.py | 7 +++ .../views/fp_bake_oven_views.xml | 10 +++- .../views/fp_bake_window_views.xml | 3 +- fusion_plating/scripts/fp_uom_smoke2.py | 53 +++++++++++++++++++ 10 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 fusion_plating/scripts/fp_uom_smoke2.py diff --git a/fusion_plating/fusion_plating/__manifest__.py b/fusion_plating/fusion_plating/__manifest__.py index aaa933b4..fda72af4 100644 --- a/fusion_plating/fusion_plating/__manifest__.py +++ b/fusion_plating/fusion_plating/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating', - 'version': '19.0.5.2.0', + 'version': '19.0.5.3.0', 'category': 'Manufacturing/Plating', 'summary': 'Core plating / metal finishing ERP: facilities, processes, tanks, baths, jobs, operators.', 'description': """ diff --git a/fusion_plating/fusion_plating/models/fp_tank.py b/fusion_plating/fusion_plating/models/fp_tank.py index 80a0fde1..20d0b321 100644 --- a/fusion_plating/fusion_plating/models/fp_tank.py +++ b/fusion_plating/fusion_plating/models/fp_tank.py @@ -72,7 +72,13 @@ class FpTank(models.Model): ('m3', 'Cubic metres'), ], string='Volume Unit', - default='l', + default=lambda self: { + 'gal': 'gal_us', + 'L': 'l', + 'imp_gal': 'gal_imp', + }.get(self.env.company.x_fc_default_volume_uom or 'gal', 'gal_us'), + help='Inherited from company default (Settings → Fusion Plating → ' + 'Units of Measure). Overrideable per tank.', ) material = fields.Selection( [ diff --git a/fusion_plating/fusion_plating_configurator/__manifest__.py b/fusion_plating/fusion_plating_configurator/__manifest__.py index 9bea941c..b760c850 100644 --- a/fusion_plating/fusion_plating_configurator/__manifest__.py +++ b/fusion_plating/fusion_plating_configurator/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Configurator', - 'version': '19.0.5.1.0', + 'version': '19.0.5.2.0', 'category': 'Manufacturing/Plating', 'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.', 'description': """ diff --git a/fusion_plating/fusion_plating_configurator/models/fp_coating_config.py b/fusion_plating/fusion_plating_configurator/models/fp_coating_config.py index 65824425..d5b287f4 100644 --- a/fusion_plating/fusion_plating_configurator/models/fp_coating_config.py +++ b/fusion_plating/fusion_plating_configurator/models/fp_coating_config.py @@ -64,8 +64,14 @@ class FpCoatingConfig(models.Model): help='Maximum time between plate exit and bake start. Typically 4h per AMS 2759/9.', ) bake_temperature = fields.Float( - string='Bake Temperature (°F)', default=375.0, - help='Relief bake temperature. Typical: 375°F for steel ≥ HRC 40.', + string='Bake Temperature', default=375.0, + help='Relief bake temperature. Default 375 (°F per AMS 2759/9 for ' + 'steel ≥ HRC 40). Unit follows bake_temperature_uom.', + ) + bake_temperature_uom = fields.Selection( + [('F', '°F'), ('C', '°C')], + string='Temp Unit', + default=lambda self: self.env.company.x_fc_default_temp_uom or 'F', ) bake_duration_hours = fields.Float( string='Bake Duration (hours)', default=23.0, diff --git a/fusion_plating/fusion_plating_shopfloor/__manifest__.py b/fusion_plating/fusion_plating_shopfloor/__manifest__.py index dca99c57..1404e522 100644 --- a/fusion_plating/fusion_plating_shopfloor/__manifest__.py +++ b/fusion_plating/fusion_plating_shopfloor/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Shop Floor', - 'version': '19.0.14.2.0', + 'version': '19.0.14.3.0', 'category': 'Manufacturing/Plating', 'summary': 'Shop-floor tablet stations, QR scanning, bake window enforcer, ' 'first-piece inspection gates.', diff --git a/fusion_plating/fusion_plating_shopfloor/models/fp_bake_oven.py b/fusion_plating/fusion_plating_shopfloor/models/fp_bake_oven.py index 2355b7e4..089a50a9 100644 --- a/fusion_plating/fusion_plating_shopfloor/models/fp_bake_oven.py +++ b/fusion_plating/fusion_plating_shopfloor/models/fp_bake_oven.py @@ -50,6 +50,13 @@ class FpBakeOven(models.Model): string='Target Temp Max', help='Upper bound of target oven temperature.', ) + target_temp_uom = fields.Selection( + [('F', '°F'), ('C', '°C')], + string='Temp Unit', + default=lambda self: self.env.company.x_fc_default_temp_uom or 'F', + help='Unit for the target temp range. Defaults to the company ' + 'preference (Settings → Fusion Plating → Units of Measure).', + ) chart_recorder_ref = fields.Char( string='Chart Recorder Ref', help='Serial / asset reference of the chart recorder providing trace evidence.', diff --git a/fusion_plating/fusion_plating_shopfloor/models/fp_bake_window.py b/fusion_plating/fusion_plating_shopfloor/models/fp_bake_window.py index a1c1d4fe..3fdd4e80 100644 --- a/fusion_plating/fusion_plating_shopfloor/models/fp_bake_window.py +++ b/fusion_plating/fusion_plating_shopfloor/models/fp_bake_window.py @@ -110,6 +110,13 @@ class FpBakeWindow(models.Model): ) bake_temp = fields.Float( string='Bake Temp', + help='Setpoint temperature recorded for the relief bake. ' + 'Unit follows bake_temp_uom (defaults from company).', + ) + bake_temp_uom = fields.Selection( + [('F', '°F'), ('C', '°C')], + string='Temp Unit', + default=lambda self: self.env.company.x_fc_default_temp_uom or 'F', ) bake_duration_hours = fields.Float( string='Bake Duration (hours)', diff --git a/fusion_plating/fusion_plating_shopfloor/views/fp_bake_oven_views.xml b/fusion_plating/fusion_plating_shopfloor/views/fp_bake_oven_views.xml index d29f2398..0cd63f98 100644 --- a/fusion_plating/fusion_plating_shopfloor/views/fp_bake_oven_views.xml +++ b/fusion_plating/fusion_plating_shopfloor/views/fp_bake_oven_views.xml @@ -42,8 +42,14 @@ - - + diff --git a/fusion_plating/fusion_plating_shopfloor/views/fp_bake_window_views.xml b/fusion_plating/fusion_plating_shopfloor/views/fp_bake_window_views.xml index bca377e0..f9c1aab5 100644 --- a/fusion_plating/fusion_plating_shopfloor/views/fp_bake_window_views.xml +++ b/fusion_plating/fusion_plating_shopfloor/views/fp_bake_window_views.xml @@ -93,7 +93,8 @@