aade-mydata-client
Version:
Node.js Client for AADE myDATA (my Digital Accounting and Tax Application) REST API
304 lines (303 loc) • 17.7 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AADEmyDataClient = void 0;
var models_1 = require("./models");
var axios_1 = __importDefault(require("axios"));
var xmlJS = __importStar(require("xml-js"));
// tslint:disable:variable-name
var Jsonix = require('jsonix');
var requestDocMapping = require('./xsd/mappings/requestDoc.js').requestDoc;
var expensesClassificationMapping = require('./xsd/mappings/expensesClassification.js').expensesClassification;
var incomeClassificationMapping = require('./xsd/mappings/incomeClassification.js').incomeClassification;
var invoicesDocMapping = require('./xsd/mappings/InvoicesDoc.js').InvoicesDoc;
var requestedInvoicesDocMapping = require('./xsd/mappings/requestedInvoicesDoc.js').requestedInvoicesDoc;
var requestedProviderDocMapping = require('./xsd/mappings/RequestedProviderDoc.js').RequestedProviderDoc;
var responseMapping = require('./xsd/mappings/response.js').response;
// tslint:enable:variable-name
var AADEmyDataClient = /** @class */ (function () {
function AADEmyDataClient(config) {
this.myDataURLdev = 'https://mydata-dev.azure-api.net';
this.myDataURLproduction = 'https://mydatapi.aade.gr/myDATA'; // 'https://mydata-prod-apim.azure-api.net/myDATA';
this.myDataApiUrl = null; // for API calls
this.config = config;
this.myDataApiUrl = this.config.livemode ? this.myDataURLproduction : this.myDataURLdev;
this.requestHeaders = {
'aade-user-id': this.config.userId,
'Ocp-Apim-Subscription-Key': this.config.subscriptionKey,
'Content-Type': 'text/xml'
};
}
/**
* Διαδικασία υποβολής ενός ή περισσότερων παραστατικών, συμπεριλαμβανομένων και διορθωμένων/τροποποιητικών
*
* @param {AadeBookInvoiceType[]} invoices
* @returns {Promise<SubmissionResponse>}
* @memberof AADEmyDataClient
*/
AADEmyDataClient.prototype.sendInvoices = function (invoices) {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function () {
var jsonData, xml, response, context, unmarshaller, jsonResponse, submissionResponse, error_1;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3]);
invoices = this.setIncomeClassificationNameSpace(invoices); // set n1:xxx for IncomeClassification namespace
jsonData = {
_declaration: {
_attributes: {
version: '1.0',
encoding: 'utf-8',
}
},
InvoicesDoc: {
_attributes: {
'xmlns': 'http://www.aade.gr/myDATA/invoice/v1.0',
'xmlns:n1': 'https://www.aade.gr/myDATA/incomeClassificaton/v1.0',
'xmlns:n2': 'https://www.aade.gr/myDATA/expensesClassificaton/v1.0'
},
invoice: invoices.map(function (inv) { return inv; })
}
};
xml = xmlJS.js2xml(jsonData, { compact: true, spaces: '\t' });
xml = xml.split('n1:n1:').join('n1:');
xml = xml.split('n2:n2:').join('n2:');
return [4 /*yield*/, axios_1.default.post(this.myDataApiUrl + "/SendInvoices", xml, {
headers: __assign({}, this.requestHeaders)
})];
case 1:
response = _e.sent();
context = new Jsonix.Jsonix.Context([responseMapping]);
unmarshaller = context.createUnmarshaller();
jsonResponse = unmarshaller.unmarshalString(response.data);
submissionResponse = new models_1.SubmissionResponse();
if (((_b = (_a = jsonResponse === null || jsonResponse === void 0 ? void 0 : jsonResponse.value) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.length) > 0) {
if (((_d = (_c = jsonResponse.value.response[0].errors) === null || _c === void 0 ? void 0 : _c.error) === null || _d === void 0 ? void 0 : _d.length) > 0) {
jsonResponse.value.response[0].errors = jsonResponse.value.response[0].errors.error;
submissionResponse = new models_1.SubmissionResponse(jsonResponse.value.response[0]);
return [2 /*return*/, Promise.reject(jsonResponse.value.response[0])];
}
submissionResponse = new models_1.SubmissionResponse(jsonResponse.value.response[0]);
return [2 /*return*/, Promise.resolve(submissionResponse)];
}
return [2 /*return*/, Promise.resolve(submissionResponse)];
case 2:
error_1 = _e.sent();
return [2 /*return*/, Promise.reject(error_1)];
case 3: return [2 /*return*/];
}
});
});
};
/**
* Η κλήση επιστρέφει όσα παραστατικά, χαρακτηρισμούς και ακυρώσεις παραστατικών έχουν υποβάλλει άλλοι χρήστες και αφορούν ως λήπτη την οντότητα που αντιστοιχεί στο όνομα χρήστη και subscription key, και αναγνωριστικό Μοναδικό Αριθμό Καταχώρησης μεγαλύτερο του mark.
*
* @param {RequestDocsParams} params
* @returns {Promise<Invoice[]>}
* @memberof AADEmyDataClient
*/
AADEmyDataClient.prototype.requestDocs = function (params) {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function () {
var response, context, unmarshaller, jsonData, error_2;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3]);
return [4 /*yield*/, axios_1.default.get(this.myDataApiUrl + "/RequestDocs", {
params: params,
headers: __assign({}, this.requestHeaders)
})];
case 1:
response = _e.sent();
context = new Jsonix.Jsonix.Context([requestDocMapping]);
unmarshaller = context.createUnmarshaller();
jsonData = unmarshaller.unmarshalString(response.data);
if (((_c = (_b = (_a = jsonData === null || jsonData === void 0 ? void 0 : jsonData.value) === null || _a === void 0 ? void 0 : _a.invoicesDoc) === null || _b === void 0 ? void 0 : _b.invoice) === null || _c === void 0 ? void 0 : _c.length) > 0)
return [2 /*return*/, Promise.resolve(jsonData.value.invoicesDoc.invoice)];
return [2 /*return*/, Promise.resolve([])];
case 2:
error_2 = _e.sent();
return [2 /*return*/, Promise.reject(((_d = error_2 === null || error_2 === void 0 ? void 0 : error_2.response) === null || _d === void 0 ? void 0 : _d.data) || (error_2 === null || error_2 === void 0 ? void 0 : error_2.response) || error_2)];
case 3: return [2 /*return*/];
}
});
});
};
/**
* Διαδικασία λήψης ενός ή περισσότερων παραστατικών, χαρακτηρισμών, ή ακυρώσεων παραστατικών που έχει υποβάλλει ο χρήστης
*
* @returns {void}
* @memberof AADEmyDataClient
*/
AADEmyDataClient.prototype.requestTransmittedDocs = function () {
console.log('requestTransmittedDocs');
return;
};
/**
* Διαδικασία υποβολής χαρακτηρισμών εσόδων, ενός ή περισσότερων, που θα αντιστοιχούν σε ήδη υποβεβλημένα παραστατικά
*
* @returns {void}
* @memberof AADEmyDataClient
*/
AADEmyDataClient.prototype.sendIncomeClassification = function () {
console.log('TODO: sendIncomeClassification()');
return;
};
/**
* Διαδικασία υποβολής χαρακτηρισμών εξόδων, ενός ή περισσότερων, που θα αντιστοιχούν σε ήδη υποβεβλημένα παραστατικά
*
* @returns {void}
* @memberof AADEmyDataClient
*/
AADEmyDataClient.prototype.sendExpensesClassification = function () {
console.log('TODO: sendExpensesClassification()');
return;
};
/**
* Διαδικασία ακύρωσης παραστατικού, δίχως ταυτόχρονη υποβολή νέου
*
* @param {(string | number)} mark
* @returns {Promise<SubmissionResponse>}
* @memberof AADEmyDataClient
*/
AADEmyDataClient.prototype.cancelInvoice = function (mark) {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function () {
var response, context, unmarshaller, jsonResponse, submissionResponse, error_3;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 2, , 3]);
return [4 /*yield*/, axios_1.default.post(this.myDataApiUrl + "/CancelInvoice", {}, {
params: { mark: mark },
headers: __assign({}, this.requestHeaders),
})];
case 1:
response = _e.sent();
context = new Jsonix.Jsonix.Context([responseMapping]);
unmarshaller = context.createUnmarshaller();
jsonResponse = unmarshaller.unmarshalString(response.data);
submissionResponse = new models_1.SubmissionResponse();
if (((_b = (_a = jsonResponse === null || jsonResponse === void 0 ? void 0 : jsonResponse.value) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.length) > 0) {
if (((_d = (_c = jsonResponse.value.response[0].errors) === null || _c === void 0 ? void 0 : _c.error) === null || _d === void 0 ? void 0 : _d.length) > 0)
jsonResponse.value.response[0].errors = jsonResponse.value.response[0].errors.error;
submissionResponse = new models_1.SubmissionResponse(jsonResponse.value.response[0]);
return [2 /*return*/, Promise.resolve(submissionResponse)];
}
return [2 /*return*/, Promise.resolve(submissionResponse)];
case 2:
error_3 = _e.sent();
console.log(error_3);
return [2 /*return*/, Promise.reject(error_3)];
case 3: return [2 /*return*/];
}
});
});
};
// Utilities
AADEmyDataClient.prototype.setIncomeClassificationNameSpace = function (invoices) {
var _a;
for (var _i = 0, invoices_1 = invoices; _i < invoices_1.length; _i++) {
var invoice = invoices_1[_i];
// tslint:disable:forin
if (((_a = invoice === null || invoice === void 0 ? void 0 : invoice.invoiceDetails) === null || _a === void 0 ? void 0 : _a.length) > 0) {
var _loop_1 = function (row) {
Object.keys(row).forEach(function (key) {
if (key === 'incomeClassification')
for (var ic = 0; ic < row[key].length; ic++)
for (var icKey in row[key][ic]) {
row[key][ic]["n1:" + icKey] = row[key][ic][icKey];
delete row[key][ic][icKey];
}
});
};
for (var _b = 0, _c = invoice.invoiceDetails; _b < _c.length; _b++) {
var row = _c[_b];
_loop_1(row);
}
}
if (invoice === null || invoice === void 0 ? void 0 : invoice.invoiceSummary)
for (var key in invoice.invoiceSummary)
if (key === 'incomeClassification')
for (var ic = 0; ic < invoice.invoiceSummary[key].length; ic++)
for (var icKey in invoice.invoiceSummary[key][ic]) {
invoice.invoiceSummary[key][ic]["n1:" + icKey] = invoice.invoiceSummary[key][ic][icKey];
delete invoice.invoiceSummary[key][ic][icKey];
}
// tslint:enable:forin
}
return invoices;
};
return AADEmyDataClient;
}());
exports.AADEmyDataClient = AADEmyDataClient;