UNPKG

facturacionelectronicapy-ts-xmlgen

Version:

Genera el contenido del archivo XML del Documento electrónico exigido por la SET

235 lines (233 loc) 8.59 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const zod_1 = require("zod"); const countries_table_1 = require("../../data/countries.table"); const currencies_table_1 = require("../../data/currencies.table"); const departments_table_1 = require("../../data/departments.table"); const taxpayerNotTaxpayer_table_1 = require("../../data/taxpayerNotTaxpayer.table"); const db_service_1 = __importDefault(require("../../services/db.service")); const DateHelper_1 = __importDefault(require("../DateHelper")); const NumberLenght_1 = __importDefault(require("./NumberLenght")); class CommonValidators { addFieldError(ctx, message) { ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message, path: ctx.path, }); } oneNumberOf(tableName, message) { return zod_1.z.number().superRefine((value, ctx) => { if (!value) return; const foundData = db_service_1.default[tableName]._findByIdIfExist(value); if (foundData) return; const path = `'${ctx.path.join('.')}'`; this.addFieldError(ctx, message ?? `El valor del campo ${path} no es válido`); }); } // DELETE: de momento no se usa, pero se puede usar para mejorar la eficiencia de algunas validaciones /* oneStringOf(tableName: 'countries' | 'currencies' | 'tradingConditions', message?: string) { return z.string().superRefine((value, ctx) => { if (!value) return; const foundData = dbService .select(tableName) ._findByIdIfExist(value as Country | Currency | TradingCondition); if (foundData) return; const path = `'${ctx.path.join('.')}'`; this.addFieldError( ctx, message ?? `El valor del campo ${path} no es válido`, ); }); } */ location(ctx, departmentId, districtId, cityId) { const strPath = `'${ctx.path.join('.')}'`; let foundDistrict = db_service_1.default.districts._findByIdIfExist(districtId); if (districtId && !foundDistrict) { this.addFieldError(ctx, `No se encontró el distrito con el Id '${districtId}' en ${strPath}`); } else if (foundDistrict && departmentId && foundDistrict.department != departmentId) { this.addFieldError(ctx, `El departamento con _id '${departmentId}' no coincide con el distrito con _id '${districtId}' en ${strPath}`); } if (!cityId) return; let foundCity = db_service_1.default.cities._findByIdIfExist(cityId); if (!foundCity) { this.addFieldError(ctx, `No se encontró la ciudad con el Id '${cityId}' en ${strPath}`); } else if (districtId && foundCity.distrito != districtId) { this.addFieldError(ctx, `El distrito con _id '${districtId}' no coincide con la ciudad con _id '${cityId}' en ${strPath}`); } } zeroPadToLength(maxLength, messages) { return zod_1.z .number() .min(1) .transform((value, ctx) => { if (value == undefined) return value; new NumberLenght_1.default(value, ctx) .int(messages?.int) .max(maxLength, messages?.max); return value.toString().padStart(maxLength, '0'); }); } isoDate() { return zod_1.z.coerce.date().transform((value) => { if (!value) return value; return DateHelper_1.default.getIsoDate(value); }); } isoDateTime() { return zod_1.z.coerce.date().transform((value) => { if (!value) return value; return DateHelper_1.default.getIsoDateTime(value); }); } taxpayer() { return zod_1.z .boolean() .transform((v) => v ? taxpayerNotTaxpayer_table_1.TaxpayerNotTaxpayer.CONTRIBUYENTE : taxpayerNotTaxpayer_table_1.TaxpayerNotTaxpayer.NO_CONTRIBUYENTE); } ruc(messages) { return zod_1.z.string().superRefine((value, ctx) => { const [id, dv] = value.split('-'); const path = `'${ctx.path.join('.')}'`; if (id.length > 8) { ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: messages?.max ?? `El numero de identificación en ${path} debe tener como máximo 8 caracteres`, }); } else if (id.length < 3) { ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: messages?.min ?? `El numero de identificación en ${path} debe tener al menos 3 caracteres`, }); } if (!dv) { ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: `El ruc en ${path} debe contener el dígito verificador`, }); } else { const dvNumber = Number(dv); if (Number.isNaN(dvNumber) || dvNumber < 1 || dvNumber > 9) { ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: `El dígito verificador de ${path} debe ser un número entre 1 y 9`, }); } } }); } name() { return zod_1.z.string().min(4).max(60); } legalName() { return zod_1.z.string().min(4).max(255); } tradeName() { return zod_1.z.string().min(4).max(255); } tel() { return zod_1.z.string().min(6).max(15); } cel() { return zod_1.z.string().min(10).max(20); } email() { return zod_1.z.string().email().min(3).max(80); } identityDocDescription() { return zod_1.z.string().min(9).max(41); } identityDocNumber() { return zod_1.z.string().min(1).max(20); } currency() { return zod_1.z.nativeEnum(currencies_table_1.Currency); } currencyChange() { return zod_1.z.number().superRefine((value, ctx) => { if (value == undefined) return; new NumberLenght_1.default(value, ctx).max(5).maxDecimals(4); }); } country() { return zod_1.z.nativeEnum(countries_table_1.Country); } department() { return zod_1.z.nativeEnum(departments_table_1.Department); } district() { return this.oneNumberOf('districts'); } city() { return this.oneNumberOf('cities'); } address() { return zod_1.z.string().min(1).max(255); } houseNumber() { return zod_1.z.number().superRefine((value, ctx) => { if (value == undefined) return; new NumberLenght_1.default(value, ctx).int().max(6); }); } gtinCode(messages) { return zod_1.z.number().superRefine((value, ctx) => { if (value == undefined) return; const nStr = value.toString(); const validLenghts = [8, 12, 13, 14]; if (validLenghts.includes(nStr.length)) return; const path = `'${ctx.path.join('.')}'`; this.addFieldError(ctx, messages?.length ?? `El valor del campo ${path} debe ser del tipo de código GTIN de 8 o 12 o 13 o 14 caracteres`); }); } cdc() { return zod_1.z.string().length(44); } motive() { return zod_1.z.string().min(5).max(500); } timbrado() { return zod_1.z.number().superRefine((value, ctx) => { new NumberLenght_1.default(value, ctx).int().length(8); }); } serie() { return zod_1.z.string().superRefine((value, ctx) => { if (value == undefined) return true; // Solo 2 letras mayúsculas if (/^[A-Z]{2}$/.test(value)) return; const path = `'${ctx.path.join('.')}'`; this.addFieldError(ctx, `El valor del campo ${path} debe ser exactamente 2 letras mayúsculas`); }); } clientCode() { return zod_1.z.string().min(3).max(15); } } exports.default = new CommonValidators();