@tasenor/common-plugins 1.9.31 → 1.9.32

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.
Files changed (122) hide show
  1. package/package.json +4 -4
  2. package/dist/CoinAPI/backend/index.d.ts +0 -22
  3. package/dist/CoinAPI/backend/index.js +0 -91
  4. package/dist/CoinAPI/backend/index.js.map +0 -1
  5. package/dist/CoinbaseImport/backend/CoinbaseHandler.d.ts +0 -11
  6. package/dist/CoinbaseImport/backend/CoinbaseHandler.js +0 -30
  7. package/dist/CoinbaseImport/backend/CoinbaseHandler.js.map +0 -1
  8. package/dist/CoinbaseImport/backend/index.d.ts +0 -5
  9. package/dist/CoinbaseImport/backend/index.js +0 -18
  10. package/dist/CoinbaseImport/backend/index.js.map +0 -1
  11. package/dist/DocumentCleaner/ui/index.d.ts +0 -43
  12. package/dist/DocumentCleaner/ui/index.js +0 -139
  13. package/dist/DocumentCleaner/ui/index.js.map +0 -1
  14. package/dist/Euro/ui/index.d.ts +0 -15
  15. package/dist/Euro/ui/index.js +0 -22
  16. package/dist/Euro/ui/index.js.map +0 -1
  17. package/dist/Finnish/ui/finnish.json +0 -341
  18. package/dist/Finnish/ui/index.d.ts +0 -17
  19. package/dist/Finnish/ui/index.js +0 -47
  20. package/dist/Finnish/ui/index.js.map +0 -1
  21. package/dist/FinnishBalanceSheetReport/backend/index.d.ts +0 -18
  22. package/dist/FinnishBalanceSheetReport/backend/index.js +0 -96
  23. package/dist/FinnishBalanceSheetReport/backend/index.js.map +0 -1
  24. package/dist/FinnishBalanceSheetReportInvestment/backend/index.d.ts +0 -18
  25. package/dist/FinnishBalanceSheetReportInvestment/backend/index.js +0 -96
  26. package/dist/FinnishBalanceSheetReportInvestment/backend/index.js.map +0 -1
  27. package/dist/FinnishBalanceSheetReportLite/backend/index.d.ts +0 -19
  28. package/dist/FinnishBalanceSheetReportLite/backend/index.js +0 -109
  29. package/dist/FinnishBalanceSheetReportLite/backend/index.js.map +0 -1
  30. package/dist/FinnishIncomeStatementReport/backend/index.d.ts +0 -26
  31. package/dist/FinnishIncomeStatementReport/backend/index.js +0 -190
  32. package/dist/FinnishIncomeStatementReport/backend/index.js.map +0 -1
  33. package/dist/FinnishIncomeStatementReportInvestment/backend/index.d.ts +0 -26
  34. package/dist/FinnishIncomeStatementReportInvestment/backend/index.js +0 -190
  35. package/dist/FinnishIncomeStatementReportInvestment/backend/index.js.map +0 -1
  36. package/dist/FinnishIncomeStatementReportLite/backend/index.d.ts +0 -26
  37. package/dist/FinnishIncomeStatementReportLite/backend/index.js +0 -188
  38. package/dist/FinnishIncomeStatementReportLite/backend/index.js.map +0 -1
  39. package/dist/FinnishInvestmentCompany/backend/index.d.ts +0 -10
  40. package/dist/FinnishInvestmentCompany/backend/index.js +0 -36
  41. package/dist/FinnishInvestmentCompany/backend/index.js.map +0 -1
  42. package/dist/FinnishInvestmentCompany/ui/index.d.ts +0 -16
  43. package/dist/FinnishInvestmentCompany/ui/index.js +0 -22
  44. package/dist/FinnishInvestmentCompany/ui/index.js.map +0 -1
  45. package/dist/FinnishLimitedCompanyComplete/backend/index.d.ts +0 -10
  46. package/dist/FinnishLimitedCompanyComplete/backend/index.js +0 -36
  47. package/dist/FinnishLimitedCompanyComplete/backend/index.js.map +0 -1
  48. package/dist/FinnishLimitedCompanyComplete/ui/index.d.ts +0 -16
  49. package/dist/FinnishLimitedCompanyComplete/ui/index.js +0 -22
  50. package/dist/FinnishLimitedCompanyComplete/ui/index.js.map +0 -1
  51. package/dist/FinnishLimitedCompanyLite/backend/index.d.ts +0 -10
  52. package/dist/FinnishLimitedCompanyLite/backend/index.js +0 -43
  53. package/dist/FinnishLimitedCompanyLite/backend/index.js.map +0 -1
  54. package/dist/FinnishLimitedCompanyLite/ui/index.d.ts +0 -16
  55. package/dist/FinnishLimitedCompanyLite/ui/index.js +0 -24
  56. package/dist/FinnishLimitedCompanyLite/ui/index.js.map +0 -1
  57. package/dist/GitBackup/backend/index.d.ts +0 -26
  58. package/dist/GitBackup/backend/index.js +0 -91
  59. package/dist/GitBackup/backend/index.js.map +0 -1
  60. package/dist/GitBackup/ui/index.d.ts +0 -44
  61. package/dist/GitBackup/ui/index.js +0 -114
  62. package/dist/GitBackup/ui/index.js.map +0 -1
  63. package/dist/IncomeAndExpenses/backend/index.d.ts +0 -5
  64. package/dist/IncomeAndExpenses/backend/index.js +0 -350
  65. package/dist/IncomeAndExpenses/backend/index.js.map +0 -1
  66. package/dist/JournalReport/backend/index.d.ts +0 -15
  67. package/dist/JournalReport/backend/index.js +0 -143
  68. package/dist/JournalReport/backend/index.js.map +0 -1
  69. package/dist/KrakenImport/backend/KrakenHandler.d.ts +0 -23
  70. package/dist/KrakenImport/backend/KrakenHandler.js +0 -83
  71. package/dist/KrakenImport/backend/KrakenHandler.js.map +0 -1
  72. package/dist/KrakenImport/backend/index.d.ts +0 -5
  73. package/dist/KrakenImport/backend/index.js +0 -18
  74. package/dist/KrakenImport/backend/index.js.map +0 -1
  75. package/dist/LedgerReport/backend/index.d.ts +0 -15
  76. package/dist/LedgerReport/backend/index.js +0 -150
  77. package/dist/LedgerReport/backend/index.js.map +0 -1
  78. package/dist/LynxImport/backend/LynxHandler.d.ts +0 -28
  79. package/dist/LynxImport/backend/LynxHandler.js +0 -340
  80. package/dist/LynxImport/backend/LynxHandler.js.map +0 -1
  81. package/dist/LynxImport/backend/index.d.ts +0 -5
  82. package/dist/LynxImport/backend/index.js +0 -18
  83. package/dist/LynxImport/backend/index.js.map +0 -1
  84. package/dist/NordeaImport/backend/NordeaHandler.d.ts +0 -11
  85. package/dist/NordeaImport/backend/NordeaHandler.js +0 -39
  86. package/dist/NordeaImport/backend/NordeaHandler.js.map +0 -1
  87. package/dist/NordeaImport/backend/index.d.ts +0 -5
  88. package/dist/NordeaImport/backend/index.js +0 -18
  89. package/dist/NordeaImport/backend/index.js.map +0 -1
  90. package/dist/NordnetImport/backend/NordnetHandler.d.ts +0 -17
  91. package/dist/NordnetImport/backend/NordnetHandler.js +0 -66
  92. package/dist/NordnetImport/backend/NordnetHandler.js.map +0 -1
  93. package/dist/NordnetImport/backend/index.d.ts +0 -5
  94. package/dist/NordnetImport/backend/index.js +0 -18
  95. package/dist/NordnetImport/backend/index.js.map +0 -1
  96. package/dist/Rand/ui/index.d.ts +0 -15
  97. package/dist/Rand/ui/index.js +0 -22
  98. package/dist/Rand/ui/index.js.map +0 -1
  99. package/dist/RapidAPI/backend/index.d.ts +0 -22
  100. package/dist/RapidAPI/backend/index.js +0 -119
  101. package/dist/RapidAPI/backend/index.js.map +0 -1
  102. package/dist/TITOImport/backend/TITOHandler.d.ts +0 -13
  103. package/dist/TITOImport/backend/TITOHandler.js +0 -241
  104. package/dist/TITOImport/backend/TITOHandler.js.map +0 -1
  105. package/dist/TITOImport/backend/index.d.ts +0 -5
  106. package/dist/TITOImport/backend/index.js +0 -18
  107. package/dist/TITOImport/backend/index.js.map +0 -1
  108. package/dist/TagEditor/ui/index.d.ts +0 -31
  109. package/dist/TagEditor/ui/index.js +0 -349
  110. package/dist/TagEditor/ui/index.js.map +0 -1
  111. package/dist/USDollar/ui/index.d.ts +0 -15
  112. package/dist/USDollar/ui/index.js +0 -22
  113. package/dist/USDollar/ui/index.js.map +0 -1
  114. package/dist/VAT/ui/index.d.ts +0 -69
  115. package/dist/VAT/ui/index.js +0 -509
  116. package/dist/VAT/ui/index.js.map +0 -1
  117. package/dist/VATFinland/backend/index.d.ts +0 -5
  118. package/dist/VATFinland/backend/index.js +0 -17
  119. package/dist/VATFinland/backend/index.js.map +0 -1
  120. package/dist/index.d.ts +0 -28
  121. package/dist/index.js +0 -29
  122. package/dist/index.js.map +0 -1
@@ -1,83 +0,0 @@
1
- import { NO_SEGMENT } from '@tasenor/common';
2
- import { NotImplemented, TransactionImportHandler } from '@tasenor/common-node';
3
- /**
4
- * Import implementation for Coinbase CSV format.
5
- */
6
- export class KrakenHandler extends TransactionImportHandler {
7
- constructor() {
8
- super('KrakenImport');
9
- this.importOptions = {
10
- parser: 'csv',
11
- numericFields: ['amount', 'balance', 'fee'],
12
- requiredFields: [],
13
- textField: 'type',
14
- totalAmountField: 'amount',
15
- csv: { useFirstLineHeadings: true, columnSeparator: ',' }
16
- };
17
- }
18
- canHandle(file) {
19
- return file.firstLineMatch(/^"txid","refid","time","type","subtype","aclass","asset","amount","fee","balance"/) || file.firstLineMatch(/^"txid","refid","time","type","aclass","asset","amount","fee","balance"/);
20
- }
21
- time(line) {
22
- return new Date(line.columns.time.replace(' ', 'T') + 'Z');
23
- }
24
- /**
25
- * Convert Kraken specific assets to commonly used tickers.
26
- * @param aclass
27
- * @param asset
28
- */
29
- ticker(aclass, asset) {
30
- if (aclass === undefined || asset === undefined)
31
- return undefined;
32
- if (aclass !== 'currency') {
33
- throw new NotImplemented(`Kraken handler does not recognize asset class '${aclass}'.`);
34
- }
35
- if (asset.startsWith('Z')) {
36
- return asset.substring(1);
37
- }
38
- const map = {
39
- BCH: 'BCH',
40
- EOS: 'EOS',
41
- SOL: 'SOL',
42
- XETH: 'ETH',
43
- XLTC: 'LTC',
44
- XMLN: 'MLN',
45
- XTZ: 'XTZ',
46
- XXBT: 'BTC',
47
- XXLM: 'XLM',
48
- XXRP: 'XRP',
49
- XZEC: 'ZEC',
50
- };
51
- if (map[asset]) {
52
- return map[asset];
53
- }
54
- throw new NotImplemented(`Kraken handler does not recognize asset '${asset}'.`);
55
- }
56
- /**
57
- * Use transaction IDs for segment ID.
58
- * @param line
59
- * @returns
60
- */
61
- segmentId(line) {
62
- if (line.columns && line.columns.txid) {
63
- return line.columns.refid || NO_SEGMENT;
64
- }
65
- return NO_SEGMENT;
66
- }
67
- async segmentation(process, state) {
68
- const segmented = await super.segmentation(process, state, process.files);
69
- for (const fileName of Object.keys(segmented.files)) {
70
- const file = segmented.files[fileName];
71
- for (let n = 0; n < file.lines.length; n++) {
72
- const { aclass, asset } = file.lines[n].columns;
73
- // Get the standard ticker.
74
- const ticker = this.ticker(aclass, asset);
75
- if (ticker) {
76
- file.lines[n].columns.ticker = ticker;
77
- }
78
- }
79
- }
80
- return segmented;
81
- }
82
- }
83
- //# sourceMappingURL=KrakenHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KrakenHandler.js","sourceRoot":"","sources":["../../../src/KrakenImport/backend/KrakenHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAA2B,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAE,cAAc,EAAwB,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAErG;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,wBAAwB;IAEzD;QACE,KAAK,CAAC,cAAc,CAAC,CAAA;QACrB,IAAI,CAAC,aAAa,GAAG;YACnB,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;YAC3C,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,MAAM;YACjB,gBAAgB,EAAE,QAAQ;YAC1B,GAAG,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE;SAC1D,CAAA;IACH,CAAC;IAED,SAAS,CAAC,IAAiB;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,mFAAmF,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,yEAAyE,CAAC,CAAA;IACnN,CAAC;IAED,IAAI,CAAC,IAAkB;QACrB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;IAC5D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc,EAAE,KAAa;QAClC,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QACjE,IAAI,MAAM,KAAK,UAAU,EAAE;YACzB,MAAM,IAAI,cAAc,CAAC,kDAAkD,MAAM,IAAI,CAAC,CAAA;SACvF;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACzB,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;SAC1B;QACD,MAAM,GAAG,GAAG;YACV,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,KAAK;YACX,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,KAAK;SACZ,CAAA;QACD,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE;YACd,OAAO,GAAG,CAAC,KAAK,CAAC,CAAA;SAClB;QACD,MAAM,IAAI,cAAc,CAAC,4CAA4C,KAAK,IAAI,CAAC,CAAA;IACjF,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,IAAkB;QAC1B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACrC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAA;SACxC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAgB,EAAE,KAAiC;QACpE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QACzE,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACnD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;gBAC/C,2BAA2B;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;gBACzC,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;iBACtC;aACF;SACF;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;CACF"}
@@ -1,5 +0,0 @@
1
- import { ImportPlugin } from '@tasenor/common-node';
2
- declare class KrakenImportPlugin extends ImportPlugin {
3
- constructor();
4
- }
5
- export default KrakenImportPlugin;
@@ -1,18 +0,0 @@
1
- import { ImportPlugin } from '@tasenor/common-node';
2
- import { KrakenHandler } from './KrakenHandler';
3
- class KrakenImportPlugin extends ImportPlugin {
4
- constructor() {
5
- super(new KrakenHandler());
6
- this.code = 'KrakenImport';
7
- this.title = 'Import for Kraken';
8
- this.version = '1.0.38';
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 = '2022-11-06';
11
- this.use = 'backend';
12
- this.type = 'import';
13
- this.description = 'Import plugin for importing transaction data in CSV format provided by Kraken.';
14
- this.languages = this.getLanguages();
15
- }
16
- }
17
- export default KrakenImportPlugin;
18
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/KrakenImport/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,MAAM,kBAAmB,SAAQ,YAAY;IAE3C;QACE,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC,CAAA;QAE1B,IAAI,CAAC,IAAI,GAAG,cAA4B,CAAA;QACxC,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,QAAmB,CAAA;QAClC,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,gFAAgF,CAAA;QAEnG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IACtC,CAAC;CAEF;AAED,eAAe,kBAAkB,CAAA"}
@@ -1,15 +0,0 @@
1
- import { ReportPlugin } from '@tasenor/common-node';
2
- import { Language, ReportColumnDefinition, ReportFormat, ReportID, ReportItem, ReportOptions } from '@tasenor/common';
3
- declare class LedgerReport extends ReportPlugin {
4
- constructor();
5
- forceOptions(): {
6
- negateAssetAndProfit: boolean;
7
- addPreviousPeriod: boolean;
8
- };
9
- getLanguages(): Language[];
10
- getReportStructure(id: ReportID, lang: Language): ReportFormat | undefined;
11
- getReportOptions(): ReportOptions;
12
- getColumns(): Promise<ReportColumnDefinition[]>;
13
- preProcess(id: any, entries: any, options: any): ReportItem[];
14
- }
15
- export default LedgerReport;
@@ -1,150 +0,0 @@
1
- import { ReportPlugin } from '@tasenor/common-node';
2
- class LedgerReport extends ReportPlugin {
3
- constructor() {
4
- super('general-ledger');
5
- this.code = 'LedgerReport';
6
- this.title = 'Ledger Report';
7
- this.version = '1.0.13';
8
- this.icon = '<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><g><path d="M0,0h24v24H0V0z" fill="none"/></g><g><g><path d="M14,5H5v14h14v-9h-5V5z M8,17c-0.55,0-1-0.45-1-1s0.45-1,1-1s1,0.45,1,1S8.55,17,8,17z M8,13 c-0.55,0-1-0.45-1-1s0.45-1,1-1s1,0.45,1,1S8.55,13,8,13z M8,9C7.45,9,7,8.55,7,8s0.45-1,1-1s1,0.45,1,1S8.55,9,8,9z" opacity=".3"/><circle cx="8" cy="8" r="1"/><path d="M15,3H5C3.9,3,3.01,3.9,3.01,5L3,19c0,1.1,0.89,2,1.99,2H19c1.1,0,2-0.9,2-2V9L15,3z M19,19H5V5h9v5h5V19z"/><circle cx="8" cy="12" r="1"/><circle cx="8" cy="16" r="1"/></g></g></svg>';
9
- this.releaseDate = '2022-03-05';
10
- this.use = 'backend';
11
- this.type = 'report';
12
- this.description = 'General purpose ledger report listing all entries in each account. Each account has also running total for balance.';
13
- this.languages = {
14
- en: {
15
- 'report-general-ledger': 'General Ledger'
16
- },
17
- fi: {
18
- 'report-general-ledger': 'Pääkirja'
19
- }
20
- };
21
- }
22
- forceOptions() {
23
- return {
24
- negateAssetAndProfit: false,
25
- addPreviousPeriod: false
26
- };
27
- }
28
- getLanguages() {
29
- return ['fi', 'en'];
30
- }
31
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
32
- getReportStructure(id, lang) {
33
- return '';
34
- }
35
- getReportOptions() {
36
- return {
37
- compact: 'boolean:true'
38
- };
39
- }
40
- async getColumns() {
41
- return [{
42
- type: 'id',
43
- name: 'account',
44
- title: '{column-account-number}'
45
- }, {
46
- type: 'name',
47
- name: 'name',
48
- title: '{column-name-or-date}'
49
- }, {
50
- type: 'numeric',
51
- name: 'debit',
52
- title: '{column-debit}'
53
- }, {
54
- type: 'numeric',
55
- name: 'credit',
56
- title: '{column-credit}'
57
- }, {
58
- type: 'numeric',
59
- name: 'balance',
60
- title: '{column-balance}'
61
- }];
62
- }
63
- preProcess(id, entries, options) {
64
- // Pre-process entries by their account number.
65
- const accounts = {};
66
- const accountNames = {};
67
- entries.forEach((entry) => {
68
- let data;
69
- if (entry.number in accounts) {
70
- data = accounts[entry.number];
71
- }
72
- else {
73
- data = [];
74
- }
75
- data.push({
76
- name: entry.name,
77
- number: entry.number,
78
- documentId: entry.documentId,
79
- description: entry.description,
80
- date: entry.date,
81
- amounts: {
82
- debit: entry.amount >= 0 ? entry.amount : null,
83
- credit: entry.amount < 0 ? -entry.amount : null,
84
- balance: null
85
- }
86
- });
87
- accounts[entry.number] = data;
88
- accountNames[entry.number] = entry.name;
89
- });
90
- const accountNumbers = Object.keys(accounts).sort();
91
- const data = [];
92
- accountNumbers.forEach((number) => {
93
- const lines = accounts[number];
94
- data.push({
95
- tab: 0,
96
- bold: true,
97
- id: number,
98
- name: accountNames[number]
99
- });
100
- let total = 0;
101
- lines.forEach((line) => {
102
- total += line.amounts.debit;
103
- total -= line.amounts.credit;
104
- line.amounts.balance = total;
105
- if (options.compact) {
106
- data.push({
107
- tab: 0,
108
- needLocalization: true,
109
- id: `#${line.documentId}`,
110
- name: `{${this.time2str(line.date)}} ${line.description.replace(/^(\[.+?\])+\s*/g, '')}`,
111
- amounts: line.amounts
112
- });
113
- }
114
- else {
115
- data.push({
116
- tab: 0,
117
- needLocalization: true,
118
- id: `#${line.documentId}`,
119
- name: `{${this.time2str(line.date)}}`
120
- });
121
- data.push({
122
- tab: 0,
123
- useRemainingColumns: true,
124
- italic: true,
125
- name: `${line.description.replace(/^(\[.+?\])+\s*/g, '')}`
126
- });
127
- data.push({
128
- tab: 0,
129
- name: '',
130
- amounts: line.amounts
131
- });
132
- }
133
- });
134
- data.push({
135
- tab: 0,
136
- name: '',
137
- bold: true,
138
- bigger: true,
139
- amounts: {
140
- debit: '',
141
- credit: '',
142
- balance: total
143
- }
144
- });
145
- });
146
- return data;
147
- }
148
- }
149
- export default LedgerReport;
150
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/LedgerReport/backend/index.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- import { ImportStateText, ProcessConfig } from '@tasenor/common';
2
- import { Process, ProcessFile, TransactionImportHandler } from '@tasenor/common-node';
3
- /**
4
- * Import implementation for Lynx CSV format.
5
- */
6
- export declare class LynxHandler extends TransactionImportHandler {
7
- constructor();
8
- canHandle(file: ProcessFile): boolean;
9
- /**
10
- * Special pre-processing for Lynx semi CSV-format. Collect headers and map content of interest to columns.
11
- * @param state
12
- * @returns
13
- */
14
- parse(state: ImportStateText<'initial'>, config: ProcessConfig): Promise<ImportStateText<'segmented'>>;
15
- /**
16
- * Resolve date string for column data extracted.
17
- * @param columns
18
- */
19
- date(columns: Record<string, string>): string;
20
- /**
21
- * Pair dividends and witholding taxes. Other lines are kept as they are.
22
- * @param process
23
- * @param state
24
- * @param files
25
- * @returns
26
- */
27
- segmentation(process: Process, state: ImportStateText<'initial'>): Promise<ImportStateText<'segmented'>>;
28
- }
@@ -1,340 +0,0 @@
1
- import { NO_SEGMENT, warning, month, ucfirst } from '@tasenor/common';
2
- import { InvalidFile, TransactionImportHandler } from '@tasenor/common-node';
3
- // Matcher for ticker and ISIN code.
4
- const TICKER_ISIN_REGEX = /^\s*([-A-Za-z0-9 .]+)\(([A-Z0-9]+)\)/;
5
- // If set, pick only transactions concerning this ticker.
6
- const DEBUG_TICKER = null;
7
- // If set, pick only transactions from this section in CSV file:
8
- // 'Deposits & Withdrawals', 'Interest', 'Trades', 'Corporate Actions', 'Dividends', 'Withholding Tax', 'Fees'.
9
- const DEBUG_TYPE = null;
10
- /**
11
- * Import implementation for Lynx CSV format.
12
- */
13
- export class LynxHandler extends TransactionImportHandler {
14
- constructor() {
15
- super('LynxImport');
16
- this.importOptions = {
17
- parser: 'custom',
18
- requiredFields: ['Amount', 'Quantity'],
19
- numericFields: ['Amount', 'Quantity', 'Proceeds', 'T. Price', 'MTM in Currency', 'Comm/Fee', 'PerAsset', 'Value'],
20
- textField: null,
21
- totalAmountField: null,
22
- };
23
- }
24
- canHandle(file) {
25
- const header = 'Statement,Header,Field Name,Field Value\n';
26
- const str = file.decode();
27
- return str.charCodeAt(0) === 0xfeff &&
28
- str.substr(1, header.length) === header;
29
- }
30
- /**
31
- * Special pre-processing for Lynx semi CSV-format. Collect headers and map content of interest to columns.
32
- * @param state
33
- * @returns
34
- */
35
- async parse(state, config) {
36
- const language = config.language;
37
- const sectionsOfInterest = new Set([
38
- 'Fees',
39
- 'Interest',
40
- 'Trades',
41
- 'Deposits & Withdrawals',
42
- 'Withholding Tax',
43
- 'Dividends',
44
- 'Corporate Actions'
45
- ]);
46
- // Map headers of different sections to the data content and costruct columns.
47
- for (const fileName of Object.keys(state.files)) {
48
- const file = state.files[fileName];
49
- let headers = [];
50
- for (let n = 0; n < file.lines.length; n++) {
51
- // Some info lines has bad quotes, so ignore errors.
52
- const columns = await this.parseCsvLine(file.lines[n].text, { columnSeparator: ',', skipErrors: true });
53
- if (!columns || !sectionsOfInterest.has(columns[0])) {
54
- continue;
55
- }
56
- // Pick headers.
57
- if (columns[1] === 'Header') {
58
- headers = columns;
59
- continue;
60
- }
61
- // Skip summaries and notes.
62
- if (columns[1] === 'Total' || columns[1] === 'SubTotal' || columns[1] === 'Notes') {
63
- continue;
64
- }
65
- if (columns[2] && columns[2].startsWith('Total')) {
66
- continue;
67
- }
68
- // Skip dividend section with `Code` to avoid duplicate dividends.
69
- if (headers[0] === 'Dividends' && headers[6] === 'Code') {
70
- continue;
71
- }
72
- if (DEBUG_TICKER) {
73
- if (columns[0] === 'Deposits & Withdrawals' || columns[0] === 'Interest')
74
- continue;
75
- if (columns[0] === 'Trades' && columns[5] !== DEBUG_TICKER)
76
- continue;
77
- if (columns[0] === 'Corporate Actions' && !columns[6].startsWith(DEBUG_TICKER))
78
- continue;
79
- if (columns[0] === 'Dividends' && !columns[4].startsWith(DEBUG_TICKER))
80
- continue;
81
- if (columns[0] === 'Withholding Tax' && !columns[4].startsWith(DEBUG_TICKER))
82
- continue;
83
- }
84
- if (DEBUG_TYPE) {
85
- if (columns[0] !== DEBUG_TYPE)
86
- continue;
87
- }
88
- const values = { Type: headers[0], Subtype: '', Description: '' };
89
- for (let i = 2; i < columns.length; i++) {
90
- values[headers[i] || `Column${i}`] = columns[i];
91
- }
92
- // Add ISIN and Ticker for dividends and tax
93
- if (['Dividends', 'Withholding Tax'].includes(values.Type)) {
94
- const match = TICKER_ISIN_REGEX.exec(values.Description);
95
- if (!match) {
96
- throw new InvalidFile(`Failed to extract ticker and ISIN from a line '${values.Description}'.`);
97
- }
98
- values.Ticker = match[1].trim();
99
- values.ISIN = match[2];
100
- // Parse more fields from dividend.
101
- if (values.Type === 'Dividends') {
102
- let text = values.Description.replace(TICKER_ISIN_REGEX, '').trim();
103
- text = text.replace(values.Ticker, '');
104
- text = text.replace(/\(\s*\)/g, '');
105
- text = text.replace(/\s\s+/g, ' ');
106
- let perAsset = /\b([0-9.]+)\s+per\s+share\b/i.exec(text);
107
- if (!perAsset) {
108
- const regex = new RegExp(`${values.Currency}\\s+([0-9.]+)\\s`);
109
- perAsset = regex.exec(text);
110
- }
111
- if (perAsset) {
112
- values.PerAsset = perAsset[1];
113
- }
114
- else {
115
- warning(`Failed to find per share dividend from a line '${values.Description}'.`);
116
- values.PerAsset = undefined;
117
- }
118
- }
119
- }
120
- // Add ISIN and Ticker for corporate actions and try to extract some info.
121
- if (values.Type === 'Corporate Actions') {
122
- let match = TICKER_ISIN_REGEX.exec(values.Description);
123
- if (!match) {
124
- throw new InvalidFile(`Failed to extract ticker and ISIN from a line '${values.Description}'.`);
125
- }
126
- values.Ticker = match[1].trim();
127
- values.ISIN = match[2];
128
- let text = values.Description.replace(TICKER_ISIN_REGEX, '').trim();
129
- if (text.startsWith('CUSIP/ISIN Change to ')) {
130
- values.Action = 'Renaming';
131
- text = text.substring(21);
132
- }
133
- else {
134
- match = /^(\w+)/.exec(text);
135
- if (!match) {
136
- throw new InvalidFile(`Cannot extract corporate action from a line '${values.Description}'.`);
137
- }
138
- values.Action = ucfirst(match[1]);
139
- text = text.replace(/^\w+/, '').trim();
140
- }
141
- match = /^\((\w+)\)/.exec(text);
142
- values.SubAction = match ? ucfirst(match[1]) : '';
143
- text = text.replace(/^\((\w+)\)/, '').trim();
144
- match = /\b(\d+)\s+for\s+(\d+)\s/i.exec(text);
145
- if (match) {
146
- values.Ratio = `${parseInt(match[1])}/${parseInt(match[2])}`;
147
- values.RatioDecimal = `${parseInt(match[1]) / parseInt(match[2])}`;
148
- }
149
- else {
150
- values.Ratio = '';
151
- values.RatioDecimal = '';
152
- }
153
- match = /.*\(([A-Z0-9 .]+),\s+.*?\)/.exec(text);
154
- values.TickerInText = match ? match[1] : '';
155
- }
156
- // Rename some currency dependent fields.
157
- if (values[`Comm in ${config.currency}`] !== undefined) {
158
- values['Comm in Currency'] = values[`Comm in ${config.currency}`];
159
- delete values[`Comm in ${config.currency}`];
160
- }
161
- if (values[`MTM in ${config.currency}`] !== undefined) {
162
- values['MTM in Currency'] = values[`MTM in ${config.currency}`];
163
- delete values[`MTM in ${config.currency}`];
164
- }
165
- // Trim the quantity's confusing desimal point.
166
- if (values.Quantity && values.Type === 'Trades') {
167
- values.Quantity = values.Quantity.replace(/,(\d\d\d)$/g, '$1');
168
- }
169
- // Fix Date/Time.
170
- if (values['Date/Time']) {
171
- values['Date/Time'] = values['Date/Time'].replace(',', '');
172
- }
173
- // Pick interest period.
174
- if (values.Type === 'Interest') {
175
- const re = /\s([A-Z][a-z][a-z])-(\d\d\d\d)$/.exec(values.Description);
176
- values.Month = re ? ucfirst(await this.getTranslation(month(re[1]) || '', language)) : '';
177
- values.Year = re ? re[2] : '';
178
- }
179
- // Ensure at least empty `Action` for easier processing in rules.
180
- values.Action = values.Action || '';
181
- file.lines[n].columns = values;
182
- }
183
- }
184
- const newState = {
185
- ...state,
186
- stage: 'segmented'
187
- };
188
- return newState;
189
- }
190
- /**
191
- * Resolve date string for column data extracted.
192
- * @param columns
193
- */
194
- date(columns) {
195
- // Mapping from types to date fields.
196
- const dateField = {
197
- Fees: 'Date',
198
- Interest: 'Date',
199
- Dividends: 'Date',
200
- Trades: 'Date/Time',
201
- 'Corporate Actions': 'Date/Time',
202
- 'Deposits & Withdrawals': 'Settle Date',
203
- 'Withholding Tax': 'Date'
204
- };
205
- let date = columns[dateField[columns.Type]];
206
- if (!date) {
207
- throw new InvalidFile(`Unable to determine timestamp from ${JSON.stringify(columns)}.`);
208
- }
209
- if (date.length < 12) {
210
- date += 'T00:00:00Z';
211
- }
212
- return date;
213
- }
214
- /**
215
- * Pair dividends and witholding taxes. Other lines are kept as they are.
216
- * @param process
217
- * @param state
218
- * @param files
219
- * @returns
220
- */
221
- async segmentation(process, state) {
222
- // Parse to get column content.
223
- const parsed = await this.parse(state, process.config);
224
- parsed.segments = {};
225
- // Collect dividend line numbers per ISIN + date combination.
226
- const actionLines = {};
227
- const dividendSegments = {};
228
- for (const fileName of Object.keys(parsed.files)) {
229
- const file = parsed.files[fileName];
230
- for (let n = 0; n < file.lines.length; n++) {
231
- const { Type, ISIN } = file.lines[n].columns;
232
- if (Type === 'Dividends') {
233
- const date = this.date(file.lines[n].columns);
234
- const key = `${date} ${ISIN}`;
235
- if (dividendSegments[key] === undefined) {
236
- const segmentId = this.segmentId(file.lines[n]);
237
- if (segmentId === NO_SEGMENT) {
238
- throw new InvalidFile(`Failed to find segment for ${JSON.stringify(file.lines[n].columns)}`);
239
- }
240
- dividendSegments[key] = segmentId;
241
- }
242
- file.lines[n].segmentId = dividendSegments[key];
243
- const segmentId = dividendSegments[key];
244
- parsed.segments[segmentId] = parsed.segments[segmentId] || { id: segmentId, time: new Date(date), lines: [] };
245
- parsed.segments[segmentId].lines.push({ number: n, file: fileName });
246
- }
247
- else if (Type === 'Corporate Actions') {
248
- const Date = this.date(file.lines[n].columns);
249
- const key = `${Date} ${ISIN}`;
250
- actionLines[key] = actionLines[key] || [];
251
- actionLines[key].push(n);
252
- }
253
- }
254
- }
255
- // Go through withholding taxes and share the segment ID with the dividend and the tax.
256
- // Recognize tax adjustments and collect them for further processing.
257
- // For other lines, get own segment ID.
258
- const taxFixSegments = {};
259
- for (const fileName of Object.keys(parsed.files)) {
260
- const file = parsed.files[fileName];
261
- for (let n = 0; n < file.lines.length; n++) {
262
- const { Type, ISIN, Description } = file.lines[n].columns;
263
- if (!Type) {
264
- continue;
265
- }
266
- // Get the timestamp.
267
- const date = this.date(file.lines[n].columns);
268
- const time = new Date(date);
269
- if (Type === 'Withholding Tax') {
270
- // Group withholding tax entries with the corresponding dividend, if possible.
271
- const key = `${date} ${ISIN}`;
272
- let segmentId;
273
- if (dividendSegments[key] === undefined) {
274
- // Sometimes there are corrections afterwards. Let us then just adjust withholding taxes.
275
- segmentId = taxFixSegments[key] || this.segmentId(file.lines[n]);
276
- if (segmentId === NO_SEGMENT) {
277
- throw new InvalidFile(`Failed to find segment for ${JSON.stringify(file.lines[n].columns)}`);
278
- }
279
- taxFixSegments[key] = segmentId;
280
- file.lines[n].columns.Subtype = 'Adjustment';
281
- }
282
- else {
283
- segmentId = dividendSegments[key];
284
- file.lines[n].columns.Subtype = 'Tax';
285
- }
286
- file.lines[n].segmentId = segmentId;
287
- parsed.segments[segmentId] = parsed.segments[segmentId] || { id: segmentId, time, lines: [] };
288
- parsed.segments[segmentId].lines.push({ number: n, file: fileName });
289
- }
290
- else if (Type === 'Corporate Actions') {
291
- const key = `${date} ${ISIN}`;
292
- if (!actionLines[key]) {
293
- throw new InvalidFile(`Unable to find matching corporate action for a line '${Description}.`);
294
- }
295
- // Use the first segmentId for all lines.
296
- let segmentId;
297
- for (const line of actionLines[key]) {
298
- if (file.lines[line].segmentId) {
299
- continue;
300
- }
301
- if (!segmentId) {
302
- segmentId = this.segmentId(file.lines[n]);
303
- parsed.segments[segmentId] = { id: segmentId, time, lines: [] };
304
- }
305
- file.lines[line].segmentId = segmentId;
306
- parsed.segments[segmentId].lines.push({ number: line, file: fileName });
307
- }
308
- }
309
- else if (Type === 'Deposits & Withdrawals') {
310
- // Determine subtype for the line.
311
- if (/Electronic Fund Transfer/.test(Description)) {
312
- file.lines[n].columns.Subtype = 'Deposit';
313
- }
314
- else if (/Disbursement Initiated by/.test(Description)) {
315
- file.lines[n].columns.Subtype = 'Withdrawal';
316
- }
317
- else if (/^Adjustment:/.test(Description)) {
318
- file.lines[n].columns.Subtype = 'Adjustment';
319
- }
320
- else {
321
- warning(`Unable to determine subtype for Deposits & Withdrawals '${Description}'.`);
322
- }
323
- }
324
- // For those not yet assigned, just record a single line segment.
325
- if (!file.lines[n].segmentId) {
326
- const segmentId = this.segmentId(file.lines[n]);
327
- if (segmentId !== NO_SEGMENT) {
328
- file.lines[n].segmentId = segmentId;
329
- parsed.segments[segmentId] = parsed.segments[segmentId] || { id: segmentId, time, lines: [] };
330
- parsed.segments[segmentId].lines.push({ number: n, file: fileName });
331
- }
332
- }
333
- }
334
- }
335
- const final = await this.segmentationPostProcess(parsed);
336
- this.debugSegmentation(final);
337
- return final;
338
- }
339
- }
340
- //# sourceMappingURL=LynxHandler.js.map