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
JavaScript
;
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();