fix(customers): re-issue the country backfill skipping migration-reset source companies (#2249)
* fix(customers): re-issue the country backfill skipping migration-reset source companies Migration 20260903170000 (PR #2241) failed on prod at its first UPDATE: "Archived migration reset source records are immutable" (SQLSTATE P0001). Rows of a company listed in company_migration_resets are frozen by trigger, and the backfill touched them, so the whole file rolled back and prod has neither normalize_country_code() nor country_raw. The same SQL ships again as 20260903173000 with every UPDATE excluding those companies (their legacy text keeps being read through normalizeCountryCode() at runtime). The old file is removed rather than edited: prod never recorded it, staging was re-tracked under the new version by hand. References in code, tests and DECISIONS.md follow. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D5EmmndLyDCmY5NHYAvYkE * docs(decisions): cite the shipped backfill version 20260903173000 The country-ISO entry still named 20260903170000, the version that never landed on prod; only the follow-up entry keeps that number, as history. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D5EmmndLyDCmY5NHYAvYkE * docs(decisions): drop the duplicate country-ISO entry the merge carried in Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D5EmmndLyDCmY5NHYAvYkE * docs(decisions): keep a single country-ISO entry Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D5EmmndLyDCmY5NHYAvYkE * docs(decisions): rebuild the tail from main so the merge leaves no duplicated entries Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
a48508e5b0
commit
3159920d7c
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* The backfill in migration 20260903170000 maps country names with a SQL
|
||||
* The backfill in migration 20260903173000 maps country names with a SQL
|
||||
* function that carries its own copy of the name table. This test holds the
|
||||
* two copies to each other: every name the SQL knows must map to the same
|
||||
* code in TypeScript, and every name TypeScript knows must be in the SQL.
|
||||
@@ -11,7 +11,7 @@ import { listKnownCountryNames, normalizeCountryCode } from '../country-codes'
|
||||
|
||||
const MIGRATION = join(
|
||||
process.cwd(),
|
||||
'supabase/migrations/20260903170000_customer_supplier_country_iso.sql',
|
||||
'supabase/migrations/20260903173000_customer_supplier_country_iso.sql',
|
||||
)
|
||||
|
||||
function sqlNameTable(): Map<string, string> {
|
||||
|
||||
@@ -132,7 +132,7 @@ const ALPHA2_RE = /^[A-Z]{2}$/
|
||||
|
||||
/**
|
||||
* Every folded name the TypeScript table knows, with its code. Exists so a
|
||||
* test can hold the SQL twin in migration 20260903170000 to the same table.
|
||||
* test can hold the SQL twin in migration 20260903173000 to the same table.
|
||||
*/
|
||||
export function listKnownCountryNames(): Array<[name: string, code: string]> {
|
||||
return [...NAME_TO_CODE.entries()]
|
||||
@@ -148,7 +148,7 @@ export function listKnownCountryNames(): Array<[name: string, code: string]> {
|
||||
* "unknown, keep the raw text" (reports, backfill) or a 400 (API writes).
|
||||
*
|
||||
* The SQL twin `public.normalize_country_code(text)` (migration
|
||||
* 20260903170000) carries the same table for the one-off backfill; keep them
|
||||
* 20260903173000) carries the same table for the one-off backfill; keep them
|
||||
* in step when adding names here.
|
||||
*/
|
||||
export function normalizeCountryCode(input: string | null | undefined): string | null {
|
||||
@@ -362,7 +362,7 @@ export function checkCountryConsistency(input: {
|
||||
* either: refusing reverse charge on a genuine German customer whose row
|
||||
* still says "Deutschland" would put Swedish VAT on a correct invoice, which
|
||||
* is the worse error. The consistency check above stops new contradictory
|
||||
* rows from being saved, and migration 20260903170000 repairs the old ones
|
||||
* rows from being saved, and migration 20260903173000 repairs the old ones
|
||||
* whose country was only ever the writer default.
|
||||
*/
|
||||
export function countryPermitsReverseCharge(country: string | null | undefined): boolean {
|
||||
|
||||
Reference in New Issue
Block a user