fecr
Version:
Modulo de comprobantes electrónicos para el API del Ministerio de Hacienda de Costa Rica versión 4.3
187 lines (159 loc) • 5.12 kB
JavaScript
"use strict";
var xml2js = require("xml2js");
var moment = require("moment");
var utils = require("./utils.js");
var signer = require("./signer.js");
class Message {
constructor(message) {
this.cert = message.cert;
this.api = message.api;
this.key = message.key;
this.date = moment();
this.issuerIdType = message.issuerIdType;
this.issuerIdNumber = message.issuerIdNumber;
this.receiverIdType = message.receiverIdType;
this.receiverIdNumber = message.receiverIdNumber;
this.message = message.message;
this.details = message.details;
this.economicActivity = message.economicActivity;
this.taxCondition = message.taxCondition;
this.totalAmountTaxCredit = message.totalAmountTaxCredit;
this.totalAmountApplicable = message.totalAmountApplicable;
this.tax = message.tax;
this.total = message.total;
this.number = message.number;
this.headquarters = message.headquarters ? message.headquarters : 1;
this.terminal = message.terminal ? message.terminal : 1;
if (message.sequence) {
this.sequence = message.sequence;
} else {
this.generateSequence();
}
this.rootTag = "MensajeReceptor";
this.namespaces = {
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
"xmlns": "https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/mensajeReceptor"
};
}
buildXml() {
var message = {
[this.rootTag]: {
$: this.namespaces
}
};
message[this.rootTag].Clave = this.key;
message[this.rootTag].NumeroCedulaEmisor = this.issuerIdNumber;
message[this.rootTag].FechaEmisionDoc = this.date.format();
message[this.rootTag].Mensaje = this.message;
if (this.details) {
message[this.rootTag].DetalleMensaje = this.details;
}
if (this.tax) {
message[this.rootTag].MontoTotalImpuesto = this.tax;
}
if (this.economicActivity) {
message[this.rootTag].CodigoActividad = this.economicActivity;
}
if (this.taxCondition) {
message[this.rootTag].CondicionImpuesto = this.taxCondition;
}
if (this.totalAmountTaxCredit) {
// eslint-disable-next-line max-len
message[this.rootTag].MontoTotalImpuestoAcreditar = this.totalAmountTaxCredit;
}
if (this.totalAmountApplicable) {
// eslint-disable-next-line max-len
message[this.rootTag].MontoTotalDeGastoAplicable = this.totalAmountApplicable;
}
message[this.rootTag].TotalFactura = this.total;
message[this.rootTag].NumeroCedulaReceptor = this.receiverIdNumber;
message[this.rootTag].NumeroConsecutivoReceptor = this.sequence;
var builder = new xml2js.Builder();
var xmlString = builder.buildObject(message);
this.data = message;
return xmlString.replace(/[\r\n]/g, "").replace(/\s{2,}/g, "");
}
generateSequence() {
var messageType;
switch (this.message) {
case 1:
messageType = 5;
break;
case 2:
messageType = 6;
break;
case 3:
messageType = 7;
break;
default:
messageType = 5;
break;
}
var headquarters = utils.zfill(this.headquarters, 3);
var terminal = utils.zfill(this.terminal, 5);
var type = utils.zfill(messageType, 2);
var number = utils.zfill(this.number, 10);
this.sequence = headquarters + terminal + type + number;
}
sign() {
return new Promise((resolve, reject) => {
signer.signXmlString(this.buildXml(), this.cert).then(signedXml => {
this.signedXml = signedXml;
this.signedXmlBase64 = Buffer.from(signedXml).toString("base64");
resolve(signedXml);
}).catch(error => {
reject(error);
});
});
}
getPayload() {
if (!this.signedXmlBase64) {
throw new Error("the document has not been signed yet");
}
var payload = {
clave: this.key,
fecha: this.date.format(),
emisor: {
tipoIdentificacion: this.issuerIdType,
numeroIdentificacion: this.issuerIdNumber
},
receptor: {
tipoIdentificacion: this.receiverIdType,
numeroIdentificacion: this.receiverIdNumber
},
consecutivoReceptor: this.sequence
};
payload.comprobanteXml = this.signedXmlBase64;
return payload;
}
/* send() {
return new Promise((resolve, reject) => {
this.sign()
.then(() => this.api.send(this.getPayload()))
.then(() => {
resolve({ data: this.data, xml: this.signedXmlBase64 });
})
.catch((error) => {
reject(error);
});
});
} /* */
send() {
return new Promise(resolve => {
this.signedXmlBase64 = Buffer.from(this.buildXml()).toString("base64");
resolve({
data: this.data,
xml: this.signedXmlBase64
});
/* this.sign()
.then(() => {
resolve({ data: this.data, xml: this.signedXmlBase64 });
})
.catch((error) => {
reject(error);
});/* */
});
}
}
module.exports = Message;