@ashray.mehta/statement-converter 1.4.3 → 1.4.4-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/dependabot.yml +7 -0
- package/.github/workflows/node.js.yml +28 -0
- package/.github/workflows/npm-publish.yml +35 -0
- package/.mocharc.json +5 -0
- package/README.md +1 -0
- package/package.json +8 -10
- package/src/StatementConverter.ts +32 -0
- package/src/adapters/ABNAdapter.ts +45 -0
- package/src/adapters/AxisAdapter.ts +42 -0
- package/src/adapters/ICICIAdapter.ts +50 -0
- package/src/adapters/ICICICreditCardAdapter.ts +50 -0
- package/src/adapters/MT940Adapter.ts +49 -0
- package/src/adapters/N26Adapter.ts +45 -0
- package/src/adapters/StandardCharteredAdapter.ts +46 -0
- package/src/adapters/TransactionAdapter.ts +8 -0
- package/src/adapters/TransactionsQifConverter.ts +28 -0
- package/src/helpers/NumberUtil.ts +27 -0
- package/src/helpers/XLSXUtil.ts +38 -0
- package/{index.d.ts → src/index.ts} +1 -1
- package/src/models/Bank.ts +9 -0
- package/{models/Transaction.d.ts → src/models/Transaction.ts} +1 -1
- package/test/AxisBankStatement.xls +0 -0
- package/test/ICICIBankStatement.xls +0 -0
- package/test/N26Statement.csv +29 -0
- package/test/NumberUtil.spec.js +32 -0
- package/test/StatementConverter.spec.js +34 -0
- package/tsconfig.json +17 -0
- package/StatementConverter.d.ts +0 -7
- package/StatementConverter.js +0 -45
- package/adapters/ABNAdapter.d.ts +0 -7
- package/adapters/ABNAdapter.js +0 -55
- package/adapters/AxisAdapter.d.ts +0 -7
- package/adapters/AxisAdapter.js +0 -53
- package/adapters/ICICIAdapter.d.ts +0 -8
- package/adapters/ICICIAdapter.js +0 -56
- package/adapters/ICICICreditCardAdapter.d.ts +0 -8
- package/adapters/ICICICreditCardAdapter.js +0 -56
- package/adapters/MT940Adapter.d.ts +0 -7
- package/adapters/MT940Adapter.js +0 -56
- package/adapters/N26Adapter.d.ts +0 -7
- package/adapters/N26Adapter.js +0 -56
- package/adapters/StandardCharteredAdapter.d.ts +0 -7
- package/adapters/StandardCharteredAdapter.js +0 -52
- package/adapters/TransactionAdapter.d.ts +0 -6
- package/adapters/TransactionAdapter.js +0 -6
- package/adapters/TransactionsQifConverter.d.ts +0 -5
- package/adapters/TransactionsQifConverter.js +0 -31
- package/helpers/NumberUtil.d.ts +0 -4
- package/helpers/NumberUtil.js +0 -28
- package/helpers/XLSXUtil.d.ts +0 -6
- package/helpers/XLSXUtil.js +0 -41
- package/index.js +0 -18
- package/models/Bank.d.ts +0 -9
- package/models/Bank.js +0 -13
- package/models/Transaction.js +0 -2
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const { expect } = require('chai');
|
|
2
|
+
const { NumberUtil } = require("../src/helpers/NumberUtil");
|
|
3
|
+
|
|
4
|
+
describe(NumberUtil.name, () => {
|
|
5
|
+
const util = new NumberUtil();
|
|
6
|
+
|
|
7
|
+
it("should parse numbers", () => {
|
|
8
|
+
expect(util.parseNumber("14327")).to.equal(14327);
|
|
9
|
+
expect(util.parseNumber("14327.59")).to.equal(14327.59);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("should parse numbers with whitespaces", () => {
|
|
13
|
+
expect(util.parseNumber(" 14327")).to.equal(14327);
|
|
14
|
+
expect(util.parseNumber("14327.59 ")).to.equal(14327.59);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should return undefined for null/undefined/empty/whitespace", () => {
|
|
18
|
+
expect(util.parseNumber(null)).to.be.undefined;
|
|
19
|
+
expect(util.parseNumber(undefined)).to.be.undefined;
|
|
20
|
+
expect(util.parseNumber("")).to.be.undefined;
|
|
21
|
+
expect(util.parseNumber(" ")).to.be.undefined;
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("should parse numbers with thousands separators", () => {
|
|
25
|
+
expect(util.parseNumber("1.59")).to.equal(1.59);
|
|
26
|
+
expect(util.parseNumber("1,59")).to.equal(1.59);
|
|
27
|
+
expect(util.parseNumber("2,055.00")).to.equal(2055);
|
|
28
|
+
expect(util.parseNumber("2,00,000.00")).to.equal(200_000);
|
|
29
|
+
expect(util.parseNumber("14,327.59")).to.equal(14327.59);
|
|
30
|
+
expect(util.parseNumber("14.327,59")).to.equal(14327.59);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const { expect } = require("chai");
|
|
2
|
+
const { readFileSync } = require("fs");
|
|
3
|
+
const { StatementConverter, Bank } = require("../src/index");
|
|
4
|
+
|
|
5
|
+
describe(StatementConverter.name, () => {
|
|
6
|
+
const converter = new StatementConverter();
|
|
7
|
+
|
|
8
|
+
it("should convert ICICI statement", async () => {
|
|
9
|
+
const statement = readFileSync("test/ICICIBankStatement.xls");
|
|
10
|
+
|
|
11
|
+
const result = await converter.convert(Bank.ICICI, statement);
|
|
12
|
+
|
|
13
|
+
expect(result).to.not.be.empty;
|
|
14
|
+
// TODO - Find a way to assert values here
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should convert N26 statement", async () => {
|
|
18
|
+
const statement = readFileSync("test/N26Statement.csv");
|
|
19
|
+
|
|
20
|
+
const result = await converter.convert(Bank.N26, statement);
|
|
21
|
+
|
|
22
|
+
expect(result).to.not.be.empty;
|
|
23
|
+
// TODO - Find a way to assert values here
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("should convert Axis Bank statement", async () => {
|
|
27
|
+
const statement = readFileSync("test/AxisBankStatement.xls");
|
|
28
|
+
|
|
29
|
+
const result = await converter.convert(Bank.Axis, statement);
|
|
30
|
+
|
|
31
|
+
expect(result).to.not.be.empty;
|
|
32
|
+
// TODO - Find a way to assert values here
|
|
33
|
+
});
|
|
34
|
+
});
|
package/tsconfig.json
ADDED
package/StatementConverter.d.ts
DELETED
package/StatementConverter.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.StatementConverter = void 0;
|
|
13
|
-
const N26Adapter_1 = require("./adapters/N26Adapter");
|
|
14
|
-
const ABNAdapter_1 = require("./adapters/ABNAdapter");
|
|
15
|
-
const AxisAdapter_1 = require("./adapters/AxisAdapter");
|
|
16
|
-
const ICICIAdapter_1 = require("./adapters/ICICIAdapter");
|
|
17
|
-
const ICICICreditCardAdapter_1 = require("./adapters/ICICICreditCardAdapter");
|
|
18
|
-
const StandardCharteredAdapter_1 = require("./adapters/StandardCharteredAdapter");
|
|
19
|
-
const TransactionsQifConverter_1 = require("./adapters/TransactionsQifConverter");
|
|
20
|
-
const MT940Adapter_1 = require("./adapters/MT940Adapter");
|
|
21
|
-
class StatementConverter {
|
|
22
|
-
constructor() {
|
|
23
|
-
this.transactionsToQif = new TransactionsQifConverter_1.TransactionsQifConverter();
|
|
24
|
-
this.allAdapters = [
|
|
25
|
-
new AxisAdapter_1.AxisAdapter(),
|
|
26
|
-
new ICICIAdapter_1.ICICIAdapter(),
|
|
27
|
-
new ICICICreditCardAdapter_1.ICICICreditCardAdapter(),
|
|
28
|
-
new StandardCharteredAdapter_1.StandardCharteredAdapter(),
|
|
29
|
-
new ABNAdapter_1.ABNAdapter(),
|
|
30
|
-
new N26Adapter_1.N26Adapter(),
|
|
31
|
-
new MT940Adapter_1.MT940Adapter(),
|
|
32
|
-
];
|
|
33
|
-
}
|
|
34
|
-
convert(bank, fileData) {
|
|
35
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
const adapter = this.allAdapters.find((adapter) => adapter.supports(bank));
|
|
37
|
-
if (!adapter) {
|
|
38
|
-
throw new Error(`No adapter found for bank [${bank}]`);
|
|
39
|
-
}
|
|
40
|
-
const transactions = yield adapter.convert(fileData);
|
|
41
|
-
return this.transactionsToQif.convert(transactions);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
exports.StatementConverter = StatementConverter;
|
package/adapters/ABNAdapter.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Bank } from '..';
|
|
2
|
-
import { Transaction } from '../models/Transaction';
|
|
3
|
-
import { TransactionAdapter } from './TransactionAdapter';
|
|
4
|
-
export declare class ABNAdapter extends TransactionAdapter {
|
|
5
|
-
convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
|
|
6
|
-
supports(bank: Bank): boolean;
|
|
7
|
-
}
|
package/adapters/ABNAdapter.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ABNAdapter = void 0;
|
|
13
|
-
const __1 = require("..");
|
|
14
|
-
const XLSXUtil_1 = require("../helpers/XLSXUtil");
|
|
15
|
-
const TransactionAdapter_1 = require("./TransactionAdapter");
|
|
16
|
-
const XLSX = require("xlsx");
|
|
17
|
-
const moment = require("moment");
|
|
18
|
-
class ABNAdapter extends TransactionAdapter_1.TransactionAdapter {
|
|
19
|
-
convert(xlsxData) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const workBook = XLSX.read(xlsxData, { raw: true, type: 'array' });
|
|
22
|
-
const sheet = workBook.Sheets[workBook.SheetNames[0]];
|
|
23
|
-
const addressForTransactionDate = XLSXUtil_1.XLSXUtil.findText(sheet, "transactiondate");
|
|
24
|
-
const addressForDescription = XLSXUtil_1.XLSXUtil.findText(sheet, "description");
|
|
25
|
-
const addressForAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "amount");
|
|
26
|
-
const startingRow = addressForTransactionDate.r + 1;
|
|
27
|
-
const range = XLSX.utils.decode_range(sheet['!ref']);
|
|
28
|
-
const rangeEnd = range.e;
|
|
29
|
-
const lastRow = rangeEnd.r;
|
|
30
|
-
const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
|
|
31
|
-
return rows.map(row => {
|
|
32
|
-
const parsedDate = moment(XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForTransactionDate.c), 'YYYYMMDD');
|
|
33
|
-
if (!parsedDate.isValid())
|
|
34
|
-
return undefined;
|
|
35
|
-
const date = parsedDate.toDate();
|
|
36
|
-
const amount = XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForAmount.c);
|
|
37
|
-
const outflow = amount < 0 ? Math.abs(amount) : 0;
|
|
38
|
-
const inflow = amount >= 0 ? amount : 0;
|
|
39
|
-
const memo = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForDescription.c);
|
|
40
|
-
return {
|
|
41
|
-
Payee: memo,
|
|
42
|
-
Outflow: outflow,
|
|
43
|
-
Inflow: inflow,
|
|
44
|
-
Date: date,
|
|
45
|
-
Memo: memo,
|
|
46
|
-
Category: null
|
|
47
|
-
};
|
|
48
|
-
}).filter(row => !!row);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
supports(bank) {
|
|
52
|
-
return bank === __1.Bank.ABN;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
exports.ABNAdapter = ABNAdapter;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Bank } from '..';
|
|
2
|
-
import { Transaction } from '../models/Transaction';
|
|
3
|
-
import { TransactionAdapter } from './TransactionAdapter';
|
|
4
|
-
export declare class AxisAdapter extends TransactionAdapter {
|
|
5
|
-
convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
|
|
6
|
-
supports(bank: Bank): boolean;
|
|
7
|
-
}
|
package/adapters/AxisAdapter.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.AxisAdapter = void 0;
|
|
13
|
-
const __1 = require("..");
|
|
14
|
-
const XLSXUtil_1 = require("../helpers/XLSXUtil");
|
|
15
|
-
const TransactionAdapter_1 = require("./TransactionAdapter");
|
|
16
|
-
const XLSX = require("xlsx");
|
|
17
|
-
const moment = require("moment");
|
|
18
|
-
class AxisAdapter extends TransactionAdapter_1.TransactionAdapter {
|
|
19
|
-
convert(xlsxData) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const workBook = XLSX.read(xlsxData, { raw: true, type: 'array' });
|
|
22
|
-
const sheet = workBook.Sheets[workBook.SheetNames[0]];
|
|
23
|
-
const addressForTransactionDate = XLSXUtil_1.XLSXUtil.findText(sheet, "Tran Date");
|
|
24
|
-
const addressForDetails = XLSXUtil_1.XLSXUtil.findText(sheet, "PARTICULARS");
|
|
25
|
-
const addressForDepositAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "CR");
|
|
26
|
-
const addressForWithdrawalAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "DR");
|
|
27
|
-
const startingRow = addressForTransactionDate.r + 1;
|
|
28
|
-
const range = XLSX.utils.decode_range(sheet['!ref']);
|
|
29
|
-
const rangeEnd = range.e;
|
|
30
|
-
const lastRow = rangeEnd.r;
|
|
31
|
-
const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
|
|
32
|
-
return rows.map(row => {
|
|
33
|
-
const parsedDate = moment(XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForTransactionDate.c), 'DD-MM-YYYY');
|
|
34
|
-
if (!parsedDate.isValid())
|
|
35
|
-
return undefined;
|
|
36
|
-
const date = parsedDate.toDate();
|
|
37
|
-
const payee = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForDetails.c);
|
|
38
|
-
return {
|
|
39
|
-
Payee: payee,
|
|
40
|
-
Outflow: XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForWithdrawalAmount.c),
|
|
41
|
-
Inflow: XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForDepositAmount.c),
|
|
42
|
-
Date: date,
|
|
43
|
-
Memo: payee,
|
|
44
|
-
Category: null
|
|
45
|
-
};
|
|
46
|
-
}).filter(row => !!row);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
supports(bank) {
|
|
50
|
-
return bank === __1.Bank.Axis;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
exports.AxisAdapter = AxisAdapter;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Bank } from '..';
|
|
2
|
-
import { Transaction } from '../models/Transaction';
|
|
3
|
-
import { TransactionAdapter } from './TransactionAdapter';
|
|
4
|
-
export declare class ICICIAdapter extends TransactionAdapter {
|
|
5
|
-
convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
|
|
6
|
-
private isOutflow;
|
|
7
|
-
supports(bank: Bank): boolean;
|
|
8
|
-
}
|
package/adapters/ICICIAdapter.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ICICIAdapter = void 0;
|
|
13
|
-
const XLSX = require("xlsx");
|
|
14
|
-
const __1 = require("..");
|
|
15
|
-
const XLSXUtil_1 = require("../helpers/XLSXUtil");
|
|
16
|
-
const TransactionAdapter_1 = require("./TransactionAdapter");
|
|
17
|
-
const moment = require("moment");
|
|
18
|
-
class ICICIAdapter extends TransactionAdapter_1.TransactionAdapter {
|
|
19
|
-
convert(xlsxData) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const workBook = XLSX.read(xlsxData, { raw: true, type: 'array' });
|
|
22
|
-
const sheet = workBook.Sheets[workBook.SheetNames[0]];
|
|
23
|
-
const addressForTransactionDate = XLSXUtil_1.XLSXUtil.findText(sheet, "Transaction Date");
|
|
24
|
-
const addressForDetails = XLSXUtil_1.XLSXUtil.findText(sheet, "Transaction Remark");
|
|
25
|
-
const addressForAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "Amount (INR)");
|
|
26
|
-
const addressForCreditOrDebit = XLSXUtil_1.XLSXUtil.findText(sheet, "CR/DR");
|
|
27
|
-
const addressForLegend = XLSXUtil_1.XLSXUtil.findText(sheet, "Legends Used in Account Statement");
|
|
28
|
-
const startingRow = addressForTransactionDate.r + 1;
|
|
29
|
-
const lastRow = addressForLegend.r - 1;
|
|
30
|
-
const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
|
|
31
|
-
return rows.map(row => {
|
|
32
|
-
const isOutflow = this.isOutflow(sheet, row, addressForCreditOrDebit.c);
|
|
33
|
-
const amount = XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForAmount.c);
|
|
34
|
-
const date = moment(XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForTransactionDate.c), 'DD/MM/YYYY').toDate();
|
|
35
|
-
const payee = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForDetails.c);
|
|
36
|
-
return {
|
|
37
|
-
Payee: payee,
|
|
38
|
-
Outflow: isOutflow ? amount : 0,
|
|
39
|
-
Inflow: !isOutflow ? amount : 0,
|
|
40
|
-
Date: date,
|
|
41
|
-
Memo: payee,
|
|
42
|
-
Category: null
|
|
43
|
-
};
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
isOutflow(sheet, row, column) {
|
|
48
|
-
const cellValue = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, column);
|
|
49
|
-
return cellValue.includes("Dr.");
|
|
50
|
-
}
|
|
51
|
-
;
|
|
52
|
-
supports(bank) {
|
|
53
|
-
return bank === __1.Bank.ICICI;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.ICICIAdapter = ICICIAdapter;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Bank } from '..';
|
|
2
|
-
import { Transaction } from '../models/Transaction';
|
|
3
|
-
import { TransactionAdapter } from './TransactionAdapter';
|
|
4
|
-
export declare class ICICICreditCardAdapter extends TransactionAdapter {
|
|
5
|
-
convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
|
|
6
|
-
private determineDebitOrCredit;
|
|
7
|
-
supports(bank: Bank): boolean;
|
|
8
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ICICICreditCardAdapter = void 0;
|
|
13
|
-
const XLSX = require("xlsx");
|
|
14
|
-
const __1 = require("..");
|
|
15
|
-
const XLSXUtil_1 = require("../helpers/XLSXUtil");
|
|
16
|
-
const TransactionAdapter_1 = require("./TransactionAdapter");
|
|
17
|
-
const moment = require("moment");
|
|
18
|
-
class ICICICreditCardAdapter extends TransactionAdapter_1.TransactionAdapter {
|
|
19
|
-
convert(xlsxData) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const workBook = XLSX.read(xlsxData, { raw: true, type: 'array' });
|
|
22
|
-
const sheet = workBook.Sheets[workBook.SheetNames[0]];
|
|
23
|
-
const addressForTransactionDate = XLSXUtil_1.XLSXUtil.findText(sheet, "Transaction Date");
|
|
24
|
-
const addressForDetails = XLSXUtil_1.XLSXUtil.findText(sheet, "Details");
|
|
25
|
-
const addressForAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "Amount (INR)");
|
|
26
|
-
const addressForReferenceNumber = XLSXUtil_1.XLSXUtil.findText(sheet, "Reference Number");
|
|
27
|
-
const startingRow = addressForTransactionDate.r + 1;
|
|
28
|
-
const range = XLSX.utils.decode_range(sheet['!ref']);
|
|
29
|
-
const rangeEnd = range.e;
|
|
30
|
-
const lastRow = rangeEnd.r;
|
|
31
|
-
const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
|
|
32
|
-
return rows.map(row => {
|
|
33
|
-
const { isOutflow, amount } = this.determineDebitOrCredit(sheet, row, addressForAmount.c);
|
|
34
|
-
const date = moment(XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForTransactionDate.c), 'DD/MM/YYYY').toDate();
|
|
35
|
-
return {
|
|
36
|
-
Payee: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForDetails.c),
|
|
37
|
-
Outflow: isOutflow ? amount : 0,
|
|
38
|
-
Inflow: !isOutflow ? amount : 0,
|
|
39
|
-
Date: date,
|
|
40
|
-
Memo: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForReferenceNumber.c),
|
|
41
|
-
Category: null
|
|
42
|
-
};
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
determineDebitOrCredit(sheet, row, column) {
|
|
47
|
-
const cellValue = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, column);
|
|
48
|
-
// TODO - Replace parsing with Globalize
|
|
49
|
-
return { isOutflow: cellValue.includes("Dr."), amount: parseFloat(cellValue.replace(/,/g, '')) };
|
|
50
|
-
}
|
|
51
|
-
;
|
|
52
|
-
supports(bank) {
|
|
53
|
-
return bank === __1.Bank.ICICICreditCard;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.ICICICreditCardAdapter = ICICICreditCardAdapter;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Bank } from '..';
|
|
2
|
-
import { Transaction } from '../models/Transaction';
|
|
3
|
-
import { TransactionAdapter } from './TransactionAdapter';
|
|
4
|
-
export declare class MT940Adapter extends TransactionAdapter {
|
|
5
|
-
convert(data: ArrayBuffer): Promise<Transaction[]>;
|
|
6
|
-
supports(bank: Bank): boolean;
|
|
7
|
-
}
|
package/adapters/MT940Adapter.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.MT940Adapter = void 0;
|
|
13
|
-
const __1 = require("..");
|
|
14
|
-
const TransactionAdapter_1 = require("./TransactionAdapter");
|
|
15
|
-
const stitch_swiftmessageparser_1 = require("stitch-swiftmessageparser");
|
|
16
|
-
const lodash_1 = require("lodash");
|
|
17
|
-
const moment = require("moment");
|
|
18
|
-
class MT940Adapter extends TransactionAdapter_1.TransactionAdapter {
|
|
19
|
-
convert(data) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const rows = stitch_swiftmessageparser_1.default.parse({
|
|
22
|
-
data: new TextDecoder().decode(data),
|
|
23
|
-
type: "mt940",
|
|
24
|
-
});
|
|
25
|
-
return (0, lodash_1.flatMap)(rows, row => row.transactions)
|
|
26
|
-
.map((row) => {
|
|
27
|
-
const parsedDate = moment(row.date);
|
|
28
|
-
const date = parsedDate.toDate();
|
|
29
|
-
const amount = row.amount;
|
|
30
|
-
const outflow = amount.isNegative() ? amount.abs().toNumber() : 0;
|
|
31
|
-
const inflow = amount.isPositive() ? amount.toNumber() : 0;
|
|
32
|
-
const memo = (0, lodash_1.filter)([
|
|
33
|
-
row.bankReference,
|
|
34
|
-
row.details,
|
|
35
|
-
row.extraDetails,
|
|
36
|
-
row.reference,
|
|
37
|
-
(0, lodash_1.filter)(row.detailSegments, (0, lodash_1.negate)(lodash_1.isEmpty)).join(" - ")
|
|
38
|
-
], (0, lodash_1.negate)(lodash_1.isEmpty))
|
|
39
|
-
.join(" - ")
|
|
40
|
-
.trim();
|
|
41
|
-
return {
|
|
42
|
-
Payee: memo,
|
|
43
|
-
Outflow: outflow,
|
|
44
|
-
Inflow: inflow,
|
|
45
|
-
Date: date,
|
|
46
|
-
Memo: memo,
|
|
47
|
-
Category: null
|
|
48
|
-
};
|
|
49
|
-
}).filter(row => !!row);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
supports(bank) {
|
|
53
|
-
return bank === __1.Bank.GenericMT940;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.MT940Adapter = MT940Adapter;
|
package/adapters/N26Adapter.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Bank } from '..';
|
|
2
|
-
import { Transaction } from '../models/Transaction';
|
|
3
|
-
import { TransactionAdapter } from './TransactionAdapter';
|
|
4
|
-
export declare class N26Adapter extends TransactionAdapter {
|
|
5
|
-
convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
|
|
6
|
-
supports(bank: Bank): boolean;
|
|
7
|
-
}
|
package/adapters/N26Adapter.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.N26Adapter = void 0;
|
|
13
|
-
const __1 = require("..");
|
|
14
|
-
const XLSXUtil_1 = require("../helpers/XLSXUtil");
|
|
15
|
-
const TransactionAdapter_1 = require("./TransactionAdapter");
|
|
16
|
-
const XLSX = require("xlsx");
|
|
17
|
-
const moment = require("moment");
|
|
18
|
-
class N26Adapter extends TransactionAdapter_1.TransactionAdapter {
|
|
19
|
-
convert(xlsxData) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const workBook = XLSX.read(xlsxData, { raw: true, type: 'array' });
|
|
22
|
-
const sheet = workBook.Sheets[workBook.SheetNames[0]];
|
|
23
|
-
const addressForTransactionDate = XLSXUtil_1.XLSXUtil.findText(sheet, "Date");
|
|
24
|
-
const addressForDescription = XLSXUtil_1.XLSXUtil.findText(sheet, "Payment reference");
|
|
25
|
-
const addressForAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "Amount (EUR)");
|
|
26
|
-
const addressForPayee = XLSXUtil_1.XLSXUtil.findText(sheet, "Payee");
|
|
27
|
-
const addressForCategory = XLSXUtil_1.XLSXUtil.findText(sheet, "Transaction type");
|
|
28
|
-
const startingRow = addressForTransactionDate.r + 1;
|
|
29
|
-
const range = XLSX.utils.decode_range(sheet['!ref']);
|
|
30
|
-
const rangeEnd = range.e;
|
|
31
|
-
const lastRow = rangeEnd.r;
|
|
32
|
-
const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
|
|
33
|
-
return rows.map(row => {
|
|
34
|
-
const parsedDate = moment(XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForTransactionDate.c), 'YYYYMMDD');
|
|
35
|
-
if (!parsedDate.isValid())
|
|
36
|
-
return undefined;
|
|
37
|
-
const date = parsedDate.toDate();
|
|
38
|
-
const amount = XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForAmount.c);
|
|
39
|
-
const outflow = amount < 0 ? Math.abs(amount) : 0;
|
|
40
|
-
const inflow = amount >= 0 ? amount : 0;
|
|
41
|
-
return {
|
|
42
|
-
Payee: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForPayee.c),
|
|
43
|
-
Outflow: outflow,
|
|
44
|
-
Inflow: inflow,
|
|
45
|
-
Date: date,
|
|
46
|
-
Memo: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForDescription.c),
|
|
47
|
-
Category: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForCategory.c)
|
|
48
|
-
};
|
|
49
|
-
}).filter(row => !!row);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
supports(bank) {
|
|
53
|
-
return bank === __1.Bank.N26;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
exports.N26Adapter = N26Adapter;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { Bank } from '..';
|
|
2
|
-
import { Transaction } from '../models/Transaction';
|
|
3
|
-
import { TransactionAdapter } from './TransactionAdapter';
|
|
4
|
-
export declare class StandardCharteredAdapter extends TransactionAdapter {
|
|
5
|
-
convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
|
|
6
|
-
supports(bank: Bank): boolean;
|
|
7
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.StandardCharteredAdapter = void 0;
|
|
13
|
-
const __1 = require("..");
|
|
14
|
-
const XLSXUtil_1 = require("../helpers/XLSXUtil");
|
|
15
|
-
const TransactionAdapter_1 = require("./TransactionAdapter");
|
|
16
|
-
const XLSX = require("xlsx");
|
|
17
|
-
const moment = require("moment");
|
|
18
|
-
class StandardCharteredAdapter extends TransactionAdapter_1.TransactionAdapter {
|
|
19
|
-
convert(xlsxData) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const workBook = XLSX.read(xlsxData, { raw: true, type: 'array' });
|
|
22
|
-
const sheet = workBook.Sheets[workBook.SheetNames[0]];
|
|
23
|
-
const addressForTransactionDate = XLSXUtil_1.XLSXUtil.findText(sheet, "Date");
|
|
24
|
-
const addressForDetails = XLSXUtil_1.XLSXUtil.findText(sheet, "Transaction");
|
|
25
|
-
const addressForDepositAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "Deposit");
|
|
26
|
-
const addressForWithdrawalAmount = XLSXUtil_1.XLSXUtil.findText(sheet, "Withdrawal");
|
|
27
|
-
const startingRow = addressForTransactionDate.r + 1;
|
|
28
|
-
const range = XLSX.utils.decode_range(sheet['!ref']);
|
|
29
|
-
const rangeEnd = range.e;
|
|
30
|
-
const lastRow = rangeEnd.r;
|
|
31
|
-
const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
|
|
32
|
-
return rows.map(row => {
|
|
33
|
-
const date = moment(XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForTransactionDate.c), 'DD/MM/YYYY').toDate();
|
|
34
|
-
const outflow = XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForWithdrawalAmount.c);
|
|
35
|
-
const inflow = XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForDepositAmount.c);
|
|
36
|
-
const payee = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForDetails.c);
|
|
37
|
-
return {
|
|
38
|
-
Payee: payee,
|
|
39
|
-
Outflow: outflow,
|
|
40
|
-
Inflow: inflow,
|
|
41
|
-
Date: date,
|
|
42
|
-
Memo: payee,
|
|
43
|
-
Category: null
|
|
44
|
-
};
|
|
45
|
-
}).filter(datum => moment(datum.Date).isValid());
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
supports(bank) {
|
|
49
|
-
return bank === __1.Bank.StandardChartered;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.StandardCharteredAdapter = StandardCharteredAdapter;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.TransactionsQifConverter = void 0;
|
|
13
|
-
const qif = require("qif");
|
|
14
|
-
const moment = require("moment");
|
|
15
|
-
class TransactionsQifConverter {
|
|
16
|
-
convert(transactions) {
|
|
17
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
-
const qifTransactions = transactions.map(t => {
|
|
19
|
-
return {
|
|
20
|
-
date: moment(t.Date).format('D/M/YYYY'),
|
|
21
|
-
amount: t.Inflow ? t.Inflow : -t.Outflow,
|
|
22
|
-
payee: t.Payee,
|
|
23
|
-
memo: t.Memo,
|
|
24
|
-
category: t.Category
|
|
25
|
-
};
|
|
26
|
-
});
|
|
27
|
-
return qif.write({ cash: qifTransactions });
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
exports.TransactionsQifConverter = TransactionsQifConverter;
|