@facturacr/atv-sdk 2.0.13-alpha → 2.0.14-alpha
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/__tests__/stubs/createDocument.data.ts +34 -0
- package/__tests__/tests/ATV/create-document.test.ts +34 -1
- package/dist/src/ATV/core/CreateDocFactory.js +5 -2
- package/dist/src/ATV/core/CreateDocFactory.js.map +1 -1
- package/dist/src/ATV/mappers/billDocToAtv.js +21 -30
- package/dist/src/ATV/mappers/billDocToAtv.js.map +1 -1
- package/examples/README.md +5 -0
- package/examples/createAndSendFEC.ts +94 -0
- package/package.json +1 -1
- package/src/ATV/core/CreateDocFactory.ts +6 -2
- package/src/ATV/mappers/billDocToAtv.ts +16 -7
|
@@ -108,3 +108,37 @@ export const TEInputExample: CreateDocumentInput['document'] = {
|
|
|
108
108
|
paymentMethod: '03',
|
|
109
109
|
conditionSale: '01'
|
|
110
110
|
}
|
|
111
|
+
|
|
112
|
+
export const FECInputExample: CreateDocumentInput['document'] = {
|
|
113
|
+
consecutiveIdentifier: '2',
|
|
114
|
+
activityCode: '729001',
|
|
115
|
+
providerId: emitterStub.identifier.id,
|
|
116
|
+
documentName: 'FacturaElectronicaCompra',
|
|
117
|
+
branch: '1',
|
|
118
|
+
terminal: '1',
|
|
119
|
+
ceSituation: '1',
|
|
120
|
+
countryCode: '506',
|
|
121
|
+
emitter: {
|
|
122
|
+
fullName: 'Airbnb',
|
|
123
|
+
commercialName: 'Airbnb',
|
|
124
|
+
activityCode: '729001',
|
|
125
|
+
identifier: {
|
|
126
|
+
type: '05',
|
|
127
|
+
id: '000000000001'
|
|
128
|
+
},
|
|
129
|
+
foreignAddress: 'Proveedor extranjero no domiciliado',
|
|
130
|
+
email: 'no-reply@airbnb.com'
|
|
131
|
+
},
|
|
132
|
+
receiver: receiverStub,
|
|
133
|
+
orderLines,
|
|
134
|
+
securityCode: '1',
|
|
135
|
+
paymentMethod: '04',
|
|
136
|
+
conditionSale: '01',
|
|
137
|
+
referenceInfo: {
|
|
138
|
+
docType: '16',
|
|
139
|
+
refNumber: 'HMX5HK4SNQ',
|
|
140
|
+
issueDate: new Date(),
|
|
141
|
+
code: '11',
|
|
142
|
+
reason: 'Proveedor no domiciliado - comision Airbnb'
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'fs'
|
|
2
2
|
import { ATV } from '@src/ATV'
|
|
3
3
|
import 'jest-xml-matcher'
|
|
4
|
-
import { FEInputExample } from '@test/stubs/createDocument.data'
|
|
4
|
+
import { FECInputExample, FEInputExample } from '@test/stubs/createDocument.data'
|
|
5
5
|
const fakePem = fs.readFileSync('__tests__/stubs/dummyKeys/client-identity.p12', 'binary')
|
|
6
6
|
const fakePassword = '1234'
|
|
7
7
|
const expectXml = fs.readFileSync('__tests__/stubs/commonExpectedXml.xml', 'utf-8')
|
|
@@ -56,4 +56,37 @@ describe('Create Document (Invoice)', () => {
|
|
|
56
56
|
})
|
|
57
57
|
expect(createdDoc.extraData.xml).toEqualXML(expectXml)
|
|
58
58
|
})
|
|
59
|
+
|
|
60
|
+
it('should create a purchase invoice without factory-assumed tax fields', async () => {
|
|
61
|
+
const atv = new ATV({}, 'stg')
|
|
62
|
+
const createdDoc = await atv.createDocumentCommand({
|
|
63
|
+
document: FECInputExample,
|
|
64
|
+
token: 'fake-token',
|
|
65
|
+
// @ts-expect-error only for testing
|
|
66
|
+
signatureOptions: undefined
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
expect(createdDoc.extraData.xml).toContain('<FacturaElectronicaCompra')
|
|
70
|
+
expect(createdDoc.extraData.xml).toContain('<ImpuestoNeto>')
|
|
71
|
+
expect(createdDoc.extraData.xml).not.toContain('<ImpuestoAsumidoEmisorFabrica>')
|
|
72
|
+
expect(createdDoc.extraData.xml).not.toContain('<TotalImpAsumEmisorFabrica>')
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('should create a purchase invoice key and activity from the signing receiver', async () => {
|
|
76
|
+
const receiver = FECInputExample.receiver
|
|
77
|
+
if (!receiver) throw new Error('FECInputExample.receiver is required')
|
|
78
|
+
|
|
79
|
+
const atv = new ATV({}, 'stg')
|
|
80
|
+
const createdDoc = await atv.createDocumentCommand({
|
|
81
|
+
document: FECInputExample,
|
|
82
|
+
token: 'fake-token',
|
|
83
|
+
// @ts-expect-error only for testing
|
|
84
|
+
signatureOptions: undefined
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
expect(createdDoc.command.data.clave).toContain(receiver.identifier.id.padStart(12, '0'))
|
|
88
|
+
expect(createdDoc.extraData.xml).toContain(`<CodigoActividadEmisor>${receiver.activityCode.padStart(6, '0')}</CodigoActividadEmisor>`)
|
|
89
|
+
expect(createdDoc.extraData.xml).toContain(`<Numero>${FECInputExample.emitter.identifier.id}</Numero>`)
|
|
90
|
+
expect(createdDoc.extraData.xml).toContain(`<Numero>${receiver.identifier.id}</Numero>`)
|
|
91
|
+
})
|
|
59
92
|
})
|
|
@@ -52,14 +52,17 @@ class CreateDocFactory {
|
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
createClave(dto, docType) {
|
|
55
|
+
const keyPerson = dto.documentName === 'FacturaElectronicaCompra' && dto.receiver
|
|
56
|
+
? dto.receiver
|
|
57
|
+
: dto.emitter;
|
|
55
58
|
return Clave_1.Clave.create({
|
|
56
59
|
branch: dto.branch,
|
|
57
60
|
ceSituation: dto.ceSituation,
|
|
58
61
|
consecutiveIdentifier: dto.consecutiveIdentifier,
|
|
59
62
|
countryCode: dto.countryCode,
|
|
60
63
|
docKeyType: docType.value,
|
|
61
|
-
emitterIdentifier:
|
|
62
|
-
identifierType:
|
|
64
|
+
emitterIdentifier: keyPerson.identifier.id,
|
|
65
|
+
identifierType: keyPerson.identifier.type || '01',
|
|
63
66
|
securityCode: dto.securityCode,
|
|
64
67
|
terminal: dto.terminal
|
|
65
68
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateDocFactory.js","sourceRoot":"","sources":["../../../../src/ATV/core/CreateDocFactory.ts"],"names":[],"mappings":";;;AAAA,qCAA0D;AAC1D,2CAAmD;AACnD,uDAA+D;AAC/D,yCAAiD;AACjD,mCAA2C;AAC3C,iDAAwE;AACxE,iEAAwF;AAoExF,MAAa,gBAAgB;IACpB,cAAc,CAAC,QAAyC;QAC7D,MAAM,YAAY,GAAG,2BAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAClD,OAAO,mBAAQ,CAAC,MAAM,CAAC;YACrB,KAAK;YACL,eAAe,EAAE,cAAc;YAC/B,UAAU;YACV,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,eAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1E,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,oBAAoB,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,2CAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;YAC9G,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,YAAY,EAAE,QAAQ,CAAC,YAAY;SACpC,CAAC,CAAA;IACJ,CAAC;IAEO,gBAAgB,CAAC,GAAoC;QAC3D,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;YAC7C,OAAO,qBAAS,CAAC,MAAM,CAAC;gBACtB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,YAAY,EAAE,SAAS,CAAC,YAAY;gBACpC,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC1D,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,GAAG,EAAE,SAAS,CAAC,GAAG;aACnB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,qBAAqB,CAAC,GAAoC,EAAE,OAAqB;QACvF,OAAO,iCAAe,CAAC,MAAM,CAAC;YAC5B,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;YAChD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YACvC,YAAY,EAAE,OAAO,CAAC,KAAK;SAC5B,CAAC,CAAA;IACJ,CAAC;IAEO,WAAW,CAAC,GAAoC,EAAE,OAAqB;QAC7E,OAAO,aAAK,CAAC,MAAM,CAAC;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;YAChD,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,UAAU,EAAE,OAAO,CAAC,KAAK;YACzB,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"CreateDocFactory.js","sourceRoot":"","sources":["../../../../src/ATV/core/CreateDocFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,12 @@ exports.mapReceptorMessageToAtvFormat = exports.mapDocumentToAtvFormat = void 0;
|
|
|
4
4
|
const parseAtvMoneyFormat = (amount) => {
|
|
5
5
|
return parseFloat(amount.toFixed(5));
|
|
6
6
|
};
|
|
7
|
-
const
|
|
7
|
+
const isPurchaseInvoice = (docName) => docName === 'FacturaElectronicaCompra';
|
|
8
|
+
const mapOrderLinesToAtvFormat = (orderLines, docName) => {
|
|
8
9
|
const LineaDetalle = orderLines.map((orderLine) => {
|
|
9
10
|
var _a;
|
|
10
11
|
const impuestoMonto = orderLine.tax ? parseAtvMoneyFormat((_a = orderLine.tax.amount) !== null && _a !== void 0 ? _a : 0) : 0;
|
|
11
|
-
return Object.assign(Object.assign({ NumeroLinea: orderLine.lineNumber, CodigoCABYS: orderLine.code,
|
|
12
|
+
return Object.assign(Object.assign(Object.assign({ NumeroLinea: orderLine.lineNumber, CodigoCABYS: orderLine.code,
|
|
12
13
|
// CodigoComercial
|
|
13
14
|
Cantidad: orderLine.quantity, UnidadMedida: orderLine.measureUnit,
|
|
14
15
|
// UnidadMedidaComercial
|
|
@@ -22,13 +23,15 @@ const mapOrderLinesToAtvFormat = (orderLines) => {
|
|
|
22
23
|
Monto: impuestoMonto
|
|
23
24
|
// Exoneracion is explicitly excluded here
|
|
24
25
|
}
|
|
25
|
-
})),
|
|
26
|
+
})), (!isPurchaseInvoice(docName) && {
|
|
27
|
+
ImpuestoAsumidoEmisorFabrica: 0
|
|
28
|
+
})), {
|
|
26
29
|
// @ts-expect-error pending-to-fix
|
|
27
30
|
ImpuestoNeto: parseAtvMoneyFormat(orderLine.tax.amount), MontoTotalLinea: parseAtvMoneyFormat(orderLine.totalOrderLineAmount), exchangeRate: orderLine.exchangeRate, currency: orderLine.currency });
|
|
28
31
|
});
|
|
29
32
|
return { LineaDetalle };
|
|
30
33
|
};
|
|
31
|
-
const mapSummaryInvoice = (document) => {
|
|
34
|
+
const mapSummaryInvoice = (document, docName) => {
|
|
32
35
|
const summaryInvoice = document.summaryInvoice;
|
|
33
36
|
const orderLines = document.orderLines; // Still need access to order lines for breakdown
|
|
34
37
|
// --- Lógica para TotalDesgloseImpuesto (sin considerar exoneraciones) ---
|
|
@@ -50,40 +53,25 @@ const mapSummaryInvoice = (document) => {
|
|
|
50
53
|
TotalMontoImpuesto: parseAtvMoneyFormat(totalMonto)
|
|
51
54
|
};
|
|
52
55
|
});
|
|
53
|
-
return {
|
|
54
|
-
CodigoTipoMoneda: {
|
|
56
|
+
return Object.assign(Object.assign({ CodigoTipoMoneda: {
|
|
55
57
|
// @ts-expect-error pending-to-fix
|
|
56
58
|
CodigoMoneda: summaryInvoice.currency.code,
|
|
57
59
|
// @ts-expect-error pending-to-fix
|
|
58
60
|
TipoCambio: summaryInvoice.currency.exchangeRate
|
|
59
|
-
},
|
|
60
|
-
TotalServGravados: parseAtvMoneyFormat(summaryInvoice.totalEncumberedServices),
|
|
61
|
-
TotalServExentos: parseAtvMoneyFormat(summaryInvoice.totalExemptServices),
|
|
62
|
-
TotalServNoSujeto: parseAtvMoneyFormat(summaryInvoice.totalNonTaxableServices), // Moved here
|
|
61
|
+
}, TotalServGravados: parseAtvMoneyFormat(summaryInvoice.totalEncumberedServices), TotalServExentos: parseAtvMoneyFormat(summaryInvoice.totalExemptServices), TotalServNoSujeto: parseAtvMoneyFormat(summaryInvoice.totalNonTaxableServices),
|
|
63
62
|
// @ts-expect-error pending-to-fix
|
|
64
|
-
TotalMercanciasGravadas: parseAtvMoneyFormat(summaryInvoice.totalEncumberedMerchandise),
|
|
63
|
+
TotalMercanciasGravadas: parseAtvMoneyFormat(summaryInvoice.totalEncumberedMerchandise),
|
|
65
64
|
// @ts-expect-error pending-to-fix
|
|
66
|
-
TotalMercanciasExentas: parseAtvMoneyFormat(summaryInvoice.totalExemptMerchandise),
|
|
67
|
-
TotalMercNoSujeta: parseAtvMoneyFormat(summaryInvoice.totalNonTaxableMerchandise), // Moved here
|
|
68
|
-
TotalGravado: parseAtvMoneyFormat(summaryInvoice.totalEncumbered),
|
|
69
|
-
TotalExento: parseAtvMoneyFormat(summaryInvoice.totalExempt),
|
|
70
|
-
TotalExonerado: parseAtvMoneyFormat(summaryInvoice.totalExonerated),
|
|
71
|
-
TotalNoSujeto: parseAtvMoneyFormat(summaryInvoice.totalNonTaxable), // Moved here
|
|
72
|
-
TotalVenta: parseAtvMoneyFormat(summaryInvoice.totalSale),
|
|
65
|
+
TotalMercanciasExentas: parseAtvMoneyFormat(summaryInvoice.totalExemptMerchandise), TotalMercNoSujeta: parseAtvMoneyFormat(summaryInvoice.totalNonTaxableMerchandise), TotalGravado: parseAtvMoneyFormat(summaryInvoice.totalEncumbered), TotalExento: parseAtvMoneyFormat(summaryInvoice.totalExempt), TotalExonerado: parseAtvMoneyFormat(summaryInvoice.totalExonerated), TotalNoSujeto: parseAtvMoneyFormat(summaryInvoice.totalNonTaxable), TotalVenta: parseAtvMoneyFormat(summaryInvoice.totalSale),
|
|
73
66
|
// @ts-expect-error pending-to-fix
|
|
74
|
-
TotalDescuentos: parseAtvMoneyFormat(summaryInvoice.totalDiscounts),
|
|
67
|
+
TotalDescuentos: parseAtvMoneyFormat(summaryInvoice.totalDiscounts),
|
|
75
68
|
// @ts-expect-error pending-to-fix
|
|
76
|
-
TotalVentaNeta: parseAtvMoneyFormat(summaryInvoice.totalNetSale),
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
TotalImpAsumEmisorFabrica: 0,
|
|
80
|
-
TotalOtrosCargos: 0,
|
|
81
|
-
MedioPago: {
|
|
69
|
+
TotalVentaNeta: parseAtvMoneyFormat(summaryInvoice.totalNetSale), TotalDesgloseImpuesto, TotalImpuesto: parseAtvMoneyFormat(summaryInvoice.totalTaxes) }, (!isPurchaseInvoice(docName) && {
|
|
70
|
+
TotalImpAsumEmisorFabrica: 0
|
|
71
|
+
})), { TotalOtrosCargos: 0, MedioPago: {
|
|
82
72
|
// @ts-expect-error pending-to-fix
|
|
83
73
|
TipoMedioPago: document.paymentMethod
|
|
84
|
-
},
|
|
85
|
-
TotalComprobante: parseAtvMoneyFormat(summaryInvoice.totalVoucher)
|
|
86
|
-
};
|
|
74
|
+
}, TotalComprobante: parseAtvMoneyFormat(summaryInvoice.totalVoucher) });
|
|
87
75
|
};
|
|
88
76
|
const mapPerson = (person) => {
|
|
89
77
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
@@ -130,11 +118,14 @@ const mapReferenceInformation = (referenceInfo) => {
|
|
|
130
118
|
const mapDocumentToAtvFormat = (docName, document) => {
|
|
131
119
|
var _a, _b;
|
|
132
120
|
const key = docName;
|
|
133
|
-
const
|
|
121
|
+
const activitySource = isPurchaseInvoice(docName) && document.receiver
|
|
122
|
+
? document.receiver
|
|
123
|
+
: document.emitter;
|
|
124
|
+
const doc = Object.assign(Object.assign(Object.assign(Object.assign({ Clave: document.clave, ProveedorSistemas: document.providerId, CodigoActividadEmisor: activitySource.activityCode.padStart(6, '0') }, (document.receiver && {
|
|
134
125
|
CodigoActividadReceptor: (_b = (_a = document.receiver) === null || _a === void 0 ? void 0 : _a.activityCode) === null || _b === void 0 ? void 0 : _b.padStart(6, '0')
|
|
135
126
|
})), { NumeroConsecutivo: document.fullConsecutive, FechaEmision: document.issueDate.toISOString(), Emisor: mapPerson(document.emitter) }), (document.receiver && {
|
|
136
127
|
Receptor: mapPerson(document.receiver)
|
|
137
|
-
})), { CondicionVenta: document.conditionSale, PlazoCredito: document.deadlineCredit, DetalleServicio: mapOrderLinesToAtvFormat(document.orderLines), ResumenFactura: mapSummaryInvoice(document), Otros: document.others });
|
|
128
|
+
})), { CondicionVenta: document.conditionSale, PlazoCredito: document.deadlineCredit, DetalleServicio: mapOrderLinesToAtvFormat(document.orderLines, docName), ResumenFactura: mapSummaryInvoice(document, docName), Otros: document.others });
|
|
138
129
|
if (document.referenceInformation) {
|
|
139
130
|
doc.InformacionReferencia = mapReferenceInformation(document.referenceInformation);
|
|
140
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billDocToAtv.js","sourceRoot":"","sources":["../../../../src/ATV/mappers/billDocToAtv.ts"],"names":[],"mappings":";;;AASA,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,EAAE;IAC7C,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,wBAAwB,GAAG,CAAC,UAAuB,EAAmB,EAAE;
|
|
1
|
+
{"version":3,"file":"billDocToAtv.js","sourceRoot":"","sources":["../../../../src/ATV/mappers/billDocToAtv.ts"],"names":[],"mappings":"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"}
|
package/examples/README.md
CHANGED
|
@@ -11,6 +11,11 @@ Para probar crear y enviar tiquete electronico. Ejemplo:
|
|
|
11
11
|
yarn ts-node -r tsconfig-paths/register --require dotenv/config examples/createAndSendTE.ts 1
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
+
Para probar crear y enviar factura electronica de compra. Ejemplo:
|
|
15
|
+
```
|
|
16
|
+
yarn ts-node -r tsconfig-paths/register --require dotenv/config examples/createAndSendFEC.ts 1
|
|
17
|
+
```
|
|
18
|
+
|
|
14
19
|
Para aceptar una factura. Ejemplo:
|
|
15
20
|
```
|
|
16
21
|
yarn ts-node -r tsconfig-paths/register --require dotenv/config examples/atvAccept.ts
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import { FECInputExample } from '@test/stubs/createDocument.data'
|
|
3
|
+
import { ATV } from '../dist/src'
|
|
4
|
+
import { PersonProps } from 'dist/src/ATV/core/Person'
|
|
5
|
+
|
|
6
|
+
const getRequiredEnv = (key: string): string => {
|
|
7
|
+
const value = process.env[key]
|
|
8
|
+
if (!value) {
|
|
9
|
+
throw new Error(`Missing required environment variable: ${key}`)
|
|
10
|
+
}
|
|
11
|
+
return value
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const USERNAME_TEST = getRequiredEnv('USERNAME_TEST')
|
|
15
|
+
const PASSWORD_TEST = getRequiredEnv('PASSWORD_TEST')
|
|
16
|
+
const EMITTER_IDENTIFIER_ID = getRequiredEnv('EMITTER_IDENTIFIER_ID')
|
|
17
|
+
const EMITTER_IDENTIFIER_TYPE = getRequiredEnv('EMITTER_IDENTIFIER_TYPE') as PersonProps['identifier']['type']
|
|
18
|
+
|
|
19
|
+
const SOURCE_P12_URI = getRequiredEnv('SOURCE_P12_URI')
|
|
20
|
+
const SOURCE_P12_PASSPORT = getRequiredEnv('SOURCE_P12_PASSPORT')
|
|
21
|
+
|
|
22
|
+
const pem = fs.readFileSync(SOURCE_P12_URI, 'binary')
|
|
23
|
+
|
|
24
|
+
const paramConsecutive = process.argv[2]
|
|
25
|
+
const consecutiveIdentifier = paramConsecutive || process.env.TEST_CONSECUTIVE
|
|
26
|
+
console.log('paramConsecutive', paramConsecutive)
|
|
27
|
+
|
|
28
|
+
// In FacturaElectronicaCompra the non-domiciled supplier is XML Emisor,
|
|
29
|
+
// and the local taxpayer/business that signs is XML Receptor.
|
|
30
|
+
const receiver = FECInputExample.receiver
|
|
31
|
+
if (!receiver) {
|
|
32
|
+
throw new Error('FECInputExample.receiver is required')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!consecutiveIdentifier) {
|
|
36
|
+
throw new Error('Missing consecutiveIdentifier. Pass it as argument or set TEST_CONSECUTIVE.')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
FECInputExample.consecutiveIdentifier = consecutiveIdentifier
|
|
40
|
+
receiver.identifier.id = EMITTER_IDENTIFIER_ID
|
|
41
|
+
receiver.identifier.type = EMITTER_IDENTIFIER_TYPE
|
|
42
|
+
FECInputExample.providerId = EMITTER_IDENTIFIER_ID
|
|
43
|
+
|
|
44
|
+
console.log('requestStub consecutivo', FECInputExample.consecutiveIdentifier)
|
|
45
|
+
|
|
46
|
+
function getConfimation(atv: ATV, token: string, location: string, ms: number): Promise<Awaited<ReturnType<ATV['sendConfirmation']>>> {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
console.log('location', location)
|
|
50
|
+
atv.sendConfirmation({
|
|
51
|
+
url: location,
|
|
52
|
+
headers: {
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
Authorization: 'bearer ' + token
|
|
55
|
+
}
|
|
56
|
+
}).then(data => resolve(data))
|
|
57
|
+
.catch(err => reject(err))
|
|
58
|
+
}, ms)
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function main(): Promise<void> {
|
|
63
|
+
const atv = new ATV({}, 'stg')
|
|
64
|
+
const tokenData = await atv.getToken({
|
|
65
|
+
username: USERNAME_TEST,
|
|
66
|
+
password: PASSWORD_TEST
|
|
67
|
+
})
|
|
68
|
+
const { command, extraData } = await atv.createDocumentCommand({
|
|
69
|
+
document: FECInputExample,
|
|
70
|
+
token: tokenData.accessToken,
|
|
71
|
+
signatureOptions: {
|
|
72
|
+
buffer: pem,
|
|
73
|
+
password: SOURCE_P12_PASSPORT
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
console.log({
|
|
77
|
+
clave: command.data.clave,
|
|
78
|
+
emisor: command.data.emisor,
|
|
79
|
+
receptor: command.data.receptor,
|
|
80
|
+
hasImpuestoAsumidoEmisorFabrica: extraData.xml.includes('ImpuestoAsumidoEmisorFabrica')
|
|
81
|
+
})
|
|
82
|
+
const response = await atv.sendDocument(command)
|
|
83
|
+
if (response.errorCause) {
|
|
84
|
+
console.log('error response', response)
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
if (!response.location) {
|
|
88
|
+
throw new Error('No confirmation location returned by Hacienda.')
|
|
89
|
+
}
|
|
90
|
+
const confirmationResponse = await getConfimation(atv, tokenData.accessToken, response.location, 3500)
|
|
91
|
+
console.log({ MensajeHacienda: confirmationResponse.confirmation })
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
main()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@facturacr/atv-sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.14-alpha",
|
|
4
4
|
"description": "Librería (SDK) de Javascript/NodeJS para acceder al API de Administración Tributaria Virtual (ATV) del Ministerio de Hacienda.",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -119,14 +119,18 @@ export class CreateDocFactory {
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
private createClave(dto: CreateDocumentInput['document'], docType: DocumentType): Clave {
|
|
122
|
+
const keyPerson = dto.documentName === 'FacturaElectronicaCompra' && dto.receiver
|
|
123
|
+
? dto.receiver
|
|
124
|
+
: dto.emitter
|
|
125
|
+
|
|
122
126
|
return Clave.create({
|
|
123
127
|
branch: dto.branch,
|
|
124
128
|
ceSituation: dto.ceSituation,
|
|
125
129
|
consecutiveIdentifier: dto.consecutiveIdentifier,
|
|
126
130
|
countryCode: dto.countryCode,
|
|
127
131
|
docKeyType: docType.value,
|
|
128
|
-
emitterIdentifier:
|
|
129
|
-
identifierType:
|
|
132
|
+
emitterIdentifier: keyPerson.identifier.id,
|
|
133
|
+
identifierType: keyPerson.identifier.type || '01',
|
|
130
134
|
securityCode: dto.securityCode,
|
|
131
135
|
terminal: dto.terminal
|
|
132
136
|
})
|
|
@@ -11,7 +11,9 @@ const parseAtvMoneyFormat = (amount: number) => {
|
|
|
11
11
|
return parseFloat(amount.toFixed(5))
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const isPurchaseInvoice = (docName: string) => docName === 'FacturaElectronicaCompra'
|
|
15
|
+
|
|
16
|
+
const mapOrderLinesToAtvFormat = (orderLines: OrderLine[], docName: string): DetalleServicio => {
|
|
15
17
|
const LineaDetalle = orderLines.map<DetalleServicio['LineaDetalle'][0]>((orderLine) => {
|
|
16
18
|
const impuestoMonto = orderLine.tax ? parseAtvMoneyFormat(orderLine.tax.amount ?? 0) : 0
|
|
17
19
|
return {
|
|
@@ -36,7 +38,9 @@ const mapOrderLinesToAtvFormat = (orderLines: OrderLine[]): DetalleServicio => {
|
|
|
36
38
|
// Exoneracion is explicitly excluded here
|
|
37
39
|
}
|
|
38
40
|
}),
|
|
39
|
-
|
|
41
|
+
...(!isPurchaseInvoice(docName) && {
|
|
42
|
+
ImpuestoAsumidoEmisorFabrica: 0
|
|
43
|
+
}),
|
|
40
44
|
// @ts-expect-error pending-to-fix
|
|
41
45
|
ImpuestoNeto: parseAtvMoneyFormat(orderLine.tax.amount),
|
|
42
46
|
MontoTotalLinea: parseAtvMoneyFormat(orderLine.totalOrderLineAmount),
|
|
@@ -47,7 +51,7 @@ const mapOrderLinesToAtvFormat = (orderLines: OrderLine[]): DetalleServicio => {
|
|
|
47
51
|
return { LineaDetalle }
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
const mapSummaryInvoice = (document: DomainDocument): Resumen => {
|
|
54
|
+
const mapSummaryInvoice = (document: DomainDocument, docName: string): Resumen => {
|
|
51
55
|
const summaryInvoice = document.summaryInvoice
|
|
52
56
|
const orderLines = document.orderLines // Still need access to order lines for breakdown
|
|
53
57
|
|
|
@@ -97,7 +101,9 @@ const mapSummaryInvoice = (document: DomainDocument): Resumen => {
|
|
|
97
101
|
TotalVentaNeta: parseAtvMoneyFormat(summaryInvoice.totalNetSale),
|
|
98
102
|
TotalDesgloseImpuesto,
|
|
99
103
|
TotalImpuesto: parseAtvMoneyFormat(summaryInvoice.totalTaxes),
|
|
100
|
-
|
|
104
|
+
...(!isPurchaseInvoice(docName) && {
|
|
105
|
+
TotalImpAsumEmisorFabrica: 0
|
|
106
|
+
}),
|
|
101
107
|
TotalOtrosCargos: 0,
|
|
102
108
|
MedioPago: {
|
|
103
109
|
// @ts-expect-error pending-to-fix
|
|
@@ -153,10 +159,13 @@ const mapReferenceInformation = (referenceInfo: ReferenceInformation): Informaci
|
|
|
153
159
|
|
|
154
160
|
export const mapDocumentToAtvFormat = (docName: string, document: DomainDocument): AtvFormat => {
|
|
155
161
|
const key = docName
|
|
162
|
+
const activitySource = isPurchaseInvoice(docName) && document.receiver
|
|
163
|
+
? document.receiver
|
|
164
|
+
: document.emitter
|
|
156
165
|
const doc: AtvDocument = {
|
|
157
166
|
Clave: document.clave,
|
|
158
167
|
ProveedorSistemas: document.providerId,
|
|
159
|
-
CodigoActividadEmisor:
|
|
168
|
+
CodigoActividadEmisor: activitySource.activityCode.padStart(6, '0'),
|
|
160
169
|
...(document.receiver && { // TODO add && document.name === 'FacturaElectronica'
|
|
161
170
|
CodigoActividadReceptor: document.receiver?.activityCode?.padStart(6, '0')
|
|
162
171
|
}),
|
|
@@ -168,8 +177,8 @@ export const mapDocumentToAtvFormat = (docName: string, document: DomainDocument
|
|
|
168
177
|
}),
|
|
169
178
|
CondicionVenta: document.conditionSale,
|
|
170
179
|
PlazoCredito: document.deadlineCredit,
|
|
171
|
-
DetalleServicio: mapOrderLinesToAtvFormat(document.orderLines),
|
|
172
|
-
ResumenFactura: mapSummaryInvoice(document),
|
|
180
|
+
DetalleServicio: mapOrderLinesToAtvFormat(document.orderLines, docName),
|
|
181
|
+
ResumenFactura: mapSummaryInvoice(document, docName),
|
|
173
182
|
Otros: document.others
|
|
174
183
|
}
|
|
175
184
|
if (document.referenceInformation) {
|