chore(i18n): drop legacy free-text country/nationality columns
Test-data only — no production migration needed (per earlier decision).
Schema is now ISO-only; readers convert ISO codes to localized names where
human-readable output is required (EOI documents, invoices, portal).
Migration 0016 drops:
- clients.nationality
- companies.incorporation_country
- client_addresses.{state_province, country}
- company_addresses.{state_province, country}
Code paths that previously read free-text values now read the ISO column
and pass through `getCountryName()` / `getSubdivisionName()` for rendering.
Document templates ({{client.nationality}}), portal client view, EOI/
reservation-agreement contexts, and invoice billing addresses all updated.
Public yacht-interest endpoint (/api/public/interests) drops the legacy
fields from its insert path and writes ISO codes only. The Zod validators
no longer accept the legacy fields — older website builds posting raw
'incorporationCountry' / 'country' / 'stateProvince' will get 400s.
Server-side phone normalization is unchanged.
Seed data updated to use ISO codes (GB/FR/ES/GR/SE/IT/GH/MC/PA), spread
across continents to keep test fixtures realistic.
Test assertions updated to match the new render shape (e.g.
'United States' not 'US', 'California' not 'CA').
Vitest: 741 -> 741 (unchanged count; assertions updated, no new tests).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -35,7 +35,7 @@ describe('buildEoiContext', () => {
|
||||
const port = await makePort();
|
||||
const client = await makeClient({
|
||||
portId: port.id,
|
||||
overrides: { fullName: 'Alice Test', nationality: 'US' },
|
||||
overrides: { fullName: 'Alice Test', nationalityIso: 'US' },
|
||||
});
|
||||
|
||||
// Insert contacts.
|
||||
@@ -60,7 +60,7 @@ describe('buildEoiContext', () => {
|
||||
portId: port.id,
|
||||
streetAddress: '1 Harbour Way',
|
||||
city: 'Anguilla',
|
||||
country: 'AI',
|
||||
countryIso: 'AI',
|
||||
isPrimary: true,
|
||||
});
|
||||
|
||||
@@ -94,15 +94,16 @@ describe('buildEoiContext', () => {
|
||||
|
||||
const ctx = await buildEoiContext(interest.id, port.id);
|
||||
|
||||
// Client assertions.
|
||||
// Client assertions. Nationality + address country are rendered as
|
||||
// localized names (Intl.DisplayNames) from the ISO codes.
|
||||
expect(ctx.client.fullName).toBe('Alice Test');
|
||||
expect(ctx.client.nationality).toBe('US');
|
||||
expect(ctx.client.nationality).toBe('United States');
|
||||
expect(ctx.client.primaryEmail).toBe('alice@example.com');
|
||||
expect(ctx.client.primaryPhone).toBe('+1-555-1234');
|
||||
expect(ctx.client.address).toEqual({
|
||||
street: '1 Harbour Way',
|
||||
city: 'Anguilla',
|
||||
country: 'AI',
|
||||
country: 'Anguilla',
|
||||
});
|
||||
|
||||
// Yacht assertions.
|
||||
@@ -181,7 +182,7 @@ describe('buildEoiContext', () => {
|
||||
portId: port.id,
|
||||
streetAddress: '99 Commerce St',
|
||||
city: 'Valley',
|
||||
country: 'AI',
|
||||
countryIso: 'AI',
|
||||
isPrimary: true,
|
||||
});
|
||||
|
||||
@@ -206,7 +207,8 @@ describe('buildEoiContext', () => {
|
||||
expect(ctx.company!.billingAddress).not.toBeNull();
|
||||
expect(ctx.company!.billingAddress).toContain('99 Commerce St');
|
||||
expect(ctx.company!.billingAddress).toContain('Valley');
|
||||
expect(ctx.company!.billingAddress).toContain('AI');
|
||||
// Country is rendered as the localized name (AI -> Anguilla).
|
||||
expect(ctx.company!.billingAddress).toContain('Anguilla');
|
||||
});
|
||||
|
||||
it('throws ValidationError when interest has no yacht', async () => {
|
||||
|
||||
Reference in New Issue
Block a user