facturacionelectronicapy-ts-xmlgen
Version:
Genera el contenido del archivo XML del Documento electrónico exigido por la SET
79 lines (78 loc) • 3.02 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CondicionSchema = void 0;
const zod_1 = require("zod");
const paymentConditions_table_1 = require("../../data/paymentConditions.table");
const entregas_schema_1 = require("./entregas.schema");
const db_service_1 = __importDefault(require("../../services/db.service"));
const ZodValidator_1 = __importDefault(require("../../helpers/validation/ZodValidator"));
const credito_schema_1 = require("./credito.schema");
const SDParser_1 = __importDefault(require("../../helpers/SDParser"));
exports.CondicionSchema = zod_1.z
.object({
// E601
tipo: zod_1.z
.nativeEnum(paymentConditions_table_1.PaymentCondition)
.describe(SDParser_1.default.stringify('E601', { e: 'PaymentCondition' })),
// E7.1. Campos que describen la forma de pago de la operación al contado o del monto de la entrega inicial (E605-E619)
entregas: zod_1.z
.array(entregas_schema_1.EntregaSchema)
.max(999)
.optional()
.describe(SDParser_1.default.stringify('E7.1', {
d: 'Campos que describen la forma de pago de la operación al contado o del monto de la entrega inicial (E605-E619)',
})),
// E7.2. Campos que describen la operación a crédito (E640-E649)
credito: credito_schema_1.CreditoSchema.optional().describe(SDParser_1.default.stringify('E7.2', {
d: 'Campos que describen la operación a crédito (E640-E649)',
})),
})
.transform((data, ctx) => {
const validator = new ZodValidator_1.default(ctx, data);
/**E601 = 1 */
const isInCash = data.tipo == paymentConditions_table_1.PaymentCondition.CONTADO;
/**E601 = 2 */
const isInCredit = data.tipo == paymentConditions_table_1.PaymentCondition.CREDITO;
// E605 - entregas
{
/*
Obligatorio si E601 = 1
Obligatorio si existe el campo E645: esto no se aplica en este repo ya que
E645 se calcula automáticamente en base a entregas
*/
if (isInCash) {
validator.requiredField('entregas');
}
}
// E640 - credito
{
/*
Obligatorio si E601 = 2
No informar si E601 ≠ 2
*/
if (isInCredit) {
validator.requiredField('credito');
}
else {
validator.undesiredField('credito');
}
}
// E645 - credito.montoEntregaInicial
let credito = data.credito;
{
// ⚠️ esto no es del manual, pero si del repo original
if (data.credito && data.entregas) {
credito.montoEntregaInicial = data.entregas.reduce((acc, entrega) => acc + entrega.monto, 0);
}
}
return {
...data,
credito,
// E602
tipoDescripcion: db_service_1.default.paymentConditions._findById(data.tipo)
.description,
};
});