UNPKG

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
"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); }); }); } };