F1.1 · Inspección multi-Acta y firma diferida
Implementa el nuevo núcleo operativo: múltiples Actas por Inspección, un Informe por Acta, cierre de campo independiente y firma de empresa diferida con conformidad/disidencia.
This commit is contained in:
@@ -93,6 +93,7 @@ export {
|
||||
InspectionActSignatureSource,
|
||||
InspectionActSignatureStatus,
|
||||
InspectionActSignerType,
|
||||
InspectionCompanySignatureManifestation,
|
||||
} from './inspection-act-signature.entity';
|
||||
export { FindingCategory } from './finding-category.entity';
|
||||
export { FindingCatalogItem } from './finding-catalog-item.entity';
|
||||
|
||||
@@ -17,6 +17,11 @@ export enum InspectionActSignatureSource {
|
||||
ANDROID = 'ANDROID',
|
||||
}
|
||||
|
||||
export enum InspectionCompanySignatureManifestation {
|
||||
CONFORMITY = 'CONFORMITY',
|
||||
DISSENT = 'DISSENT',
|
||||
}
|
||||
|
||||
@Entity({ name: 'inspection_act_signatures' })
|
||||
@Index('idx_inspection_act_signatures_act_created', ['actId', 'createdAt'])
|
||||
@Index('idx_inspection_act_signatures_sha256', ['signaturePayloadSha256'])
|
||||
@@ -51,6 +56,12 @@ export class InspectionActSignature {
|
||||
@Column({ type: 'text', nullable: true })
|
||||
reason!: string | null;
|
||||
|
||||
@Column({ name: 'company_manifestation', type: 'varchar', length: 20, nullable: true })
|
||||
companyManifestation!: InspectionCompanySignatureManifestation | null;
|
||||
|
||||
@Column({ name: 'company_statement', type: 'text', nullable: true })
|
||||
companyStatement!: string | null;
|
||||
|
||||
@Column({ name: 'original_name', type: 'varchar', length: 255, nullable: true })
|
||||
originalName!: string | null;
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ export enum InspectionActStatus {
|
||||
}
|
||||
|
||||
@Entity({ name: 'inspection_acts' })
|
||||
@Index('uq_inspection_acts_visit', ['visitId'], { unique: true })
|
||||
@Index('uq_inspection_acts_one_draft_per_visit', ['visitId'], { unique: true, where: "status = 'DRAFT'" })
|
||||
@Index('uq_inspection_acts_year_number', ['actYear', 'actNumber'], { unique: true })
|
||||
@Index('uq_inspection_acts_code', ['code'], { unique: true })
|
||||
@Index('idx_inspection_acts_visit_status', ['visitId', 'status'])
|
||||
|
||||
@@ -25,7 +25,7 @@ export enum InspectionReportReviewStatus {
|
||||
}
|
||||
|
||||
@Entity({ name: 'inspection_reports' })
|
||||
@Index('uq_inspection_reports_visit', ['visitId'], { unique: true })
|
||||
@Index('idx_inspection_reports_visit_id', ['visitId'])
|
||||
@Index('uq_inspection_reports_act', ['actId'], { unique: true })
|
||||
@Index('uq_inspection_reports_year_number', ['reportYear', 'reportNumber'], { unique: true })
|
||||
@Index('uq_inspection_reports_code', ['code'], { unique: true })
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||
|
||||
export class PhaseF11MultiActInspections1789495200000 implements MigrationInterface {
|
||||
name = 'PhaseF11MultiActInspections1789495200000';
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_acts
|
||||
DROP CONSTRAINT IF EXISTS uq_inspection_acts_visit
|
||||
`);
|
||||
await queryRunner.query(`
|
||||
CREATE UNIQUE INDEX uq_inspection_acts_one_draft_per_visit
|
||||
ON inspection_acts (visit_id)
|
||||
WHERE status = 'DRAFT'
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_reports
|
||||
DROP CONSTRAINT IF EXISTS uq_inspection_reports_visit
|
||||
`);
|
||||
await queryRunner.query(`
|
||||
CREATE INDEX idx_inspection_reports_visit_id
|
||||
ON inspection_reports (visit_id)
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_act_signatures
|
||||
ADD COLUMN company_manifestation varchar(20),
|
||||
ADD COLUMN company_statement text
|
||||
`);
|
||||
await queryRunner.query(`
|
||||
UPDATE inspection_act_signatures
|
||||
SET company_manifestation = 'CONFORMITY'
|
||||
WHERE signer_type = 'COMPANY_RESPONSIBLE'
|
||||
AND status = 'SIGNED'
|
||||
`);
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_act_signatures
|
||||
ADD CONSTRAINT chk_inspection_act_signatures_company_manifestation CHECK (
|
||||
(
|
||||
signer_type = 'COMPANY_RESPONSIBLE'
|
||||
AND status = 'SIGNED'
|
||||
AND company_manifestation IN ('CONFORMITY', 'DISSENT')
|
||||
AND (
|
||||
(company_manifestation = 'CONFORMITY' AND company_statement IS NULL)
|
||||
OR
|
||||
(company_manifestation = 'DISSENT' AND LENGTH(TRIM(COALESCE(company_statement, ''))) >= 10)
|
||||
)
|
||||
)
|
||||
OR
|
||||
(
|
||||
NOT (signer_type = 'COMPANY_RESPONSIBLE' AND status = 'SIGNED')
|
||||
AND company_manifestation IS NULL
|
||||
AND company_statement IS NULL
|
||||
)
|
||||
)
|
||||
`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT visit_id FROM inspection_acts
|
||||
GROUP BY visit_id HAVING COUNT(*) > 1
|
||||
) THEN
|
||||
RAISE EXCEPTION 'F1.1 no puede revertirse: existen inspecciones con múltiples actas';
|
||||
END IF;
|
||||
IF EXISTS (
|
||||
SELECT visit_id FROM inspection_reports
|
||||
GROUP BY visit_id HAVING COUNT(*) > 1
|
||||
) THEN
|
||||
RAISE EXCEPTION 'F1.1 no puede revertirse: existen inspecciones con múltiples informes';
|
||||
END IF;
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM inspection_act_signatures
|
||||
WHERE company_manifestation = 'DISSENT'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'F1.1 no puede revertirse: existen firmas en disidencia';
|
||||
END IF;
|
||||
END
|
||||
$$
|
||||
`);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_act_signatures
|
||||
DROP CONSTRAINT chk_inspection_act_signatures_company_manifestation
|
||||
`);
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_act_signatures
|
||||
DROP COLUMN company_statement,
|
||||
DROP COLUMN company_manifestation
|
||||
`);
|
||||
|
||||
await queryRunner.query(`DROP INDEX idx_inspection_reports_visit_id`);
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_reports
|
||||
ADD CONSTRAINT uq_inspection_reports_visit UNIQUE (visit_id)
|
||||
`);
|
||||
|
||||
await queryRunner.query(`DROP INDEX uq_inspection_acts_one_draft_per_visit`);
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE inspection_acts
|
||||
ADD CONSTRAINT uq_inspection_acts_visit UNIQUE (visit_id)
|
||||
`);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user