# -*- coding: utf-8 -*- # Copyright 2026 Nexa Systems Inc. """Name-match existing fp_receiving.carrier_name → x_fc_carrier_id. Phase A of the shipping integration replaces the free-text carrier field with a Many2one to delivery.carrier. Existing records (16 on entech at write time) have free-text values like "FedEx", "Purolator" in carrier_name. This migration walks them and populates the new M2O when a unique case-insensitive name match exists. delivery.carrier.name is jsonb (translatable) in Odoo 19 — match strips to the en_US translation. Ambiguous values stay as text in carrier_name for the operator to pick manually. """ import logging _logger = logging.getLogger(__name__) def migrate(cr, version): # Skip if the field doesn't exist yet (defensive — the column is # added by the registry update that runs before post-migrate). cr.execute(""" SELECT 1 FROM information_schema.columns WHERE table_name = 'fp_receiving' AND column_name = 'x_fc_carrier_id' """) if not cr.fetchone(): _logger.warning('x_fc_carrier_id column not present — skip.') return cr.execute(""" UPDATE fp_receiving r SET x_fc_carrier_id = dc.id FROM delivery_carrier dc WHERE r.carrier_name IS NOT NULL AND r.carrier_name <> '' AND r.x_fc_carrier_id IS NULL AND LOWER(TRIM(r.carrier_name)) = LOWER(TRIM((dc.name->>'en_US'))) """) matched = cr.rowcount _logger.info( 'Receiving carrier migration: matched %d record(s) by name.', matched, )