From 92240b21c2d7be99c41e31dbf63d473df286f7ea Mon Sep 17 00:00:00 2001 From: enlineawork Date: Mon, 7 Sep 2026 20:47:33 -0300 Subject: [PATCH] feat(f4): adopt institutional INSP numbering --- .../inspection-visit-code.ts | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/api-v3/src/inspection-visits/inspection-visit-code.ts b/api-v3/src/inspection-visits/inspection-visit-code.ts index 3b48b52..fa946bd 100644 --- a/api-v3/src/inspection-visits/inspection-visit-code.ts +++ b/api-v3/src/inspection-visits/inspection-visit-code.ts @@ -4,12 +4,14 @@ export async function nextInspectionVisitCode( manager: EntityManager, plannedStartAt: Date, ): Promise { - const [yearRow] = (await manager.query(` - SELECT EXTRACT( - YEAR FROM $1::timestamptz AT TIME ZONE 'America/Argentina/Mendoza' - )::integer AS year - `, [plannedStartAt])) as Array<{ year: number }>; - const year = Number(yearRow?.year); + const [dateRow] = (await manager.query(` + SELECT + EXTRACT(YEAR FROM $1::timestamptz AT TIME ZONE 'America/Argentina/Mendoza')::integer AS year, + TO_CHAR($1::timestamptz AT TIME ZONE 'America/Argentina/Mendoza', 'DD') AS day, + TO_CHAR($1::timestamptz AT TIME ZONE 'America/Argentina/Mendoza', 'MM') AS month, + TO_CHAR($1::timestamptz AT TIME ZONE 'America/Argentina/Mendoza', 'YY') AS short_year + `, [plannedStartAt])) as Array<{ year: number; day: string; month: string; short_year: string }>; + const year = Number(dateRow?.year); if (!Number.isInteger(year) || year < 2000 || year > 9999) { throw new Error('Unable to derive inspection visit year'); } @@ -20,15 +22,15 @@ export async function nextInspectionVisitCode( ); const [sequenceRow] = (await manager.query(` - SELECT COALESCE(MAX(RIGHT(code, 6)::integer), 0)::integer AS sequence + SELECT COALESCE(MAX(SUBSTRING(code FROM 6 FOR 5)::integer), 0)::integer AS sequence FROM inspection_visits - WHERE code LIKE $1 - AND code ~ ('^INS-' || $2::text || '-[0-9]{6}$') - `, [`INS-${year}-%`, year])) as Array<{ sequence: number }>; + WHERE code ~ '^INSP-[0-9]{5}-[0-9]{2}-[0-9]{2}-[0-9]{2}$' + AND RIGHT(code, 2) = $1 + `, [dateRow.short_year])) as Array<{ sequence: number }>; const sequence = Number(sequenceRow?.sequence ?? 0) + 1; - if (sequence > 999999) { + if (sequence > 99999) { throw new Error(`Inspection visit sequence exhausted for ${year}`); } - return `INS-${year}-${String(sequence).padStart(6, '0')}`; + return `INSP-${String(sequence).padStart(5, '0')}-${dateRow.day}-${dateRow.month}-${dateRow.short_year}`; }