mirror of
https://origin.cursor.com/mrdevmx/panels.git
synced 2026-10-09 13:23:17 +00:00
La vigencia de 3 meses para alta o reingreso cuenta desde la fecha de carga. Quien recibe el expediente revisa si el documento es válido. Co-authored-by: alberto.martinez <alberto.martinez@mrdev.mx>
170 lines
4.8 KiB
TypeScript
170 lines
4.8 KiB
TypeScript
import { assertEquals } from "https://deno.land/std@0.224.0/assert/mod.ts";
|
|
import {
|
|
evaluateDocumentValidity,
|
|
freshnessRequired,
|
|
DOCUMENT_TYPE_SEED,
|
|
PROJECT_DOCUMENT_TYPE_SEED,
|
|
COMPANY_DOCUMENT_TYPE_SEED,
|
|
type DocTypePolicy,
|
|
type WorkerImssContext,
|
|
} from "./document_validity.ts";
|
|
|
|
const curpPolicy: DocTypePolicy = {
|
|
code: "curp",
|
|
label: "CURP",
|
|
required: true,
|
|
validity_mode: "freshness",
|
|
freshness_days: 90,
|
|
requires_issued_at: false,
|
|
requires_expires_at: false,
|
|
};
|
|
|
|
const inePolicy: DocTypePolicy = {
|
|
code: "ine",
|
|
label: "INE",
|
|
required: true,
|
|
validity_mode: "expiry",
|
|
freshness_days: null,
|
|
requires_issued_at: false,
|
|
requires_expires_at: false,
|
|
};
|
|
|
|
Deno.test("freshnessRequired: sin alta exige frescor", () => {
|
|
assertEquals(
|
|
freshnessRequired({ imss_status: "sin_alta", last_rehire_at: null, current_alta_at: null }),
|
|
true,
|
|
);
|
|
});
|
|
|
|
Deno.test("freshnessRequired: alta continua no exige frescor", () => {
|
|
assertEquals(
|
|
freshnessRequired({
|
|
imss_status: "alta",
|
|
last_rehire_at: null,
|
|
current_alta_at: "2024-01-01",
|
|
}),
|
|
false,
|
|
);
|
|
});
|
|
|
|
Deno.test("freshnessRequired: rehire sin alta posterior exige frescor", () => {
|
|
assertEquals(
|
|
freshnessRequired({
|
|
imss_status: "alta",
|
|
last_rehire_at: "2026-06-01",
|
|
current_alta_at: "2025-01-01",
|
|
}),
|
|
true,
|
|
);
|
|
});
|
|
|
|
Deno.test("freshnessRequired: rehire con alta posterior no exige frescor", () => {
|
|
assertEquals(
|
|
freshnessRequired({
|
|
imss_status: "alta",
|
|
last_rehire_at: "2026-01-01",
|
|
current_alta_at: "2026-02-01",
|
|
}),
|
|
false,
|
|
);
|
|
});
|
|
|
|
Deno.test("CURP stale when freshness required and upload is older than 90 days", () => {
|
|
const ctx: WorkerImssContext = {
|
|
imss_status: "sin_alta",
|
|
last_rehire_at: null,
|
|
current_alta_at: null,
|
|
};
|
|
const result = evaluateDocumentValidity(
|
|
curpPolicy,
|
|
{ type_code: "curp", issued_at: "2025-01-01", expires_at: null, uploaded_at: "2025-01-02" },
|
|
ctx,
|
|
"2026-08-20",
|
|
);
|
|
assertEquals(result.validity_status, "stale_for_alta");
|
|
assertEquals(result.valid, false);
|
|
});
|
|
|
|
Deno.test("CURP recent upload is fresh even if issued_at is old", () => {
|
|
const ctx: WorkerImssContext = {
|
|
imss_status: "sin_alta",
|
|
last_rehire_at: null,
|
|
current_alta_at: null,
|
|
};
|
|
const result = evaluateDocumentValidity(
|
|
curpPolicy,
|
|
{ type_code: "curp", issued_at: "2024-01-01", expires_at: null, uploaded_at: "2026-08-01" },
|
|
ctx,
|
|
"2026-08-20",
|
|
);
|
|
assertEquals(result.validity_status, "ok");
|
|
assertEquals(result.valid, true);
|
|
});
|
|
|
|
Deno.test("CURP old but ok when already alta", () => {
|
|
const ctx: WorkerImssContext = {
|
|
imss_status: "alta",
|
|
last_rehire_at: null,
|
|
current_alta_at: "2025-02-01",
|
|
};
|
|
const result = evaluateDocumentValidity(
|
|
curpPolicy,
|
|
{ type_code: "curp", issued_at: "2025-01-01", expires_at: null, uploaded_at: "2025-01-02" },
|
|
ctx,
|
|
"2026-08-20",
|
|
);
|
|
assertEquals(result.validity_status, "ok");
|
|
assertEquals(result.valid, true);
|
|
});
|
|
|
|
Deno.test("INE expired always invalid", () => {
|
|
const ctx: WorkerImssContext = {
|
|
imss_status: "alta",
|
|
last_rehire_at: null,
|
|
current_alta_at: "2026-01-01",
|
|
};
|
|
const result = evaluateDocumentValidity(
|
|
inePolicy,
|
|
{ type_code: "ine", issued_at: null, expires_at: "2025-12-31", uploaded_at: "2025-01-01" },
|
|
ctx,
|
|
"2026-08-20",
|
|
);
|
|
assertEquals(result.validity_status, "expired");
|
|
assertEquals(result.valid, false);
|
|
});
|
|
|
|
Deno.test("freshness without issued_at uses uploaded_at", () => {
|
|
const result = evaluateDocumentValidity(
|
|
curpPolicy,
|
|
{ type_code: "curp", issued_at: null, expires_at: null, uploaded_at: "2026-08-01" },
|
|
{ imss_status: "sin_alta", last_rehire_at: null, current_alta_at: null },
|
|
"2026-08-20",
|
|
);
|
|
assertEquals(result.validity_status, "ok");
|
|
assertEquals(result.valid, true);
|
|
});
|
|
|
|
Deno.test("INE without expires_at is valid; reviewer checks the file", () => {
|
|
const result = evaluateDocumentValidity(
|
|
inePolicy,
|
|
{ type_code: "ine", issued_at: null, expires_at: null, uploaded_at: "2026-08-01" },
|
|
{ imss_status: "sin_alta", last_rehire_at: null, current_alta_at: null },
|
|
"2026-08-20",
|
|
);
|
|
assertEquals(result.validity_status, "ok");
|
|
assertEquals(result.valid, true);
|
|
});
|
|
|
|
Deno.test("núcleo de persona no se agranda", () => {
|
|
const required = DOCUMENT_TYPE_SEED.filter((d) => d.required).map((d) => d.code).sort();
|
|
assertEquals(required, ["curp", "domicilio", "foto", "ine", "nss", "rfc"]);
|
|
});
|
|
|
|
Deno.test("núcleo de obra no se agranda", () => {
|
|
const required = PROJECT_DOCUMENT_TYPE_SEED.filter((d) => d.required).map((d) => d.code).sort();
|
|
assertEquals(required, ["contrato", "presupuesto"]);
|
|
});
|
|
|
|
Deno.test("empresa no tiene documentos obligatorios", () => {
|
|
assertEquals(COMPANY_DOCUMENT_TYPE_SEED.every((d) => d.required === 0), true);
|
|
});
|