@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.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-ci.log +2 -2
- package/data/TickerData.mjs +8 -0
- package/dist/AssetReport/backend/index.d.ts +2 -2
- package/dist/AssetReport/backend/index.js +17 -7
- package/dist/AssetReport/backend/index.js.map +1 -1
- package/dist/FinnishBalanceSheetReport/backend/index.d.ts +2 -2
- package/dist/FinnishBalanceSheetReport/backend/index.js +2 -2
- package/dist/FinnishBalanceSheetReport/backend/index.js.map +1 -1
- package/dist/FinnishBalanceSheetReportLite/backend/index.d.ts +2 -2
- package/dist/FinnishBalanceSheetReportLite/backend/index.js +2 -2
- package/dist/FinnishBalanceSheetReportLite/backend/index.js.map +1 -1
- package/dist/FinnishIncomeStatementReport/backend/index.d.ts +2 -2
- package/dist/FinnishIncomeStatementReport/backend/index.js +2 -2
- package/dist/FinnishIncomeStatementReport/backend/index.js.map +1 -1
- package/dist/FinnishIncomeStatementReportLite/backend/index.d.ts +2 -2
- package/dist/FinnishIncomeStatementReportLite/backend/index.js +2 -2
- package/dist/FinnishIncomeStatementReportLite/backend/index.js.map +1 -1
- package/dist/IncomeAndExpenses/backend/index.js +1 -1
- package/dist/IncomeAndExpenses/backend/index.js.map +1 -1
- package/dist/JournalReport/backend/index.d.ts +1 -1
- package/dist/JournalReport/backend/index.js +1 -1
- package/dist/JournalReport/backend/index.js.map +1 -1
- package/dist/LedgerReport/backend/index.d.ts +1 -1
- package/dist/LedgerReport/backend/index.js +1 -1
- package/dist/LedgerReport/backend/index.js.map +1 -1
- package/dist/TickerData/backend/index.d.ts +57 -0
- package/dist/TickerData/backend/index.js +212 -0
- package/dist/TickerData/backend/index.js.map +1 -0
- package/dist/VATFinland/backend/index.js +1 -1
- package/dist/VATFinland/backend/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
- package/src/AssetReport/backend/index.ts +19 -7
- package/src/FinnishBalanceSheetReport/backend/index.ts +2 -2
- package/src/FinnishBalanceSheetReportLite/backend/index.ts +2 -2
- package/src/FinnishIncomeStatementReport/backend/index.ts +2 -2
- package/src/FinnishIncomeStatementReportLite/backend/index.ts +2 -2
- package/src/IncomeAndExpenses/backend/index.ts +1 -1
- package/src/JournalReport/backend/index.ts +1 -1
- package/src/LedgerReport/backend/index.ts +1 -1
- package/src/TickerData/backend/cryptocurrencies.json +3762 -0
- package/src/TickerData/backend/currencies.json +181 -0
- package/src/TickerData/backend/etf.json +3339 -0
- package/src/TickerData/backend/hel.json +144 -0
- package/src/TickerData/backend/index.ts +241 -0
- package/src/TickerData/backend/nasdaq.json +505 -0
- package/src/TickerData/backend/nyse.json +514 -0
- package/src/TickerData/backend/otc.json +3 -0
- package/src/TickerData/backend/tal.json +36 -0
- package/src/TickerData/backend/tsx.json +421 -0
- package/src/TickerData/backend/xetra.json +15 -0
- package/src/VATFinland/backend/index.ts +1 -1
- 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 +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;
|
|
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.
|
|
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.
|
|
16
|
-
"@tasenor/common-
|
|
17
|
-
"@tasenor/common-
|
|
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
|
-
"
|
|
34
|
-
"
|
|
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)
|
|
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
|
-
|
|
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'
|