@ashray.mehta/statement-converter 1.6.1 → 1.7.0

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.
@@ -18,6 +18,7 @@ const ICICICreditCardAdapter_1 = require("./adapters/ICICICreditCardAdapter");
18
18
  const StandardCharteredAdapter_1 = require("./adapters/StandardCharteredAdapter");
19
19
  const TransactionsQifConverter_1 = require("./adapters/TransactionsQifConverter");
20
20
  const MT940Adapter_1 = require("./adapters/MT940Adapter");
21
+ const WiseAdapter_1 = require("./adapters/WiseAdapter");
21
22
  class StatementConverter {
22
23
  constructor() {
23
24
  this.transactionsToQif = new TransactionsQifConverter_1.TransactionsQifConverter();
@@ -29,6 +30,7 @@ class StatementConverter {
29
30
  new ABNAdapter_1.ABNAdapter(),
30
31
  new N26Adapter_1.N26Adapter(),
31
32
  new MT940Adapter_1.MT940Adapter(),
33
+ new WiseAdapter_1.WiseAdapter(),
32
34
  ];
33
35
  }
34
36
  convert(bank, fileData) {
@@ -3,6 +3,7 @@ import { Transaction } from '../models/Transaction';
3
3
  import { TransactionAdapter } from './TransactionAdapter';
4
4
  export declare class ICICICreditCardAdapter extends TransactionAdapter {
5
5
  convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
6
+ private findStartingRow;
6
7
  private determineDebitOrCredit;
7
8
  supports(bank: Bank): boolean;
8
9
  }
@@ -46,6 +46,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
46
46
  };
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.ICICICreditCardAdapter = void 0;
49
+ const lodash_es_1 = require("lodash-es");
49
50
  const __1 = require("..");
50
51
  const XLSXUtil_1 = require("../helpers/XLSXUtil");
51
52
  const TransactionAdapter_1 = require("./TransactionAdapter");
@@ -62,17 +63,17 @@ class ICICICreditCardAdapter extends TransactionAdapter_1.TransactionAdapter {
62
63
  const addressForAmount = (_d = (_c = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Amount (INR)")) !== null && _c !== void 0 ? _c : XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, 'Amount(in Rs)')) !== null && _d !== void 0 ? _d : XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, 'Intl.Amount');
63
64
  const addressForReferenceNumber = (_e = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Reference Number")) !== null && _e !== void 0 ? _e : XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, 'Sr.No.');
64
65
  const addressForCreditOrDebit = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "BillingAmountSign");
65
- const startingRow = addressForTransactionDate.r + 1;
66
66
  const range = XLSX.utils.decode_range(sheet['!ref']);
67
67
  const rangeEnd = range.e;
68
68
  const lastRow = rangeEnd.r;
69
+ const startingRow = this.findStartingRow(sheet, range, addressForTransactionDate);
69
70
  const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
70
71
  return rows
71
72
  .filter(row => {
72
73
  // ICICI sometimes has account numbers in the Date field which serve as a separator between inflows and outflows.
73
74
  // This filters those rows out.
74
75
  const dateText = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForTransactionDate.c);
75
- if (dateText.length === 16) {
76
+ if ((0, lodash_es_1.size)(dateText) === 16) {
76
77
  return false;
77
78
  }
78
79
  else {
@@ -104,6 +105,15 @@ class ICICICreditCardAdapter extends TransactionAdapter_1.TransactionAdapter {
104
105
  });
105
106
  });
106
107
  }
108
+ findStartingRow(sheet, range, addressForTransactionDate) {
109
+ var current = addressForTransactionDate.r; // Right after this is where the data should start, but sometimes there are blank rows after the header.
110
+ for (var current = addressForTransactionDate.r + 1; current <= range.e.r; current++) {
111
+ if (!(0, lodash_es_1.isEmpty)(XLSXUtil_1.XLSXUtil.getCellValue(sheet, current, addressForTransactionDate.c))) {
112
+ return current;
113
+ }
114
+ }
115
+ return addressForTransactionDate.r;
116
+ }
107
117
  determineDebitOrCredit(sheet, row, column) {
108
118
  const cellValue = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, column);
109
119
  // TODO - Replace parsing with Globalize
@@ -0,0 +1,7 @@
1
+ import { Bank } from '..';
2
+ import { Transaction } from '../models/Transaction';
3
+ import { TransactionAdapter } from './TransactionAdapter';
4
+ export declare class WiseAdapter extends TransactionAdapter {
5
+ convert(xlsxData: ArrayBuffer): Promise<Transaction[]>;
6
+ supports(bank: Bank): boolean;
7
+ }
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.WiseAdapter = void 0;
49
+ const __1 = require("..");
50
+ const XLSXUtil_1 = require("../helpers/XLSXUtil");
51
+ const TransactionAdapter_1 = require("./TransactionAdapter");
52
+ const XLSX = __importStar(require("xlsx"));
53
+ const moment_1 = __importDefault(require("moment"));
54
+ class WiseAdapter extends TransactionAdapter_1.TransactionAdapter {
55
+ convert(xlsxData) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ const workBook = XLSX.read(xlsxData, { raw: true, type: 'array' });
58
+ const sheet = workBook.Sheets[workBook.SheetNames[0]];
59
+ const addressForCreatedOn = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Created on");
60
+ const addressForPayee = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Target name");
61
+ const addressForAmount = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Source amount (after fees)");
62
+ const addressForDirection = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Direction");
63
+ const addressForReference = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Reference");
64
+ const addressForCategory = XLSXUtil_1.XLSXUtil.findTextIgnoringWhitespace(sheet, "Category");
65
+ const startingRow = addressForCreatedOn.r + 1;
66
+ const range = XLSX.utils.decode_range(sheet['!ref']);
67
+ const rangeEnd = range.e;
68
+ const lastRow = rangeEnd.r;
69
+ const rows = [...Array(1 + lastRow - startingRow).keys()].map(v => startingRow + v);
70
+ return rows.map(row => {
71
+ const parsedDate = (0, moment_1.default)(XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForCreatedOn.c), 'YYYY-MM-DD hh:mm:ss');
72
+ if (!parsedDate.isValid())
73
+ return undefined;
74
+ const date = parsedDate.toDate();
75
+ const amount = XLSXUtil_1.XLSXUtil.getNumberInCell(sheet, row, addressForAmount.c);
76
+ const direction = XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForDirection.c);
77
+ const isOutflow = direction === 'OUT';
78
+ const outflow = isOutflow ? amount : 0;
79
+ const inflow = isOutflow ? 0 : amount;
80
+ return {
81
+ Payee: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForPayee.c),
82
+ Outflow: outflow,
83
+ Inflow: inflow,
84
+ Date: date,
85
+ Memo: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForReference.c),
86
+ Category: XLSXUtil_1.XLSXUtil.getCellValue(sheet, row, addressForCategory.c)
87
+ };
88
+ }).filter(row => !!row);
89
+ });
90
+ }
91
+ supports(bank) {
92
+ return bank === __1.Bank.Wise;
93
+ }
94
+ }
95
+ exports.WiseAdapter = WiseAdapter;
package/models/Bank.d.ts CHANGED
@@ -5,5 +5,6 @@ export declare enum Bank {
5
5
  StandardChartered = "sc",
6
6
  ABN = "abn",
7
7
  N26 = "n26",
8
+ Wise = "wise",
8
9
  GenericMT940 = "Others (MT940)"
9
10
  }
package/models/Bank.js CHANGED
@@ -9,5 +9,6 @@ var Bank;
9
9
  Bank["StandardChartered"] = "sc";
10
10
  Bank["ABN"] = "abn";
11
11
  Bank["N26"] = "n26";
12
+ Bank["Wise"] = "wise";
12
13
  Bank["GenericMT940"] = "Others (MT940)";
13
14
  })(Bank || (exports.Bank = Bank = {}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ashray.mehta/statement-converter",
3
- "version": "1.6.1",
3
+ "version": "1.7.0",
4
4
  "description": "Library to convert statements from frequently used banks to QIF.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -20,8 +20,8 @@
20
20
  },
21
21
  "license": "ISC",
22
22
  "dependencies": {
23
- "@types/lodash": "4.17.20",
24
- "lodash-es": "4.17.21",
23
+ "@types/lodash": "4.17.24",
24
+ "lodash-es": "4.18.1",
25
25
  "moment": "2.30.1",
26
26
  "multi-number-parse": "1.1.0",
27
27
  "qif": "0.0.2",
@@ -29,16 +29,17 @@
29
29
  "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/chai": "5.2.2",
33
- "@types/globalize": "1.5.5",
32
+ "@types/chai": "5.2.3",
33
+ "@types/globalize": "1.5.6",
34
+ "@types/lodash-es": "4.17.12",
34
35
  "@types/mocha": "10.0.10",
35
36
  "@types/moment": "2.13.0",
36
- "@types/node": "24.3.0",
37
- "@types/yargs": "17.0.33",
38
- "chai": "6.0.1",
39
- "mocha": "11.7.2",
37
+ "@types/node": "25.5.2",
38
+ "@types/yargs": "17.0.35",
39
+ "chai": "6.2.2",
40
+ "mocha": "11.7.5",
40
41
  "ts-node": "10.9.2",
41
- "tsx": "4.20.5",
42
- "typescript": "5.9.2"
42
+ "tsx": "4.21.0",
43
+ "typescript": "6.0.2"
43
44
  }
44
45
  }