@angro/nav-connector
Version:
Node.js module which provides an interface for communicating with NAV online invoice service.
80 lines (68 loc) • 2.21 kB
JavaScript
const { pick } = require('lodash');
const createBaseRequest = require('./create-base-request.js');
const getExchangeToken = require('./get-exchange-token.js');
const sendRequest = require('./send-request.js');
/**
* Send request to NAV service to manage invoices.
* @async
* @param {Object} params Function params.
* @param {Object} params.invoiceOperations Request object for xml conversion and send.
* @param {Object} params.technicalUser Technical user’s data.
* @param {Object} params.softwareData Invoice software data.
* @param {Object} params.axios Axios instance.
* @returns {Promise<string>} Manage invoice operation transaction id.
*/
module.exports = async function manageInvoice({
invoiceOperations,
technicalUser,
softwareData,
axios,
}) {
const invoices = invoiceOperations.invoiceOperation.map(invoiceOperation => {
return {
data: invoiceOperation.invoiceData,
operation: invoiceOperation.invoiceOperation,
};
});
const request = createBaseRequest({
requestType: 'ManageInvoiceRequest',
technicalUser,
softwareData,
invoices,
});
request.ManageInvoiceRequest.exchangeToken = await getExchangeToken({
axios,
technicalUser,
softwareData,
});
/* Normalize request object key order. */
const normalizedInvoiceOperations = pick(invoiceOperations, [
'compressedContent',
'invoiceOperation',
]);
const { invoiceOperation } = normalizedInvoiceOperations;
normalizedInvoiceOperations.invoiceOperation = invoiceOperation.map(elem => {
const operation = {
index: elem.index,
invoiceOperation: elem.invoiceOperation,
invoiceData: elem.invoiceData,
};
//[3.0] add electronicInvoiceHash as optional property
if (elem.electronicInvoiceHash) {
operation.electronicInvoiceHash = {
$: {
cryptoType: 'SHA3-512',
},
_: elem.electronicInvoiceHash,
};
}
return operation;
});
request.ManageInvoiceRequest.invoiceOperations = normalizedInvoiceOperations;
const responseData = await sendRequest({
request,
axios,
path: '/manageInvoice',
});
return responseData.ManageInvoiceResponse.transactionId;
};