facturacionelectronicapy-ts-xmlgen
Version:
Genera el contenido del archivo XML del Documento electrónico exigido por la SET
66 lines (65 loc) • 2.79 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EDocSchema = void 0;
const zod_1 = require("zod");
const EDocData_schema_1 = require("./EDocData.schema");
const EDocParams_schema_1 = require("./EDocParams.schema");
const ZodValidator_1 = __importDefault(require("../helpers/validation/ZodValidator"));
const Path_1 = require("../helpers/Path");
const remissionReasons_table_1 = require("../data/remissionReasons.table");
const CDCHelper_1 = __importDefault(require("../helpers/CDCHelper"));
exports.EDocSchema = zod_1.z
.object({
data: EDocData_schema_1.EDocDataSchema,
params: EDocParams_schema_1.EDocParamsSchema,
})
.transform((eDoc, ctx) => {
const { data, params } = eDoc;
const validator = new ZodValidator_1.default(ctx, eDoc);
const dataPath = new Path_1.Path('data');
const paramsPath = new Path_1.Path('params');
const isValidEstablishment = params.establecimientos.some((d) => d.codigo == data.establecimiento);
const paramsEstablishmentPath = paramsPath.concat('establecimiento');
validator.validate(dataPath.concat('establecimiento'), !isValidEstablishment, `Debe utilizar un establecimiento de '${paramsEstablishmentPath}'`);
// E501
{
/*
OBS: Cuando el motivo sea por
operaciones internas de la empresa,
el RUC del receptor debe ser igual al
RUC del emisor.
*/
if (data.remision &&
data.remision.motivo ==
remissionReasons_table_1.RemissionReason.TRASLADO_ENTRE_LOCALES_DE_LA_EMPRESA) {
const paramsRucPath = paramsPath.concat('ruc');
validator.validate(dataPath.concat('cliente').concat('ruc'), data.cliente.ruc != params.ruc, `RUC del receptor en $path debe coincidir con el RUC del emisor en '${paramsRucPath}'`);
}
}
// ⚠️ según el repo original
if (!data.cdc) {
validator.requiredField(dataPath.concat('codigoSeguridadAleatorio'));
if (data.codigoSeguridadAleatorio) {
validator.validate(paramsPath.concat('ruc'), !params.rucDV, '$path debe contener dígito verificador');
data.cdc = CDCHelper_1.default.generateCDC(params, data);
}
}
else {
CDCHelper_1.default.validateCDC(params, data, ctx);
}
return {
data: {
...data,
// A002: ⚠️ según el repo original
Id: data.cdc,
// A003
dvId: data.cdc?.charAt(data.cdc.length - 1),
// B004
codigoSeguridadAleatorio: data.codigoSeguridadAleatorio?.toString(),
},
params,
};
});