From dac6c94370055539857f0e4d4f71b83d383feb2f Mon Sep 17 00:00:00 2001 From: enlineawork Date: Mon, 7 Sep 2026 19:43:26 -0300 Subject: [PATCH] =?UTF-8?q?F4.0=20=C2=B7=20actualizar=20contratos=20y=20pr?= =?UTF-8?q?uebas=20del=20nuevo=20flujo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inspection-visits-authorization.test.ts | 4 +-- ...e-d5-6-4-quick-inspection-planning.test.ts | 6 ++-- .../phase-f4-document-flow-foundation.test.ts | 36 +++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 api-v3/test/unit/phase-f4-document-flow-foundation.test.ts diff --git a/api-v3/test/unit/inspection-visits-authorization.test.ts b/api-v3/test/unit/inspection-visits-authorization.test.ts index 450d2a7..ac040ef 100644 --- a/api-v3/test/unit/inspection-visits-authorization.test.ts +++ b/api-v3/test/unit/inspection-visits-authorization.test.ts @@ -10,7 +10,7 @@ function permissionFor(method: string): string[] { return Reflect.getMetadata(REQUIRED_PERMISSIONS_KEY, handler) as string[]; } -test('inspection visit endpoints separate reading, planning, assignment and execution', () => { +test('inspection visit endpoints separate reading, planning, assignment and explicit execution', () => { assert.deepEqual(permissionFor('list'), ['inspections.read']); assert.deepEqual(permissionFor('get'), ['inspections.read']); assert.deepEqual(permissionFor('assignees'), ['inspections.assign']); @@ -18,7 +18,7 @@ test('inspection visit endpoints separate reading, planning, assignment and exec assert.deepEqual(permissionFor('update'), ['inspections.manage']); assert.deepEqual(permissionFor('replaceAssets'), ['inspections.manage']); assert.deepEqual(permissionFor('replaceTeam'), ['inspections.assign']); - assert.deepEqual(permissionFor('changeStatus'), ['inspections.manage']); + assert.equal('changeStatus' in InspectionVisitsController.prototype, false); assert.deepEqual(permissionFor('start'), ['inspections.execute']); assert.deepEqual(permissionFor('close'), ['inspections.execute']); }); diff --git a/api-v3/test/unit/phase-d5-6-4-quick-inspection-planning.test.ts b/api-v3/test/unit/phase-d5-6-4-quick-inspection-planning.test.ts index c7f2698..6f1660c 100644 --- a/api-v3/test/unit/phase-d5-6-4-quick-inspection-planning.test.ts +++ b/api-v3/test/unit/phase-d5-6-4-quick-inspection-planning.test.ts @@ -6,11 +6,13 @@ import test from 'node:test'; const root = process.cwd(); const read = (relative: string) => fs.readFileSync(path.join(root, relative), 'utf8'); -test('D5.6.4 generates inspection codes server-side with an annual transactional sequence', () => { +test('F4 keeps server-side annual numbering but emits the institutional INSP-date format', () => { const generator = read('src/inspection-visits/inspection-visit-code.ts'); - assert.match(generator, /INS-\$\{year\}-\$\{String\(sequence\)\.padStart\(6, '0'\)\}/); + assert.match(generator, /INSP-\$\{String\(sequence\)\.padStart\(5, '0'\)\}-\$\{datePart\}/); + assert.match(generator, /DD-MM-YY/); assert.match(generator, /pg_advisory_xact_lock/); assert.match(generator, /America\/Argentina\/Mendoza/); + assert.match(generator, /INS-\$\{year\}-%/); }); test('D5.6.4 creates one inspection from Area Operator start and lead inspector without manual title or end date', () => { diff --git a/api-v3/test/unit/phase-f4-document-flow-foundation.test.ts b/api-v3/test/unit/phase-f4-document-flow-foundation.test.ts new file mode 100644 index 0000000..d18f7dd --- /dev/null +++ b/api-v3/test/unit/phase-f4-document-flow-foundation.test.ts @@ -0,0 +1,36 @@ +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import path from 'node:path'; +import test from 'node:test'; + +const root = process.cwd(); +const read = (relative: string) => fs.readFileSync(path.join(root, relative), 'utf8'); + +test('F4 foundation snapshots Act deadlines and seeds the institutional 5/10 business-day policy', () => { + const migration = read('src/database/migrations/1790035200000-phase-f4-document-flow-foundation.ts'); + assert.match(migration, /deadline_policy_snapshot jsonb/); + assert.match(migration, /'URGENT', 5, 'BUSINESS', 'ACT_DATE'/); + assert.match(migration, /'NON_URGENT', 10, 'BUSINESS', 'GEDO_LOAD_DATE'/); + assert.match(migration, /inspection_non_working_days/); +}); + +test('F4 foundation models recurrence as a new Finding linked to its antecedent', () => { + const finding = read('src/database/entities/inspection-finding.entity.ts'); + const migration = read('src/database/migrations/1790035200000-phase-f4-document-flow-foundation.ts'); + assert.match(finding, /isRecurrence!/); + assert.match(finding, /antecedentFindingId!/); + assert.match(migration, /fk_inspection_findings_antecedent/); + assert.match(migration, /chk_inspection_findings_recurrence_link/); +}); + +test('F4 foundation separates editable INF content, GEDO IF officialization and report-level follow-up', () => { + const report = read('src/database/entities/inspection-report.entity.ts'); + const migration = read('src/database/migrations/1790035200000-phase-f4-document-flow-foundation.ts'); + assert.match(report, /executiveSummary!/); + assert.match(report, /description!/); + assert.match(report, /gedoIfIdentifier!/); + assert.match(report, /gedoOfficializedOn!/); + assert.match(migration, /inspection_report_follow_ups/); + assert.match(migration, /COMPANY_NOTE/); + assert.doesNotMatch(migration, /finding_id uuid NOT NULL[\s\S]*inspection_report_follow_ups/); +});