diff --git a/api-v3/src/inspection-acts/inspection-acts.service.ts b/api-v3/src/inspection-acts/inspection-acts.service.ts index 5d89a31..260f858 100644 --- a/api-v3/src/inspection-acts/inspection-acts.service.ts +++ b/api-v3/src/inspection-acts/inspection-acts.service.ts @@ -14,6 +14,9 @@ import { DocumentSequenceType, InspectionAct, InspectionActStatus, + InspectionActUrgency, + InspectionDeadlineBasis, + InspectionDeadlineDayType, InspectionActVersionEvent, InspectionVisit, InspectionVisitStatus, @@ -72,6 +75,17 @@ export interface InspectionActListItem { title: string; summary: string; observations: string | null; + urgency: InspectionActUrgency; + deadlineDays: number | null; + deadlineDayType: InspectionDeadlineDayType | null; + deadlineBasis: InspectionDeadlineBasis | null; + deadlineBaseAt: Date | null; + deadlineAt: Date | null; + lockedAt: Date | null; + lockedBy: string | null; + lockedSha256: string | null; + sealedAt: Date | null; + sealedBy: string | null; currentVersion: number; cancellationReason: string | null; closedAt: Date | null; @@ -313,13 +327,16 @@ export class InspectionActsService { const occurredAt = new Date(dto.occurredAt); const actYear = await this.yearAtProjectTimezone(manager, occurredAt); const actNumber = await this.allocateNumber(manager, actYear); - if (actNumber > 999999) { + if (actNumber > 99999) { throw new ConflictException({ code: 'INSPECTION_ACT_SEQUENCE_EXHAUSTED', message: 'La numeración anual de actas agotó su rango disponible', }); } - const code = `ACTA-${actYear}-${String(actNumber).padStart(6, '0')}`; + const [dateRow] = (await manager.query(` + SELECT TO_CHAR($1::timestamptz AT TIME ZONE 'America/Argentina/Mendoza', 'DD-MM-YY') AS date_part + `, [occurredAt])) as Array<{ date_part: string }>; + const code = `ACT-${String(actNumber).padStart(5, '0')}-${dateRow.date_part}`; const act = manager.getRepository(InspectionAct).create({ visitId, actYear, @@ -330,6 +347,17 @@ export class InspectionActsService { title: dto.title, summary: dto.summary, observations: dto.observations ?? null, + urgency: dto.urgency, + deadlineDays: null, + deadlineDayType: null, + deadlineBasis: null, + deadlineBaseAt: null, + deadlineAt: null, + lockedAt: null, + lockedBy: null, + lockedSha256: null, + sealedAt: null, + sealedBy: null, currentVersion: 0, cancellationReason: null, createdBy: principal.userId, @@ -384,6 +412,7 @@ export class InspectionActsService { await this.assertVisitAssets(manager, visit.id, nextAssetIds); const before = await this.loadView(manager, id); if (dto.occurredAt !== undefined) act.occurredAt = nextOccurredAt; + if (dto.urgency !== undefined) act.urgency = dto.urgency; if (dto.title !== undefined) act.title = dto.title; if (dto.summary !== undefined) act.summary = dto.summary; if (dto.observations !== undefined) act.observations = dto.observations; @@ -474,6 +503,17 @@ export class InspectionActsService { act.title, act.summary, act.observations, + act.urgency, + act.deadline_days AS "deadlineDays", + act.deadline_day_type AS "deadlineDayType", + act.deadline_basis AS "deadlineBasis", + act.deadline_base_at AS "deadlineBaseAt", + act.deadline_at AS "deadlineAt", + act.locked_at AS "lockedAt", + act.locked_by AS "lockedBy", + act.locked_sha256 AS "lockedSha256", + act.sealed_at AS "sealedAt", + act.sealed_by AS "sealedBy", act.current_version AS "currentVersion", act.cancellation_reason AS "cancellationReason", act.closed_at AS "closedAt", @@ -645,7 +685,7 @@ export class InspectionActsService { if (rows.length > 0) { throw new ConflictException({ code: 'INSPECTION_VISIT_DRAFT_ACT_ALREADY_EXISTS', - message: 'La inspección ya tiene un acta en borrador; preparala o cancelala antes de crear otra', + message: 'La inspección ya tiene un acta en borrador; finalizala o cancelala antes de crear otra', }); } } @@ -665,7 +705,7 @@ export class InspectionActsService { if (assetIds.length < 1 || Number(row?.count ?? 0) !== assetIds.length) { throw new BadRequestException({ code: 'INSPECTION_ACT_ASSET_INVALID', - message: 'Cada activo del acta debe estar incluido en la visita', + message: 'Cada inventario del acta debe estar incluido en la inspección', }); } } @@ -758,6 +798,15 @@ export class InspectionActsService { 'title', act.title, 'summary', act.summary, 'observations', act.observations, + 'urgency', act.urgency, + 'deadlineDays', act.deadline_days, + 'deadlineDayType', act.deadline_day_type, + 'deadlineBasis', act.deadline_basis, + 'deadlineBaseAt', act.deadline_base_at, + 'deadlineAt', act.deadline_at, + 'lockedAt', act.locked_at, + 'lockedSha256', act.locked_sha256, + 'sealedAt', act.sealed_at, 'currentVersion', act.current_version, 'cancellationReason', act.cancellation_reason, 'createdBy', act.created_by, @@ -804,6 +853,15 @@ export class InspectionActsService { title: act.title, summary: act.summary, observations: act.observations, + urgency: act.urgency, + deadlineDays: act.deadlineDays, + deadlineDayType: act.deadlineDayType, + deadlineBasis: act.deadlineBasis, + deadlineBaseAt: act.deadlineBaseAt, + deadlineAt: act.deadlineAt, + lockedAt: act.lockedAt, + lockedSha256: act.lockedSha256, + sealedAt: act.sealedAt, currentVersion: act.currentVersion, cancellationReason: act.cancellationReason, closedAt: act.closedAt,