fecr
Version:
Modulo de comprobantes electrónicos para el API del Ministerio de Hacienda de Costa Rica versión 4.3
583 lines (493 loc) • 15.9 kB
JavaScript
"use strict";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var xml2js = require("xml2js");
var Invoice = require("./invoice.js");
var DebitNote = require("./debitNote.js");
var CreditNote = require("./creditNote.js");
var Purchase = require("./purchase.js");
var Ticket = require("./ticket.js");
var TicketRS = require("./ticketRS.js");
var Proforma = require("./proforma.js");
var Message = require("./message.js");
var Issuer = require("./voucher/issuer.js");
var Item = require("./voucher/item.js");
var Others = require("./voucher/others.js");
var Receiver = require("./voucher/receiver.js");
var Reference = require("./voucher/reference.js");
var Tax = require("./voucher/tax.js");
var Allowance = require("./voucher/allowance.js");
var Api = require("./api.js");
var utils = require("./utils.js");
var ExportVoucher = require("./exportVoucher.js");
var OtherCharges = require("./voucher/otherCharges.js");
module.exports = {
issueVoucher(obj) {
return new Promise((resolve, reject) => {
var issuer = new Issuer(obj.issuer);
var items = [];
obj.items.forEach((item, index) => {
var line = {};
line.number = index + 1;
if (item.hsCode) {
line.hsCode = item.hsCode;
}
if (item.code) {
line.code = item.code;
}
if (item.commercialCode) {
line.typeCommercialCode = item.typeCommercialCode ? item.typeCommercialCode : "04";
line.commercialCode = item.commercialCode;
}
line.quantity = item.quantity;
line.unit = item.unit;
if (item.commercialUnit) {
line.commercialUnit = item.commercialUnit;
}
line.description = item.description;
line.unitPrice = utils.round10(item.unitPrice, -5);
line.total = utils.round10(line.unitPrice * line.quantity, -5);
var discount = 0;
if (item.discounts) {
line.discounts = [];
item.discounts.forEach((_ref) => {
var {
discountAmount,
discountReason
} = _ref;
discount += utils.round10(discountAmount, -5);
line.discounts.push({
discountAmount: utils.round10(discountAmount, -5),
discountReason
});
});
}
line.subtotal = discount > 0 ? utils.round10(line.total - discount, -5) : line.total;
line.taxBase = line.taxBase ? utils.round10(item.taxBase, -5) : line.subtotal;
var taxNet = 0;
if (item.taxes) {
var taxes = [];
item.taxes.forEach(tax => {
var {
rateCode
} = tax;
var {
allowance
} = tax;
var taxFactor = 0;
var taxTotal = 0;
var newTax = {};
var rate = 0;
if (tax.code === "01" || tax.code === "07") {
switch (rateCode) {
case "01":
rate = 0;
break;
case "02":
rate = 1;
break;
case "03":
rate = 2;
break;
case "04":
rate = 4;
break;
case "05":
rate = 0;
break;
case "06":
rate = 4;
break;
case "07":
rate = 8;
break;
case "08":
rate = 13;
break;
default:
rateCode = "08";
rate = 13;
break;
}
} else {
rate = tax.rate;
}
taxFactor = rate / 100;
taxTotal = utils.round10(line.taxBase * taxFactor, -5);
newTax.code = tax.code;
if (rateCode) {
newTax.rateCode = rateCode;
}
newTax.rate = rate;
newTax.taxFactor = taxFactor;
newTax.total = taxTotal;
if (allowance) {
var amount = utils.round10(line.taxBase * (Number(allowance.percentage) / 100), -5);
newTax.allowance = new Allowance(_objectSpread({}, allowance, {
amount
}));
taxTotal -= amount;
}
taxNet = utils.round10(taxNet + taxTotal, -5);
taxes.push(new Tax(newTax));
});
line.taxes = taxes;
}
line.taxNet = utils.round10(taxNet, -5);
line.netTotal = utils.round10(line.taxNet + line.subtotal, -5);
items.push(new Item(line));
});
var data = {};
data.activityCode = obj.activityCode;
data.api = obj.api ? new Api(obj.api) : null;
data.cert = obj.cert ? obj.cert : null;
if (obj.condition) {
data.condition = obj.condition;
}
if (obj.creditTerm) {
data.creditTerm = obj.creditTerm;
}
if (obj.headquarters) {
data.headquarters = obj.headquarters;
}
data.issuer = issuer;
data.items = items;
if (obj.otherCharges) {
var otherCharges = [];
obj.otherCharges.forEach(charge => {
otherCharges.push(new OtherCharges(charge));
});
data.otherCharges = otherCharges;
}
if (obj.others) {
data.others = new Others({
text: obj.others
});
}
data.number = obj.number;
if (obj.paymentType) {
data.paymentType = obj.paymentType;
}
if (obj.receiver) {
data.receiver = new Receiver(obj.receiver);
}
if (obj.references) {
var references = [];
obj.references.forEach(reference => {
references.push(new Reference(reference));
});
data.references = references;
}
data.securityCode = obj.securityCode ? obj.securityCode : utils.zfill(Math.floor(Math.random() * 100000000), 9);
if (obj.situation) {
data.situation = obj.situation;
}
if (obj.terminal) {
data.terminal = obj.terminal;
}
if (obj.currency) {
data.currency = obj.currency;
}
if (obj.exchangeRate) {
data.exchangeRate = obj.exchangeRate;
}
if (obj.callbackUrl) {
data.callbackUrl = obj.callbackUrl;
}
var voucher;
switch (obj.type) {
case "FE":
voucher = new Invoice(data);
break;
case "ND":
voucher = new DebitNote(data);
break;
case "NC":
voucher = new CreditNote(data);
break;
case "TE":
voucher = new Ticket(data);
break;
case "FEC":
voucher = new Purchase(data);
break;
case "FEE":
voucher = new ExportVoucher(data);
break;
case "TRS":
voucher = new TicketRS(data);
break;
case "FP":
voucher = new Proforma(data);
break;
default:
voucher = new Invoice(data);
break;
}
voucher.send().then(dataVoucher => {
resolve(dataVoucher);
}).catch(error => {
reject(error);
});
});
},
issueMessage(obj) {
return new Promise((resolve, reject) => {
var message = new Message({
cert: obj.cert,
api: obj.api,
key: obj.key,
issuerIdType: obj.issuerIdType,
issuerIdNumber: obj.issuerIdNumber,
receiverIdType: obj.receiverIdType,
receiverIdNumber: obj.receiverIdNumber,
message: obj.message,
details: obj.details,
economicActivity: obj.economicActivity,
taxCondition: obj.taxCondition,
totalAmountTaxCredit: obj.totalAmountTaxCredit,
totalAmountApplicable: obj.totalAmountApplicable,
tax: obj.tax,
total: obj.total,
number: obj.number,
headquarters: obj.headquarters,
terminal: obj.terminal
});
message.send().then(messageData => {
resolve(messageData);
}).catch(error => {
reject(error);
});
});
},
issueMessageFromXML(obj) {
return new Promise((resolve, reject) => {
var {
xml,
base64,
cert,
api,
message,
details,
taxCondition,
number,
headquarters,
terminal
} = obj;
var stringXml = base64 ? Buffer.from(xml, "base64").toString("utf8") : xml;
xml2js.parseStringPromise(stringXml).then(result => {
var data = utils.parseVouchers(result);
var msj = {
key: data.key,
issuerIdType: data.issuer.type,
issuerIdNumber: data.issuer.identification,
receiverIdType: data.receiver.type,
receiverIdNumber: data.receiver.identification,
message,
details,
economicActivity: data.activityCode,
taxCondition: taxCondition || "01",
tax: data.summary.taxTotal,
total: data.summary.netTotal,
number,
headquarters,
terminal,
cert,
api
};
return this.issueMessage(msj);
}).then(messageData => {
resolve(messageData);
}).catch(error => {
reject(error);
});
});
},
issueDebitFromXML(obj) {
return new Promise((resolve, reject) => {
var {
xml,
base64,
reason,
number,
headquarters,
terminal,
cert,
api,
securityCode,
situation
} = obj;
var stringXml = base64 ? Buffer.from(base64, "base64").toString("utf8") : xml;
xml2js.parseStringPromise(stringXml).then(result => {
var data = utils.parseVouchers(result);
var debitNote = {
type: "ND",
number,
terminal,
headquarters,
situation,
condition: data.condition,
creditTerm: data.creditTerm,
paymentType: data.paymentType,
activityCode: data.activityCode,
securityCode,
cert,
api
};
debitNote.issuer = {
name: data.issuer.name,
idType: data.issuer.type,
id: data.issuer.identification,
location: {
province: data.issuer.location.province,
county: data.issuer.location.county,
district: data.issuer.location.district,
others: data.issuer.location.others
},
phone: data.phone,
email: data.email
};
if (data.receiver) {
debitNote.receiver = {
name: data.receiver.name,
idType: data.receiver.type,
id: data.receiver.identification
};
}
debitNote.items = [];
data.items.forEach(item => {
var tmpItem = {
commercialCode: item,
quantity: item,
unit: item,
description: item,
unitPrice: item
};
if (item.discount) {
tmpItem.discount = item.discount;
tmpItem.discountReason = item.discountReason;
}
if (item.taxes) {
var taxes = [];
item.taxes.forEach(tax => {
taxes.push({
code: tax.code,
rateCode: tax.rateCode,
rate: tax.rate
});
});
tmpItem.taxes = taxes;
}
debitNote.items.push(tmpItem);
});
debitNote.references = data.references ? data.references : [];
debitNote.references.push({
documentType: data.documentType,
number: data.key,
date: data.date,
code: "01",
reason: reason || "Error en los montos"
});
return this.issueVoucher(debitNote);
}).then(voucher => {
resolve(voucher);
}).catch(error => {
reject(error);
});
});
},
issueCreditFromXML(obj) {
return new Promise((resolve, reject) => {
var {
xml,
base64,
reason,
number,
headquarters,
terminal,
cert,
api,
securityCode,
situation
} = obj;
var stringXml = base64 ? Buffer.from(base64, "base64").toString("utf8") : xml;
xml2js.parseStringPromise(stringXml).then(result => {
var data = utils.parseVouchers(result);
var debitNote = {
type: "NC",
number,
terminal,
headquarters,
situation,
condition: data.condition,
creditTerm: data.creditTerm,
paymentType: data.paymentType,
activityCode: data.activityCode,
securityCode,
cert,
api
};
debitNote.issuer = {
name: data.issuer.name,
idType: data.issuer.type,
id: data.issuer.identification,
location: {
province: data.issuer.location.province,
county: data.issuer.location.county,
district: data.issuer.location.district,
others: data.issuer.location.others
},
phone: data.phone,
email: data.email
};
if (data.receiver) {
debitNote.receiver = {
name: data.receiver.name,
idType: data.receiver.type,
id: data.receiver.identification
};
}
debitNote.items = [];
data.items.forEach(item => {
var tmpItem = {
commercialCode: item,
quantity: item,
unit: item,
description: item,
unitPrice: item
};
if (item.discount) {
tmpItem.discount = item.discount;
tmpItem.discountReason = item.discountReason;
}
if (item.taxes) {
var taxes = [];
item.taxes.forEach(tax => {
taxes.push({
code: tax.code,
rateCode: tax.rateCode,
rate: tax.rate
});
});
tmpItem.taxes = taxes;
}
debitNote.items.push(tmpItem);
});
debitNote.references = data.references ? data.references : [];
debitNote.references.push({
documentType: data.documentType,
number: data.key,
date: data.date,
code: "01",
reason: reason || "Error en los montos"
});
return this.issueVoucher(debitNote);
}).then(voucher => {
resolve(voucher);
}).catch(error => {
reject(error);
});
});
}
};