feat(promote-customer-spec): Phase E — final removal of coating + treatment
DELETED entirely (model + view + ACL + data file + menu): - fp.coating.config (configurator) - fp.treatment (configurator + seeded data) - fp.coating.thickness (configurator) — replaced by fp.recipe.thickness in Phase A - fp.customer.price.list (configurator) — coating-keyed, no replacement Field deletions: - sale.order.x_fc_coating_config_id - sale.order.line.x_fc_coating_config_id + x_fc_treatment_ids - account.move.line.x_fc_coating_config_id - fp.part.catalog.x_fc_default_coating_config_id + x_fc_default_treatment_ids - fp.job.coating_config_id - fp.pricing.rule.coating_config_id - fp.quality.point.coating_config_ids - fp.direct.order.line.coating_config_id + treatment_ids - fp.sale.description.template.coating_config_id Refactored: - fp.quote.configurator.coating_config_id → recipe_id (now points at fusion.plating.process.node, the actual recipe). All compute, onchange, and matcher logic updated to use recipe directly. Quality inherit extends matcher with spec-tier scoring. - fp.job._fp_create_certificates now reads spec from job.customer_spec_id and formats spec_reference as "code Rev rev". Same for thickness source — bake fields read from recipe_root (Phase A). - fp.job.step.button_finish bake-window auto-spawn reads bake settings from recipe_root instead of coating. - fp.certificate auto-fill spec_min_mils/max_mils from recipe (Phase A thickness fields) instead of coating. - jobs/sale_order.py: job creation reads x_fc_customer_spec_id from line, drops coating refs and the legacy header-coating fallback. - Wizards drop coating + treatment fields and refs. - Configurator views drop x_fc_coating_config_id + x_fc_treatment_ids fields entirely. Quality inherits re-anchor on stable fields (x_fc_part_catalog_id, x_fc_internal_description, default_process_id, process_variant_id, substrate_material) so they keep working. - Reports drop coating fallback elifs; print recipe / spec. - Tablet payload drops coating_config_id from job.read fields. Skipped (deferred to backlog): - fusion_plating_bridge_mrp — module is uninstalled per Sub 11; source files retain coating refs but no runtime impact. - fusion_plating_portal — circular dep (portal → quality → certs → portal). Customer-facing portal coating picker stays for now; promote-spec polish is a separate sub-project. Verification: grep for "coating_config_id|fp.coating.config| fp.treatment|fp.coating.thickness" in live (non-bridge_mrp, non-portal, non-script, non-test) Python/XML/CSV returns 3 hits, all in module / class docstrings explaining Phase E history. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
'name': 'Fusion Plating — Certificates',
|
||||
'version': '19.0.5.6.0',
|
||||
'version': '19.0.6.0.0',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Certificate registry for CoC, thickness reports, and quality documents.',
|
||||
'description': """
|
||||
|
||||
@@ -286,14 +286,27 @@ class FpCertificate(models.Model):
|
||||
def create(self, vals_list):
|
||||
SaleOrder = self.env['sale.order']
|
||||
for vals in vals_list:
|
||||
# Spec-limit auto-fill (existing behaviour, preserved).
|
||||
# Spec-limit auto-fill — sources thickness range from the
|
||||
# recipe (Phase A moved the thickness fields onto the
|
||||
# recipe root). Falls back gracefully when the SO has no
|
||||
# recipe-bearing line.
|
||||
already_set = vals.get('spec_min_mils') or vals.get('spec_max_mils')
|
||||
if not already_set and vals.get('sale_order_id'):
|
||||
so = SaleOrder.browse(vals['sale_order_id'])
|
||||
cfg = getattr(so, 'x_fc_coating_config_id', False)
|
||||
if cfg and cfg.thickness_uom == 'mils':
|
||||
vals.setdefault('spec_min_mils', cfg.thickness_min or 0.0)
|
||||
vals.setdefault('spec_max_mils', cfg.thickness_max or 0.0)
|
||||
# Look across order_line for the first recipe with a
|
||||
# populated thickness range.
|
||||
first_line = so.order_line[:1] if so.order_line else False
|
||||
recipe = (
|
||||
first_line.x_fc_process_variant_id
|
||||
if (first_line
|
||||
and 'x_fc_process_variant_id' in first_line._fields)
|
||||
else False
|
||||
)
|
||||
if (recipe
|
||||
and 'thickness_uom' in recipe._fields
|
||||
and recipe.thickness_uom == 'mils'):
|
||||
vals.setdefault('spec_min_mils', recipe.thickness_min or 0.0)
|
||||
vals.setdefault('spec_max_mils', recipe.thickness_max or 0.0)
|
||||
# Defer naming: let the record exist so the mixin can write
|
||||
# name via raw SQL, then fall back to the legacy sequence if
|
||||
# no parent SO is reachable.
|
||||
|
||||
Reference in New Issue
Block a user