facturacionelectronicapy-ts-xmlgen
Version:
Genera el contenido del archivo XML del Documento electrónico exigido por la SET
89 lines (88 loc) • 3.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImpuestoSchema = void 0;
const zod_1 = require("zod");
const TaxRate_1 = require("../../types/TaxRate");
const taxTreatments_table_1 = require("../../data/taxTreatments.table");
const ZodValidator_1 = __importDefault(require("../../helpers/validation/ZodValidator"));
const db_service_1 = __importDefault(require("../../services/db.service"));
const SDParser_1 = __importDefault(require("../../helpers/SDParser"));
/**E8.2. Campos que describen el IVA de la operación por ítem (E730-E739) */
exports.ImpuestoSchema = zod_1.z
.object({
// E731
ivaTipo: zod_1.z
.nativeEnum(taxTreatments_table_1.TaxTreatment)
.describe(SDParser_1.default.stringify('E731', { e: 'TaxTreatment' })),
// E733
proporcionGravada: zod_1.z
.number()
.min(0)
.max(100)
.optional()
.describe(SDParser_1.default.stringify('E733')),
// E734
iva: zod_1.z
.nativeEnum(TaxRate_1.TaxRate)
.describe(SDParser_1.default.stringify('E734', { e: 'TaxRate' })),
})
.transform((data, ctx) => {
const validator = new ZodValidator_1.default(ctx, data);
/**E731 = 1 */
const isIvaGravado = data.ivaTipo == taxTreatments_table_1.TaxTreatment.GRAVADO_IVA;
/**E731 = 2 */
const isIvaExonerado = data.ivaTipo == taxTreatments_table_1.TaxTreatment.EXONERADO__ART__100___LEY_6380_2019_;
/**E731 = 3 */
const isIvaExento = data.ivaTipo == taxTreatments_table_1.TaxTreatment.EXENTO;
/**E731 = 4 */
const isIvaGravadoParcial = data.ivaTipo == taxTreatments_table_1.TaxTreatment.GRAVADO_PARCIAL__GRAV__EXENTO_;
/**E734 = 0 */
const taxRateIs0 = data.iva == TaxRate_1.TaxRate.CERO;
/**E734 = 5 */
const taxRateIs5 = data.iva == TaxRate_1.TaxRate.CINCO;
/**E734 = 10 */
const taxRateIs10 = data.iva == TaxRate_1.TaxRate.DIEZ;
// E733 - proporcionGravada
{
// ⚠️ esto no es del manual
if (data.proporcionGravada != undefined) {
if (isIvaGravado) {
validator.validate('proporcionGravada', data.proporcionGravada != 100, '$path debe ser de 100% para el tipo de IVA gravado');
}
else if (isIvaExonerado || isIvaExento) {
validator.validate('proporcionGravada', data.proporcionGravada != 0, '$path debe ser de 0% para el tipo de IVA exonerado o exento');
}
}
else {
if (isIvaGravado) {
data.proporcionGravada = 100;
}
else if (isIvaExonerado || isIvaExento) {
data.proporcionGravada = 0;
}
else if (isIvaGravadoParcial) {
validator.requiredField('proporcionGravada', 'Si el tipo de IVA es parcial, la proporcion gravada es requerida');
}
}
}
// E734 - iva
{
/*
0 (para E731 = 2 o 3)
5 (para E731 = 1 o 4)
10 (para E731 = 1 o 4)
*/
validator.validate('iva', (isIvaGravado || isIvaGravadoParcial) && !(taxRateIs5 || taxRateIs10), '$path debe ser cinco o diez si es gravado o gravado parcial');
validator.validate('iva', (isIvaExonerado || isIvaExento) && !taxRateIs0, '$path debe ser cero si es exonerado o exento');
}
return {
...data,
proporcionGravada: data.proporcionGravada,
// E732
ivaTipoDescripcion: db_service_1.default.taxTreatments._findById(data.ivaTipo)
.description,
};
});