sunat-engine-nest 2.0.4 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +43 -0
  2. package/dist/gre/sunat-gre.client.d.ts +1 -0
  3. package/dist/gre/sunat-gre.client.js +2 -1
  4. package/dist/gre/sunat-gre.client.js.map +1 -1
  5. package/dist/index.d.ts +4 -2
  6. package/dist/index.js +8 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/ose/ose.client.d.ts +20 -2
  9. package/dist/ose/ose.client.js +316 -27
  10. package/dist/ose/ose.client.js.map +1 -1
  11. package/dist/signer/xml-signer.service.js +4 -1
  12. package/dist/signer/xml-signer.service.js.map +1 -1
  13. package/dist/soap/sunat-soap.client.d.ts +2 -1
  14. package/dist/soap/sunat-soap.client.js +48 -23
  15. package/dist/soap/sunat-soap.client.js.map +1 -1
  16. package/dist/sunat-engine.module.d.ts +4 -0
  17. package/dist/sunat-engine.module.js.map +1 -1
  18. package/dist/sunat-engine.service.d.ts +1 -0
  19. package/dist/sunat-engine.service.js +41 -13
  20. package/dist/sunat-engine.service.js.map +1 -1
  21. package/dist/tsconfig.build.tsbuildinfo +1 -1
  22. package/dist/tsconfig.tsbuildinfo +1 -1
  23. package/dist/types/sunat.types.d.ts +9 -1
  24. package/dist/validation/document.validator.d.ts +5 -0
  25. package/dist/validation/document.validator.js +262 -0
  26. package/dist/validation/document.validator.js.map +1 -0
  27. package/dist/validation/invoice.validator.d.ts +4 -0
  28. package/dist/validation/invoice.validator.js +249 -31
  29. package/dist/validation/invoice.validator.js.map +1 -1
  30. package/dist/xml/common.builder.js +50 -19
  31. package/dist/xml/common.builder.js.map +1 -1
  32. package/dist/xml/despatch.builder.d.ts +1 -0
  33. package/dist/xml/despatch.builder.js +217 -20
  34. package/dist/xml/despatch.builder.js.map +1 -1
  35. package/dist/xml/invoice.builder.js +4 -1
  36. package/dist/xml/invoice.builder.js.map +1 -1
  37. package/dist/xml/namespaces.js +2 -2
  38. package/dist/xml/namespaces.js.map +1 -1
  39. package/dist/xml/note.builder.js +2 -1
  40. package/dist/xml/note.builder.js.map +1 -1
  41. package/dist/xml/summary.builder.js +16 -23
  42. package/dist/xml/summary.builder.js.map +1 -1
  43. package/dist/xml/voided.builder.js +5 -5
  44. package/dist/xml/voided.builder.js.map +1 -1
  45. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InvoiceValidationError = void 0;
3
+ exports.CATALOGO_51_TIPO_OPERACION = exports.CATALOGO_06_DOC_IDENTIDAD = exports.CATALOGO_02_MONEDA = exports.InvoiceValidationError = void 0;
4
+ exports.normalizeTipDocAfectado = normalizeTipDocAfectado;
4
5
  exports.validateInvoicePayload = validateInvoicePayload;
5
6
  exports.validateNotePayload = validateNotePayload;
6
7
  class InvoiceValidationError extends Error {
@@ -14,6 +15,47 @@ exports.InvoiceValidationError = InvoiceValidationError;
14
15
  function addError(errors, field, msg) {
15
16
  errors.push(`${field}: ${msg}`);
16
17
  }
18
+ function normalizeTipDocAfectado(value) {
19
+ const raw = String(value ?? '').trim();
20
+ return /^\d$/.test(raw) ? raw.padStart(2, '0') : raw;
21
+ }
22
+ exports.CATALOGO_02_MONEDA = [
23
+ 'PEN', 'USD', 'EUR', 'GBP', 'JPY', 'CAD', 'AUD', 'CHF', 'CNY',
24
+ 'SEK', 'NOK', 'DKK', 'CZK', 'PLN', 'HUF', 'RON', 'BGN', 'RUB',
25
+ 'TRY', 'UAH', 'INR', 'KRW', 'SGD', 'HKD', 'NZD', 'THB', 'MYR',
26
+ 'PHP', 'IDR', 'VND', 'MXN', 'BRL', 'ARS', 'CLP', 'COP',
27
+ 'ILS', 'SAR', 'AED', 'ZAR', 'EGP', 'NGN', 'KES', 'MAD', 'TND',
28
+ 'BHD', 'QAR', 'KWD', 'OMR', 'JOD', 'LKR', 'PKR', 'BDT', 'NPR',
29
+ 'KZT', 'UZS', 'GEL', 'AZN', 'AMD', 'BYN', 'HRK', 'RSD', 'ISK',
30
+ 'ALL', 'MKD', 'BAM', 'MDA', 'TJS', 'TMT', 'KGS',
31
+ ];
32
+ exports.CATALOGO_06_DOC_IDENTIDAD = ['0', '1', '4', '6', '7', 'A', 'B', 'C', 'D', 'E'];
33
+ exports.CATALOGO_51_TIPO_OPERACION = [
34
+ '0101', '0112', '0113',
35
+ '0200', '0201', '0202', '0203', '0204', '0205', '0206', '0207', '0208',
36
+ '0301', '0302', '0303',
37
+ '0401',
38
+ '0501', '0502', '0503',
39
+ '1001', '1002', '1003', '1004',
40
+ '2001', '2100', '2101', '2102', '2103', '2104',
41
+ ];
42
+ const AFECTACION_GRAVADA = ['10', '11', '12', '13', '14', '15', '16', '17'];
43
+ const AFECTACION_SIN_IGV = [
44
+ '20', '21', '30', '31', '32', '33', '34', '35', '36', '37',
45
+ ];
46
+ const TASA_IGV = 18;
47
+ const TOL_LINEA = 0.02;
48
+ const TOL_EXACTA = 0.01;
49
+ function near(a, b, tol = TOL_EXACTA) {
50
+ const cents = Math.abs(Math.round(Number(a) * 100) - Math.round(Number(b) * 100));
51
+ return cents <= Math.round(tol * 100);
52
+ }
53
+ function round2(n) {
54
+ return Math.round(n * 100) / 100;
55
+ }
56
+ function hasTwoDecimals(value) {
57
+ return Math.abs(value * 100 - Math.round(value * 100)) < 1e-6;
58
+ }
17
59
  function isValidRuc(ruc) {
18
60
  if (!/^\d{11}$/.test(ruc))
19
61
  return false;
@@ -24,11 +66,8 @@ function isValidRuc(ruc) {
24
66
  const checkDigit = remainder < 2 ? remainder : 11 - remainder;
25
67
  return checkDigit === digits[10];
26
68
  }
27
- function isValidSerie(tipoDoc, serie) {
28
- const prefix = tipoDoc === '01' ? 'F' : tipoDoc === '03' ? 'B' : tipoDoc === '07' ? 'F' : tipoDoc === '08' ? 'F' : '';
29
- if (!prefix)
30
- return /^\w{3,4}$/.test(serie);
31
- return new RegExp(`^${prefix}\\d{3,4}$`).test(serie);
69
+ function isValidSerie(serie) {
70
+ return /^[A-Z0-9]{4}$/i.test(serie);
32
71
  }
33
72
  function isValidCorrelativo(correlativo) {
34
73
  return /^\d{1,8}$/.test(correlativo);
@@ -49,6 +88,9 @@ function validateDetail(detail, index, errors) {
49
88
  if (!detail.unidad || detail.unidad.trim() === '') {
50
89
  addError(errors, `${prefix}.unidad`, 'Unidad de medida es obligatoria');
51
90
  }
91
+ else if (!/^[A-Za-z0-9]{1,3}$/.test(detail.unidad.trim())) {
92
+ addError(errors, `${prefix}.unidad`, `Unidad "${detail.unidad}" inválida: debe ser un código de 1 a 3 caracteres del Catálogo N.° 05 (ej: NIU, KGM, ZZ)`);
93
+ }
52
94
  if (detail.cantidad === undefined || detail.cantidad === null || detail.cantidad <= 0) {
53
95
  addError(errors, `${prefix}.cantidad`, 'Cantidad debe ser mayor a 0');
54
96
  }
@@ -64,12 +106,67 @@ function validateDetail(detail, index, errors) {
64
106
  if (!detail.tipAfeIgv || !['10', '11', '12', '13', '14', '15', '16', '17', '20', '21', '30', '31', '32', '33', '34', '35', '36', '37', '40', '41'].includes(detail.tipAfeIgv)) {
65
107
  addError(errors, `${prefix}.tipAfeIgv`, `Tipo afectación IGV "${detail.tipAfeIgv}" no es válido (Cat. 07)`);
66
108
  }
67
- const afectacionesGravadas = ['10', '11', '12', '13', '14', '15', '16', '17'];
68
- if (afectacionesGravadas.includes(detail.tipAfeIgv)) {
69
- const igvEsperado = Math.round(detail.mtoBaseIgv * 18) / 100;
70
- if (Math.abs(detail.igv - igvEsperado) > 0.02) {
71
- addError(errors, `${prefix}.igv`, `IGV ${detail.igv} no coincide con 18% de base ${detail.mtoBaseIgv} (esperado: ${igvEsperado})`);
109
+ const importes = [
110
+ 'mtoValorUnitario', 'mtoValorVenta', 'mtoBaseIgv', 'porcentajeIgv',
111
+ 'igv', 'totalImpuestos', 'mtoPrecioUnitario', 'mtoValorGratuito',
112
+ 'isc', 'icbper',
113
+ ];
114
+ for (const campo of importes) {
115
+ const v = detail[campo];
116
+ if (v == null)
117
+ continue;
118
+ if (typeof v !== 'number' || Number.isNaN(v)) {
119
+ addError(errors, `${prefix}.${campo}`, `${campo} debe ser un número`);
120
+ continue;
121
+ }
122
+ if (v < 0) {
123
+ addError(errors, `${prefix}.${campo}`, `${campo} no puede ser negativo (recibido ${v})`);
124
+ continue;
72
125
  }
126
+ if (campo !== 'porcentajeIgv' && !hasTwoDecimals(v)) {
127
+ addError(errors, `${prefix}.${campo}`, `${campo} debe tener máximo 2 decimales (recibido ${v})`);
128
+ }
129
+ }
130
+ const gratuita = (detail.mtoValorGratuito ?? 0) > 0;
131
+ const gravada = AFECTACION_GRAVADA.includes(detail.tipAfeIgv);
132
+ if (gravada) {
133
+ if (Number(detail.porcentajeIgv) !== TASA_IGV) {
134
+ addError(errors, `${prefix}.porcentajeIgv`, `Operación gravada (tipAfeIgv ${detail.tipAfeIgv}) debe llevar porcentajeIgv ${TASA_IGV} (recibido ${detail.porcentajeIgv})`);
135
+ }
136
+ const igvEsperado = round2((detail.mtoBaseIgv ?? 0) * TASA_IGV / 100);
137
+ if (!near(detail.igv, igvEsperado, TOL_LINEA)) {
138
+ addError(errors, `${prefix}.igv`, `IGV ${detail.igv} no coincide con ${TASA_IGV}% de la base ${detail.mtoBaseIgv} (esperado: ${igvEsperado})`);
139
+ }
140
+ }
141
+ else if (AFECTACION_SIN_IGV.includes(detail.tipAfeIgv)) {
142
+ if (Number(detail.porcentajeIgv) !== 0 || detail.igv !== 0) {
143
+ addError(errors, `${prefix}.igv`, `Operación exonerada/inafecta (tipAfeIgv ${detail.tipAfeIgv}) no genera IGV: ` +
144
+ `porcentajeIgv debe ser 0 e igv 0 (recibidos ${detail.porcentajeIgv}, ${detail.igv})`);
145
+ }
146
+ }
147
+ if (gratuita) {
148
+ if (detail.mtoValorVenta !== 0) {
149
+ addError(errors, `${prefix}.mtoValorVenta`, `Con mtoValorGratuito > 0 el mtoValorVenta debe ser 0 (recibido ${detail.mtoValorVenta})`);
150
+ }
151
+ return;
152
+ }
153
+ const vvEsperado = round2(Number(detail.cantidad) * Number(detail.mtoValorUnitario));
154
+ if (!near(detail.mtoValorVenta, vvEsperado, TOL_LINEA)) {
155
+ addError(errors, `${prefix}.mtoValorVenta`, `mtoValorVenta ${detail.mtoValorVenta} no coincide con cantidad (${detail.cantidad}) × ` +
156
+ `mtoValorUnitario (${detail.mtoValorUnitario}) = ${vvEsperado}`);
157
+ }
158
+ if (!near(detail.mtoBaseIgv, detail.mtoValorVenta)) {
159
+ addError(errors, `${prefix}.mtoBaseIgv`, `mtoBaseIgv ${detail.mtoBaseIgv} debe ser igual a mtoValorVenta ${detail.mtoValorVenta}`);
160
+ }
161
+ const precioEsperado = round2(Number(detail.mtoValorUnitario) * (1 + Number(detail.porcentajeIgv) / 100));
162
+ if (!near(detail.mtoPrecioUnitario, precioEsperado, TOL_LINEA)) {
163
+ addError(errors, `${prefix}.mtoPrecioUnitario`, `mtoPrecioUnitario ${detail.mtoPrecioUnitario} no coincide con ` +
164
+ `mtoValorUnitario × (1 + ${detail.porcentajeIgv}%) = ${precioEsperado}`);
165
+ }
166
+ const totalImpuestosEsperado = round2((detail.igv ?? 0) + (detail.isc ?? 0) + (detail.icbper ?? 0));
167
+ if (!near(detail.totalImpuestos, totalImpuestosEsperado)) {
168
+ addError(errors, `${prefix}.totalImpuestos`, `totalImpuestos ${detail.totalImpuestos} no coincide con IGV+ISC+ICBPER = ${totalImpuestosEsperado} ` +
169
+ `(SUNAT observa 3292/3294)`);
73
170
  }
74
171
  }
75
172
  function validateInvoicePayload(data) {
@@ -77,8 +174,8 @@ function validateInvoicePayload(data) {
77
174
  if (!data.tipoDoc || !['01', '03'].includes(data.tipoDoc)) {
78
175
  addError(errors, 'tipoDoc', `Tipo documento "${data.tipoDoc}" inválido. Debe ser "01" (Factura) o "03" (Boleta)`);
79
176
  }
80
- if (!data.serie || !isValidSerie(data.tipoDoc, data.serie)) {
81
- addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido (ej: F001, B001)`);
177
+ if (!data.serie || !isValidSerie(data.serie)) {
178
+ addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido (4 caracteres alfanuméricos, ej: F001, FC01, B001, BC01)`);
82
179
  }
83
180
  if (!data.correlativo || !isValidCorrelativo(data.correlativo)) {
84
181
  addError(errors, 'correlativo', `Correlativo "${data.correlativo}" inválido (1-8 dígitos numéricos)`);
@@ -92,9 +189,15 @@ function validateInvoicePayload(data) {
92
189
  if (!data.tipoMoneda || data.tipoMoneda.trim() === '') {
93
190
  addError(errors, 'tipoMoneda', 'Tipo de moneda es obligatoria (ej: PEN, USD)');
94
191
  }
192
+ else if (!exports.CATALOGO_02_MONEDA.includes(data.tipoMoneda.trim().toUpperCase())) {
193
+ addError(errors, 'tipoMoneda', `tipoMoneda "${data.tipoMoneda}" no está en el Catálogo N.° 02 (ej: ${exports.CATALOGO_02_MONEDA.slice(0, 6).join(', ')})`);
194
+ }
95
195
  if (!data.tipoOperacion || data.tipoOperacion.trim() === '') {
96
196
  addError(errors, 'tipoOperacion', 'Tipo de operación es obligatorio (Cat. 51)');
97
197
  }
198
+ else if (!exports.CATALOGO_51_TIPO_OPERACION.includes(data.tipoOperacion.trim())) {
199
+ addError(errors, 'tipoOperacion', `tipoOperacion "${data.tipoOperacion}" no está en el Catálogo N.° 51 (ej: 0101 venta interna, 0200 exportación de bienes, 1001 sujeta a detracción, 2001 sujeta a percepción)`);
200
+ }
98
201
  if (!data.company) {
99
202
  addError(errors, 'company', 'Datos del emisor son obligatorios');
100
203
  }
@@ -113,6 +216,9 @@ function validateInvoicePayload(data) {
113
216
  if (!data.client.tipoDoc || data.client.tipoDoc.trim() === '') {
114
217
  addError(errors, 'client.tipoDoc', 'Tipo documento del cliente es obligatorio');
115
218
  }
219
+ else if (!exports.CATALOGO_06_DOC_IDENTIDAD.includes(data.client.tipoDoc.trim())) {
220
+ addError(errors, 'client.tipoDoc', `client.tipoDoc "${data.client.tipoDoc}" no está en el Catálogo N.° 06 (6=RUC, 1=DNI, 4=Carné extranjería, 7=Pasaporte, 0=Doc. trib. sin RUC)`);
221
+ }
116
222
  if (!data.client.numDoc || data.client.numDoc.trim() === '') {
117
223
  addError(errors, 'client.numDoc', 'Número documento del cliente es obligatorio');
118
224
  }
@@ -136,32 +242,86 @@ function validateInvoicePayload(data) {
136
242
  }
137
243
  if (data.details && data.details.length > 0) {
138
244
  const afectacionesGravadas = ['10', '11', '12', '13', '14', '15', '16', '17'];
245
+ const isFree = (d) => (d.mtoValorGratuito ?? 0) > 0;
139
246
  let sumaValorVenta = 0;
140
247
  let sumaBaseIgv = 0;
141
248
  let sumaIgv = 0;
249
+ let sumaBaseGravada = 0;
250
+ let sumaOperGratuitas = 0;
251
+ let sumaIGVGratuitas = 0;
142
252
  for (const d of data.details) {
253
+ if (isFree(d)) {
254
+ sumaOperGratuitas += d.mtoValorGratuito || 0;
255
+ if (afectacionesGravadas.includes(d.tipAfeIgv)) {
256
+ sumaIGVGratuitas += d.igv || 0;
257
+ }
258
+ continue;
259
+ }
143
260
  sumaValorVenta += d.mtoValorVenta || 0;
144
261
  sumaBaseIgv += d.mtoBaseIgv || 0;
145
262
  if (afectacionesGravadas.includes(d.tipAfeIgv)) {
146
263
  sumaIgv += d.igv || 0;
264
+ sumaBaseGravada += d.mtoBaseIgv || 0;
147
265
  }
148
266
  }
267
+ const esAfectante = (cod) => cod === '00' || cod === '02';
268
+ let descuentoAfectante = 0;
269
+ let descuentoNoAfectante = 0;
270
+ for (const d of data.descuentos ?? []) {
271
+ const monto = Number(d.monto) || 0;
272
+ if (esAfectante(d.codTipo))
273
+ descuentoAfectante += monto;
274
+ else
275
+ descuentoNoAfectante += monto;
276
+ }
277
+ const tasaIgv = sumaBaseGravada > 0 ? sumaIgv / sumaBaseGravada : 0;
278
+ const descuentoIgv = descuentoAfectante * tasaIgv;
279
+ const valorVentaEsperada = sumaValorVenta - descuentoAfectante;
280
+ const mtoIgvEsperado = sumaIgv - descuentoIgv;
281
+ const totalImpuestosEsperado = mtoIgvEsperado + (data.mtoISC || 0) + (data.icbper || 0);
282
+ const mtoImpVentaEsperada = valorVentaEsperada + totalImpuestosEsperado - descuentoNoAfectante + (data.redondeo || 0);
283
+ const ctxValorVenta = descuentoAfectante > 0 ? ` - descuento global (${descuentoAfectante})` : '';
284
+ const ctxIgv = descuentoAfectante > 0 ? ` - IGV descuento global (${descuentoIgv})` : '';
285
+ if (data.mtoDescuentos != null && Math.abs(data.mtoDescuentos - descuentoNoAfectante) > 0.02) {
286
+ addError(errors, 'mtoDescuentos', `Descuentos declarados (${data.mtoDescuentos}) no coinciden con la suma de descuentos que NO afectan la base imponible (${descuentoNoAfectante}); los códigos 00/02 no van en AllowanceTotalAmount`);
287
+ }
288
+ if (descuentoNoAfectante > 0 && data.mtoDescuentos == null) {
289
+ addError(errors, 'mtoDescuentos', `Hay descuentos que no afectan la base (${descuentoNoAfectante}) pero falta mtoDescuentos / AllowanceTotalAmount`);
290
+ }
149
291
  if (Math.abs(sumaBaseIgv - sumaValorVenta) > 0.02) {
150
292
  addError(errors, 'totals', `Suma de bases IGV (${sumaBaseIgv}) no coincide con suma de valor venta (${sumaValorVenta})`);
151
293
  }
152
- if (Math.abs(data.mtoIGV - sumaIgv) > 0.02) {
153
- addError(errors, 'mtoIGV', `Total IGV declarado (${data.mtoIGV}) no coincide con suma de IGV de items (${sumaIgv})`);
294
+ if (Math.abs(data.mtoIGV - mtoIgvEsperado) > 0.02) {
295
+ addError(errors, 'mtoIGV', `Total IGV declarado (${data.mtoIGV}) no coincide con suma de IGV de items${ctxIgv} (${mtoIgvEsperado})`);
296
+ }
297
+ if (Math.abs(data.valorVenta - valorVentaEsperada) > 0.02) {
298
+ addError(errors, 'valorVenta', `Valor de venta declarado (${data.valorVenta}) no coincide con suma de items${ctxValorVenta} (${valorVentaEsperada})`);
299
+ }
300
+ if (data.mtoOperGravadas != null) {
301
+ const gravadasEsperadas = valorVentaEsperada - (data.mtoOperExoneradas ?? 0) - (data.mtoOperInafectas ?? 0);
302
+ if (Math.abs(data.mtoOperGravadas - gravadasEsperadas) > 0.02) {
303
+ addError(errors, 'mtoOperGravadas', `Operaciones gravadas (${data.mtoOperGravadas}) no coincide con valorVenta esperado menos exoneradas/inafectas (${gravadasEsperadas})`);
304
+ }
305
+ }
306
+ if (sumaOperGratuitas > 0) {
307
+ const mtoOpGrat = data.mtoOperGratuitas ?? 0;
308
+ if (Math.abs(mtoOpGrat - sumaOperGratuitas) > 0.02) {
309
+ addError(errors, 'mtoOperGratuitas', `Operaciones gratuitas (${mtoOpGrat}) no coincide con suma de items gratuitos (${sumaOperGratuitas})`);
310
+ }
311
+ const mtoIgvGrat = data.mtoIGVGratuitas ?? 0;
312
+ if (sumaIGVGratuitas > 0 && Math.abs(mtoIgvGrat - sumaIGVGratuitas) > 0.02) {
313
+ addError(errors, 'mtoIGVGratuitas', `IGV gratuito (${mtoIgvGrat}) no coincide con suma de IGV de items gratuitos (${sumaIGVGratuitas})`);
314
+ }
154
315
  }
155
- if (Math.abs(data.valorVenta - sumaValorVenta) > 0.02) {
156
- addError(errors, 'valorVenta', `Valor de venta declarado (${data.valorVenta}) no coincide con suma de items (${sumaValorVenta})`);
316
+ const totalImpuestosDeclaradoEsperado = data.mtoIGV + (data.mtoISC || 0) + (data.icbper || 0);
317
+ if (Math.abs(data.totalImpuestos - totalImpuestosDeclaradoEsperado) > 0.02) {
318
+ addError(errors, 'totalImpuestos', `Total impuestos (${data.totalImpuestos}) no coincide con IGV+ISC+ICBPER (${totalImpuestosDeclaradoEsperado})`);
157
319
  }
158
- const totalImpuestosEsperado = data.mtoIGV + (data.mtoISC || 0) + (data.icbper || 0);
159
320
  if (Math.abs(data.totalImpuestos - totalImpuestosEsperado) > 0.02) {
160
- addError(errors, 'totalImpuestos', `Total impuestos (${data.totalImpuestos}) no coincide con IGV+ISC+ICBPER (${totalImpuestosEsperado})`);
321
+ addError(errors, 'totalImpuestos', `Total impuestos (${data.totalImpuestos}) no coincide con el total esperado de ítems${ctxIgv} (${totalImpuestosEsperado})`);
161
322
  }
162
- const mtoImpVentaEsperado = data.valorVenta + data.totalImpuestos + (data.redondeo || 0);
163
- if (Math.abs(data.mtoImpVenta - mtoImpVentaEsperado) > 0.02) {
164
- addError(errors, 'mtoImpVenta', `Monto total (${data.mtoImpVenta}) no coincide con valorVenta+totalImpuestos (${mtoImpVentaEsperado})`);
323
+ if (Math.abs(data.mtoImpVenta - mtoImpVentaEsperada) > 0.02) {
324
+ addError(errors, 'mtoImpVenta', `Monto total (${data.mtoImpVenta}) no coincide con valorVenta+totalImpuestos-descuentos no afectantes esperados (${mtoImpVentaEsperada})`);
165
325
  }
166
326
  }
167
327
  if (!data.legends || data.legends.length === 0) {
@@ -173,6 +333,39 @@ function validateInvoicePayload(data) {
173
333
  addError(errors, 'legends', 'Leyenda code 1000 (monto en letras) es obligatoria');
174
334
  }
175
335
  }
336
+ if ((data.details ?? []).some(d => (d.mtoValorGratuito ?? 0) > 0)) {
337
+ const has1002 = (data.legends ?? []).some(l => l.code === '1002');
338
+ if (!has1002) {
339
+ addError(errors, 'legends', 'Leyenda code 1002 ("TRANSFERENCIA GRATUITA DE UN BIEN Y/O SERVICIO PRESTADO GRATUITAMENTE") es obligatoria cuando existen ítems gratuitos (Cat. 15)');
340
+ }
341
+ }
342
+ if (data.formaPago?.tipo === 'Credito') {
343
+ const montoPago = data.formaPago.monto;
344
+ if (montoPago === undefined || montoPago === null || Number.isNaN(Number(montoPago))) {
345
+ addError(errors, 'formaPago.monto', 'Monto de crédito es obligatorio (debe igualar mtoImpVenta)');
346
+ }
347
+ else if (Math.abs(Number(montoPago) - data.mtoImpVenta) > 0.02) {
348
+ addError(errors, 'formaPago.monto', `Monto de crédito (${montoPago}) no coincide con mtoImpVenta (${data.mtoImpVenta})`);
349
+ }
350
+ const cuotas = data.cuotas ?? [];
351
+ if (cuotas.length === 0) {
352
+ addError(errors, 'cuotas', 'Crédito debe incluir al menos 1 cuota');
353
+ }
354
+ else {
355
+ const sumaCuotas = cuotas.reduce((acc, c) => acc + (Number(c.monto) || 0), 0);
356
+ if (Math.abs(sumaCuotas - data.mtoImpVenta) > 0.02) {
357
+ addError(errors, 'cuotas', `Suma de cuotas (${sumaCuotas}) no coincide con mtoImpVenta (${data.mtoImpVenta})`);
358
+ }
359
+ cuotas.forEach((c, i) => {
360
+ if (!c.fechaPago || !isValidDate(c.fechaPago)) {
361
+ addError(errors, `cuotas[${i}].fechaPago`, 'Fecha de pago de cuota es obligatoria y debe ser ISO válida');
362
+ }
363
+ if (c.monto === undefined || c.monto === null || Number(c.monto) <= 0) {
364
+ addError(errors, `cuotas[${i}].monto`, 'Monto de cuota debe ser mayor a 0');
365
+ }
366
+ });
367
+ }
368
+ }
176
369
  if (errors.length > 0) {
177
370
  throw new InvoiceValidationError(`Validación de factura fallida:\n - ${errors.join('\n - ')}`, errors);
178
371
  }
@@ -182,8 +375,9 @@ function validateNotePayload(data) {
182
375
  if (!data.tipoDoc || !['07', '08'].includes(data.tipoDoc)) {
183
376
  addError(errors, 'tipoDoc', `Tipo documento "${data.tipoDoc}" inválido. Debe ser "07" (NC) o "08" (ND)`);
184
377
  }
185
- if (!data.serie || !isValidSerie(data.tipoDoc, data.serie)) {
186
- addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido`);
378
+ const tipDocAfectado = normalizeTipDocAfectado(data.tipDocAfectado);
379
+ if (!data.serie || !isValidSerie(data.serie)) {
380
+ addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido (4 caracteres alfanuméricos, ej: F001, FC01, B001, BC01)`);
187
381
  }
188
382
  if (!data.correlativo || !isValidCorrelativo(data.correlativo)) {
189
383
  addError(errors, 'correlativo', `Correlativo "${data.correlativo}" inválido`);
@@ -197,12 +391,21 @@ function validateNotePayload(data) {
197
391
  if (!data.tipoMoneda || data.tipoMoneda.trim() === '') {
198
392
  addError(errors, 'tipoMoneda', 'Tipo de moneda es obligatoria');
199
393
  }
200
- if (!data.tipDocAfectado || data.tipDocAfectado.trim() === '') {
394
+ else if (!exports.CATALOGO_02_MONEDA.includes(data.tipoMoneda.trim().toUpperCase())) {
395
+ addError(errors, 'tipoMoneda', `tipoMoneda "${data.tipoMoneda}" no está en el Catálogo N.° 02 (ej: PEN, USD)`);
396
+ }
397
+ if (!tipDocAfectado) {
201
398
  addError(errors, 'tipDocAfectado', 'Tipo del documento afectado es obligatorio');
202
399
  }
400
+ else if (!/^\d{2}$/.test(tipDocAfectado)) {
401
+ addError(errors, 'tipDocAfectado', `tipDocAfectado "${data.tipDocAfectado}" inválido. Debe ser código de 2 dígitos del Catálogo N.° 01 (ej: 01 factura, 03 boleta, 04 liquidación de compra, 09 guía de remisión)`);
402
+ }
203
403
  if (!data.numDocAfectado || data.numDocAfectado.trim() === '') {
204
404
  addError(errors, 'numDocAfectado', 'Número del documento afectado es obligatorio');
205
405
  }
406
+ else if (!/^[A-Za-z0-9]{1,4}-\d{1,8}$/.test(data.numDocAfectado.trim())) {
407
+ addError(errors, 'numDocAfectado', `numDocAfectado "${data.numDocAfectado}" inválido. Debe ser SERIE-CORRELATIVO (ej: F001-00000045, B001-47)`);
408
+ }
206
409
  if (!data.codMotivo || data.codMotivo.trim() === '') {
207
410
  addError(errors, 'codMotivo', 'Código de motivo es obligatorio');
208
411
  }
@@ -224,9 +427,23 @@ function validateNotePayload(data) {
224
427
  addError(errors, 'client', 'Datos del cliente son obligatorios');
225
428
  }
226
429
  else {
430
+ if (!data.client.tipoDoc || data.client.tipoDoc.trim() === '') {
431
+ addError(errors, 'client.tipoDoc', 'Tipo documento del cliente es obligatorio');
432
+ }
433
+ else if (!exports.CATALOGO_06_DOC_IDENTIDAD.includes(data.client.tipoDoc.trim())) {
434
+ addError(errors, 'client.tipoDoc', `client.tipoDoc "${data.client.tipoDoc}" no está en el Catálogo N.° 06 (6=RUC, 1=DNI, 4=Carné extranjería, 7=Pasaporte, 0=Doc. trib. sin RUC)`);
435
+ }
227
436
  if (!data.client.numDoc || data.client.numDoc.trim() === '') {
228
437
  addError(errors, 'client.numDoc', 'Número documento del cliente es obligatorio');
229
438
  }
439
+ else {
440
+ if (data.client.tipoDoc === '6' && !/^\d{11}$/.test(data.client.numDoc)) {
441
+ addError(errors, 'client.numDoc', 'RUC del cliente debe tener 11 dígitos');
442
+ }
443
+ if (data.client.tipoDoc === '1' && !/^\d{8}$/.test(data.client.numDoc)) {
444
+ addError(errors, 'client.numDoc', 'DNI del cliente debe tener 8 dígitos');
445
+ }
446
+ }
230
447
  if (!data.client.rznSocial || data.client.rznSocial.trim() === '') {
231
448
  addError(errors, 'client.rznSocial', 'Razón social del cliente es obligatoria');
232
449
  }
@@ -235,12 +452,13 @@ function validateNotePayload(data) {
235
452
  addError(errors, 'details', 'Debe haber al menos 1 item');
236
453
  }
237
454
  else {
238
- data.details.forEach((detail, i) => {
239
- if (detail.cantidad <= 0)
240
- addError(errors, `details[${i}].cantidad`, 'Cantidad debe ser mayor a 0');
241
- if (!detail.descripcion)
242
- addError(errors, `details[${i}].descripcion`, 'Descripción es obligatoria');
243
- });
455
+ data.details.forEach((detail, i) => validateDetail(detail, i, errors));
456
+ }
457
+ if ((data.details ?? []).some(d => (d.mtoValorGratuito ?? 0) > 0)) {
458
+ const has1002 = (data.legends ?? []).some(l => l.code === '1002');
459
+ if (!has1002) {
460
+ addError(errors, 'legends', 'Leyenda code 1002 ("TRANSFERENCIA GRATUITA DE UN BIEN Y/O SERVICIO PRESTADO GRATUITAMENTE") es obligatoria cuando existen ítems gratuitos (Cat. 15)');
461
+ }
244
462
  }
245
463
  if (errors.length > 0) {
246
464
  throw new InvoiceValidationError(`Validación de nota fallida:\n - ${errors.join('\n - ')}`, errors);
@@ -1 +1 @@
1
- {"version":3,"file":"invoice.validator.js","sourceRoot":"","sources":["../../src/validation/invoice.validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invoice.validator.js","sourceRoot":"","sources":["../../src/validation/invoice.validator.ts"],"names":[],"mappings":"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"}
@@ -131,8 +131,9 @@ function addDocumentTaxTotal(root, data) {
131
131
  if ((data.mtoOperGravadas ?? 0) > 0) {
132
132
  addTaxSubtotal(taxTotal, data.mtoOperGravadas, data.mtoIGV, 'IGV', 18, undefined, cur);
133
133
  }
134
- if ((data.mtoIGVGratuitas ?? 0) > 0) {
135
- addTaxSubtotal(taxTotal, data.mtoOperGratuitas ?? 0, data.mtoIGVGratuitas, 'GRA', 18, undefined, cur);
134
+ if ((data.mtoOperGratuitas ?? 0) > 0 || (data.mtoIGVGratuitas ?? 0) > 0) {
135
+ const igvGrat = data.mtoIGVGratuitas ?? 0;
136
+ addTaxSubtotal(taxTotal, data.mtoOperGratuitas ?? 0, igvGrat, 'GRA', igvGrat > 0 ? 18 : 0, undefined, cur);
136
137
  }
137
138
  if ((data.mtoISC ?? 0) > 0) {
138
139
  addTaxSubtotal(taxTotal, data.mtoOperGravadas ?? 0, data.mtoISC, 'ISC', undefined, undefined, cur);
@@ -171,9 +172,22 @@ function addInvoiceLine(root, detail, index, currency, elementName = 'cac:Invoic
171
172
  const line = root.ele(elementName);
172
173
  line.ele('cbc:ID').txt(String(index)).up();
173
174
  line.ele(qtyTag, { unitCode: detail.unidad }).txt(fmt(detail.cantidad, 10)).up();
174
- line.ele('cbc:LineExtensionAmount', { currencyID: currency }).txt(fmt(detail.mtoValorVenta)).up();
175
- const priceTypeCode = (0, namespaces_1.tipAfeToPreType)(detail.tipAfeIgv);
176
- const precioRef = priceTypeCode === '02' ? detail.mtoValorGratuito ?? 0 : detail.mtoPrecioUnitario;
175
+ const freeValue = detail.mtoValorGratuito ?? 0;
176
+ const isFreeItem = freeValue > 0;
177
+ const freeTaxZeroTips = ['21', '31', '32', '33', '34', '35', '36', '37', '40'];
178
+ const freeLineTaxZero = isFreeItem && freeTaxZeroTips.includes(detail.tipAfeIgv);
179
+ const priceTypeCode = isFreeItem ? '02' : (0, namespaces_1.tipAfeToPreType)(detail.tipAfeIgv);
180
+ const qty = detail.cantidad || 1;
181
+ const precioRef = isFreeItem ? freeValue / qty : detail.mtoPrecioUnitario;
182
+ const lineExtension = isFreeItem ? freeValue : detail.mtoValorVenta;
183
+ const freePercent = freeLineTaxZero ? 0 : detail.porcentajeIgv;
184
+ const freeIgv = isFreeItem
185
+ ? (freeLineTaxZero
186
+ ? 0
187
+ : Number(((freeValue * (detail.porcentajeIgv || 18)) / 100).toFixed(2)))
188
+ : detail.igv;
189
+ const freeTotalTax = isFreeItem ? 0 : detail.totalImpuestos;
190
+ line.ele('cbc:LineExtensionAmount', { currencyID: currency }).txt(fmt(lineExtension)).up();
177
191
  line.ele('cac:PricingReference')
178
192
  .ele('cac:AlternativeConditionPrice')
179
193
  .ele('cbc:PriceAmount', { currencyID: currency }).txt(fmt(precioRef)).up()
@@ -181,20 +195,37 @@ function addInvoiceLine(root, detail, index, currency, elementName = 'cac:Invoic
181
195
  .up()
182
196
  .up();
183
197
  const lineTax = line.ele('cac:TaxTotal');
184
- lineTax.ele('cbc:TaxAmount', { currencyID: currency }).txt(fmt(detail.totalImpuestos)).up();
185
- const tributo = (0, namespaces_1.tipAfeToTributo)(detail.tipAfeIgv);
186
- const lineSub = lineTax.ele('cac:TaxSubtotal');
187
- lineSub.ele('cbc:TaxableAmount', { currencyID: currency }).txt(fmt(detail.mtoBaseIgv)).up();
188
- lineSub.ele('cbc:TaxAmount', { currencyID: currency }).txt(fmt(detail.igv)).up();
189
- const lineCat = lineSub.ele('cac:TaxCategory');
190
- lineCat.ele('cbc:ID', { schemeAgencyName: 'PE:SUNAT', schemeName: 'Codigo de tributos' }).txt(tributo.id).up();
191
- lineCat.ele('cbc:Percent').txt(fmt(detail.porcentajeIgv, 2)).up();
192
- lineCat.ele('cbc:TaxExemptionReasonCode').txt(detail.tipAfeIgv).up();
193
- lineCat.ele('cac:TaxScheme')
194
- .ele('cbc:ID').txt(tributo.id).up()
195
- .ele('cbc:Name').txt(tributo.name).up()
196
- .ele('cbc:TaxTypeCode').txt(tributo.typeCode).up()
197
- .up();
198
+ lineTax.ele('cbc:TaxAmount', { currencyID: currency }).txt(fmt(freeTotalTax)).up();
199
+ if (isFreeItem) {
200
+ const graSub = lineTax.ele('cac:TaxSubtotal');
201
+ graSub.ele('cbc:TaxableAmount', { currencyID: currency }).txt(fmt(freeValue)).up();
202
+ graSub.ele('cbc:TaxAmount', { currencyID: currency }).txt(fmt(freeIgv)).up();
203
+ const graCat = graSub.ele('cac:TaxCategory');
204
+ graCat.ele('cbc:ID', { schemeAgencyName: 'PE:SUNAT', schemeName: 'Codigo de tributos' }).txt(namespaces_1.TRIBUTOS.GRA.id).up();
205
+ graCat.ele('cbc:Percent').txt(fmt(freePercent, 2)).up();
206
+ graCat.ele('cbc:TaxExemptionReasonCode').txt(detail.tipAfeIgv).up();
207
+ graCat.ele('cac:TaxScheme')
208
+ .ele('cbc:ID').txt(namespaces_1.TRIBUTOS.GRA.id).up()
209
+ .ele('cbc:Name').txt(namespaces_1.TRIBUTOS.GRA.name).up()
210
+ .ele('cbc:TaxTypeCode').txt(namespaces_1.TRIBUTOS.GRA.typeCode).up()
211
+ .up();
212
+ }
213
+ else {
214
+ const tributo = (0, namespaces_1.tipAfeToTributo)(detail.tipAfeIgv);
215
+ const taxableAmount = detail.mtoBaseIgv;
216
+ const lineSub = lineTax.ele('cac:TaxSubtotal');
217
+ lineSub.ele('cbc:TaxableAmount', { currencyID: currency }).txt(fmt(taxableAmount)).up();
218
+ lineSub.ele('cbc:TaxAmount', { currencyID: currency }).txt(fmt(detail.igv)).up();
219
+ const lineCat = lineSub.ele('cac:TaxCategory');
220
+ lineCat.ele('cbc:ID', { schemeAgencyName: 'PE:SUNAT', schemeName: 'Codigo de tributos' }).txt(tributo.id).up();
221
+ lineCat.ele('cbc:Percent').txt(fmt(detail.porcentajeIgv, 2)).up();
222
+ lineCat.ele('cbc:TaxExemptionReasonCode').txt(detail.tipAfeIgv).up();
223
+ lineCat.ele('cac:TaxScheme')
224
+ .ele('cbc:ID').txt(tributo.id).up()
225
+ .ele('cbc:Name').txt(tributo.name).up()
226
+ .ele('cbc:TaxTypeCode').txt(tributo.typeCode).up()
227
+ .up();
228
+ }
198
229
  if ((detail.isc ?? 0) > 0) {
199
230
  const iscSub = lineTax.ele('cac:TaxSubtotal');
200
231
  iscSub.ele('cbc:TaxableAmount', { currencyID: currency }).txt(fmt(detail.mtoBaseIgv)).up();