UNPKG

fio-api-handler

Version:
414 lines (337 loc) 12.3 kB
import _defineProperty from '@babel/runtime/helpers/defineProperty'; import { Api, DefaultResponseProcessor } from 'rest-api-handler'; import { DateTime } from 'luxon'; class FioApiException extends Error { /** * Response from server that throwed an error. */ /** * Constructor. * * @param response - Processed response from server. */ constructor(response) { super(`Fio exception: ${JSON.stringify(response.data)}`); _defineProperty(this, "response", void 0); this.response = response; } getResponse() { return this.response; } getRequest() { return this.response.request; } } class FioApi extends Api { constructor(apiKey, format = 'json') { super('https://www.fio.cz/ib_api/rest', [new DefaultResponseProcessor(FioApiException)]); _defineProperty(this, "apiKey", void 0); _defineProperty(this, "format", void 0); _defineProperty(this, "dateFormat", 'yyyy-MM-dd'); this.apiKey = apiKey; this.format = format; } getTransactionOverview(year, overviewNumber) { return this.get(this.getTransactionsApiUrl('by-id', `${year}/${overviewNumber}`)); } getTransactions(start, end) { return this.get(this.getTransactionsApiUrl('periods', `${start.toFormat(this.dateFormat)}/${end.toFormat(this.dateFormat)}`)); } getLastTransactions() { return this.get(this.getTransactionsApiUrl('last')); } setLastTransactionById(id) { return this.get(this.getLastTransactionSetApiUrl('id', id.toString())); } setLastTransactionBydate(date) { return this.get(this.getLastTransactionSetApiUrl('date', date.toFormat(this.dateFormat))); } getApiUrl(action, namespace, format = this.format) { return `${action}/${this.apiKey}/${namespace}${format ? `.${format}` : '/'}`; } getTransactionsApiUrl(action, namespace) { return this.getApiUrl(action, `${namespace ? `/${namespace}/` : ''}transactions`); } getLastTransactionSetApiUrl(action, value) { return this.getApiUrl(`set-last-${action}`, value, undefined); } } 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; } class Info { constructor(source) { _defineProperty(this, "data", void 0); _defineProperty(this, "source", void 0); const dateFormat = 'yyyy-MM-ddZZZ'; this.source = source; // $FlowFixMe this.data = _objectSpread(_objectSpread({}, source), {}, { accountId: Number(source.accountId), bankId: Number(source.bankId), dateStart: DateTime.fromFormat(source.dateStart, dateFormat), dateEnd: DateTime.fromFormat(source.dateEnd, dateFormat) }); } getAccountId() { return this.data.accountId; } getBankId() { return this.data.bankId; } getCurrency() { return this.data.currency; } getIban() { return this.data.iban; } getBic() { return this.data.bic; } getOpeningBalance() { return this.data.openingBalance; } getClosingBalance() { return this.data.closingBalance; } getStart() { return this.data.dateStart; } getEnd() { return this.data.dateEnd; } getYearList() { return this.data.yearList; } getIdList() { return this.data.idList; } getIdFrom() { return this.data.idFrom; } getIdTo() { return this.data.idTo; } getIdLastDownload() { return this.data.idLastDownload; } getData() { return this.data; } getSource() { return this.source; } } const PRIJEM_PREVODEM_UVNITR_BANKY = 'Příjem převodem uvnitř banky'; const PLATBA_PREVODEM_UVNITR_BANKY = 'Platba převodem uvnitř banky'; const POPLATEK = 'Poplatek'; const VKLAD_POKLADNOU = 'Vklad pokladnou'; const EVIDOVANY_POPLATEK = 'Evidovaný poplatek'; const VYBER_POKLADNOU = 'Výběr pokladnou'; const PREVOD_MEZI_BANKOVNIMI_KONTY_PLATBA = 'Převod mezi bankovními konty (platba)'; const VKLAD_V_HOTOVOSTI = 'Vklad v hotovosti'; const PREVOD_MEZI_BANKOVNIMI_KONTY_PRIJEM = 'Převod mezi bankovními konty (příjem)'; const VYBER_V_HOTOVOSTI = 'Výběr v hotovosti'; const NEIDENTIFIKOVANA_PLATBA_Z_BANKOVNIHO_KONTA = 'Neidentifikovaná platba z bankovního konta'; const PLATBA = 'Platba'; const NEIDENTIFIKOVANY_PRIJEM_NA_BANKOVNI_KONTO = 'Neidentifikovaný příjem na bankovní konto'; const PRIJEM = 'Příjem'; const VLASTNI_PLATBA_Z_BANKOVNIHO_KONTA = 'Vlastní platba z bankovního konta'; const VLASTNI_PRIJEM_NA_BANKOVNI_KONTO = 'Vlastní příjem na bankovní konto'; const BEZHOTOVOSTNI_PRIJEM = 'Bezhotovostní příjem'; const VLASTNI_PLATBA_POKLADNOU = 'Vlastní platba pokladnou'; const PLATBA_KARTOU = 'Platba kartou'; const VLASTNI_PRIJEM_POKLADNOU = 'Vlastní příjem pokladnou'; const BEZHOTOVOSTNI_PLATBA = 'Bezhotovostní platba'; const OPRAVNY_POHYB = 'Opravný pohyb'; const UROK_Z_UVERU = 'Úrok z úvěru'; const PRIJATY_POPLATEK = 'Přijatý poplatek'; const SANKCNI_POPLATEK = 'Sankční poplatek'; const PLATBA_V_JINE_MENE = 'Platba v jiné měně'; const POSEL_PREDANI = 'Posel - předání'; const POPLATEK_PLATEBNI_KARTA = 'Poplatek - platební karta'; const POSEL_PRIJEM = 'Posel - příjem'; const INKASO = 'Inkaso'; const PREVOD_UVNITR_KONTA = 'Převod uvnitř konta'; const INKASO_VE_PROSPECH_UCTU = 'Inkaso ve prospěch účtu'; const PRIPSANY_UROK = 'Připsaný úrok'; const INKASO_Z_UCTU = 'Inkaso z účtu'; const VYPLACENY_UROK = 'Vyplacený úrok'; const PRIJEM_INKASA_Z_CIZI_BANKY = 'Příjem inkasa z cizí banky'; const ODVOD_DANE_Z_UROKU = 'Odvod daně z úroků'; const EVIDOVANY_UROK = 'Evidovaný úrok'; var transactionTypes = { __proto__: null, PRIJEM_PREVODEM_UVNITR_BANKY: PRIJEM_PREVODEM_UVNITR_BANKY, PLATBA_PREVODEM_UVNITR_BANKY: PLATBA_PREVODEM_UVNITR_BANKY, POPLATEK: POPLATEK, VKLAD_POKLADNOU: VKLAD_POKLADNOU, EVIDOVANY_POPLATEK: EVIDOVANY_POPLATEK, VYBER_POKLADNOU: VYBER_POKLADNOU, PREVOD_MEZI_BANKOVNIMI_KONTY_PLATBA: PREVOD_MEZI_BANKOVNIMI_KONTY_PLATBA, VKLAD_V_HOTOVOSTI: VKLAD_V_HOTOVOSTI, PREVOD_MEZI_BANKOVNIMI_KONTY_PRIJEM: PREVOD_MEZI_BANKOVNIMI_KONTY_PRIJEM, VYBER_V_HOTOVOSTI: VYBER_V_HOTOVOSTI, NEIDENTIFIKOVANA_PLATBA_Z_BANKOVNIHO_KONTA: NEIDENTIFIKOVANA_PLATBA_Z_BANKOVNIHO_KONTA, PLATBA: PLATBA, NEIDENTIFIKOVANY_PRIJEM_NA_BANKOVNI_KONTO: NEIDENTIFIKOVANY_PRIJEM_NA_BANKOVNI_KONTO, PRIJEM: PRIJEM, VLASTNI_PLATBA_Z_BANKOVNIHO_KONTA: VLASTNI_PLATBA_Z_BANKOVNIHO_KONTA, VLASTNI_PRIJEM_NA_BANKOVNI_KONTO: VLASTNI_PRIJEM_NA_BANKOVNI_KONTO, BEZHOTOVOSTNI_PRIJEM: BEZHOTOVOSTNI_PRIJEM, VLASTNI_PLATBA_POKLADNOU: VLASTNI_PLATBA_POKLADNOU, PLATBA_KARTOU: PLATBA_KARTOU, VLASTNI_PRIJEM_POKLADNOU: VLASTNI_PRIJEM_POKLADNOU, BEZHOTOVOSTNI_PLATBA: BEZHOTOVOSTNI_PLATBA, OPRAVNY_POHYB: OPRAVNY_POHYB, UROK_Z_UVERU: UROK_Z_UVERU, PRIJATY_POPLATEK: PRIJATY_POPLATEK, SANKCNI_POPLATEK: SANKCNI_POPLATEK, PLATBA_V_JINE_MENE: PLATBA_V_JINE_MENE, POSEL_PREDANI: POSEL_PREDANI, POPLATEK_PLATEBNI_KARTA: POPLATEK_PLATEBNI_KARTA, POSEL_PRIJEM: POSEL_PRIJEM, INKASO: INKASO, PREVOD_UVNITR_KONTA: PREVOD_UVNITR_KONTA, INKASO_VE_PROSPECH_UCTU: INKASO_VE_PROSPECH_UCTU, PRIPSANY_UROK: PRIPSANY_UROK, INKASO_Z_UCTU: INKASO_Z_UCTU, VYPLACENY_UROK: VYPLACENY_UROK, PRIJEM_INKASA_Z_CIZI_BANKY: PRIJEM_INKASA_Z_CIZI_BANKY, ODVOD_DANE_Z_UROKU: ODVOD_DANE_Z_UROKU, EVIDOVANY_UROK: EVIDOVANY_UROK }; class Transaction { // eslint-disable-next-line complexity,sonarjs/cognitive-complexity constructor(source) { _defineProperty(this, "data", void 0); _defineProperty(this, "source", void 0); this.source = source; const comment = source.column25 ? source.column25.value : null; const type = source.column8.value; const issueDate = DateTime.fromFormat(source.column0.value, 'yyyy-MM-ddZZZ'); const createdDate = type === PLATBA_KARTOU && comment ? DateTime.fromFormat(comment.split(/dne (\d*\.\d*\.\d{4})/g)[1], 'd.M.yyyy') : issueDate; const amount = source.column1.value; const currency = source.column14.value; const message = source.column16 ? source.column16.value : null; this.data = { issueDate, createdDate, type, comment, transactionId: source.column22.value, approvalId: source.column17.value, amount, originalAmount: amount, currency, originalCurrency: currency, message, vs: source.column5 ? source.column5.value : null, ks: source.column4 ? source.column4.value : null, ss: source.column6 ? source.column6.value : null, info: source.column7 ? source.column7.value : null, author: source.column9 ? source.column9.value : null, sendToAccountNumber: source.column2 ? source.column2.value : null, sendToAccountName: source.column10 ? source.column10.value : null, sendToBankCode: source.column3 ? source.column3.value : null, sendToBank: source.column12 ? source.column12.value : null }; if (type === PLATBA_KARTOU && message) { const [// eslint-disable-next-line no-unused-vars text, originalAmount, originalCurrency] = message.match(/částka {2}(\d*\.\d{2}) (([a-zA-Z]|\u010D){2,3})/); this.data.originalAmount = Number(originalAmount) * (amount / Math.abs(amount)); this.data.originalCurrency = originalCurrency === 'Kč' ? 'CZK' : originalCurrency; } } getIssueDate() { return this.data.issueDate; } getCreatedDate() { return this.data.createdDate; } getTransactionId() { return this.data.transactionId; } getApprovalId() { return this.data.approvalId; } getAmount() { return this.data.amount; } getCurrency() { return this.data.currency; } getOriginalAmount() { return this.data.originalAmount; } getOriginalCurrency() { return this.data.originalCurrency; } getCounterpartyAccountNumber() { return this.data.sendToAccountNumber; } getCounterpartyAccountName() { return this.data.sendToAccountName; } getCounterpartyBankName() { return this.data.sendToBank; } getCounterpartyBankNumber() { return this.data.sendToBankCode; } getVs() { return this.data.vs; } getKs() { return this.data.ks; } getSs() { return this.data.ss; } getInfo() { return this.data.info; } getMessage() { return this.data.message; } getAuthor() { return this.data.author; } getData() { return this.data; } } class EnhacedFioApi extends FioApi { // eslint-disable-next-line no-useless-constructor constructor(key) { super(key); } processTransactionResponse(data) { const { accountStatement } = data; return { info: new Info(accountStatement.info), transactions: accountStatement.transactionList.transaction.map(transaction => { return new Transaction(transaction); }) }; } async getTransactions(start, end) { const { data } = await FioApi.prototype.getTransactions.call(this, start, end); return this.processTransactionResponse(data); } async getLastTransactions() { const { data } = await FioApi.prototype.getLastTransactions.call(this); return this.processTransactionResponse(data); } async getTransactionOverview(year, overviewNumber) { const { data } = await FioApi.prototype.getTransactionOverview.call(this, year, overviewNumber); return this.processTransactionResponse(data); } } export { EnhacedFioApi, FioApi, transactionTypes as TRANSACTION_TYPES };