sunat-engine-nest 2.0.3 → 2.1.0

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 (42) 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 +3 -1
  6. package/dist/index.js +7 -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 +307 -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 -0
  14. package/dist/soap/sunat-soap.client.js.map +1 -1
  15. package/dist/sunat-engine.module.d.ts +4 -0
  16. package/dist/sunat-engine.module.js.map +1 -1
  17. package/dist/sunat-engine.service.d.ts +1 -0
  18. package/dist/sunat-engine.service.js +37 -13
  19. package/dist/sunat-engine.service.js.map +1 -1
  20. package/dist/tsconfig.build.tsbuildinfo +1 -1
  21. package/dist/tsconfig.tsbuildinfo +1 -1
  22. package/dist/types/sunat.types.d.ts +9 -1
  23. package/dist/validation/document.validator.d.ts +5 -0
  24. package/dist/validation/document.validator.js +262 -0
  25. package/dist/validation/document.validator.js.map +1 -0
  26. package/dist/validation/invoice.validator.d.ts +3 -0
  27. package/dist/validation/invoice.validator.js +247 -28
  28. package/dist/validation/invoice.validator.js.map +1 -1
  29. package/dist/xml/common.builder.js +50 -19
  30. package/dist/xml/common.builder.js.map +1 -1
  31. package/dist/xml/despatch.builder.d.ts +1 -0
  32. package/dist/xml/despatch.builder.js +204 -12
  33. package/dist/xml/despatch.builder.js.map +1 -1
  34. package/dist/xml/invoice.builder.js +4 -1
  35. package/dist/xml/invoice.builder.js.map +1 -1
  36. package/dist/xml/namespaces.js +2 -2
  37. package/dist/xml/namespaces.js.map +1 -1
  38. package/dist/xml/summary.builder.js +16 -23
  39. package/dist/xml/summary.builder.js.map +1 -1
  40. package/dist/xml/voided.builder.js +5 -5
  41. package/dist/xml/voided.builder.js.map +1 -1
  42. package/package.json +1 -1
@@ -1,6 +1,6 @@
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
4
  exports.validateInvoicePayload = validateInvoicePayload;
5
5
  exports.validateNotePayload = validateNotePayload;
6
6
  class InvoiceValidationError extends Error {
@@ -14,6 +14,43 @@ exports.InvoiceValidationError = InvoiceValidationError;
14
14
  function addError(errors, field, msg) {
15
15
  errors.push(`${field}: ${msg}`);
16
16
  }
17
+ exports.CATALOGO_02_MONEDA = [
18
+ 'PEN', 'USD', 'EUR', 'GBP', 'JPY', 'CAD', 'AUD', 'CHF', 'CNY',
19
+ 'SEK', 'NOK', 'DKK', 'CZK', 'PLN', 'HUF', 'RON', 'BGN', 'RUB',
20
+ 'TRY', 'UAH', 'INR', 'KRW', 'SGD', 'HKD', 'NZD', 'THB', 'MYR',
21
+ 'PHP', 'IDR', 'VND', 'MXN', 'BRL', 'ARS', 'CLP', 'COP',
22
+ 'ILS', 'SAR', 'AED', 'ZAR', 'EGP', 'NGN', 'KES', 'MAD', 'TND',
23
+ 'BHD', 'QAR', 'KWD', 'OMR', 'JOD', 'LKR', 'PKR', 'BDT', 'NPR',
24
+ 'KZT', 'UZS', 'GEL', 'AZN', 'AMD', 'BYN', 'HRK', 'RSD', 'ISK',
25
+ 'ALL', 'MKD', 'BAM', 'MDA', 'TJS', 'TMT', 'KGS',
26
+ ];
27
+ exports.CATALOGO_06_DOC_IDENTIDAD = ['0', '1', '4', '6', '7', 'A', 'B', 'C', 'D', 'E'];
28
+ exports.CATALOGO_51_TIPO_OPERACION = [
29
+ '0101', '0112', '0113',
30
+ '0200', '0201', '0202', '0203', '0204', '0205', '0206', '0207', '0208',
31
+ '0301', '0302', '0303',
32
+ '0401',
33
+ '0501', '0502', '0503',
34
+ '1001', '1002', '1003', '1004',
35
+ '2001', '2100', '2101', '2102', '2103', '2104',
36
+ ];
37
+ const AFECTACION_GRAVADA = ['10', '11', '12', '13', '14', '15', '16', '17'];
38
+ const AFECTACION_SIN_IGV = [
39
+ '20', '21', '30', '31', '32', '33', '34', '35', '36', '37',
40
+ ];
41
+ const TASA_IGV = 18;
42
+ const TOL_LINEA = 0.02;
43
+ const TOL_EXACTA = 0.01;
44
+ function near(a, b, tol = TOL_EXACTA) {
45
+ const cents = Math.abs(Math.round(Number(a) * 100) - Math.round(Number(b) * 100));
46
+ return cents <= Math.round(tol * 100);
47
+ }
48
+ function round2(n) {
49
+ return Math.round(n * 100) / 100;
50
+ }
51
+ function hasTwoDecimals(value) {
52
+ return Math.abs(value * 100 - Math.round(value * 100)) < 1e-6;
53
+ }
17
54
  function isValidRuc(ruc) {
18
55
  if (!/^\d{11}$/.test(ruc))
19
56
  return false;
@@ -24,11 +61,18 @@ function isValidRuc(ruc) {
24
61
  const checkDigit = remainder < 2 ? remainder : 11 - remainder;
25
62
  return checkDigit === digits[10];
26
63
  }
27
- function isValidSerie(tipoDoc, serie) {
28
- const prefix = tipoDoc === '01' ? 'F' : tipoDoc === '03' ? 'B' : tipoDoc === '07' ? 'F' : tipoDoc === '08' ? 'F' : '';
64
+ function isValidSerie(tipoDoc, serie, tipDocAfectado) {
65
+ let prefix = '';
66
+ if (tipoDoc === '01')
67
+ prefix = 'F';
68
+ else if (tipoDoc === '03')
69
+ prefix = 'B';
70
+ else if (tipoDoc === '07' || tipoDoc === '08') {
71
+ prefix = tipDocAfectado === '03' ? 'B' : 'F';
72
+ }
29
73
  if (!prefix)
30
- return /^\w{3,4}$/.test(serie);
31
- return new RegExp(`^${prefix}\\d{3,4}$`).test(serie);
74
+ return /^[A-Z0-9]{3,4}$/i.test(serie);
75
+ return new RegExp(`^${prefix}[A-Z0-9]{3}$`, 'i').test(serie);
32
76
  }
33
77
  function isValidCorrelativo(correlativo) {
34
78
  return /^\d{1,8}$/.test(correlativo);
@@ -49,6 +93,9 @@ function validateDetail(detail, index, errors) {
49
93
  if (!detail.unidad || detail.unidad.trim() === '') {
50
94
  addError(errors, `${prefix}.unidad`, 'Unidad de medida es obligatoria');
51
95
  }
96
+ else if (!/^[A-Za-z0-9]{1,3}$/.test(detail.unidad.trim())) {
97
+ 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)`);
98
+ }
52
99
  if (detail.cantidad === undefined || detail.cantidad === null || detail.cantidad <= 0) {
53
100
  addError(errors, `${prefix}.cantidad`, 'Cantidad debe ser mayor a 0');
54
101
  }
@@ -64,12 +111,67 @@ function validateDetail(detail, index, errors) {
64
111
  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
112
  addError(errors, `${prefix}.tipAfeIgv`, `Tipo afectación IGV "${detail.tipAfeIgv}" no es válido (Cat. 07)`);
66
113
  }
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})`);
114
+ const importes = [
115
+ 'mtoValorUnitario', 'mtoValorVenta', 'mtoBaseIgv', 'porcentajeIgv',
116
+ 'igv', 'totalImpuestos', 'mtoPrecioUnitario', 'mtoValorGratuito',
117
+ 'isc', 'icbper',
118
+ ];
119
+ for (const campo of importes) {
120
+ const v = detail[campo];
121
+ if (v == null)
122
+ continue;
123
+ if (typeof v !== 'number' || Number.isNaN(v)) {
124
+ addError(errors, `${prefix}.${campo}`, `${campo} debe ser un número`);
125
+ continue;
126
+ }
127
+ if (v < 0) {
128
+ addError(errors, `${prefix}.${campo}`, `${campo} no puede ser negativo (recibido ${v})`);
129
+ continue;
72
130
  }
131
+ if (campo !== 'porcentajeIgv' && !hasTwoDecimals(v)) {
132
+ addError(errors, `${prefix}.${campo}`, `${campo} debe tener máximo 2 decimales (recibido ${v})`);
133
+ }
134
+ }
135
+ const gratuita = (detail.mtoValorGratuito ?? 0) > 0;
136
+ const gravada = AFECTACION_GRAVADA.includes(detail.tipAfeIgv);
137
+ if (gravada) {
138
+ if (Number(detail.porcentajeIgv) !== TASA_IGV) {
139
+ addError(errors, `${prefix}.porcentajeIgv`, `Operación gravada (tipAfeIgv ${detail.tipAfeIgv}) debe llevar porcentajeIgv ${TASA_IGV} (recibido ${detail.porcentajeIgv})`);
140
+ }
141
+ const igvEsperado = round2((detail.mtoBaseIgv ?? 0) * TASA_IGV / 100);
142
+ if (!near(detail.igv, igvEsperado, TOL_LINEA)) {
143
+ addError(errors, `${prefix}.igv`, `IGV ${detail.igv} no coincide con ${TASA_IGV}% de la base ${detail.mtoBaseIgv} (esperado: ${igvEsperado})`);
144
+ }
145
+ }
146
+ else if (AFECTACION_SIN_IGV.includes(detail.tipAfeIgv)) {
147
+ if (Number(detail.porcentajeIgv) !== 0 || detail.igv !== 0) {
148
+ addError(errors, `${prefix}.igv`, `Operación exonerada/inafecta (tipAfeIgv ${detail.tipAfeIgv}) no genera IGV: ` +
149
+ `porcentajeIgv debe ser 0 e igv 0 (recibidos ${detail.porcentajeIgv}, ${detail.igv})`);
150
+ }
151
+ }
152
+ if (gratuita) {
153
+ if (detail.mtoValorVenta !== 0) {
154
+ addError(errors, `${prefix}.mtoValorVenta`, `Con mtoValorGratuito > 0 el mtoValorVenta debe ser 0 (recibido ${detail.mtoValorVenta})`);
155
+ }
156
+ return;
157
+ }
158
+ const vvEsperado = round2(Number(detail.cantidad) * Number(detail.mtoValorUnitario));
159
+ if (!near(detail.mtoValorVenta, vvEsperado, TOL_LINEA)) {
160
+ addError(errors, `${prefix}.mtoValorVenta`, `mtoValorVenta ${detail.mtoValorVenta} no coincide con cantidad (${detail.cantidad}) × ` +
161
+ `mtoValorUnitario (${detail.mtoValorUnitario}) = ${vvEsperado}`);
162
+ }
163
+ if (!near(detail.mtoBaseIgv, detail.mtoValorVenta)) {
164
+ addError(errors, `${prefix}.mtoBaseIgv`, `mtoBaseIgv ${detail.mtoBaseIgv} debe ser igual a mtoValorVenta ${detail.mtoValorVenta}`);
165
+ }
166
+ const precioEsperado = round2(Number(detail.mtoValorUnitario) * (1 + Number(detail.porcentajeIgv) / 100));
167
+ if (!near(detail.mtoPrecioUnitario, precioEsperado, TOL_LINEA)) {
168
+ addError(errors, `${prefix}.mtoPrecioUnitario`, `mtoPrecioUnitario ${detail.mtoPrecioUnitario} no coincide con ` +
169
+ `mtoValorUnitario × (1 + ${detail.porcentajeIgv}%) = ${precioEsperado}`);
170
+ }
171
+ const totalImpuestosEsperado = round2((detail.igv ?? 0) + (detail.isc ?? 0) + (detail.icbper ?? 0));
172
+ if (!near(detail.totalImpuestos, totalImpuestosEsperado)) {
173
+ addError(errors, `${prefix}.totalImpuestos`, `totalImpuestos ${detail.totalImpuestos} no coincide con IGV+ISC+ICBPER = ${totalImpuestosEsperado} ` +
174
+ `(SUNAT observa 3292/3294)`);
73
175
  }
74
176
  }
75
177
  function validateInvoicePayload(data) {
@@ -78,7 +180,7 @@ function validateInvoicePayload(data) {
78
180
  addError(errors, 'tipoDoc', `Tipo documento "${data.tipoDoc}" inválido. Debe ser "01" (Factura) o "03" (Boleta)`);
79
181
  }
80
182
  if (!data.serie || !isValidSerie(data.tipoDoc, data.serie)) {
81
- addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido (ej: F001, B001)`);
183
+ addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido (4 caracteres alfanuméricos, ej: F001, FC01, FA01, B001)`);
82
184
  }
83
185
  if (!data.correlativo || !isValidCorrelativo(data.correlativo)) {
84
186
  addError(errors, 'correlativo', `Correlativo "${data.correlativo}" inválido (1-8 dígitos numéricos)`);
@@ -92,9 +194,15 @@ function validateInvoicePayload(data) {
92
194
  if (!data.tipoMoneda || data.tipoMoneda.trim() === '') {
93
195
  addError(errors, 'tipoMoneda', 'Tipo de moneda es obligatoria (ej: PEN, USD)');
94
196
  }
197
+ else if (!exports.CATALOGO_02_MONEDA.includes(data.tipoMoneda.trim().toUpperCase())) {
198
+ addError(errors, 'tipoMoneda', `tipoMoneda "${data.tipoMoneda}" no está en el Catálogo N.° 02 (ej: ${exports.CATALOGO_02_MONEDA.slice(0, 6).join(', ')})`);
199
+ }
95
200
  if (!data.tipoOperacion || data.tipoOperacion.trim() === '') {
96
201
  addError(errors, 'tipoOperacion', 'Tipo de operación es obligatorio (Cat. 51)');
97
202
  }
203
+ else if (!exports.CATALOGO_51_TIPO_OPERACION.includes(data.tipoOperacion.trim())) {
204
+ 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)`);
205
+ }
98
206
  if (!data.company) {
99
207
  addError(errors, 'company', 'Datos del emisor son obligatorios');
100
208
  }
@@ -113,6 +221,9 @@ function validateInvoicePayload(data) {
113
221
  if (!data.client.tipoDoc || data.client.tipoDoc.trim() === '') {
114
222
  addError(errors, 'client.tipoDoc', 'Tipo documento del cliente es obligatorio');
115
223
  }
224
+ else if (!exports.CATALOGO_06_DOC_IDENTIDAD.includes(data.client.tipoDoc.trim())) {
225
+ 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)`);
226
+ }
116
227
  if (!data.client.numDoc || data.client.numDoc.trim() === '') {
117
228
  addError(errors, 'client.numDoc', 'Número documento del cliente es obligatorio');
118
229
  }
@@ -136,32 +247,86 @@ function validateInvoicePayload(data) {
136
247
  }
137
248
  if (data.details && data.details.length > 0) {
138
249
  const afectacionesGravadas = ['10', '11', '12', '13', '14', '15', '16', '17'];
250
+ const isFree = (d) => (d.mtoValorGratuito ?? 0) > 0;
139
251
  let sumaValorVenta = 0;
140
252
  let sumaBaseIgv = 0;
141
253
  let sumaIgv = 0;
254
+ let sumaBaseGravada = 0;
255
+ let sumaOperGratuitas = 0;
256
+ let sumaIGVGratuitas = 0;
142
257
  for (const d of data.details) {
258
+ if (isFree(d)) {
259
+ sumaOperGratuitas += d.mtoValorGratuito || 0;
260
+ if (afectacionesGravadas.includes(d.tipAfeIgv)) {
261
+ sumaIGVGratuitas += d.igv || 0;
262
+ }
263
+ continue;
264
+ }
143
265
  sumaValorVenta += d.mtoValorVenta || 0;
144
266
  sumaBaseIgv += d.mtoBaseIgv || 0;
145
267
  if (afectacionesGravadas.includes(d.tipAfeIgv)) {
146
268
  sumaIgv += d.igv || 0;
269
+ sumaBaseGravada += d.mtoBaseIgv || 0;
147
270
  }
148
271
  }
272
+ const esAfectante = (cod) => cod === '00' || cod === '02';
273
+ let descuentoAfectante = 0;
274
+ let descuentoNoAfectante = 0;
275
+ for (const d of data.descuentos ?? []) {
276
+ const monto = Number(d.monto) || 0;
277
+ if (esAfectante(d.codTipo))
278
+ descuentoAfectante += monto;
279
+ else
280
+ descuentoNoAfectante += monto;
281
+ }
282
+ const tasaIgv = sumaBaseGravada > 0 ? sumaIgv / sumaBaseGravada : 0;
283
+ const descuentoIgv = descuentoAfectante * tasaIgv;
284
+ const valorVentaEsperada = sumaValorVenta - descuentoAfectante;
285
+ const mtoIgvEsperado = sumaIgv - descuentoIgv;
286
+ const totalImpuestosEsperado = mtoIgvEsperado + (data.mtoISC || 0) + (data.icbper || 0);
287
+ const mtoImpVentaEsperada = valorVentaEsperada + totalImpuestosEsperado - descuentoNoAfectante + (data.redondeo || 0);
288
+ const ctxValorVenta = descuentoAfectante > 0 ? ` - descuento global (${descuentoAfectante})` : '';
289
+ const ctxIgv = descuentoAfectante > 0 ? ` - IGV descuento global (${descuentoIgv})` : '';
290
+ if (data.mtoDescuentos != null && Math.abs(data.mtoDescuentos - descuentoNoAfectante) > 0.02) {
291
+ 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`);
292
+ }
293
+ if (descuentoNoAfectante > 0 && data.mtoDescuentos == null) {
294
+ addError(errors, 'mtoDescuentos', `Hay descuentos que no afectan la base (${descuentoNoAfectante}) pero falta mtoDescuentos / AllowanceTotalAmount`);
295
+ }
149
296
  if (Math.abs(sumaBaseIgv - sumaValorVenta) > 0.02) {
150
297
  addError(errors, 'totals', `Suma de bases IGV (${sumaBaseIgv}) no coincide con suma de valor venta (${sumaValorVenta})`);
151
298
  }
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})`);
299
+ if (Math.abs(data.mtoIGV - mtoIgvEsperado) > 0.02) {
300
+ addError(errors, 'mtoIGV', `Total IGV declarado (${data.mtoIGV}) no coincide con suma de IGV de items${ctxIgv} (${mtoIgvEsperado})`);
301
+ }
302
+ if (Math.abs(data.valorVenta - valorVentaEsperada) > 0.02) {
303
+ addError(errors, 'valorVenta', `Valor de venta declarado (${data.valorVenta}) no coincide con suma de items${ctxValorVenta} (${valorVentaEsperada})`);
304
+ }
305
+ if (data.mtoOperGravadas != null) {
306
+ const gravadasEsperadas = valorVentaEsperada - (data.mtoOperExoneradas ?? 0) - (data.mtoOperInafectas ?? 0);
307
+ if (Math.abs(data.mtoOperGravadas - gravadasEsperadas) > 0.02) {
308
+ addError(errors, 'mtoOperGravadas', `Operaciones gravadas (${data.mtoOperGravadas}) no coincide con valorVenta esperado menos exoneradas/inafectas (${gravadasEsperadas})`);
309
+ }
310
+ }
311
+ if (sumaOperGratuitas > 0) {
312
+ const mtoOpGrat = data.mtoOperGratuitas ?? 0;
313
+ if (Math.abs(mtoOpGrat - sumaOperGratuitas) > 0.02) {
314
+ addError(errors, 'mtoOperGratuitas', `Operaciones gratuitas (${mtoOpGrat}) no coincide con suma de items gratuitos (${sumaOperGratuitas})`);
315
+ }
316
+ const mtoIgvGrat = data.mtoIGVGratuitas ?? 0;
317
+ if (sumaIGVGratuitas > 0 && Math.abs(mtoIgvGrat - sumaIGVGratuitas) > 0.02) {
318
+ addError(errors, 'mtoIGVGratuitas', `IGV gratuito (${mtoIgvGrat}) no coincide con suma de IGV de items gratuitos (${sumaIGVGratuitas})`);
319
+ }
154
320
  }
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})`);
321
+ const totalImpuestosDeclaradoEsperado = data.mtoIGV + (data.mtoISC || 0) + (data.icbper || 0);
322
+ if (Math.abs(data.totalImpuestos - totalImpuestosDeclaradoEsperado) > 0.02) {
323
+ addError(errors, 'totalImpuestos', `Total impuestos (${data.totalImpuestos}) no coincide con IGV+ISC+ICBPER (${totalImpuestosDeclaradoEsperado})`);
157
324
  }
158
- const totalImpuestosEsperado = data.mtoIGV + (data.mtoISC || 0) + (data.icbper || 0);
159
325
  if (Math.abs(data.totalImpuestos - totalImpuestosEsperado) > 0.02) {
160
- addError(errors, 'totalImpuestos', `Total impuestos (${data.totalImpuestos}) no coincide con IGV+ISC+ICBPER (${totalImpuestosEsperado})`);
326
+ addError(errors, 'totalImpuestos', `Total impuestos (${data.totalImpuestos}) no coincide con el total esperado de ítems${ctxIgv} (${totalImpuestosEsperado})`);
161
327
  }
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})`);
328
+ if (Math.abs(data.mtoImpVenta - mtoImpVentaEsperada) > 0.02) {
329
+ addError(errors, 'mtoImpVenta', `Monto total (${data.mtoImpVenta}) no coincide con valorVenta+totalImpuestos-descuentos no afectantes esperados (${mtoImpVentaEsperada})`);
165
330
  }
166
331
  }
167
332
  if (!data.legends || data.legends.length === 0) {
@@ -173,6 +338,39 @@ function validateInvoicePayload(data) {
173
338
  addError(errors, 'legends', 'Leyenda code 1000 (monto en letras) es obligatoria');
174
339
  }
175
340
  }
341
+ if ((data.details ?? []).some(d => (d.mtoValorGratuito ?? 0) > 0)) {
342
+ const has1002 = (data.legends ?? []).some(l => l.code === '1002');
343
+ if (!has1002) {
344
+ addError(errors, 'legends', 'Leyenda code 1002 ("TRANSFERENCIA GRATUITA DE UN BIEN Y/O SERVICIO PRESTADO GRATUITAMENTE") es obligatoria cuando existen ítems gratuitos (Cat. 15)');
345
+ }
346
+ }
347
+ if (data.formaPago?.tipo === 'Credito') {
348
+ const montoPago = data.formaPago.monto;
349
+ if (montoPago === undefined || montoPago === null || Number.isNaN(Number(montoPago))) {
350
+ addError(errors, 'formaPago.monto', 'Monto de crédito es obligatorio (debe igualar mtoImpVenta)');
351
+ }
352
+ else if (Math.abs(Number(montoPago) - data.mtoImpVenta) > 0.02) {
353
+ addError(errors, 'formaPago.monto', `Monto de crédito (${montoPago}) no coincide con mtoImpVenta (${data.mtoImpVenta})`);
354
+ }
355
+ const cuotas = data.cuotas ?? [];
356
+ if (cuotas.length === 0) {
357
+ addError(errors, 'cuotas', 'Crédito debe incluir al menos 1 cuota');
358
+ }
359
+ else {
360
+ const sumaCuotas = cuotas.reduce((acc, c) => acc + (Number(c.monto) || 0), 0);
361
+ if (Math.abs(sumaCuotas - data.mtoImpVenta) > 0.02) {
362
+ addError(errors, 'cuotas', `Suma de cuotas (${sumaCuotas}) no coincide con mtoImpVenta (${data.mtoImpVenta})`);
363
+ }
364
+ cuotas.forEach((c, i) => {
365
+ if (!c.fechaPago || !isValidDate(c.fechaPago)) {
366
+ addError(errors, `cuotas[${i}].fechaPago`, 'Fecha de pago de cuota es obligatoria y debe ser ISO válida');
367
+ }
368
+ if (c.monto === undefined || c.monto === null || Number(c.monto) <= 0) {
369
+ addError(errors, `cuotas[${i}].monto`, 'Monto de cuota debe ser mayor a 0');
370
+ }
371
+ });
372
+ }
373
+ }
176
374
  if (errors.length > 0) {
177
375
  throw new InvoiceValidationError(`Validación de factura fallida:\n - ${errors.join('\n - ')}`, errors);
178
376
  }
@@ -182,8 +380,8 @@ function validateNotePayload(data) {
182
380
  if (!data.tipoDoc || !['07', '08'].includes(data.tipoDoc)) {
183
381
  addError(errors, 'tipoDoc', `Tipo documento "${data.tipoDoc}" inválido. Debe ser "07" (NC) o "08" (ND)`);
184
382
  }
185
- if (!data.serie || !isValidSerie(data.tipoDoc, data.serie)) {
186
- addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido`);
383
+ if (!data.serie || !isValidSerie(data.tipoDoc, data.serie, data.tipDocAfectado)) {
384
+ addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido (4 caracteres alfanuméricos, ej: F001, FC01, B001, BC01)`);
187
385
  }
188
386
  if (!data.correlativo || !isValidCorrelativo(data.correlativo)) {
189
387
  addError(errors, 'correlativo', `Correlativo "${data.correlativo}" inválido`);
@@ -197,12 +395,18 @@ function validateNotePayload(data) {
197
395
  if (!data.tipoMoneda || data.tipoMoneda.trim() === '') {
198
396
  addError(errors, 'tipoMoneda', 'Tipo de moneda es obligatoria');
199
397
  }
398
+ else if (!exports.CATALOGO_02_MONEDA.includes(data.tipoMoneda.trim().toUpperCase())) {
399
+ addError(errors, 'tipoMoneda', `tipoMoneda "${data.tipoMoneda}" no está en el Catálogo N.° 02 (ej: PEN, USD)`);
400
+ }
200
401
  if (!data.tipDocAfectado || data.tipDocAfectado.trim() === '') {
201
402
  addError(errors, 'tipDocAfectado', 'Tipo del documento afectado es obligatorio');
202
403
  }
203
404
  if (!data.numDocAfectado || data.numDocAfectado.trim() === '') {
204
405
  addError(errors, 'numDocAfectado', 'Número del documento afectado es obligatorio');
205
406
  }
407
+ else if (!/^[A-Za-z0-9]{1,4}-\d{1,8}$/.test(data.numDocAfectado.trim())) {
408
+ addError(errors, 'numDocAfectado', `numDocAfectado "${data.numDocAfectado}" inválido. Debe ser SERIE-CORRELATIVO (ej: F001-00000045, B001-47)`);
409
+ }
206
410
  if (!data.codMotivo || data.codMotivo.trim() === '') {
207
411
  addError(errors, 'codMotivo', 'Código de motivo es obligatorio');
208
412
  }
@@ -224,9 +428,23 @@ function validateNotePayload(data) {
224
428
  addError(errors, 'client', 'Datos del cliente son obligatorios');
225
429
  }
226
430
  else {
431
+ if (!data.client.tipoDoc || data.client.tipoDoc.trim() === '') {
432
+ addError(errors, 'client.tipoDoc', 'Tipo documento del cliente es obligatorio');
433
+ }
434
+ else if (!exports.CATALOGO_06_DOC_IDENTIDAD.includes(data.client.tipoDoc.trim())) {
435
+ 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)`);
436
+ }
227
437
  if (!data.client.numDoc || data.client.numDoc.trim() === '') {
228
438
  addError(errors, 'client.numDoc', 'Número documento del cliente es obligatorio');
229
439
  }
440
+ else {
441
+ if (data.client.tipoDoc === '6' && !/^\d{11}$/.test(data.client.numDoc)) {
442
+ addError(errors, 'client.numDoc', 'RUC del cliente debe tener 11 dígitos');
443
+ }
444
+ if (data.client.tipoDoc === '1' && !/^\d{8}$/.test(data.client.numDoc)) {
445
+ addError(errors, 'client.numDoc', 'DNI del cliente debe tener 8 dígitos');
446
+ }
447
+ }
230
448
  if (!data.client.rznSocial || data.client.rznSocial.trim() === '') {
231
449
  addError(errors, 'client.rznSocial', 'Razón social del cliente es obligatoria');
232
450
  }
@@ -235,12 +453,13 @@ function validateNotePayload(data) {
235
453
  addError(errors, 'details', 'Debe haber al menos 1 item');
236
454
  }
237
455
  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
- });
456
+ data.details.forEach((detail, i) => validateDetail(detail, i, errors));
457
+ }
458
+ if ((data.details ?? []).some(d => (d.mtoValorGratuito ?? 0) > 0)) {
459
+ const has1002 = (data.legends ?? []).some(l => l.code === '1002');
460
+ if (!has1002) {
461
+ addError(errors, 'legends', 'Leyenda code 1002 ("TRANSFERENCIA GRATUITA DE UN BIEN Y/O SERVICIO PRESTADO GRATUITAMENTE") es obligatoria cuando existen ítems gratuitos (Cat. 15)');
462
+ }
244
463
  }
245
464
  if (errors.length > 0) {
246
465
  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();