fio-api-handler
Version:
Unofficial handler for Fio Bank API
414 lines (337 loc) • 12.3 kB
JavaScript
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 };