Skip to content

Commit

Permalink
Add tests, round money sums
Browse files Browse the repository at this point in the history
  • Loading branch information
m-arrieta-r committed Sep 28, 2024
1 parent 5459f32 commit ca5afd4
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 22 deletions.
2 changes: 1 addition & 1 deletion __tests__/stubs/commonExpectedXml.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<FacturaElectronica xmlns="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica https://www.hacienda.go.cr/ATV/ComprobanteElectronico/docs/esquemas/2016/v4.3/FacturaElectronica_V4.3.xsd">
<FacturaElectronica xmlns="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Clave>50601042400020692014200100001010000000002100000001</Clave>
<CodigoActividad>000004</CodigoActividad>
<NumeroConsecutivo>00100001010000000002</NumeroConsecutivo>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Create Document (Invoice) should create document and generate a correct command 1`] = `"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RmFjdHVyYUVsZWN0cm9uaWNhIHhtbG5zPSJodHRwczovL2Nkbi5jb21wcm9iYW50ZXNlbGVjdHJvbmljb3MuZ28uY3IveG1sLXNjaGVtYXMvdjQuMy9mYWN0dXJhRWxlY3Ryb25pY2EiIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj48Q2xhdmU+NTA2MDEwNDI0MDAwMjA2OTIwMTQyMDAxMDAwMDEwMTAwMDAwMDAwMDIxMDAwMDAwMDE8L0NsYXZlPjxDb2RpZ29BY3RpdmlkYWQ+MDAwMDA0PC9Db2RpZ29BY3RpdmlkYWQ+PE51bWVyb0NvbnNlY3V0aXZvPjAwMTAwMDAxMDEwMDAwMDAwMDAyPC9OdW1lcm9Db25zZWN1dGl2bz48RmVjaGFFbWlzaW9uPjIwMjQtMDQtMDFUMDA6MDA6MDAuMDAwWjwvRmVjaGFFbWlzaW9uPjxFbWlzb3I+PE5vbWJyZT5FbWlzb3IgbmFtZTwvTm9tYnJlPjxJZGVudGlmaWNhY2lvbj48VGlwbz4wMTwvVGlwbz48TnVtZXJvPjIwNjkyMDE0MjwvTnVtZXJvPjwvSWRlbnRpZmljYWNpb24+PE5vbWJyZUNvbWVyY2lhbD5lbWlzb3IgY29tZXJjaWFsIG5hbWU8L05vbWJyZUNvbWVyY2lhbD48VWJpY2FjaW9uPjxQcm92aW5jaWE+MjwvUHJvdmluY2lhPjxDYW50b24+MDY8L0NhbnRvbj48RGlzdHJpdG8+MDQ8L0Rpc3RyaXRvPjxCYXJyaW8+MDY8L0JhcnJpbz48T3RyYXNTZW5hcz5kZXRhaWxzPC9PdHJhc1NlbmFzPjwvVWJpY2FjaW9uPjxUZWxlZm9ubz48Q29kaWdvUGFpcz41MDY8L0NvZGlnb1BhaXM+PE51bVRlbGVmb25vPjEyMzQxMjM0PC9OdW1UZWxlZm9ubz48L1RlbGVmb25vPjxGYXg+PENvZGlnb1BhaXM+NTA2PC9Db2RpZ29QYWlzPjxOdW1UZWxlZm9ubz4xMjM0MTIzNDwvTnVtVGVsZWZvbm8+PC9GYXg+PENvcnJlb0VsZWN0cm9uaWNvPnRlc3RAdGVzdC5jb208L0NvcnJlb0VsZWN0cm9uaWNvPjwvRW1pc29yPjxSZWNlcHRvcj48Tm9tYnJlPnJlY2VpdmVyIG5hbWUgU1JMPC9Ob21icmU+PElkZW50aWZpY2FjaW9uPjxUaXBvPjAxPC9UaXBvPjxOdW1lcm8+MjA2OTMwMTQzPC9OdW1lcm8+PC9JZGVudGlmaWNhY2lvbj48Tm9tYnJlQ29tZXJjaWFsPnJlY2VpdmVyIG5hbWU8L05vbWJyZUNvbWVyY2lhbD48VWJpY2FjaW9uPjxQcm92aW5jaWE+MjwvUHJvdmluY2lhPjxDYW50b24+MDY8L0NhbnRvbj48RGlzdHJpdG8+MDQ8L0Rpc3RyaXRvPjxCYXJyaW8+MDY8L0JhcnJpbz48T3RyYXNTZW5hcz5kZXRhaWxzPC9PdHJhc1NlbmFzPjwvVWJpY2FjaW9uPjxUZWxlZm9ubz48Q29kaWdvUGFpcz41MDY8L0NvZGlnb1BhaXM+PE51bVRlbGVmb25vPjgwODA4MDgwPC9OdW1UZWxlZm9ubz48L1RlbGVmb25vPjxGYXg+PENvZGlnb1BhaXM+NTA2PC9Db2RpZ29QYWlzPjxOdW1UZWxlZm9ubz44MDgwODA4MDwvTnVtVGVsZWZvbm8+PC9GYXg+PENvcnJlb0VsZWN0cm9uaWNvPnRlc3RAdGVzdC5jb208L0NvcnJlb0VsZWN0cm9uaWNvPjwvUmVjZXB0b3I+PENvbmRpY2lvblZlbnRhPjAxPC9Db25kaWNpb25WZW50YT48TWVkaW9QYWdvPjAxPC9NZWRpb1BhZ28+PERldGFsbGVTZXJ2aWNpbz48TGluZWFEZXRhbGxlPjxOdW1lcm9MaW5lYT4xPC9OdW1lcm9MaW5lYT48Q29kaWdvPjcxMTMzMDEwMDAwMDA8L0NvZGlnbz48Q2FudGlkYWQ+MTwvQ2FudGlkYWQ+PFVuaWRhZE1lZGlkYT5VbmlkPC9VbmlkYWRNZWRpZGE+PERldGFsbGU+ZGV0YWxsZTwvRGV0YWxsZT48UHJlY2lvVW5pdGFyaW8+MTA8L1ByZWNpb1VuaXRhcmlvPjxNb250b1RvdGFsPjEwPC9Nb250b1RvdGFsPjxTdWJUb3RhbD4xMDwvU3ViVG90YWw+PEltcHVlc3RvPjxDb2RpZ28+MDE8L0NvZGlnbz48Q29kaWdvVGFyaWZhPjA4PC9Db2RpZ29UYXJpZmE+PFRhcmlmYT4xMzwvVGFyaWZhPjxNb250bz4xLjM8L01vbnRvPjwvSW1wdWVzdG8+PE1vbnRvVG90YWxMaW5lYT4xMS4zPC9Nb250b1RvdGFsTGluZWE+PC9MaW5lYURldGFsbGU+PC9EZXRhbGxlU2VydmljaW8+PFJlc3VtZW5GYWN0dXJhPjxDb2RpZ29UaXBvTW9uZWRhPjxDb2RpZ29Nb25lZGE+Q1JDPC9Db2RpZ29Nb25lZGE+PFRpcG9DYW1iaW8+NTg1LjY5PC9UaXBvQ2FtYmlvPjwvQ29kaWdvVGlwb01vbmVkYT48VG90YWxTZXJ2R3JhdmFkb3M+MDwvVG90YWxTZXJ2R3JhdmFkb3M+PFRvdGFsU2VydkV4ZW50b3M+MDwvVG90YWxTZXJ2RXhlbnRvcz48VG90YWxNZXJjYW5jaWFzR3JhdmFkYXM+MTA8L1RvdGFsTWVyY2FuY2lhc0dyYXZhZGFzPjxUb3RhbE1lcmNhbmNpYXNFeGVudGFzPjA8L1RvdGFsTWVyY2FuY2lhc0V4ZW50YXM+PFRvdGFsR3JhdmFkbz4xMDwvVG90YWxHcmF2YWRvPjxUb3RhbEV4ZW50bz4wPC9Ub3RhbEV4ZW50bz48VG90YWxFeG9uZXJhZG8+MDwvVG90YWxFeG9uZXJhZG8+PFRvdGFsVmVudGE+MTA8L1RvdGFsVmVudGE+PFRvdGFsRGVzY3VlbnRvcz4wPC9Ub3RhbERlc2N1ZW50b3M+PFRvdGFsVmVudGFOZXRhPjEwPC9Ub3RhbFZlbnRhTmV0YT48VG90YWxJbXB1ZXN0bz4xLjM8L1RvdGFsSW1wdWVzdG8+PFRvdGFsQ29tcHJvYmFudGU+MTEuMzwvVG90YWxDb21wcm9iYW50ZT48L1Jlc3VtZW5GYWN0dXJhPjwvRmFjdHVyYUVsZWN0cm9uaWNhPg=="`;
3 changes: 0 additions & 3 deletions __tests__/tests/ATV/__snapshots__/index.test.ts.snap

This file was deleted.

File renamed without changes.
41 changes: 41 additions & 0 deletions __tests__/tests/ATV/create-receptor-message.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import fs from 'fs'
import { ATV } from "@src/ATV";
import { AceptationStates } from '@src/ATV/core/types';
import { parseElectronicBillXML } from '@src/lib/genXML';
const expectXml = fs.readFileSync('__tests__/stubs/commonExpectedXml.xml', 'utf-8')
const fakePem = fs.readFileSync('__tests__/stubs/dummyKeys/client-identity.p12', 'binary')
const fakePassword = '1234'
describe('Create Receptor Message', () => {
it('should create document and generate a correct command', async () => {
const atv = new ATV({}, 'stg')
const electronillBillRaw = parseElectronicBillXML(expectXml)
const { command, extraData } = await atv.createReceptorMessage({
aceptationState: AceptationStates.ACCEPTED,
aceptationDetailMessage: 'Accepted',
clave: electronillBillRaw.Clave,
emitterIdentifier: electronillBillRaw.Emisor.Identificacion.Numero,
emitterIdentifierType: electronillBillRaw.Emisor.Identificacion.Tipo,
receptorIdentifier: electronillBillRaw.Receptor.Identificacion.Numero,
receptorIdentifierType: electronillBillRaw.Receptor.Identificacion.Tipo,
documentIssueDate: new Date(electronillBillRaw.FechaEmision),
activityCode: electronillBillRaw.CodigoActividad,
taxCondition: electronillBillRaw.CondicionVenta,
totalTaxes: electronillBillRaw.ResumenFactura.TotalImpuesto,
totalSale: electronillBillRaw.ResumenFactura.TotalVenta,
branch: '01',
terminal: '01',
consecutive: '01',
token: 'fake-token',
signatureOptions: {
buffer: fakePem,
password: fakePassword
}
})
expect(command.data).toMatchObject({
clave: '50601042400020692014200100001010000000002100000001',
fecha: '2024-04-01T00:00:00.000Z',
emisor: { tipoIdentificacion: electronillBillRaw.Emisor.Identificacion.Tipo, numeroIdentificacion: electronillBillRaw.Emisor.Identificacion.Numero },
receptor: { tipoIdentificacion: electronillBillRaw.Receptor.Identificacion.Tipo, numeroIdentificacion: electronillBillRaw.Receptor.Identificacion.Numero }
});
});
})
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@facturacr/atv-sdk",
"version": "1.2.5",
"version": "1.2.6",
"description": "Librería (SDK) de Javascript/NodeJS para acceder al API de Administración Tributaria Virtual (ATV) del Ministerio de Hacienda.",
"main": "dist/src/index.js",
"types": "dist/src/index.d.ts",
Expand Down
28 changes: 16 additions & 12 deletions src/ATV/mappers/billDocToAtv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,28 @@ const mapOrderLinesToAtvFormat = (orderLines: OrderLine[]): DetalleServicio => {
return { LineaDetalle }
}

const parseAtvMoneyFormat = (amount: number) => {
return parseFloat(amount.toFixed(5))
}

const mapSummaryInvoice = (summaryInvoice: DomainDocument['summaryInvoice']): Resumen => {
return {
CodigoTipoMoneda: {
CodigoMoneda: summaryInvoice.currency.code,
TipoCambio: summaryInvoice.currency.exchangeRate
},
TotalServGravados: summaryInvoice.totalEncumberedServices,
TotalServExentos: summaryInvoice.totalExemptServices,
TotalMercanciasGravadas: summaryInvoice.totalEncumberedMerchandise,
TotalMercanciasExentas: summaryInvoice.totalExemptMerchandise,
TotalGravado: summaryInvoice.totalEncumbered,
TotalExento: summaryInvoice.totalExempt,
TotalExonerado: summaryInvoice.totalExonerated,
TotalVenta: summaryInvoice.totalSale,
TotalDescuentos: summaryInvoice.totalDiscounts,
TotalVentaNeta: summaryInvoice.totalNetSale,
TotalImpuesto: summaryInvoice.totalTaxes,
TotalComprobante: summaryInvoice.totalVoucher
TotalServGravados: parseAtvMoneyFormat(summaryInvoice.totalEncumberedServices),
TotalServExentos: parseAtvMoneyFormat(summaryInvoice.totalExemptServices),
TotalMercanciasGravadas: parseAtvMoneyFormat(summaryInvoice.totalEncumberedMerchandise),
TotalMercanciasExentas: parseAtvMoneyFormat(summaryInvoice.totalExemptMerchandise),
TotalGravado: parseAtvMoneyFormat(summaryInvoice.totalEncumbered),
TotalExento: parseAtvMoneyFormat(summaryInvoice.totalExempt),
TotalExonerado: parseAtvMoneyFormat(summaryInvoice.totalExonerated),
TotalVenta: parseAtvMoneyFormat(summaryInvoice.totalSale),
TotalDescuentos: parseAtvMoneyFormat(summaryInvoice.totalDiscounts),
TotalVentaNeta: parseAtvMoneyFormat(summaryInvoice.totalNetSale),
TotalImpuesto: parseAtvMoneyFormat(summaryInvoice.totalTaxes),
TotalComprobante: parseAtvMoneyFormat(summaryInvoice.totalVoucher)
}
}

Expand Down
10 changes: 5 additions & 5 deletions src/lib/genXML/xmlConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,31 @@ const COMMON_STRUCTURE = {
const FE_XML_ATTRS = { // Factura Electronica
xmlns: FE_XML_SCHEMA_NS,
...COMMON_STRUCTURE,
'xsi:schemaLocation': `${FE_XML_SCHEMA_NS} ${FE_XML_SCHEMA_XSI}`
// 'xsi:schemaLocation': `${FE_XML_SCHEMA_NS} ${FE_XML_SCHEMA_XSI}`
}

const FEE_XML_ATTRS = { // Factura Electronica Exportación
xmlns: FE_XML_SCHEMA_NS,
...COMMON_STRUCTURE,
'xsi:schemaLocation': `${FEE_XML_SCHEMA_NS} ${FEE_XML_SCHEMA_XSI}`
// 'xsi:schemaLocation': `${FEE_XML_SCHEMA_NS} ${FEE_XML_SCHEMA_XSI}`
}

const NC_XML_ATTRS = { // Nota Credito Electronica
xmlns: NC_XML_SCHEMA_NS,
...COMMON_STRUCTURE,
'xsi:schemaLocation': `${NC_XML_SCHEMA_NS} ${NC_XML_SCHEMA_XSI}`
// 'xsi:schemaLocation': `${NC_XML_SCHEMA_NS} ${NC_XML_SCHEMA_XSI}`
}

const ND_XML_ATTRS = { // Nota Credito Electronica
xmlns: NC_XML_SCHEMA_NS,
...COMMON_STRUCTURE,
'xsi:schemaLocation': `${ND_XML_SCHEMA_NS} ${ND_XML_SCHEMA_XSI}`
// 'xsi:schemaLocation': `${ND_XML_SCHEMA_NS} ${ND_XML_SCHEMA_XSI}`
}

const MR_XML_ATTRS = { // Mensaje Receptor
xmlns: MR_XML_SCHEMA_NS,
...COMMON_STRUCTURE,
'xsi:schemaLocation': `${MR_XML_SCHEMA_NS}`
// 'xsi:schemaLocation': `${MR_XML_SCHEMA_NS}`
}

export const xmlExtructures = {
Expand Down

0 comments on commit ca5afd4

Please sign in to comment.