@tasenor/common-plugins 1.14.1 → 1.14.3

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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @tasenor/common-plugins@1.14.0 build /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
2
+ > @tasenor/common-plugins@1.14.2 build /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
3
3
  > rm -fr dist && tsc
4
4
 
@@ -1,8 +1,8 @@
1
1
 
2
- > @tasenor/common-plugins@1.14.0 ci /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
2
+ > @tasenor/common-plugins@1.14.2 ci /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
3
3
  > pnpm run lint
4
4
 
5
5
 
6
- > @tasenor/common-plugins@1.14.0 lint /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
6
+ > @tasenor/common-plugins@1.14.2 lint /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
7
7
  > eslint 'src/**/*.{ts,tsx}' 'data/**/*.mjs'
8
8
 
@@ -1,12 +1,12 @@
1
1
 
2
- > @tasenor/common-plugins@1.13.27 nightly /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
2
+ > @tasenor/common-plugins@1.14.2 nightly /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
3
3
  > pnpm run ci
4
4
 
5
5
 
6
- > @tasenor/common-plugins@1.13.27 ci /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
6
+ > @tasenor/common-plugins@1.14.2 ci /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
7
7
  > pnpm run lint
8
8
 
9
9
 
10
- > @tasenor/common-plugins@1.13.27 lint /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
10
+ > @tasenor/common-plugins@1.14.2 lint /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
11
11
  > eslint 'src/**/*.{ts,tsx}' 'data/**/*.mjs'
12
12
 
@@ -0,0 +1,12 @@
1
+ import { DirectoryPath, NO_SEGMENT, SegmentId, TextFileLine } from '@tasenor/common';
2
+ import { ProcessFile, TransactionImportHandler } from '@tasenor/common-node';
3
+ /**
4
+ * Import implementation for Alisa CSV format.
5
+ */
6
+ export declare class AlisaHandler extends TransactionImportHandler {
7
+ constructor();
8
+ get path(): DirectoryPath;
9
+ canHandle(file: ProcessFile): boolean;
10
+ segmentId(line: TextFileLine): SegmentId | typeof NO_SEGMENT;
11
+ time(line: TextFileLine): Date | undefined;
12
+ }
@@ -0,0 +1,58 @@
1
+ import { NO_SEGMENT } from '@tasenor/common';
2
+ import { TransactionImportHandler } from '@tasenor/common-node';
3
+ import dayjs from 'dayjs';
4
+ import { sprintf } from 'sprintf-js';
5
+ /**
6
+ * Import implementation for Alisa CSV format.
7
+ */
8
+ export class AlisaHandler extends TransactionImportHandler {
9
+ constructor() {
10
+ super('AlisaImport');
11
+ this.importOptions = {
12
+ parser: 'csv',
13
+ numericFields: ['Amount', 'AmountPaid'],
14
+ requiredFields: ['Type', 'Account'],
15
+ textField: 'Message',
16
+ totalAmountField: 'Amount',
17
+ fieldRemapping: {
18
+ CounterpartyAccountNumber: 'Account',
19
+ CounterpartyName: 'Name',
20
+ CounterpartySpecification: 'Specification',
21
+ },
22
+ csv: {
23
+ cutFromBeginning: 8,
24
+ useFirstLineHeadings: true,
25
+ columnSeparator: ';',
26
+ trimLines: true,
27
+ }
28
+ };
29
+ }
30
+ get path() {
31
+ return __dirname;
32
+ }
33
+ canHandle(file) {
34
+ const data = file.decode();
35
+ const lines = data.substring(0, 150).split('\n');
36
+ const lookup = ['sep=', 'AccountNumber', 'AccountName', 'AccountType', 'CurrencyCode', 'StartDate', 'EndDate', ''];
37
+ for (let i = 0; i < 8; i++) {
38
+ if (lines[i].split(';')[0].trim() !== lookup[i]) {
39
+ return false;
40
+ }
41
+ }
42
+ this.importOptions.csv = this.importOptions.csv || {};
43
+ this.importOptions.csv.columnSeparator = lines[0].trim().split('=')[1];
44
+ return true;
45
+ }
46
+ segmentId(line) {
47
+ return line && line.columns ? line.columns.TransactionNumber : NO_SEGMENT;
48
+ }
49
+ time(line) {
50
+ const time = line.columns.BookingDate;
51
+ const re = time && /^(\d\d)\.(\d\d)\.(\d\d\d\d)$/.exec(time);
52
+ if (re && re !== null) {
53
+ return dayjs(sprintf('%04d-%02d-%02d 12:00:00Z', re[3], re[2], re[1])).toDate();
54
+ }
55
+ throw new Error(`Alisa import cannot figure out date from ${JSON.stringify(time)}.`);
56
+ }
57
+ }
58
+ //# sourceMappingURL=AlisaHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlisaHandler.js","sourceRoot":"","sources":["../../../src/AlisaImport/backend/AlisaHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,UAAU,EAA2B,MAAM,iBAAiB,CAAA;AACpF,OAAO,EAAe,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,wBAAwB;IAExD;QACE,KAAK,CAAC,aAAa,CAAC,CAAA;QACpB,IAAI,CAAC,aAAa,GAAG;YACnB,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;YACvC,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;YACnC,SAAS,EAAE,SAAS;YACpB,gBAAgB,EAAE,QAAQ;YAC1B,cAAc,EAAE;gBACd,yBAAyB,EAAE,SAAS;gBACpC,gBAAgB,EAAE,MAAM;gBACxB,yBAAyB,EAAE,eAAe;aAC3C;YACD,GAAG,EAAE;gBACH,gBAAgB,EAAE,CAAC;gBACnB,oBAAoB,EAAE,IAAI;gBAC1B,eAAe,EAAE,GAAG;gBACpB,SAAS,EAAE,IAAI;aAChB;SACF,CAAA;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,SAA0B,CAAA;IACnC,CAAC;IAED,SAAS,CAAC,IAAiB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QAElH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC/C,OAAO,KAAK,CAAA;aACb;SACF;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE,CAAA;QACrD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAEtE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,CAAC,IAAkB;QAC1B,OAAO,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAA;IAC3E,CAAC;IAED,IAAI,CAAC,IAAkB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAA;QACrC,MAAM,EAAE,GAAG,IAAI,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;YACrB,OAAO,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;SAChF;QACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtF,CAAC;CAEF"}
@@ -0,0 +1,5 @@
1
+ import { ImportPlugin } from '@tasenor/common-node';
2
+ declare class AlisaImportPlugin extends ImportPlugin {
3
+ constructor();
4
+ }
5
+ export default AlisaImportPlugin;
@@ -0,0 +1,18 @@
1
+ import { ImportPlugin } from '@tasenor/common-node';
2
+ import { AlisaHandler } from './AlisaHandler';
3
+ class AlisaImportPlugin extends ImportPlugin {
4
+ constructor() {
5
+ super(new AlisaHandler());
6
+ this.code = 'AlisaImport';
7
+ this.title = 'Import for Alisa';
8
+ this.version = '1.0.0';
9
+ this.icon = '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M5 6.99h3V14h2V6.99h3L9 3zM14 10v7.01h-3L15 21l4-3.99h-3V10z"/></svg>';
10
+ this.releaseDate = '2025-02-09';
11
+ this.use = 'backend';
12
+ this.type = 'import';
13
+ this.description = 'Import plugin for importing transaction data in CSV format provided by Alisa Bank.';
14
+ this.languages = this.getLanguages();
15
+ }
16
+ }
17
+ export default AlisaImportPlugin;
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/AlisaImport/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,iBAAkB,SAAQ,YAAY;IAE1C;QACE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC,CAAA;QAEzB,IAAI,CAAC,IAAI,GAAG,aAA2B,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAA;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAkB,CAAA;QACjC,IAAI,CAAC,IAAI,GAAG,6NAA6N,CAAA;QACzO,IAAI,CAAC,WAAW,GAAG,YAAY,CAAA;QAC/B,IAAI,CAAC,GAAG,GAAG,SAAS,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,oFAAoF,CAAA;QAEvG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IACtC,CAAC;CAEF;AAED,eAAe,iBAAiB,CAAA"}
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { ToolPlugin } from '@tasenor/common-ui';
2
3
  import { ShortDate, ID } from '@tasenor/common';
3
4
  declare class DocumentCleaner extends ToolPlugin {
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { ToolPlugin } from '@tasenor/common-ui';
2
3
  declare class GitBackup extends ToolPlugin {
3
4
  busy: boolean;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { ToolPlugin } from '@tasenor/common-ui';
2
3
  import { DatabaseModel, TagModel } from '@tasenor/common';
3
4
  /**
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { ToolPlugin } from '@tasenor/common-ui';
2
3
  declare class VAT extends ToolPlugin {
3
4
  showVatTable: boolean;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { AlisaHandler } from './AlisaImport/backend/AlisaHandler';
1
2
  export { default as AssetReportBackend } from './AssetReport/backend';
2
3
  export { default as CoinAPIBackend } from './CoinAPI/backend';
3
4
  export { default as CoinbaseImportBackend } from './CoinbaseImport/backend';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { AlisaHandler } from './AlisaImport/backend/AlisaHandler';
1
2
  export { default as AssetReportBackend } from './AssetReport/backend';
2
3
  export { default as CoinAPIBackend } from './CoinAPI/backend';
3
4
  export { default as CoinbaseImportBackend } from './CoinbaseImport/backend';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAC1E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,qCAAqC,CAAA;AACjG,OAAO,EAAE,OAAO,IAAI,oCAAoC,EAAE,MAAM,yCAAyC,CAAA;AACzG,OAAO,EAAE,OAAO,IAAI,mCAAmC,EAAE,MAAM,wCAAwC,CAAA;AACvG,OAAO,EAAE,OAAO,IAAI,uCAAuC,EAAE,MAAM,4CAA4C,CAAA;AAC/G,OAAO,EAAE,OAAO,IAAI,oCAAoC,EAAE,MAAM,yCAAyC,CAAA;AACzG,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,qCAAqC,CAAA;AACjG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AACjF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAC1E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,qCAAqC,CAAA;AACjG,OAAO,EAAE,OAAO,IAAI,oCAAoC,EAAE,MAAM,yCAAyC,CAAA;AACzG,OAAO,EAAE,OAAO,IAAI,mCAAmC,EAAE,MAAM,wCAAwC,CAAA;AACvG,OAAO,EAAE,OAAO,IAAI,uCAAuC,EAAE,MAAM,4CAA4C,CAAA;AAC/G,OAAO,EAAE,OAAO,IAAI,oCAAoC,EAAE,MAAM,yCAAyC,CAAA;AACzG,OAAO,EAAE,OAAO,IAAI,gCAAgC,EAAE,MAAM,qCAAqC,CAAA;AACjG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AACjF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tasenor/common-plugins",
3
- "version": "1.14.1",
3
+ "version": "1.14.3",
4
4
  "description": "Shared common plugins of Tasenor project",
5
5
  "repository": "git@github.com:dataplugoy/tasenor-bookkeeper.git",
6
6
  "author": "Tommi Ronkainen <tommi.ronkainen@gmail.com>",
@@ -13,9 +13,9 @@
13
13
  "dayjs": "1.10.8",
14
14
  "sprintf-js": "^1.1.2",
15
15
  "tsx": "^4.7.0",
16
- "@tasenor/common": "1.14.1",
17
- "@tasenor/common-ui": "1.14.1",
18
- "@tasenor/common-node": "1.14.1"
16
+ "@tasenor/common": "1.14.3",
17
+ "@tasenor/common-node": "1.14.3",
18
+ "@tasenor/common-ui": "1.14.3"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@mui/icons-material": "^5.14.1",
@@ -31,8 +31,8 @@
31
31
  "react-i18next": "^14.0.5",
32
32
  "react-router-dom": "^6.14.1",
33
33
  "typescript": "^5.1.6",
34
- "eslint-config-tasenor": "0.0.0",
35
- "@tasenor/config": "1.14.1"
34
+ "@tasenor/config": "1.14.3",
35
+ "eslint-config-tasenor": "0.0.0"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@mui/icons-material": "^5.14.1",
@@ -0,0 +1,67 @@
1
+ import { DirectoryPath, NO_SEGMENT, SegmentId, TextFileLine } from '@tasenor/common'
2
+ import { ProcessFile, TransactionImportHandler } from '@tasenor/common-node'
3
+ import dayjs from 'dayjs'
4
+ import { sprintf } from 'sprintf-js'
5
+
6
+ /**
7
+ * Import implementation for Alisa CSV format.
8
+ */
9
+ export class AlisaHandler extends TransactionImportHandler {
10
+
11
+ constructor() {
12
+ super('AlisaImport')
13
+ this.importOptions = {
14
+ parser: 'csv',
15
+ numericFields: ['Amount', 'AmountPaid'],
16
+ requiredFields: ['Type', 'Account'],
17
+ textField: 'Message',
18
+ totalAmountField: 'Amount',
19
+ fieldRemapping: {
20
+ CounterpartyAccountNumber: 'Account',
21
+ CounterpartyName: 'Name',
22
+ CounterpartySpecification: 'Specification',
23
+ },
24
+ csv: {
25
+ cutFromBeginning: 8,
26
+ useFirstLineHeadings: true,
27
+ columnSeparator: ';',
28
+ trimLines: true,
29
+ }
30
+ }
31
+ }
32
+
33
+ get path(): DirectoryPath {
34
+ return __dirname as DirectoryPath
35
+ }
36
+
37
+ canHandle(file: ProcessFile): boolean {
38
+ const data = file.decode()
39
+ const lines = data.substring(0, 150).split('\n')
40
+ const lookup = ['sep=', 'AccountNumber', 'AccountName', 'AccountType', 'CurrencyCode', 'StartDate', 'EndDate', '']
41
+
42
+ for (let i = 0; i < 8; i++) {
43
+ if (lines[i].split(';')[0].trim() !== lookup[i]) {
44
+ return false
45
+ }
46
+ }
47
+
48
+ this.importOptions.csv = this.importOptions.csv || {}
49
+ this.importOptions.csv.columnSeparator = lines[0].trim().split('=')[1]
50
+
51
+ return true
52
+ }
53
+
54
+ segmentId(line: TextFileLine): SegmentId | typeof NO_SEGMENT {
55
+ return line && line.columns ? line.columns.TransactionNumber : NO_SEGMENT
56
+ }
57
+
58
+ time(line: TextFileLine): Date | undefined {
59
+ const time = line.columns.BookingDate
60
+ const re = time && /^(\d\d)\.(\d\d)\.(\d\d\d\d)$/.exec(time)
61
+ if (re && re !== null) {
62
+ return dayjs(sprintf('%04d-%02d-%02d 12:00:00Z', re[3], re[2], re[1])).toDate()
63
+ }
64
+ throw new Error(`Alisa import cannot figure out date from ${JSON.stringify(time)}.`)
65
+ }
66
+
67
+ }
@@ -0,0 +1,24 @@
1
+ import { ImportPlugin } from '@tasenor/common-node'
2
+ import { PluginCode, Version } from '@tasenor/common'
3
+ import { AlisaHandler } from './AlisaHandler'
4
+
5
+ class AlisaImportPlugin extends ImportPlugin {
6
+
7
+ constructor() {
8
+ super(new AlisaHandler())
9
+
10
+ this.code = 'AlisaImport' as PluginCode
11
+ this.title = 'Import for Alisa'
12
+ this.version = '1.0.0' as Version
13
+ this.icon = '<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M5 6.99h3V14h2V6.99h3L9 3zM14 10v7.01h-3L15 21l4-3.99h-3V10z"/></svg>'
14
+ this.releaseDate = '2025-02-09'
15
+ this.use = 'backend'
16
+ this.type = 'import'
17
+ this.description = 'Import plugin for importing transaction data in CSV format provided by Alisa Bank.'
18
+
19
+ this.languages = this.getLanguages()
20
+ }
21
+
22
+ }
23
+
24
+ export default AlisaImportPlugin
@@ -0,0 +1,4 @@
1
+ {
2
+ "rules": [
3
+ ]
4
+ }
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { AlisaHandler } from './AlisaImport/backend/AlisaHandler'
1
2
  export { default as AssetReportBackend } from './AssetReport/backend'
2
3
  export { default as CoinAPIBackend } from './CoinAPI/backend'
3
4
  export { default as CoinbaseImportBackend } from './CoinbaseImport/backend'