sunat-engine-nest 2.0.1 → 2.0.3
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.
- package/dist/cdr/cdr-parser.service.js +51 -0
- package/dist/cdr/cdr-parser.service.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/sunat-engine.service.js +3 -0
- package/dist/sunat-engine.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/sunat.types.d.ts +10 -0
- package/dist/validation/invoice.validator.d.ts +7 -0
- package/dist/validation/invoice.validator.js +249 -0
- package/dist/validation/invoice.validator.js.map +1 -0
- package/package.json +1 -1
|
@@ -243,9 +243,19 @@ export interface VoidedPayload {
|
|
|
243
243
|
details: VoidedDetailSunat[];
|
|
244
244
|
}
|
|
245
245
|
export interface CdrResponse {
|
|
246
|
+
cdrId?: string;
|
|
247
|
+
responseDate?: string;
|
|
248
|
+
responseTime?: string;
|
|
246
249
|
code?: string;
|
|
247
250
|
description?: string;
|
|
251
|
+
documentId?: string;
|
|
252
|
+
documentTypeCode?: string;
|
|
253
|
+
issuerId?: string;
|
|
254
|
+
receiverId?: string;
|
|
255
|
+
statusReasonCode?: string;
|
|
256
|
+
statusReason?: string;
|
|
248
257
|
notes?: string[];
|
|
258
|
+
additionalInfo?: string[];
|
|
249
259
|
}
|
|
250
260
|
export interface SunatResponse {
|
|
251
261
|
success?: boolean;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { InvoicePayload, NotePayload } from '../types/sunat.types';
|
|
2
|
+
export declare class InvoiceValidationError extends Error {
|
|
3
|
+
readonly fields: string[];
|
|
4
|
+
constructor(message: string, fields?: string[]);
|
|
5
|
+
}
|
|
6
|
+
export declare function validateInvoicePayload(data: InvoicePayload): void;
|
|
7
|
+
export declare function validateNotePayload(data: NotePayload): void;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvoiceValidationError = void 0;
|
|
4
|
+
exports.validateInvoicePayload = validateInvoicePayload;
|
|
5
|
+
exports.validateNotePayload = validateNotePayload;
|
|
6
|
+
class InvoiceValidationError extends Error {
|
|
7
|
+
constructor(message, fields = []) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'InvoiceValidationError';
|
|
10
|
+
this.fields = fields;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.InvoiceValidationError = InvoiceValidationError;
|
|
14
|
+
function addError(errors, field, msg) {
|
|
15
|
+
errors.push(`${field}: ${msg}`);
|
|
16
|
+
}
|
|
17
|
+
function isValidRuc(ruc) {
|
|
18
|
+
if (!/^\d{11}$/.test(ruc))
|
|
19
|
+
return false;
|
|
20
|
+
const digits = ruc.split('').map(Number);
|
|
21
|
+
const factors = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
|
|
22
|
+
const sum = factors.reduce((acc, f, i) => acc + f * digits[i], 0);
|
|
23
|
+
const remainder = sum % 11;
|
|
24
|
+
const checkDigit = remainder < 2 ? remainder : 11 - remainder;
|
|
25
|
+
return checkDigit === digits[10];
|
|
26
|
+
}
|
|
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);
|
|
32
|
+
}
|
|
33
|
+
function isValidCorrelativo(correlativo) {
|
|
34
|
+
return /^\d{1,8}$/.test(correlativo);
|
|
35
|
+
}
|
|
36
|
+
function isValidDate(isoDate) {
|
|
37
|
+
if (!isoDate)
|
|
38
|
+
return false;
|
|
39
|
+
const date = new Date(isoDate);
|
|
40
|
+
return !isNaN(date.getTime());
|
|
41
|
+
}
|
|
42
|
+
function isFutureDate(isoDate) {
|
|
43
|
+
const date = new Date(isoDate);
|
|
44
|
+
const now = new Date();
|
|
45
|
+
return date > now;
|
|
46
|
+
}
|
|
47
|
+
function validateDetail(detail, index, errors) {
|
|
48
|
+
const prefix = `details[${index}]`;
|
|
49
|
+
if (!detail.unidad || detail.unidad.trim() === '') {
|
|
50
|
+
addError(errors, `${prefix}.unidad`, 'Unidad de medida es obligatoria');
|
|
51
|
+
}
|
|
52
|
+
if (detail.cantidad === undefined || detail.cantidad === null || detail.cantidad <= 0) {
|
|
53
|
+
addError(errors, `${prefix}.cantidad`, 'Cantidad debe ser mayor a 0');
|
|
54
|
+
}
|
|
55
|
+
if (!detail.descripcion || detail.descripcion.trim() === '') {
|
|
56
|
+
addError(errors, `${prefix}.descripcion`, 'Descripción es obligatoria');
|
|
57
|
+
}
|
|
58
|
+
if (detail.mtoValorUnitario === undefined || detail.mtoValorUnitario < 0) {
|
|
59
|
+
addError(errors, `${prefix}.mtoValorUnitario`, 'Valor unitario no puede ser negativo');
|
|
60
|
+
}
|
|
61
|
+
if (detail.mtoPrecioUnitario === undefined || detail.mtoPrecioUnitario < 0) {
|
|
62
|
+
addError(errors, `${prefix}.mtoPrecioUnitario`, 'Precio unitario no puede ser negativo');
|
|
63
|
+
}
|
|
64
|
+
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
|
+
addError(errors, `${prefix}.tipAfeIgv`, `Tipo afectación IGV "${detail.tipAfeIgv}" no es válido (Cat. 07)`);
|
|
66
|
+
}
|
|
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})`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function validateInvoicePayload(data) {
|
|
76
|
+
const errors = [];
|
|
77
|
+
if (!data.tipoDoc || !['01', '03'].includes(data.tipoDoc)) {
|
|
78
|
+
addError(errors, 'tipoDoc', `Tipo documento "${data.tipoDoc}" inválido. Debe ser "01" (Factura) o "03" (Boleta)`);
|
|
79
|
+
}
|
|
80
|
+
if (!data.serie || !isValidSerie(data.tipoDoc, data.serie)) {
|
|
81
|
+
addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido (ej: F001, B001)`);
|
|
82
|
+
}
|
|
83
|
+
if (!data.correlativo || !isValidCorrelativo(data.correlativo)) {
|
|
84
|
+
addError(errors, 'correlativo', `Correlativo "${data.correlativo}" inválido (1-8 dígitos numéricos)`);
|
|
85
|
+
}
|
|
86
|
+
if (!data.fechaEmision || !isValidDate(data.fechaEmision)) {
|
|
87
|
+
addError(errors, 'fechaEmision', 'Fecha de emisión es obligatoria y debe ser formato ISO válido');
|
|
88
|
+
}
|
|
89
|
+
else if (isFutureDate(data.fechaEmision)) {
|
|
90
|
+
addError(errors, 'fechaEmision', 'Fecha de emisión no puede ser futura');
|
|
91
|
+
}
|
|
92
|
+
if (!data.tipoMoneda || data.tipoMoneda.trim() === '') {
|
|
93
|
+
addError(errors, 'tipoMoneda', 'Tipo de moneda es obligatoria (ej: PEN, USD)');
|
|
94
|
+
}
|
|
95
|
+
if (!data.tipoOperacion || data.tipoOperacion.trim() === '') {
|
|
96
|
+
addError(errors, 'tipoOperacion', 'Tipo de operación es obligatorio (Cat. 51)');
|
|
97
|
+
}
|
|
98
|
+
if (!data.company) {
|
|
99
|
+
addError(errors, 'company', 'Datos del emisor son obligatorios');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
if (!data.company.ruc || !isValidRuc(data.company.ruc)) {
|
|
103
|
+
addError(errors, 'company.ruc', `RUC emisor "${data.company.ruc}" inválido (debe ser 11 dígitos con dígito verificador válido)`);
|
|
104
|
+
}
|
|
105
|
+
if (!data.company.razonSocial || data.company.razonSocial.trim() === '') {
|
|
106
|
+
addError(errors, 'company.razonSocial', 'Razón social del emisor es obligatoria');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!data.client) {
|
|
110
|
+
addError(errors, 'client', 'Datos del cliente son obligatorios');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
if (!data.client.tipoDoc || data.client.tipoDoc.trim() === '') {
|
|
114
|
+
addError(errors, 'client.tipoDoc', 'Tipo documento del cliente es obligatorio');
|
|
115
|
+
}
|
|
116
|
+
if (!data.client.numDoc || data.client.numDoc.trim() === '') {
|
|
117
|
+
addError(errors, 'client.numDoc', 'Número documento del cliente es obligatorio');
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (data.client.tipoDoc === '6' && !/^\d{11}$/.test(data.client.numDoc)) {
|
|
121
|
+
addError(errors, 'client.numDoc', 'RUC del cliente debe tener 11 dígitos');
|
|
122
|
+
}
|
|
123
|
+
if (data.client.tipoDoc === '1' && !/^\d{8}$/.test(data.client.numDoc)) {
|
|
124
|
+
addError(errors, 'client.numDoc', 'DNI del cliente debe tener 8 dígitos');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (!data.client.rznSocial || data.client.rznSocial.trim() === '') {
|
|
128
|
+
addError(errors, 'client.rznSocial', 'Razón social del cliente es obligatoria');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (!data.details || data.details.length === 0) {
|
|
132
|
+
addError(errors, 'details', 'Debe haber al menos 1 item en el detalle');
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
data.details.forEach((detail, i) => validateDetail(detail, i, errors));
|
|
136
|
+
}
|
|
137
|
+
if (data.details && data.details.length > 0) {
|
|
138
|
+
const afectacionesGravadas = ['10', '11', '12', '13', '14', '15', '16', '17'];
|
|
139
|
+
let sumaValorVenta = 0;
|
|
140
|
+
let sumaBaseIgv = 0;
|
|
141
|
+
let sumaIgv = 0;
|
|
142
|
+
for (const d of data.details) {
|
|
143
|
+
sumaValorVenta += d.mtoValorVenta || 0;
|
|
144
|
+
sumaBaseIgv += d.mtoBaseIgv || 0;
|
|
145
|
+
if (afectacionesGravadas.includes(d.tipAfeIgv)) {
|
|
146
|
+
sumaIgv += d.igv || 0;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (Math.abs(sumaBaseIgv - sumaValorVenta) > 0.02) {
|
|
150
|
+
addError(errors, 'totals', `Suma de bases IGV (${sumaBaseIgv}) no coincide con suma de valor venta (${sumaValorVenta})`);
|
|
151
|
+
}
|
|
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})`);
|
|
154
|
+
}
|
|
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})`);
|
|
157
|
+
}
|
|
158
|
+
const totalImpuestosEsperado = data.mtoIGV + (data.mtoISC || 0) + (data.icbper || 0);
|
|
159
|
+
if (Math.abs(data.totalImpuestos - totalImpuestosEsperado) > 0.02) {
|
|
160
|
+
addError(errors, 'totalImpuestos', `Total impuestos (${data.totalImpuestos}) no coincide con IGV+ISC+ICBPER (${totalImpuestosEsperado})`);
|
|
161
|
+
}
|
|
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})`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (!data.legends || data.legends.length === 0) {
|
|
168
|
+
addError(errors, 'legends', 'Debe incluir al menos una leyenda (code 1000 = monto en letras)');
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const has1000 = data.legends.some(l => l.code === '1000');
|
|
172
|
+
if (!has1000) {
|
|
173
|
+
addError(errors, 'legends', 'Leyenda code 1000 (monto en letras) es obligatoria');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (errors.length > 0) {
|
|
177
|
+
throw new InvoiceValidationError(`Validación de factura fallida:\n - ${errors.join('\n - ')}`, errors);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function validateNotePayload(data) {
|
|
181
|
+
const errors = [];
|
|
182
|
+
if (!data.tipoDoc || !['07', '08'].includes(data.tipoDoc)) {
|
|
183
|
+
addError(errors, 'tipoDoc', `Tipo documento "${data.tipoDoc}" inválido. Debe ser "07" (NC) o "08" (ND)`);
|
|
184
|
+
}
|
|
185
|
+
if (!data.serie || !isValidSerie(data.tipoDoc, data.serie)) {
|
|
186
|
+
addError(errors, 'serie', `Serie "${data.serie}" no tiene formato válido`);
|
|
187
|
+
}
|
|
188
|
+
if (!data.correlativo || !isValidCorrelativo(data.correlativo)) {
|
|
189
|
+
addError(errors, 'correlativo', `Correlativo "${data.correlativo}" inválido`);
|
|
190
|
+
}
|
|
191
|
+
if (!data.fechaEmision || !isValidDate(data.fechaEmision)) {
|
|
192
|
+
addError(errors, 'fechaEmision', 'Fecha de emisión es obligatoria');
|
|
193
|
+
}
|
|
194
|
+
else if (isFutureDate(data.fechaEmision)) {
|
|
195
|
+
addError(errors, 'fechaEmision', 'Fecha de emisión no puede ser futura');
|
|
196
|
+
}
|
|
197
|
+
if (!data.tipoMoneda || data.tipoMoneda.trim() === '') {
|
|
198
|
+
addError(errors, 'tipoMoneda', 'Tipo de moneda es obligatoria');
|
|
199
|
+
}
|
|
200
|
+
if (!data.tipDocAfectado || data.tipDocAfectado.trim() === '') {
|
|
201
|
+
addError(errors, 'tipDocAfectado', 'Tipo del documento afectado es obligatorio');
|
|
202
|
+
}
|
|
203
|
+
if (!data.numDocAfectado || data.numDocAfectado.trim() === '') {
|
|
204
|
+
addError(errors, 'numDocAfectado', 'Número del documento afectado es obligatorio');
|
|
205
|
+
}
|
|
206
|
+
if (!data.codMotivo || data.codMotivo.trim() === '') {
|
|
207
|
+
addError(errors, 'codMotivo', 'Código de motivo es obligatorio');
|
|
208
|
+
}
|
|
209
|
+
if (!data.desMotivo || data.desMotivo.trim() === '') {
|
|
210
|
+
addError(errors, 'desMotivo', 'Descripción de motivo es obligatoria');
|
|
211
|
+
}
|
|
212
|
+
if (!data.company) {
|
|
213
|
+
addError(errors, 'company', 'Datos del emisor son obligatorios');
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
if (!data.company.ruc || !isValidRuc(data.company.ruc)) {
|
|
217
|
+
addError(errors, 'company.ruc', `RUC emisor "${data.company.ruc}" inválido`);
|
|
218
|
+
}
|
|
219
|
+
if (!data.company.razonSocial || data.company.razonSocial.trim() === '') {
|
|
220
|
+
addError(errors, 'company.razonSocial', 'Razón social del emisor es obligatoria');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (!data.client) {
|
|
224
|
+
addError(errors, 'client', 'Datos del cliente son obligatorios');
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
if (!data.client.numDoc || data.client.numDoc.trim() === '') {
|
|
228
|
+
addError(errors, 'client.numDoc', 'Número documento del cliente es obligatorio');
|
|
229
|
+
}
|
|
230
|
+
if (!data.client.rznSocial || data.client.rznSocial.trim() === '') {
|
|
231
|
+
addError(errors, 'client.rznSocial', 'Razón social del cliente es obligatoria');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (!data.details || data.details.length === 0) {
|
|
235
|
+
addError(errors, 'details', 'Debe haber al menos 1 item');
|
|
236
|
+
}
|
|
237
|
+
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
|
+
});
|
|
244
|
+
}
|
|
245
|
+
if (errors.length > 0) {
|
|
246
|
+
throw new InvoiceValidationError(`Validación de nota fallida:\n - ${errors.join('\n - ')}`, errors);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=invoice.validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice.validator.js","sourceRoot":"","sources":["../../src/validation/invoice.validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED