@tasenor/common-plugins 1.9.125 → 1.9.127

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 (56) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-ci.log +2 -2
  3. package/data/TickerData.mjs +8 -0
  4. package/dist/AssetReport/backend/index.d.ts +2 -2
  5. package/dist/AssetReport/backend/index.js +17 -7
  6. package/dist/AssetReport/backend/index.js.map +1 -1
  7. package/dist/FinnishBalanceSheetReport/backend/index.d.ts +2 -2
  8. package/dist/FinnishBalanceSheetReport/backend/index.js +2 -2
  9. package/dist/FinnishBalanceSheetReport/backend/index.js.map +1 -1
  10. package/dist/FinnishBalanceSheetReportLite/backend/index.d.ts +2 -2
  11. package/dist/FinnishBalanceSheetReportLite/backend/index.js +2 -2
  12. package/dist/FinnishBalanceSheetReportLite/backend/index.js.map +1 -1
  13. package/dist/FinnishIncomeStatementReport/backend/index.d.ts +2 -2
  14. package/dist/FinnishIncomeStatementReport/backend/index.js +2 -2
  15. package/dist/FinnishIncomeStatementReport/backend/index.js.map +1 -1
  16. package/dist/FinnishIncomeStatementReportLite/backend/index.d.ts +2 -2
  17. package/dist/FinnishIncomeStatementReportLite/backend/index.js +2 -2
  18. package/dist/FinnishIncomeStatementReportLite/backend/index.js.map +1 -1
  19. package/dist/IncomeAndExpenses/backend/index.js +1 -1
  20. package/dist/IncomeAndExpenses/backend/index.js.map +1 -1
  21. package/dist/JournalReport/backend/index.d.ts +1 -1
  22. package/dist/JournalReport/backend/index.js +1 -1
  23. package/dist/JournalReport/backend/index.js.map +1 -1
  24. package/dist/LedgerReport/backend/index.d.ts +1 -1
  25. package/dist/LedgerReport/backend/index.js +1 -1
  26. package/dist/LedgerReport/backend/index.js.map +1 -1
  27. package/dist/TickerData/backend/index.d.ts +57 -0
  28. package/dist/TickerData/backend/index.js +212 -0
  29. package/dist/TickerData/backend/index.js.map +1 -0
  30. package/dist/VATFinland/backend/index.js +1 -1
  31. package/dist/VATFinland/backend/index.js.map +1 -1
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.js +1 -0
  34. package/dist/index.js.map +1 -1
  35. package/package.json +7 -6
  36. package/src/AssetReport/backend/index.ts +19 -7
  37. package/src/FinnishBalanceSheetReport/backend/index.ts +2 -2
  38. package/src/FinnishBalanceSheetReportLite/backend/index.ts +2 -2
  39. package/src/FinnishIncomeStatementReport/backend/index.ts +2 -2
  40. package/src/FinnishIncomeStatementReportLite/backend/index.ts +2 -2
  41. package/src/IncomeAndExpenses/backend/index.ts +1 -1
  42. package/src/JournalReport/backend/index.ts +1 -1
  43. package/src/LedgerReport/backend/index.ts +1 -1
  44. package/src/TickerData/backend/cryptocurrencies.json +3762 -0
  45. package/src/TickerData/backend/currencies.json +181 -0
  46. package/src/TickerData/backend/etf.json +3339 -0
  47. package/src/TickerData/backend/hel.json +144 -0
  48. package/src/TickerData/backend/index.ts +241 -0
  49. package/src/TickerData/backend/nasdaq.json +505 -0
  50. package/src/TickerData/backend/nyse.json +514 -0
  51. package/src/TickerData/backend/otc.json +3 -0
  52. package/src/TickerData/backend/tal.json +36 -0
  53. package/src/TickerData/backend/tsx.json +421 -0
  54. package/src/TickerData/backend/xetra.json +15 -0
  55. package/src/VATFinland/backend/index.ts +1 -1
  56. package/src/index.ts +1 -0
@@ -0,0 +1,212 @@
1
+ import { DataPlugin } from '@tasenor/common-node';
2
+ import { ALL, error } from '@tasenor/common';
3
+ /**
4
+ * Data sets for stock tickers and crypto currencies.
5
+ *
6
+ * Backend Queries:
7
+ *
8
+ * * (*exchange*, ALL) - List of all known exhanges.
9
+ * * (*exchange*, *code*) - Exchange data if code, name or alias match, null otherwise.
10
+ * * (*ticker*, *type*:*code*) - Lookup from all exchanges the specific ticker of the given type.
11
+ * * (*ticker*, *type*:*exchange*:*code*) - Lookup from the given exchange the specific ticker.
12
+ *
13
+ * Data sources and/or ideas:
14
+ *
15
+ * * HEL - Manually constructed from public Nasdaq Helsinki data.
16
+ * * TAL - Manually constructed from public Nasdaq Helsinki data.
17
+ * * crypto - https://github.com/crypti/cryptocurrencies/blob/master/cryptocurrencies.json
18
+ *
19
+ * ...others done manually so far (need some source and conversion tool)...
20
+ *
21
+ * Note: there is useful tool to generate from CSV in `tasenor-bookkeeper/apps/cli/bin/convert-csv-to-map.mjs`.
22
+ *
23
+ * Data file is simply a mapping from ticker to its name. If the ticker has aliases, it can be expressed
24
+ * as an array like
25
+ * {
26
+ * ...
27
+ * "MAIN": ["Name of the main", "ALIAS1", "ALIAS2"]
28
+ * ...
29
+ * }
30
+ */
31
+ class TickerData extends DataPlugin {
32
+ // TODO: Currency name data.
33
+ constructor() {
34
+ super({ common: [], backend: ['exchange', 'ticker'] });
35
+ this.code = 'TickerData';
36
+ this.title = 'Asset ticker names';
37
+ this.version = '1.0.0';
38
+ 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="M16 7H5v10h11l3.55-5z" opacity=".3"/><path d="M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16zM16 17H5V7h11l3.55 5L16 17z"/></svg>';
39
+ this.releaseDate = '2024-01-15';
40
+ this.use = 'backend';
41
+ this.type = 'data';
42
+ this.description = 'List of stock tickers and exchanges and their names. Lookup services for those.';
43
+ this.languages = {};
44
+ }
45
+ async queryBackend(dataSet, query) {
46
+ if (dataSet === 'exchange') {
47
+ return this.queryExchange(query);
48
+ }
49
+ if (dataSet === 'ticker' && query !== ALL) {
50
+ return this.queryTicker(query);
51
+ }
52
+ return undefined;
53
+ }
54
+ async queryExchange(query) {
55
+ if (query === ALL) {
56
+ // This also priority order if there is no better knowledge for ticker exchange, when queried.
57
+ return [
58
+ {
59
+ code: 'ETF',
60
+ name: 'List of ETFs',
61
+ aliases: [],
62
+ file: 'etf.json',
63
+ type: 'stock'
64
+ },
65
+ {
66
+ code: 'NYSE',
67
+ name: 'New York Stock Exchange',
68
+ aliases: [],
69
+ file: 'nyse.json',
70
+ type: 'stock'
71
+ },
72
+ {
73
+ code: 'NASDAQ',
74
+ name: 'The Nasdaq Stock Market',
75
+ aliases: ['Nasdaq', 'National Association of Securities Dealers Automated Quotations'],
76
+ file: 'nasdaq.json',
77
+ type: 'stock'
78
+ },
79
+ {
80
+ code: 'XETRA',
81
+ name: 'Deutsche Börse',
82
+ aliases: [],
83
+ file: 'xetra.json',
84
+ type: 'stock'
85
+ },
86
+ {
87
+ code: 'HEL',
88
+ name: 'Nasdaq Helsinki',
89
+ aliases: ['HE'],
90
+ file: 'hel.json',
91
+ type: 'stock'
92
+ },
93
+ {
94
+ code: 'TAL',
95
+ name: 'Nasdaq Tallinn',
96
+ aliases: ['TL'],
97
+ file: 'tal.json',
98
+ type: 'stock'
99
+ },
100
+ {
101
+ code: 'OTC',
102
+ name: 'Over the Counter',
103
+ aliases: ['PINK', 'Pink Sheets'],
104
+ file: 'otc.json',
105
+ type: 'stock'
106
+ },
107
+ {
108
+ code: 'TSX',
109
+ name: 'Toronto Stock Exchange',
110
+ aliases: ['TO'],
111
+ file: 'tsx.json',
112
+ type: 'stock'
113
+ },
114
+ {
115
+ code: 'CRYPTO',
116
+ name: 'Crypto Currency',
117
+ aliases: [],
118
+ file: 'cryptocurrencies.json',
119
+ type: 'crypto'
120
+ },
121
+ {
122
+ code: 'CURRENCY',
123
+ name: 'Currency',
124
+ aliases: [],
125
+ file: 'currencies.json',
126
+ type: 'currency'
127
+ },
128
+ ];
129
+ }
130
+ const all = await this.queryExchange(ALL);
131
+ for (const ex of all) {
132
+ if (ex.code === query || ex.name === query || ex.aliases.includes(query)) {
133
+ return ex;
134
+ }
135
+ }
136
+ return undefined;
137
+ }
138
+ /**
139
+ * Fill in aliases.
140
+ */
141
+ afterLoad(fileName, data) {
142
+ Object.keys(data).forEach(ticker => {
143
+ if (data[ticker] instanceof Array) {
144
+ for (const alias of data[ticker].splice(1)) {
145
+ if (data[`${alias}`] !== undefined) {
146
+ error(`${this.code}: Cannot re-use '${alias}' as an alias since it has already used as ${JSON.stringify(data[`${alias}`])}.`);
147
+ }
148
+ else {
149
+ data[`${alias}`] = data[ticker][0];
150
+ }
151
+ }
152
+ data[ticker] = data[ticker][0];
153
+ }
154
+ });
155
+ return data;
156
+ }
157
+ /**
158
+ * If the result is ambiquous, all results are returned.
159
+ */
160
+ async queryTicker(query) {
161
+ if (query.indexOf(':') < 0) {
162
+ error(`${this.code}: Invalid query '${query}' for plugin '${this.code}'.`);
163
+ return undefined;
164
+ }
165
+ const parts = query.split(':');
166
+ const type = parts[0];
167
+ const exchange = parts.length >= 3 ? parts[1] : null;
168
+ const ticker = parts.length >= 3 ? parts[2] : parts[1];
169
+ // Single exchange.
170
+ if (exchange !== null) {
171
+ const ex = await this.queryExchange(exchange);
172
+ if (ex === undefined) {
173
+ return undefined;
174
+ }
175
+ if (ex.type !== type) {
176
+ error(`${this.code}: Invalid type '${type}' when queried from exchange '${exchange}'.`);
177
+ return undefined;
178
+ }
179
+ const tickers = this.loadCached(ex.file);
180
+ if (tickers[ticker] === undefined) {
181
+ return undefined;
182
+ }
183
+ return [{
184
+ exchange: { code: ex.code, name: ex.name, aliases: ex.aliases },
185
+ ticker,
186
+ name: tickers[ticker],
187
+ aliases: []
188
+ }];
189
+ }
190
+ // Scan all exchanges.
191
+ let result = [];
192
+ let typeFound = false;
193
+ for (const ex of await this.queryExchange(ALL)) {
194
+ if (ex.type === type) {
195
+ typeFound = true;
196
+ const match = await this.queryTicker(`${type}:${ex.code}:${ticker}`);
197
+ if (match !== undefined) {
198
+ result = result.concat(match);
199
+ }
200
+ }
201
+ }
202
+ if (result.length) {
203
+ return result;
204
+ }
205
+ if (!typeFound) {
206
+ error(`${this.code}: Cannot find any exchange to provide data for type '${type}'.`);
207
+ }
208
+ return undefined;
209
+ }
210
+ }
211
+ export default TickerData;
212
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/TickerData/backend/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { DataPlugin } from '@tasenor/common-node';
2
2
  class VATFinland extends DataPlugin {
3
3
  constructor() {
4
- super('vat');
4
+ super({ common: ['vat'], backend: [] });
5
5
  this.code = 'VATFinland';
6
6
  this.title = 'VAT Data for Finland';
7
7
  this.version = '1.0.12';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/VATFinland/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjD,MAAM,UAAW,SAAQ,UAAU;IACjC;QACE,KAAK,CAAC,KAAK,CAAC,CAAA;QAEZ,IAAI,CAAC,IAAI,GAAG,YAAyB,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,sBAAsB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,QAAmB,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,mkBAAmkB,CAAA;QAC/kB,IAAI,CAAC,WAAW,GAAG,YAAY,CAAA;QAC/B,IAAI,CAAC,GAAG,GAAG,SAAS,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAA;QAClB,IAAI,CAAC,WAAW,GAAG,+DAA+D,CAAA;QAElF,IAAI,CAAC,SAAS,GAAG,EAChB,CAAA;IACH,CAAC;CACF;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/VATFinland/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGjD,MAAM,UAAW,SAAQ,UAAU;IACjC;QACE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;QAEvC,IAAI,CAAC,IAAI,GAAG,YAAyB,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,sBAAsB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,QAAmB,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,mkBAAmkB,CAAA;QAC/kB,IAAI,CAAC,WAAW,GAAG,YAAY,CAAA;QAC/B,IAAI,CAAC,GAAG,GAAG,SAAS,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAA;QAClB,IAAI,CAAC,WAAW,GAAG,+DAA+D,CAAA;QAElF,IAAI,CAAC,SAAS,GAAG,EAChB,CAAA;IACH,CAAC;CACF;AAED,eAAe,UAAU,CAAA"}
package/dist/index.d.ts CHANGED
@@ -21,6 +21,7 @@ export { NordeaHandler } from './NordeaImport/backend/NordeaHandler';
21
21
  export { default as NordnetImportBackend } from './NordnetImport/backend';
22
22
  export { NordnetHandler } from './NordnetImport/backend/NordnetHandler';
23
23
  export { default as RapidAPIBackend } from './RapidAPI/backend';
24
+ export { default as TickerDataBackend } from './TickerData/backend';
24
25
  export { default as TITOImportBackend } from './TITOImport/backend';
25
26
  export { TITOHandler } from './TITOImport/backend/TITOHandler';
26
27
  export { default as VATFinlandBackend } from './VATFinland/backend';
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ export { NordeaHandler } from './NordeaImport/backend/NordeaHandler';
21
21
  export { default as NordnetImportBackend } from './NordnetImport/backend';
22
22
  export { NordnetHandler } from './NordnetImport/backend/NordnetHandler';
23
23
  export { default as RapidAPIBackend } from './RapidAPI/backend';
24
+ export { default as TickerDataBackend } from './TickerData/backend';
24
25
  export { default as TITOImportBackend } from './TITOImport/backend';
25
26
  export { TITOHandler } from './TITOImport/backend/TITOHandler';
26
27
  export { default as VATFinlandBackend } from './VATFinland/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,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,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,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,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,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.9.125",
3
+ "version": "1.9.127",
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>",
@@ -9,12 +9,13 @@
9
9
  "types": "src/index.ts",
10
10
  "dependencies": {
11
11
  "clone": "^2.1.2",
12
+ "currency-codes": "^2.1.0",
12
13
  "dayjs": "1.10.8",
13
14
  "sprintf-js": "^1.1.2",
14
15
  "tsx": "3.12.7",
15
- "@tasenor/common": "1.9.125",
16
- "@tasenor/common-node": "1.9.125",
17
- "@tasenor/common-ui": "1.9.125"
16
+ "@tasenor/common": "1.9.127",
17
+ "@tasenor/common-ui": "1.9.127",
18
+ "@tasenor/common-node": "1.9.127"
18
19
  },
19
20
  "devDependencies": {
20
21
  "@mui/icons-material": "^5.14.1",
@@ -30,8 +31,8 @@
30
31
  "react-i18next": "^13.0.2",
31
32
  "react-router-dom": "^6.14.1",
32
33
  "typescript": "^5.1.6",
33
- "eslint-config-tasenor": "0.0.0",
34
- "@tasenor/config": "1.9.125"
34
+ "@tasenor/config": "1.9.127",
35
+ "eslint-config-tasenor": "0.0.0"
35
36
  },
36
37
  "peerDependencies": {
37
38
  "@mui/icons-material": "^5.14.1",
@@ -1,4 +1,4 @@
1
- import { AccountNumber, Language, PluginCode, ReportColumnDefinition, ReportData, ReportID, ReportLine, ReportMeta, ReportOptions, ReportQueryParams, StockBookkeeping, StockChangeData, Version } from '@tasenor/common'
1
+ import { AccountNumber, Language, PluginCode, ReportColumnDefinition, ReportData, ReportID, ReportLine, ReportMeta, ReportOptions, ReportQueryParams, StockBookkeeping, StockChangeData, Version, getBackendCatalog } from '@tasenor/common'
2
2
  import { ReportPlugin } from '@tasenor/common-node'
3
3
  import dayjs from 'dayjs'
4
4
  import quarterOfYear from 'dayjs/plugin/quarterOfYear'
@@ -56,7 +56,8 @@ class AssetReport extends ReportPlugin {
56
56
  {
57
57
  name: 'title',
58
58
  title: '',
59
- type: 'name'
59
+ type: 'name',
60
+ width: 5,
60
61
  },
61
62
  {
62
63
  name: 'ticker',
@@ -89,10 +90,11 @@ class AssetReport extends ReportPlugin {
89
90
  * Gather ticker counts for each account.
90
91
  */
91
92
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
92
- preProcess(id: ReportID, entries: ReportData[], options: ReportQueryParams, settings: ReportMeta, columns: ReportColumnDefinition[]): ReportLine[] {
93
+ async preProcess(id: ReportID, entries: ReportData[], options: ReportQueryParams, settings: ReportMeta, columns: ReportColumnDefinition[]): Promise<ReportLine[]> {
93
94
 
94
95
  const stock: Record<AccountNumber, { data: StockChangeData, time: Date }[]> = {}
95
96
  const names: Record<AccountNumber, string> = {}
97
+ const types: Record<AccountNumber, string> = {}
96
98
 
97
99
  const lines: ReportLine[] = []
98
100
 
@@ -105,9 +107,12 @@ class AssetReport extends ReportPlugin {
105
107
  data: entry.data as StockChangeData,
106
108
  time: new Date(entry.date)
107
109
  })
110
+ if (entry.accountData && entry.accountData.code) {
111
+ types[entry.number] = entry.accountData.code
112
+ }
108
113
  })
109
114
 
110
- Object.keys(stock).forEach(number => {
115
+ for (const number of Object.keys(stock)) {
111
116
  const bookkeeping = new StockBookkeeping(number)
112
117
  bookkeeping.applyAll(stock[number])
113
118
  lines.push({
@@ -119,15 +124,22 @@ class AssetReport extends ReportPlugin {
119
124
  name: `${number} ${names[number]}`,
120
125
  values: { }
121
126
  })
127
+ lines.push({ paragraphBreak: true })
128
+
129
+ const type = ['CRYPTOCURRENCIES'].includes(types[number]) ? 'crypto' : 'stock'
130
+
122
131
  // Note: we could construct also detailed changes at this point, if we want detailed version of the report.
123
132
  let total = 0
124
133
  const totals = bookkeeping.totals().sort((a, b) => a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0))
125
134
  for (const [, asset, amount] of totals) {
126
135
  if (amount) {
127
136
  const value = bookkeeping.value(asset)
137
+ const tickers = await getBackendCatalog().queryBackend('ticker', `${type}:${asset}`)
138
+ // TODO: How to differentiate between multiple answers? Perhaps need to ask during the import and store somehow?
139
+ // If so, we need to query `${type}:${exchange}:${asset}` instead.
128
140
  total += value
129
141
  lines.push({
130
- tab: 4,
142
+ name: tickers && tickers instanceof Array && tickers.length ? tickers[0].name : '',
131
143
  values: {
132
144
  ticker: asset,
133
145
  count: amount,
@@ -147,12 +159,12 @@ class AssetReport extends ReportPlugin {
147
159
  }
148
160
  })
149
161
  lines.push({ paragraphBreak: true })
150
- })
162
+ }
151
163
 
152
164
  return lines
153
165
  }
154
166
 
155
- postProcess(id, data) {
167
+ async postProcess(id, data) {
156
168
  return data
157
169
  }
158
170
  }
@@ -66,7 +66,7 @@ class FinnishBalanceSheetReport extends ReportPlugin {
66
66
  }
67
67
  }
68
68
 
69
- preProcess(id, entries, options, settings, columns): ReportLine[] {
69
+ async preProcess(id, entries, options, settings, columns): Promise<ReportLine[]> {
70
70
  const columnNames = columns.map((col) => col.name)
71
71
 
72
72
  // Summarize all totals from the entries.
@@ -88,7 +88,7 @@ class FinnishBalanceSheetReport extends ReportPlugin {
88
88
  /**
89
89
  * Mark mismatching Vastaavaa and Vastattavaa with red.
90
90
  */
91
- postProcess(id, data) {
91
+ async postProcess(id, data) {
92
92
  const liabilities = data.find(line => line.name === 'Vastattavaa yhteensä')
93
93
  const assets = data.find(line => line.name === 'Vastaavaa yhteensä')
94
94
  if (liabilities && assets) {
@@ -80,7 +80,7 @@ class FinnishBalanceSheetReportLite extends ReportPlugin {
80
80
  return columns
81
81
  }
82
82
 
83
- preProcess(id, entries, options, settings, columns) {
83
+ async preProcess(id, entries, options, settings, columns) {
84
84
  const columnNames = columns.map((col) => col.name)
85
85
 
86
86
  // Summarize all totals from the entries.
@@ -102,7 +102,7 @@ class FinnishBalanceSheetReportLite extends ReportPlugin {
102
102
  /**
103
103
  * Mark mismatching Vastaavaa and Vastattavaa with red.
104
104
  */
105
- postProcess(id, data) {
105
+ async postProcess(id, data) {
106
106
  const liabilities = data.find(line => line.name === 'Vastattavaa yhteensä')
107
107
  const assets = data.find(line => line.name === 'Vastaavaa yhteensä')
108
108
  if (liabilities && assets) {
@@ -154,7 +154,7 @@ class FinnishIncomeStatementReport extends ReportPlugin {
154
154
  return this.parseAndCombineReport([...accountNumbers], accountNames, columns, options.format, totals)
155
155
  }
156
156
 
157
- preProcess(id, entries, options, settings, columns) {
157
+ async preProcess(id, entries, options, settings, columns) {
158
158
  if (options.byTags) {
159
159
  return this.preProcessByTags(id, entries, options, settings, columns)
160
160
  }
@@ -180,7 +180,7 @@ class FinnishIncomeStatementReport extends ReportPlugin {
180
180
  /**
181
181
  * Remove empty columns if report made by tags.
182
182
  */
183
- postProcess(id, data, options, settings, columns) {
183
+ async postProcess(id, data, options, settings, columns) {
184
184
  if (!options.byTags) {
185
185
  return data
186
186
  }
@@ -152,7 +152,7 @@ class FinnishIncomeStatementReportLite extends ReportPlugin {
152
152
  return this.parseAndCombineReport([...accountNumbers], accountNames, columns, options.format, totals)
153
153
  }
154
154
 
155
- preProcess(id, entries, options, settings, columns) {
155
+ async preProcess(id, entries, options, settings, columns) {
156
156
  if (options.byTags) {
157
157
  return this.preProcessByTags(id, entries, options, settings, columns)
158
158
  }
@@ -178,7 +178,7 @@ class FinnishIncomeStatementReportLite extends ReportPlugin {
178
178
  /**
179
179
  * Remove empty columns if report made by tags.
180
180
  */
181
- postProcess(id, data, options, settings, columns) {
181
+ async postProcess(id, data, options, settings, columns) {
182
182
  if (!options.byTags) {
183
183
  return data
184
184
  }
@@ -3,7 +3,7 @@ import { PluginCode, Version } from '@tasenor/common'
3
3
 
4
4
  class IncomeAndExpenses extends DataPlugin {
5
5
  constructor() {
6
- super('income', 'expense', 'taxTypes', 'assetCodes')
6
+ super({ common: ['income', 'expense', 'taxTypes', 'assetCodes'], backend: [] })
7
7
 
8
8
  this.code = 'IncomeAndExpenses'as PluginCode
9
9
  this.title = 'Income and Expense Classification'
@@ -66,7 +66,7 @@ class JournalReport extends ReportPlugin {
66
66
  }]
67
67
  }
68
68
 
69
- preProcess(id, entries, options) {
69
+ async preProcess(id, entries, options) {
70
70
  // Pre-process entries by their document number.
71
71
  const docs = {}
72
72
  entries.forEach((entry) => {
@@ -70,7 +70,7 @@ class LedgerReport extends ReportPlugin {
70
70
  }]
71
71
  }
72
72
 
73
- preProcess(id, entries, options) {
73
+ async preProcess(id, entries, options) {
74
74
  // Pre-process entries by their account number.
75
75
  const accounts = {}
76
76
  const accountNames = {}