@fin.cx/opendata 4.7.0 → 4.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.smartconfig.json +6 -2
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/financialstatements/amounts.d.ts +58 -0
- package/dist_ts/financialstatements/amounts.js +130 -0
- package/dist_ts/financialstatements/classes.financialstatementerror.d.ts +24 -0
- package/dist_ts/financialstatements/classes.financialstatementerror.js +10 -0
- package/dist_ts/financialstatements/constants.d.ts +16 -0
- package/dist_ts/financialstatements/constants.js +20 -0
- package/dist_ts/financialstatements/dates.d.ts +16 -0
- package/dist_ts/financialstatements/dates.js +72 -0
- package/dist_ts/financialstatements/html.d.ts +21 -0
- package/dist_ts/financialstatements/html.js +92 -0
- package/dist_ts/financialstatements/index.d.ts +6 -0
- package/dist_ts/financialstatements/index.js +11 -0
- package/dist_ts/financialstatements/interfaces.d.ts +258 -0
- package/dist_ts/financialstatements/interfaces.js +2 -0
- package/dist_ts/financialstatements/layout.d.ts +20 -0
- package/dist_ts/financialstatements/layout.html.d.ts +8 -0
- package/dist_ts/financialstatements/layout.html.js +125 -0
- package/dist_ts/financialstatements/layout.js +2 -0
- package/dist_ts/financialstatements/layout.pdf.d.ts +6 -0
- package/dist_ts/financialstatements/layout.pdf.js +229 -0
- package/dist_ts/financialstatements/mediatypes.d.ts +3 -0
- package/dist_ts/financialstatements/mediatypes.js +11 -0
- package/dist_ts/financialstatements/outline.d.ts +22 -0
- package/dist_ts/financialstatements/outline.js +26 -0
- package/dist_ts/financialstatements/parse.esef.d.ts +13 -0
- package/dist_ts/financialstatements/parse.esef.js +349 -0
- package/dist_ts/financialstatements/parse.hgb.d.ts +9 -0
- package/dist_ts/financialstatements/parse.hgb.js +1014 -0
- package/dist_ts/financialstatements/parse.statement.d.ts +8 -0
- package/dist_ts/financialstatements/parse.statement.js +25 -0
- package/dist_ts/financialstatements/plugins.d.ts +10 -0
- package/dist_ts/financialstatements/plugins.js +15 -0
- package/dist_ts/financialstatements/read.d.ts +10 -0
- package/dist_ts/financialstatements/read.js +113 -0
- package/dist_ts/gleif/classes.gleifclient.d.ts +26 -0
- package/dist_ts/gleif/classes.gleifclient.js +214 -0
- package/dist_ts/gleif/classes.gleiferror.d.ts +6 -0
- package/dist_ts/gleif/classes.gleiferror.js +11 -0
- package/dist_ts/gleif/crosswalk.d.ts +7 -0
- package/dist_ts/gleif/crosswalk.js +25 -0
- package/dist_ts/gleif/csv.d.ts +2 -0
- package/dist_ts/gleif/csv.js +75 -0
- package/dist_ts/gleif/data.crosswalk.d.ts +12 -0
- package/dist_ts/gleif/data.crosswalk.js +1265 -0
- package/dist_ts/gleif/index.d.ts +6 -0
- package/dist_ts/gleif/index.js +7 -0
- package/dist_ts/gleif/interfaces.d.ts +101 -0
- package/dist_ts/gleif/interfaces.js +2 -0
- package/dist_ts/gleif/plugins.d.ts +1 -0
- package/dist_ts/gleif/plugins.js +3 -0
- package/dist_ts/gleif/records.d.ts +6 -0
- package/dist_ts/gleif/records.js +107 -0
- package/dist_ts/gleif/stream.zip.d.ts +2 -0
- package/dist_ts/gleif/stream.zip.js +54 -0
- package/dist_ts/plugins.d.ts +2 -0
- package/dist_ts/plugins.js +4 -1
- package/package.json +20 -5
- package/readme.md +156 -5
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/financialstatements/amounts.ts +181 -0
- package/ts/financialstatements/classes.financialstatementerror.ts +35 -0
- package/ts/financialstatements/constants.ts +24 -0
- package/ts/financialstatements/dates.ts +89 -0
- package/ts/financialstatements/html.ts +107 -0
- package/ts/financialstatements/index.ts +17 -0
- package/ts/financialstatements/interfaces.ts +268 -0
- package/ts/financialstatements/layout.html.ts +130 -0
- package/ts/financialstatements/layout.pdf.ts +268 -0
- package/ts/financialstatements/layout.ts +16 -0
- package/ts/financialstatements/mediatypes.ts +14 -0
- package/ts/financialstatements/outline.ts +44 -0
- package/ts/financialstatements/parse.esef.ts +394 -0
- package/ts/financialstatements/parse.hgb.ts +1235 -0
- package/ts/financialstatements/parse.statement.ts +26 -0
- package/ts/financialstatements/plugins.ts +29 -0
- package/ts/financialstatements/read.ts +135 -0
- package/ts/gleif/classes.gleifclient.ts +170 -0
- package/ts/gleif/classes.gleiferror.ts +8 -0
- package/ts/gleif/crosswalk.ts +29 -0
- package/ts/gleif/csv.ts +60 -0
- package/ts/gleif/data.crosswalk.ts +1271 -0
- package/ts/gleif/index.ts +6 -0
- package/ts/gleif/interfaces.ts +107 -0
- package/ts/gleif/plugins.ts +2 -0
- package/ts/gleif/records.ts +104 -0
- package/ts/gleif/stream.zip.ts +43 -0
- package/ts/plugins.ts +4 -0
|
@@ -0,0 +1,1014 @@
|
|
|
1
|
+
import { FinancialStatementError } from './classes.financialstatementerror.js';
|
|
2
|
+
import { addAmounts, amountsAgree, formatAmount, namesOtherCurrency, negateAmount, normalizeSpaces, parsePrintedAmount, readsAsAmount, sumAmounts, toAmount, unitsIn, unitStatedBy, withoutOtherCurrencies, withoutUnits, zeroAmount, } from './amounts.js';
|
|
3
|
+
import { lastDateIn, lastYearIn, periodIn, withoutDates } from './dates.js';
|
|
4
|
+
import { isMemoLabel, isTotalLabel, splitOutlineCode } from './outline.js';
|
|
5
|
+
const statementPeriods = ['current', 'prior'];
|
|
6
|
+
const notNull = (valueArg) => valueArg !== null;
|
|
7
|
+
// ---------------------------------------------------------------------------------------------
|
|
8
|
+
// headings that mark the parts of a document
|
|
9
|
+
/** the parts of an annual report after the statements, which end them */
|
|
10
|
+
const otherPartPattern = /^(?:Anhang|Lagebericht|Anlagenspiegel|Entwicklung des (?:Konzern-?)?Anlagevermögens|Bestätigungsvermerk|Ergebnisverwendung|Vorschlag (?:für die|zur) (?:Verwendung|Ergebnisverwendung)|Bericht des Aufsichtsrat|Kapitalflussrechnung|Eigenkapitalspiegel|Angaben)/i;
|
|
11
|
+
/** a heading set letter by letter, `A K T I V A`, as one word */
|
|
12
|
+
const unspaced = (textArg) => (/^(?:[A-ZÄÖÜ] )+[A-ZÄÖÜ]$/.test(textArg) ? textArg.replace(/ /g, '') : textArg);
|
|
13
|
+
/** the part of a document a heading opens; null for any other text */
|
|
14
|
+
const markerOf = (textArg) => {
|
|
15
|
+
const text = unspaced(normalizeSpaces(textArg)).replace(/\s*:$/, '');
|
|
16
|
+
if (text === '' || text.length > 120) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (/^(?:Aktiva|Aktivseite)$/i.test(text)) {
|
|
20
|
+
return 'assets';
|
|
21
|
+
}
|
|
22
|
+
if (/^(?:Passiva|Passivseite)$/i.test(text)) {
|
|
23
|
+
return 'liabilities';
|
|
24
|
+
}
|
|
25
|
+
if (/^(?:Konzern-?)?bilanz\b/i.test(text)) {
|
|
26
|
+
return 'balance';
|
|
27
|
+
}
|
|
28
|
+
if (/^(?:Konzern-?)?Gewinn-? und Verlustrechnung\b/i.test(text) || /^GuV\b/.test(text)) {
|
|
29
|
+
return 'income';
|
|
30
|
+
}
|
|
31
|
+
return otherPartPattern.test(text) && unitStatedBy(text) === null ? 'other' : null;
|
|
32
|
+
};
|
|
33
|
+
// ---------------------------------------------------------------------------------------------
|
|
34
|
+
// column headings
|
|
35
|
+
const priorWordPattern = /Vorjahr|\bVJ\b|vorhergehend|vorangegangen|Vorperiode/i;
|
|
36
|
+
const currentWordPattern = /Geschäftsjahr|Berichtsjahr|Berichtszeitraum|laufendes|aktuelles|\bGJ\b/i;
|
|
37
|
+
const periodWordPattern = /Jahr|Periode|Zeitraum|Stichtag|\bGJ\b|\bVJ\b/i;
|
|
38
|
+
const notesHeadingPattern = /^(?:Anhang|Anh\.|Anm\.|Tz\.|Ziffer|Ziff\.|Erl\.|Note|Notes)(?![A-Za-zÄÖÜäöüß])/i;
|
|
39
|
+
/** the words a column heading may hold besides dates, years and units */
|
|
40
|
+
const headingWords = new Set([
|
|
41
|
+
'geschäftsjahr', 'geschäftsjahres', 'berichtsjahr', 'berichtsjahres', 'wirtschaftsjahr', 'wirtschaftsjahres',
|
|
42
|
+
'vorjahr', 'vorjahres', 'vorjahreszahlen', 'vorjahreswerte', 'vorjahresbetrag', 'vorjahresbeträge',
|
|
43
|
+
'berichtszeitraum', 'berichtszeitraums', 'berichtsperiode', 'vorperiode', 'periode', 'zeitraum', 'stichtag',
|
|
44
|
+
'jahr', 'jahres', 'laufendes', 'laufenden', 'aktuelles', 'aktuellen', 'vorhergehendes', 'vorhergehenden',
|
|
45
|
+
'vorangegangenes', 'vorangegangenen', 'gj', 'vj', 'betrag', 'beträge', 'stand', 'zum', 'per', 'am', 'in',
|
|
46
|
+
'bis', 'vom', 'von', 'für', 'das', 'der', 'die', 'des', 'dem', 'den', 'im', 'anhang', 'anh', 'anm', 'tz',
|
|
47
|
+
'ziffer', 'ziff', 'erl', 'erläuterung', 'erläuterungen', 'note', 'notes', 'nr', 'januar', 'jänner',
|
|
48
|
+
'februar', 'märz', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'dezember',
|
|
49
|
+
]);
|
|
50
|
+
/**
|
|
51
|
+
* whether a cell can head a column: dates, years, units and the words for the two years only; a
|
|
52
|
+
* currency other than the euro heads a column too, for the statement to be refused for it
|
|
53
|
+
*/
|
|
54
|
+
const isHeadingText = (textArg) => {
|
|
55
|
+
if (readsAsAmount(textArg)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const rest = withoutDates(withoutOtherCurrencies(withoutUnits(textArg))).replace(/\b(?:19|20)\d{2}\b/g, ' ');
|
|
59
|
+
if (/\d/.test(rest)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return rest
|
|
63
|
+
.split(/[^A-Za-zÄÖÜäöüß]+/)
|
|
64
|
+
.filter((wordArg) => wordArg !== '')
|
|
65
|
+
.every((wordArg) => headingWords.has(wordArg.toLowerCase()));
|
|
66
|
+
};
|
|
67
|
+
/** whether a heading names a year or a unit, not only a note column */
|
|
68
|
+
const namesPeriodOrUnit = (textArg) => unitsIn(textArg).length > 0 ||
|
|
69
|
+
namesOtherCurrency(textArg) ||
|
|
70
|
+
lastDateIn(textArg) !== null ||
|
|
71
|
+
lastYearIn(textArg) !== null ||
|
|
72
|
+
periodWordPattern.test(textArg);
|
|
73
|
+
/**
|
|
74
|
+
* A row that heads the columns below it: no outline code, and every cell right of the label a
|
|
75
|
+
* heading, one of them naming a year or a unit.
|
|
76
|
+
*/
|
|
77
|
+
const isHeadingRow = (cellsArg) => {
|
|
78
|
+
const labelCell = cellsArg.find((cellArg) => cellArg.first === 0);
|
|
79
|
+
if (labelCell && splitOutlineCode(labelCell.text).code !== null) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
const headings = cellsArg.filter((cellArg) => cellArg.first > 0);
|
|
83
|
+
if (headings.length === 0 || !headings.every((cellArg) => isHeadingText(cellArg.text))) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (!headings.some((cellArg) => namesPeriodOrUnit(cellArg.text))) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return (!labelCell ||
|
|
90
|
+
markerOf(labelCell.text) !== null ||
|
|
91
|
+
isHeadingText(labelCell.text) ||
|
|
92
|
+
/^(?:Posten|Position|Bezeichnung|Gliederung)$/i.test(labelCell.text));
|
|
93
|
+
};
|
|
94
|
+
const hasAmountCell = (cellsArg) => cellsArg.some((cellArg) => cellArg.first > 0 && readsAsAmount(cellArg.text));
|
|
95
|
+
/**
|
|
96
|
+
* Splits a document into its balance sheet, its income statement and the text before them, by the
|
|
97
|
+
* headings that open them. A part ends at the next heading; one that comes again after it was read
|
|
98
|
+
* in full is left out with a note.
|
|
99
|
+
*/
|
|
100
|
+
const readSections = (blocksArg) => {
|
|
101
|
+
const newDraft = () => ({ contexts: [], items: [], valueRows: 0 });
|
|
102
|
+
const sections = {
|
|
103
|
+
documentContext: [],
|
|
104
|
+
balance: newDraft(),
|
|
105
|
+
income: newDraft(),
|
|
106
|
+
sideValueRows: { assets: 0, liabilities: 0 },
|
|
107
|
+
sideBySide: false,
|
|
108
|
+
notes: [],
|
|
109
|
+
};
|
|
110
|
+
let section = 'none';
|
|
111
|
+
let side = null;
|
|
112
|
+
const draft = () => section === 'balance' ? sections.balance : section === 'income' ? sections.income : null;
|
|
113
|
+
const balanceComplete = () => sections.sideValueRows.assets > 0 && sections.sideValueRows.liabilities > 0;
|
|
114
|
+
const addContext = (textArg) => {
|
|
115
|
+
const target = draft();
|
|
116
|
+
if (target) {
|
|
117
|
+
target.contexts.push(textArg);
|
|
118
|
+
}
|
|
119
|
+
else if (section === 'none') {
|
|
120
|
+
sections.documentContext.push(textArg);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const noteSecond = (whatArg) => {
|
|
124
|
+
const note = `The document holds a second ${whatArg}, which was not read.`;
|
|
125
|
+
if (!sections.notes.includes(note)) {
|
|
126
|
+
sections.notes.push(note);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const enter = (markerArg) => {
|
|
130
|
+
if (markerArg === 'assets' || markerArg === 'liabilities') {
|
|
131
|
+
if (section !== 'balance') {
|
|
132
|
+
if (balanceComplete()) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
section = 'balance';
|
|
136
|
+
}
|
|
137
|
+
side = markerArg;
|
|
138
|
+
}
|
|
139
|
+
else if (markerArg === 'balance') {
|
|
140
|
+
if (section !== 'balance') {
|
|
141
|
+
if (balanceComplete()) {
|
|
142
|
+
noteSecond('balance sheet');
|
|
143
|
+
section = 'other';
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
section = 'balance';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if (markerArg === 'income') {
|
|
150
|
+
if (section !== 'income') {
|
|
151
|
+
if (sections.income.valueRows > 0) {
|
|
152
|
+
noteSecond('income statement');
|
|
153
|
+
section = 'other';
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
section = 'income';
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
section = 'other';
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
blocksArg.forEach((block, blockIndex) => {
|
|
164
|
+
if (block.kind === 'text') {
|
|
165
|
+
const marker = markerOf(block.text);
|
|
166
|
+
if (marker) {
|
|
167
|
+
enter(marker);
|
|
168
|
+
addContext(block.text);
|
|
169
|
+
}
|
|
170
|
+
else if (block.heading && (draft()?.valueRows ?? 0) > 0) {
|
|
171
|
+
section = 'other';
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
addContext(block.text);
|
|
175
|
+
}
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
for (const cells of block.rows) {
|
|
179
|
+
const valued = hasAmountCell(cells);
|
|
180
|
+
if (!valued &&
|
|
181
|
+
cells.some((cellArg) => markerOf(cellArg.text) === 'assets') &&
|
|
182
|
+
cells.some((cellArg) => markerOf(cellArg.text) === 'liabilities')) {
|
|
183
|
+
if (!balanceComplete()) {
|
|
184
|
+
section = 'balance';
|
|
185
|
+
sections.sideBySide = true;
|
|
186
|
+
}
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const heading = !valued && isHeadingRow(cells);
|
|
190
|
+
if (!valued) {
|
|
191
|
+
const rowText = normalizeSpaces(cells.map((cellArg) => cellArg.text).join(' '));
|
|
192
|
+
const labelCell = cells.find((cellArg) => cellArg.first === 0);
|
|
193
|
+
const marker = (labelCell ? markerOf(labelCell.text) : null) ?? (heading ? null : markerOf(rowText));
|
|
194
|
+
if (marker) {
|
|
195
|
+
enter(marker);
|
|
196
|
+
if (!heading) {
|
|
197
|
+
addContext(rowText);
|
|
198
|
+
}
|
|
199
|
+
draft()?.items.push({ cells, block: blockIndex, side, heading });
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (!heading) {
|
|
203
|
+
addContext(rowText);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const target = draft();
|
|
207
|
+
if (!target) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
target.items.push({ cells, block: blockIndex, side, heading });
|
|
211
|
+
if (valued) {
|
|
212
|
+
target.valueRows++;
|
|
213
|
+
if (section === 'balance' && side) {
|
|
214
|
+
sections.sideValueRows[side]++;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
return sections;
|
|
220
|
+
};
|
|
221
|
+
/** the tables of a section split where a table or a run of column headings begins */
|
|
222
|
+
const scopesOf = (itemsArg) => {
|
|
223
|
+
const scopes = [];
|
|
224
|
+
let previous = null;
|
|
225
|
+
for (const item of itemsArg) {
|
|
226
|
+
if (!previous || item.block !== previous.block || (item.heading && !previous.heading)) {
|
|
227
|
+
scopes.push({ headings: [], body: [] });
|
|
228
|
+
}
|
|
229
|
+
const scope = scopes[scopes.length - 1];
|
|
230
|
+
(item.heading && scope.body.length === 0 ? scope.headings : scope.body).push(item);
|
|
231
|
+
previous = item;
|
|
232
|
+
}
|
|
233
|
+
return scopes;
|
|
234
|
+
};
|
|
235
|
+
/** the years of a table's columns, from their headings */
|
|
236
|
+
const rolesOf = (headingsArg, failArg) => {
|
|
237
|
+
const infos = headingsArg.map((headingArg) => {
|
|
238
|
+
const date = lastDateIn(headingArg);
|
|
239
|
+
return {
|
|
240
|
+
word: priorWordPattern.test(headingArg) ? 'prior' : currentWordPattern.test(headingArg) ? 'current' : null,
|
|
241
|
+
date,
|
|
242
|
+
year: date ? Number(date.slice(0, 4)) : lastYearIn(headingArg),
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
const stated = infos.filter((infoArg) => infoArg.word !== null || infoArg.year !== null);
|
|
246
|
+
const periodsOf = infos.map(() => null);
|
|
247
|
+
const byLatest = (keyOf) => {
|
|
248
|
+
const distinct = [...new Set(stated.map(keyOf))].sort();
|
|
249
|
+
if (distinct.length > 2) {
|
|
250
|
+
failArg('shows columns for more than two years.');
|
|
251
|
+
}
|
|
252
|
+
infos.forEach((infoArg, index) => {
|
|
253
|
+
const key = keyOf(infoArg);
|
|
254
|
+
if (key !== null) {
|
|
255
|
+
periodsOf[index] = key === distinct[distinct.length - 1] ? 'current' : 'prior';
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
if (stated.length > 0) {
|
|
260
|
+
if (stated.every((infoArg) => infoArg.date !== null)) {
|
|
261
|
+
byLatest((infoArg) => infoArg.date);
|
|
262
|
+
}
|
|
263
|
+
else if (stated.every((infoArg) => infoArg.year !== null)) {
|
|
264
|
+
byLatest((infoArg) => infoArg.year);
|
|
265
|
+
}
|
|
266
|
+
else if (stated.every((infoArg) => infoArg.word !== null)) {
|
|
267
|
+
infos.forEach((infoArg, index) => (periodsOf[index] = infoArg.word));
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
failArg('heads some columns with a date and others with a word.');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
infos.forEach((infoArg, index) => {
|
|
274
|
+
if (infoArg.word !== null && periodsOf[index] !== null && infoArg.word !== periodsOf[index]) {
|
|
275
|
+
failArg(`heads a column "${headingsArg[index]}", which names another year than its date.`);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
const dates = infos.map((infoArg) => infoArg.date);
|
|
279
|
+
for (let index = infos.length - 1; index >= 0; index--) {
|
|
280
|
+
if (periodsOf[index] !== null) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
if (index + 1 < infos.length) {
|
|
284
|
+
periodsOf[index] = periodsOf[index + 1];
|
|
285
|
+
dates[index] = dates[index + 1];
|
|
286
|
+
}
|
|
287
|
+
else if (infos.length === 1) {
|
|
288
|
+
periodsOf[index] = 'current';
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
failArg('has columns whose year it does not state.');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (!periodsOf.includes('current')) {
|
|
295
|
+
failArg('has no column for the current year.');
|
|
296
|
+
}
|
|
297
|
+
const roles = [];
|
|
298
|
+
for (const period of statementPeriods) {
|
|
299
|
+
const indexes = periodsOf.flatMap((periodArg, index) => (periodArg === period ? [index] : []));
|
|
300
|
+
if (indexes.length > 2) {
|
|
301
|
+
failArg(`has more than two columns for the ${period} year.`);
|
|
302
|
+
}
|
|
303
|
+
indexes.forEach((columnIndex, position) => {
|
|
304
|
+
roles[columnIndex] = {
|
|
305
|
+
period,
|
|
306
|
+
slot: indexes.length === 2 && position === 0 ? 'pre' : 'main',
|
|
307
|
+
heading: headingsArg[columnIndex],
|
|
308
|
+
date: dates[columnIndex],
|
|
309
|
+
};
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return roles;
|
|
313
|
+
};
|
|
314
|
+
/** the one unit some lines state; null if none does */
|
|
315
|
+
const unitStatedIn = (linesArg, failArg) => {
|
|
316
|
+
const units = new Map(linesArg.map(unitStatedBy).filter(notNull).map((unitArg) => [unitArg.label, unitArg]));
|
|
317
|
+
if (units.size > 1) {
|
|
318
|
+
failArg(`states more than one unit (${[...units.keys()].join(', ')}).`);
|
|
319
|
+
}
|
|
320
|
+
return [...units.values()][0] ?? null;
|
|
321
|
+
};
|
|
322
|
+
/** a cell that holds only a unit, `T€` or `(EUR)` */
|
|
323
|
+
const isUnitOnly = (textArg) => unitsIn(textArg).length > 0 && /^[\s()]*$/.test(withoutUnits(textArg));
|
|
324
|
+
/**
|
|
325
|
+
* Reads the rows of a section: finds each table's amount columns and the year and unit each stands
|
|
326
|
+
* for, and the label and amounts of each row. Throws `unparseable` where a column's year or unit is
|
|
327
|
+
* not stated with certainty, or where a row holds text in an amount column.
|
|
328
|
+
*/
|
|
329
|
+
const readSectionRows = (draftArg, titleArg, documentContextArg) => {
|
|
330
|
+
const fail = (messageArg) => {
|
|
331
|
+
throw new FinancialStatementError('unparseable', `The ${titleArg} ${messageArg}`);
|
|
332
|
+
};
|
|
333
|
+
const contextUnit = unitStatedIn(draftArg.contexts, fail) ?? unitStatedIn(documentContextArg, fail);
|
|
334
|
+
const result = { rows: [], unit: null, vorspalte: new Set(), columns: {} };
|
|
335
|
+
let previous = null;
|
|
336
|
+
let sectionUnit = null;
|
|
337
|
+
for (const scope of scopesOf(draftArg.items)) {
|
|
338
|
+
const headingCells = scope.headings.flatMap((itemArg) => itemArg.cells).filter((cellArg) => cellArg.first > 0);
|
|
339
|
+
const notesColumns = new Set();
|
|
340
|
+
for (const cell of headingCells) {
|
|
341
|
+
if (notesHeadingPattern.test(cell.text)) {
|
|
342
|
+
for (let column = cell.first; column <= cell.last; column++) {
|
|
343
|
+
notesColumns.add(column);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const inNotesColumn = (cellArg) => {
|
|
348
|
+
for (let column = cellArg.first; column <= cellArg.last; column++) {
|
|
349
|
+
if (!notesColumns.has(column)) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return true;
|
|
354
|
+
};
|
|
355
|
+
const bodies = scope.body.map((itemArg) => {
|
|
356
|
+
const cells = itemArg.cells.filter((cellArg) => cellArg.first === 0 || !inNotesColumn(cellArg));
|
|
357
|
+
return {
|
|
358
|
+
item: itemArg,
|
|
359
|
+
cells: cells.filter((cellArg) => cellArg.first === 0 || !isUnitOnly(cellArg.text)),
|
|
360
|
+
unitCells: cells.filter((cellArg) => cellArg.first > 0 && isUnitOnly(cellArg.text)),
|
|
361
|
+
};
|
|
362
|
+
});
|
|
363
|
+
const columns = [
|
|
364
|
+
...new Set(bodies.flatMap((bodyArg) => bodyArg.cells.filter((cellArg) => cellArg.first > 0 && readsAsAmount(cellArg.text)).map((cellArg) => cellArg.last))),
|
|
365
|
+
].sort((leftArg, rightArg) => leftArg - rightArg);
|
|
366
|
+
let roles = [];
|
|
367
|
+
let unit = null;
|
|
368
|
+
if (columns.length > 0) {
|
|
369
|
+
if (scope.headings.length === 0 && previous) {
|
|
370
|
+
if (previous.columns.length !== columns.length) {
|
|
371
|
+
fail('changes its columns without heading them anew.');
|
|
372
|
+
}
|
|
373
|
+
roles = previous.roles;
|
|
374
|
+
unit = previous.unit;
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
const headingOf = (columnArg) => normalizeSpaces(headingCells
|
|
378
|
+
.filter((cellArg) => cellArg.first <= columnArg && columnArg <= cellArg.last)
|
|
379
|
+
.map((cellArg) => cellArg.text)
|
|
380
|
+
.join(' '));
|
|
381
|
+
roles = rolesOf(columns.map(headingOf), fail);
|
|
382
|
+
const headingText = headingCells.map((cellArg) => cellArg.text).join(' ');
|
|
383
|
+
if (namesOtherCurrency(headingText)) {
|
|
384
|
+
fail('is in a currency other than the euro.');
|
|
385
|
+
}
|
|
386
|
+
const headingUnits = new Map(unitsIn(headingText).map((unitArg) => [unitArg.label, unitArg]));
|
|
387
|
+
if (headingUnits.size > 1) {
|
|
388
|
+
fail(`heads its columns with more than one unit (${[...headingUnits.keys()].join(', ')}).`);
|
|
389
|
+
}
|
|
390
|
+
const printedUnits = new Map(bodies
|
|
391
|
+
.flatMap((bodyArg) => [
|
|
392
|
+
...bodyArg.cells
|
|
393
|
+
.filter((cellArg) => columns.includes(cellArg.last) && cellArg.first > 0)
|
|
394
|
+
.map((cellArg) => parsePrintedAmount(cellArg.text)?.unit ?? null),
|
|
395
|
+
...bodyArg.unitCells.map((cellArg) => unitsIn(cellArg.text)[0]),
|
|
396
|
+
])
|
|
397
|
+
.filter(notNull)
|
|
398
|
+
.map((unitArg) => [unitArg.label, unitArg]));
|
|
399
|
+
if (printedUnits.size > 1) {
|
|
400
|
+
fail(`prints amounts in more than one unit (${[...printedUnits.keys()].join(', ')}).`);
|
|
401
|
+
}
|
|
402
|
+
unit = [...headingUnits.values()][0] ?? contextUnit ?? [...printedUnits.values()][0] ?? null;
|
|
403
|
+
if (!unit) {
|
|
404
|
+
fail('does not state its unit (EUR, TEUR or Mio. EUR).');
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
const scopeUnit = unit;
|
|
408
|
+
if (sectionUnit && sectionUnit.label !== scopeUnit.label) {
|
|
409
|
+
fail(`is printed in more than one unit (${sectionUnit.label}, ${scopeUnit.label}).`);
|
|
410
|
+
}
|
|
411
|
+
sectionUnit = scopeUnit;
|
|
412
|
+
previous = { columns, roles, unit: scopeUnit };
|
|
413
|
+
for (const role of roles) {
|
|
414
|
+
if (role.slot === 'pre') {
|
|
415
|
+
result.vorspalte.add(role.period);
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
result.columns[role.period] ??= role;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const labelLimit = columns.length > 0 ? columns[0] : Number.POSITIVE_INFINITY;
|
|
423
|
+
for (const body of bodies) {
|
|
424
|
+
const fullLabel = normalizeSpaces(body.cells.filter((cellArg) => cellArg.first < labelLimit).map((cellArg) => cellArg.text).join(' '));
|
|
425
|
+
const values = { current: { pre: null, main: null }, prior: { pre: null, main: null } };
|
|
426
|
+
let amounts = 0;
|
|
427
|
+
let text = null;
|
|
428
|
+
for (const cell of body.cells.filter((cellArg) => cellArg.first >= labelLimit)) {
|
|
429
|
+
const index = columns.indexOf(cell.last);
|
|
430
|
+
const printed = index >= 0 ? parsePrintedAmount(cell.text) : null;
|
|
431
|
+
if (!printed) {
|
|
432
|
+
text ??= cell.text;
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
const scopeUnit = unit;
|
|
436
|
+
if (printed.unit && printed.unit.label !== scopeUnit.label) {
|
|
437
|
+
fail(`prints "${cell.text}" in a table in ${scopeUnit.label}.`);
|
|
438
|
+
}
|
|
439
|
+
const role = roles[index];
|
|
440
|
+
if (values[role.period][role.slot]) {
|
|
441
|
+
fail(`prints two amounts in one column of "${fullLabel}".`);
|
|
442
|
+
}
|
|
443
|
+
values[role.period][role.slot] = toAmount(printed, scopeUnit);
|
|
444
|
+
amounts++;
|
|
445
|
+
}
|
|
446
|
+
if (amounts > 0 && text !== null) {
|
|
447
|
+
fail(`holds text where an amount belongs: "${text}" in "${fullLabel}".`);
|
|
448
|
+
}
|
|
449
|
+
for (const cell of body.unitCells) {
|
|
450
|
+
if (unit && unitsIn(cell.text)[0].label !== unit.label) {
|
|
451
|
+
fail(`prints "${cell.text}" in a table in ${unit.label}.`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
const { code, label } = splitOutlineCode(fullLabel);
|
|
455
|
+
result.rows.push({
|
|
456
|
+
label,
|
|
457
|
+
code,
|
|
458
|
+
memo: isMemoLabel(label),
|
|
459
|
+
total: code === null && isTotalLabel(label),
|
|
460
|
+
values,
|
|
461
|
+
hasValues: amounts > 0,
|
|
462
|
+
side: body.item.side,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (!sectionUnit) {
|
|
467
|
+
fail('prints no amounts.');
|
|
468
|
+
}
|
|
469
|
+
result.unit = sectionUnit;
|
|
470
|
+
return result;
|
|
471
|
+
};
|
|
472
|
+
/** the labels of the income statement's intermediate results */
|
|
473
|
+
const subtotalLabelPattern = /ergebnis|Zwischensumme|Summe|Rohertrag/i;
|
|
474
|
+
/**
|
|
475
|
+
* Builds the outline of a part from its rows. Coded rows nest by their codes; an uncoded row with
|
|
476
|
+
* amounts belongs to the position before it where that position prints none of its own, else stands
|
|
477
|
+
* beside it. In the balance sheet the last row with amounts, uncoded, is the total of its side, and
|
|
478
|
+
* other summing rows are printed sums; in the income statement intermediate results stand at the top.
|
|
479
|
+
*/
|
|
480
|
+
const buildPart = (rowsArg, incomeArg) => {
|
|
481
|
+
const part = { lines: [], roots: [], nodes: [], total: null };
|
|
482
|
+
const valued = rowsArg.filter((rowArg) => rowArg.hasValues && !rowArg.memo);
|
|
483
|
+
const lastValued = valued[valued.length - 1];
|
|
484
|
+
const totalRow = !incomeArg && lastValued && lastValued.code === null ? lastValued : null;
|
|
485
|
+
const stack = [];
|
|
486
|
+
let previous = null;
|
|
487
|
+
const line = (rowArg, roleArg, nodeArg) => {
|
|
488
|
+
const result = { row: rowArg, role: roleArg, node: nodeArg, previous, closes: { current: null, prior: null } };
|
|
489
|
+
part.lines.push(result);
|
|
490
|
+
return result;
|
|
491
|
+
};
|
|
492
|
+
const addNode = (rowArg, parentArg) => {
|
|
493
|
+
let codeAbove = null;
|
|
494
|
+
for (let ancestor = parentArg; ancestor && codeAbove === null; ancestor = ancestor.parent) {
|
|
495
|
+
codeAbove = ancestor.codePath;
|
|
496
|
+
}
|
|
497
|
+
const node = {
|
|
498
|
+
row: rowArg,
|
|
499
|
+
parent: parentArg,
|
|
500
|
+
children: [],
|
|
501
|
+
depth: parentArg ? parentArg.depth + 1 : 0,
|
|
502
|
+
codePath: rowArg.code ? (codeAbove ? `${codeAbove}.${rowArg.code.key}` : rowArg.code.key) : null,
|
|
503
|
+
value: { current: null, prior: null },
|
|
504
|
+
};
|
|
505
|
+
(parentArg ? parentArg.children : part.roots).push(node);
|
|
506
|
+
part.nodes.push(node);
|
|
507
|
+
previous = node;
|
|
508
|
+
line(rowArg, 'node', node);
|
|
509
|
+
return node;
|
|
510
|
+
};
|
|
511
|
+
for (const row of rowsArg) {
|
|
512
|
+
if (row === totalRow) {
|
|
513
|
+
part.total = line(row, 'total', null);
|
|
514
|
+
}
|
|
515
|
+
else if (row.memo) {
|
|
516
|
+
if (row.hasValues) {
|
|
517
|
+
line(row, 'memo', previous);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
else if (row.code) {
|
|
521
|
+
while (stack.length > 0 && stack[stack.length - 1].row.code.rank >= row.code.rank) {
|
|
522
|
+
stack.pop();
|
|
523
|
+
}
|
|
524
|
+
stack.push(addNode(row, stack[stack.length - 1] ?? null));
|
|
525
|
+
}
|
|
526
|
+
else if (!row.hasValues) {
|
|
527
|
+
continue;
|
|
528
|
+
}
|
|
529
|
+
else if (row.total && !incomeArg) {
|
|
530
|
+
line(row, 'sum', null);
|
|
531
|
+
}
|
|
532
|
+
else if (incomeArg && (row.total || subtotalLabelPattern.test(row.label))) {
|
|
533
|
+
stack.length = 0;
|
|
534
|
+
addNode(row, null);
|
|
535
|
+
}
|
|
536
|
+
else {
|
|
537
|
+
const before = previous;
|
|
538
|
+
addNode(row, before && !before.row.hasValues ? before : (before?.parent ?? null));
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
return part;
|
|
542
|
+
};
|
|
543
|
+
const lastOf = (nodeArg) => {
|
|
544
|
+
let node = nodeArg;
|
|
545
|
+
while (node.children.length > 0) {
|
|
546
|
+
node = node.children[node.children.length - 1];
|
|
547
|
+
}
|
|
548
|
+
return node;
|
|
549
|
+
};
|
|
550
|
+
/** what a position adds to its parent in a year: its own amount, else the sum of its parts' */
|
|
551
|
+
const contributionOf = (nodeArg, periodArg) => {
|
|
552
|
+
const own = nodeArg.value[periodArg];
|
|
553
|
+
if (own) {
|
|
554
|
+
return own;
|
|
555
|
+
}
|
|
556
|
+
const parts = nodeArg.children.map((childArg) => contributionOf(childArg, periodArg)).filter(notNull);
|
|
557
|
+
return parts.length > 0 ? sumAmounts(parts) : null;
|
|
558
|
+
};
|
|
559
|
+
const describe = (rowArg) => `"${[rowArg.code?.printed, rowArg.label].filter((partArg) => partArg).join(' ') || '(no label)'}"`;
|
|
560
|
+
/**
|
|
561
|
+
* The position a sum or a main-column amount states: the deepest of the given position and those
|
|
562
|
+
* above it that it closes, whose parts add up to the amount. A position without an amount of its own
|
|
563
|
+
* comes first; one whose own amount agrees also does.
|
|
564
|
+
*/
|
|
565
|
+
const closedBy = (fromArg, lastArg, amountArg, periodArg, ownAllowedArg) => {
|
|
566
|
+
let agreeing = null;
|
|
567
|
+
for (let candidate = fromArg; candidate && lastOf(candidate) === lastArg; candidate = candidate.parent) {
|
|
568
|
+
const contribution = contributionOf(candidate, periodArg);
|
|
569
|
+
if (!contribution || !amountsAgree(contribution, amountArg)) {
|
|
570
|
+
continue;
|
|
571
|
+
}
|
|
572
|
+
if (candidate.value[periodArg] === null) {
|
|
573
|
+
return candidate;
|
|
574
|
+
}
|
|
575
|
+
agreeing ??= ownAllowedArg ? candidate : null;
|
|
576
|
+
}
|
|
577
|
+
return agreeing;
|
|
578
|
+
};
|
|
579
|
+
/**
|
|
580
|
+
* Gives one year's amounts to the positions they belong to. In a year printed in two columns a row
|
|
581
|
+
* with both gives its first to itself and its second to the position it closes; a row with one
|
|
582
|
+
* gives it to itself. In a year printed in one column next to such a year, each amount goes where
|
|
583
|
+
* the row's main amount went (`mirror`), unless the column also prints the parts (`own`). Returns
|
|
584
|
+
* why the amounts do not fit, or null.
|
|
585
|
+
*/
|
|
586
|
+
const assignYear = (partArg, periodArg, modeArg, mainTargetsArg) => {
|
|
587
|
+
for (const line of partArg.lines) {
|
|
588
|
+
const { pre, main } = line.row.values[periodArg];
|
|
589
|
+
if (line.role === 'node') {
|
|
590
|
+
const node = line.node;
|
|
591
|
+
if (modeArg === 'vorspalte' && pre && main) {
|
|
592
|
+
if (node.value[periodArg]) {
|
|
593
|
+
return `${describe(line.row)} receives a second amount.`;
|
|
594
|
+
}
|
|
595
|
+
node.value[periodArg] = pre;
|
|
596
|
+
const target = closedBy(node.parent, node, main, periodArg, false);
|
|
597
|
+
if (!target) {
|
|
598
|
+
return `${describe(line.row)} prints ${formatAmount(main)} for no position whose parts add up to it.`;
|
|
599
|
+
}
|
|
600
|
+
target.value[periodArg] = main;
|
|
601
|
+
mainTargetsArg.set(line.row, target);
|
|
602
|
+
}
|
|
603
|
+
else if (pre || main) {
|
|
604
|
+
const amount = (main ?? pre);
|
|
605
|
+
const target = modeArg === 'mirror' ? (mainTargetsArg.get(line.row) ?? node) : node;
|
|
606
|
+
if (target.value[periodArg]) {
|
|
607
|
+
return `${describe(line.row)} gives a second amount to ${describe(target.row)}.`;
|
|
608
|
+
}
|
|
609
|
+
target.value[periodArg] = amount;
|
|
610
|
+
if (modeArg === 'vorspalte' && main) {
|
|
611
|
+
mainTargetsArg.set(line.row, node);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
else if (line.role === 'sum') {
|
|
616
|
+
const amount = main ?? pre;
|
|
617
|
+
if (!amount) {
|
|
618
|
+
continue;
|
|
619
|
+
}
|
|
620
|
+
const target = line.previous ? closedBy(line.previous, line.previous, amount, periodArg, true) : null;
|
|
621
|
+
if (!target) {
|
|
622
|
+
return `${describe(line.row)} of ${formatAmount(amount)} is not the sum of the positions above it.`;
|
|
623
|
+
}
|
|
624
|
+
target.value[periodArg] ??= amount;
|
|
625
|
+
line.closes[periodArg] = target;
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
return null;
|
|
629
|
+
};
|
|
630
|
+
/** whether every position with an amount and parts with amounts equals their sum; why not, or null */
|
|
631
|
+
const checkParts = (nodesArg, periodArg) => {
|
|
632
|
+
for (const node of nodesArg) {
|
|
633
|
+
const own = node.value[periodArg];
|
|
634
|
+
const parts = node.children.map((childArg) => contributionOf(childArg, periodArg)).filter(notNull);
|
|
635
|
+
if (!own || parts.length === 0) {
|
|
636
|
+
continue;
|
|
637
|
+
}
|
|
638
|
+
const sum = sumAmounts(parts);
|
|
639
|
+
if (!amountsAgree(own, sum)) {
|
|
640
|
+
return `${describe(node.row)} prints ${formatAmount(own)}, but its parts add up to ${formatAmount(sum)}.`;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return null;
|
|
644
|
+
};
|
|
645
|
+
const clearYear = (partsArg, periodArg) => {
|
|
646
|
+
for (const part of partsArg) {
|
|
647
|
+
part.nodes.forEach((nodeArg) => (nodeArg.value[periodArg] = null));
|
|
648
|
+
part.lines.forEach((lineArg) => (lineArg.closes[periodArg] = null));
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
const printedAmount = (rowArg, periodArg) => rowArg.values[periodArg].main ?? rowArg.values[periodArg].pre;
|
|
652
|
+
/**
|
|
653
|
+
* Gives each year's amounts of a section to its positions and checks them; the years printed in two
|
|
654
|
+
* columns come first, as the others may follow them. Returns, per year with amounts, why it does not
|
|
655
|
+
* add up, or null; a year that does not keeps no amounts.
|
|
656
|
+
*/
|
|
657
|
+
const settleSection = (partsArg, sectionArg, checkArg) => {
|
|
658
|
+
const outcome = new Map();
|
|
659
|
+
const years = statementPeriods.filter((periodArg) => sectionArg.rows.some((rowArg) => rowArg.values[periodArg].pre || rowArg.values[periodArg].main));
|
|
660
|
+
const order = [
|
|
661
|
+
...years.filter((periodArg) => sectionArg.vorspalte.has(periodArg)),
|
|
662
|
+
...years.filter((periodArg) => !sectionArg.vorspalte.has(periodArg)),
|
|
663
|
+
];
|
|
664
|
+
let mainTargets = null;
|
|
665
|
+
for (const period of order) {
|
|
666
|
+
const targets = new Map();
|
|
667
|
+
let mode = 'vorspalte';
|
|
668
|
+
if (!sectionArg.vorspalte.has(period)) {
|
|
669
|
+
const partsPrinted = sectionArg.rows.some((rowArg) => !rowArg.memo &&
|
|
670
|
+
[...sectionArg.vorspalte].some((yearArg) => rowArg.values[yearArg].pre && !rowArg.values[yearArg].main) &&
|
|
671
|
+
printedAmount(rowArg, period) !== null);
|
|
672
|
+
mode = partsPrinted ? 'own' : 'mirror';
|
|
673
|
+
}
|
|
674
|
+
let failure = null;
|
|
675
|
+
for (const part of partsArg) {
|
|
676
|
+
failure ??= assignYear(part, period, mode, mode === 'mirror' ? (mainTargets ?? targets) : targets);
|
|
677
|
+
}
|
|
678
|
+
failure ??= checkArg(period);
|
|
679
|
+
if (failure) {
|
|
680
|
+
clearYear(partsArg, period);
|
|
681
|
+
}
|
|
682
|
+
else if (mode === 'vorspalte') {
|
|
683
|
+
mainTargets ??= targets;
|
|
684
|
+
}
|
|
685
|
+
outcome.set(period, failure);
|
|
686
|
+
}
|
|
687
|
+
return outcome;
|
|
688
|
+
};
|
|
689
|
+
// ---------------------------------------------------------------------------------------------
|
|
690
|
+
// the balance sheet
|
|
691
|
+
const checkBalanceYear = (assetsArg, liabilitiesArg, periodArg) => {
|
|
692
|
+
const totals = [];
|
|
693
|
+
for (const [part, name] of [
|
|
694
|
+
[assetsArg, 'assets'],
|
|
695
|
+
[liabilitiesArg, 'equity and liabilities'],
|
|
696
|
+
]) {
|
|
697
|
+
const failure = checkParts(part.nodes, periodArg);
|
|
698
|
+
if (failure) {
|
|
699
|
+
return failure;
|
|
700
|
+
}
|
|
701
|
+
const total = part.total ? printedAmount(part.total.row, periodArg) : null;
|
|
702
|
+
if (!total) {
|
|
703
|
+
return `The ${name} print no total.`;
|
|
704
|
+
}
|
|
705
|
+
const sum = sumAmounts(part.roots.map((rootArg) => contributionOf(rootArg, periodArg)).filter(notNull));
|
|
706
|
+
if (!amountsAgree(total, sum)) {
|
|
707
|
+
return `The ${name} total ${formatAmount(total)}, but their positions add up to ${formatAmount(sum)}.`;
|
|
708
|
+
}
|
|
709
|
+
totals.push(total);
|
|
710
|
+
}
|
|
711
|
+
if (totals[0].micros !== totals[1].micros) {
|
|
712
|
+
return `Total assets of ${formatAmount(totals[0])} differ from total equity and liabilities of ${formatAmount(totals[1])}.`;
|
|
713
|
+
}
|
|
714
|
+
return null;
|
|
715
|
+
};
|
|
716
|
+
// ---------------------------------------------------------------------------------------------
|
|
717
|
+
// the income statement
|
|
718
|
+
/** the expenses of § 275 HGB, which a statement may print as positive amounts to subtract */
|
|
719
|
+
const expensePattern = /aufwend|aufwand|abschreibung|steuern|Verminderung des Bestand|Herstellungskosten|Vertriebskosten|Verwaltungskosten|Verlustübernahme|abgeführte Gewinne/i;
|
|
720
|
+
const isExpense = (labelArg) => expensePattern.test(labelArg) && !/Erhöhung|ergebnis/i.test(labelArg) && !/^Erträge/i.test(labelArg);
|
|
721
|
+
const netIncomePattern = /^(?:Konzern-?)?jahres(?:überschuss|fehlbetrag|ergebnis)/i;
|
|
722
|
+
/**
|
|
723
|
+
* Adds an income statement's lines up to its net income, expenses as printed or, with
|
|
724
|
+
* `expensesPositiveArg`, subtracted. A line that states the sum of the lines before it, or of those
|
|
725
|
+
* since the last such line, is an intermediate result and not added again.
|
|
726
|
+
*/
|
|
727
|
+
const addUpIncome = (partArg, netIndexArg, periodArg, expensesPositiveArg) => {
|
|
728
|
+
let running = zeroAmount;
|
|
729
|
+
let segment = zeroAmount;
|
|
730
|
+
const subtotals = new Set();
|
|
731
|
+
for (const root of partArg.roots.slice(0, netIndexArg)) {
|
|
732
|
+
const printed = contributionOf(root, periodArg);
|
|
733
|
+
if (!printed) {
|
|
734
|
+
continue;
|
|
735
|
+
}
|
|
736
|
+
if ((root.row.total || subtotalLabelPattern.test(root.row.label)) &&
|
|
737
|
+
(amountsAgree(printed, running) || amountsAgree(printed, segment))) {
|
|
738
|
+
subtotals.add(root);
|
|
739
|
+
segment = zeroAmount;
|
|
740
|
+
continue;
|
|
741
|
+
}
|
|
742
|
+
if (root.row.total) {
|
|
743
|
+
return `${describe(root.row)} of ${formatAmount(printed)} is the sum of no lines above it.`;
|
|
744
|
+
}
|
|
745
|
+
const signed = expensesPositiveArg && isExpense(root.row.label) ? negateAmount(printed) : printed;
|
|
746
|
+
running = addAmounts(running, signed);
|
|
747
|
+
segment = addAmounts(segment, signed);
|
|
748
|
+
}
|
|
749
|
+
const netNode = partArg.roots[netIndexArg];
|
|
750
|
+
const net = contributionOf(netNode, periodArg);
|
|
751
|
+
if (!net) {
|
|
752
|
+
return 'It prints no net income.';
|
|
753
|
+
}
|
|
754
|
+
if (amountsAgree(net, running)) {
|
|
755
|
+
return { netIncome: net, subtotals };
|
|
756
|
+
}
|
|
757
|
+
const lossOnly = /fehlbetrag/i.test(netNode.row.label) && !/überschuss|ergebnis/i.test(netNode.row.label);
|
|
758
|
+
if (lossOnly && net.micros > 0n && amountsAgree(negateAmount(net), running)) {
|
|
759
|
+
return { netIncome: negateAmount(net), subtotals };
|
|
760
|
+
}
|
|
761
|
+
return `Its lines add up to ${formatAmount(running)}, not to the net income of ${formatAmount(net)}.`;
|
|
762
|
+
};
|
|
763
|
+
const methodOf = (partArg) => {
|
|
764
|
+
const labels = partArg.nodes.map((nodeArg) => nodeArg.row.label);
|
|
765
|
+
const totalCost = labels.some((labelArg) => /Materialaufwand|Personalaufwand/i.test(labelArg));
|
|
766
|
+
const costOfSales = labels.some((labelArg) => /Herstellungskosten der zur Erzielung|Vertriebskosten/i.test(labelArg));
|
|
767
|
+
return totalCost === costOfSales ? null : totalCost ? 'total_cost' : 'cost_of_sales';
|
|
768
|
+
};
|
|
769
|
+
/** reads the income statement; throws `unparseable` where its current year cannot be read */
|
|
770
|
+
const readIncome = (draftArg, documentContextArg) => {
|
|
771
|
+
const fail = (messageArg) => {
|
|
772
|
+
throw new FinancialStatementError('unparseable', messageArg);
|
|
773
|
+
};
|
|
774
|
+
const rows = readSectionRows(draftArg, 'income statement', documentContextArg);
|
|
775
|
+
const part = buildPart(rows.rows, true);
|
|
776
|
+
const netIndex = part.roots.findIndex((rootArg) => netIncomePattern.test(rootArg.row.label));
|
|
777
|
+
if (netIndex < 0) {
|
|
778
|
+
fail('The income statement prints no net income (Jahresüberschuss or Jahresfehlbetrag).');
|
|
779
|
+
}
|
|
780
|
+
const netLine = part.lines.findIndex((lineArg) => lineArg.node === part.roots[netIndex]);
|
|
781
|
+
const checked = part.lines
|
|
782
|
+
.slice(0, netLine + 1)
|
|
783
|
+
.filter((lineArg) => lineArg.role === 'node')
|
|
784
|
+
.map((lineArg) => lineArg.node);
|
|
785
|
+
const outcome = settleSection([part], rows, (periodArg) => checkParts(checked, periodArg));
|
|
786
|
+
if (!outcome.has('current')) {
|
|
787
|
+
fail('The income statement prints no amounts for the current year.');
|
|
788
|
+
}
|
|
789
|
+
const currentFailure = outcome.get('current');
|
|
790
|
+
if (currentFailure) {
|
|
791
|
+
fail(`The income statement does not add up for the current year: ${currentFailure}`);
|
|
792
|
+
}
|
|
793
|
+
const years = new Map();
|
|
794
|
+
let expenses = 'negative';
|
|
795
|
+
const asPrinted = addUpIncome(part, netIndex, 'current', false);
|
|
796
|
+
if (typeof asPrinted !== 'string') {
|
|
797
|
+
years.set('current', asPrinted);
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
const subtracted = addUpIncome(part, netIndex, 'current', true);
|
|
801
|
+
if (typeof subtracted === 'string') {
|
|
802
|
+
fail(`The income statement does not add up to its net income for the current year: ${asPrinted}`);
|
|
803
|
+
}
|
|
804
|
+
years.set('current', subtracted);
|
|
805
|
+
expenses = 'positive';
|
|
806
|
+
}
|
|
807
|
+
let priorFailure = outcome.get('prior') ?? null;
|
|
808
|
+
if (outcome.has('prior') && !priorFailure) {
|
|
809
|
+
const prior = addUpIncome(part, netIndex, 'prior', expenses === 'positive');
|
|
810
|
+
if (typeof prior === 'string') {
|
|
811
|
+
priorFailure = prior;
|
|
812
|
+
clearYear([part], 'prior');
|
|
813
|
+
}
|
|
814
|
+
else {
|
|
815
|
+
years.set('prior', prior);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
return { rows, part, expenses, years, priorFailure };
|
|
819
|
+
};
|
|
820
|
+
// ---------------------------------------------------------------------------------------------
|
|
821
|
+
// the statement
|
|
822
|
+
/** the day a line of a statement names as its balance sheet date: `zum 31.12.2024`, or a period's end */
|
|
823
|
+
const balanceDateIn = (linesArg) => {
|
|
824
|
+
for (const line of linesArg) {
|
|
825
|
+
const period = periodIn(line);
|
|
826
|
+
if (period.start && period.end) {
|
|
827
|
+
return period.end;
|
|
828
|
+
}
|
|
829
|
+
const date = lastDateIn(line);
|
|
830
|
+
if (date && /\b(?:zum|per|am|Stichtag)\b/i.test(line)) {
|
|
831
|
+
return date;
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
return null;
|
|
835
|
+
};
|
|
836
|
+
const rangeIn = (linesArg) => {
|
|
837
|
+
for (const line of linesArg) {
|
|
838
|
+
const period = periodIn(line);
|
|
839
|
+
if (period.start && period.end) {
|
|
840
|
+
return { start: period.start, end: period.end };
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
return null;
|
|
844
|
+
};
|
|
845
|
+
const findNode = (nodesArg, patternArg) => nodesArg.find((nodeArg) => patternArg.test(nodeArg.row.label)) ?? null;
|
|
846
|
+
const descendantsOf = (nodeArg) => {
|
|
847
|
+
const result = [];
|
|
848
|
+
const stack = [...nodeArg.children].reverse();
|
|
849
|
+
for (let node = stack.pop(); node; node = stack.pop()) {
|
|
850
|
+
result.push(node);
|
|
851
|
+
stack.push(...[...node.children].reverse());
|
|
852
|
+
}
|
|
853
|
+
return result;
|
|
854
|
+
};
|
|
855
|
+
const amountText = (amountArg) => (amountArg ? formatAmount(amountArg) : null);
|
|
856
|
+
/** the printed lines of a part, each with the amounts its year kept */
|
|
857
|
+
const positionsOf = (partArg, kindsArg, keptArg) => partArg.lines.map((line) => {
|
|
858
|
+
const amountFor = (periodArg) => {
|
|
859
|
+
if (!keptArg.has(periodArg)) {
|
|
860
|
+
return null;
|
|
861
|
+
}
|
|
862
|
+
const values = line.row.values[periodArg];
|
|
863
|
+
if (line.role === 'node') {
|
|
864
|
+
return amountText(line.node.value[periodArg]);
|
|
865
|
+
}
|
|
866
|
+
return amountText(line.role === 'memo' ? (values.pre ?? values.main) : (values.main ?? values.pre));
|
|
867
|
+
};
|
|
868
|
+
const node = line.role === 'node' ? line.node : null;
|
|
869
|
+
let level = 0;
|
|
870
|
+
if (node) {
|
|
871
|
+
level = node.depth;
|
|
872
|
+
}
|
|
873
|
+
else if (line.role === 'memo') {
|
|
874
|
+
level = line.node ? line.node.depth + 1 : 0;
|
|
875
|
+
}
|
|
876
|
+
else if (line.role === 'sum') {
|
|
877
|
+
level = (line.closes.current ?? line.closes.prior ?? line.previous)?.depth ?? 0;
|
|
878
|
+
}
|
|
879
|
+
const kind = line.role === 'memo' ? 'memo' : line.role === 'total' ? 'total' : line.role === 'sum' ? 'subtotal' : (kindsArg.get(node) ?? 'position');
|
|
880
|
+
return {
|
|
881
|
+
code: node ? node.codePath : null,
|
|
882
|
+
printedCode: node ? (line.row.code?.printed ?? null) : null,
|
|
883
|
+
label: line.row.label,
|
|
884
|
+
level,
|
|
885
|
+
kind,
|
|
886
|
+
current: amountFor('current'),
|
|
887
|
+
prior: amountFor('prior'),
|
|
888
|
+
};
|
|
889
|
+
});
|
|
890
|
+
/**
|
|
891
|
+
* Reads a statement under the HGB from the blocks of its document: the balance sheet (§ 266 HGB),
|
|
892
|
+
* required, and the income statement (§ 275 HGB), where one is published. Throws `unparseable` where
|
|
893
|
+
* no balance sheet is found or its current year cannot be read with certainty; leaves out with a
|
|
894
|
+
* note an income statement that cannot, and a prior year that does not add up.
|
|
895
|
+
*/
|
|
896
|
+
export const readHgbStatement = (blocksArg) => {
|
|
897
|
+
const unparseable = (messageArg) => {
|
|
898
|
+
throw new FinancialStatementError('unparseable', messageArg);
|
|
899
|
+
};
|
|
900
|
+
const sections = readSections(blocksArg);
|
|
901
|
+
const notes = [...sections.notes];
|
|
902
|
+
if (sections.sideBySide) {
|
|
903
|
+
unparseable('The balance sheet prints its two sides next to each other, which is not read here.');
|
|
904
|
+
}
|
|
905
|
+
if (sections.balance.valueRows === 0) {
|
|
906
|
+
unparseable('No balance sheet was found.');
|
|
907
|
+
}
|
|
908
|
+
if (sections.balance.items.some((itemArg) => itemArg.side === null && hasAmountCell(itemArg.cells))) {
|
|
909
|
+
unparseable('The balance sheet does not mark its sides (Aktiva, Passiva).');
|
|
910
|
+
}
|
|
911
|
+
const balanceRows = readSectionRows(sections.balance, 'balance sheet', sections.documentContext);
|
|
912
|
+
const assets = buildPart(balanceRows.rows.filter((rowArg) => rowArg.side === 'assets'), false);
|
|
913
|
+
const liabilities = buildPart(balanceRows.rows.filter((rowArg) => rowArg.side === 'liabilities'), false);
|
|
914
|
+
const balanceOutcome = settleSection([assets, liabilities], balanceRows, (periodArg) => checkBalanceYear(assets, liabilities, periodArg));
|
|
915
|
+
if (!balanceOutcome.has('current')) {
|
|
916
|
+
unparseable('The balance sheet prints no amounts for the current year.');
|
|
917
|
+
}
|
|
918
|
+
const balanceFailure = balanceOutcome.get('current');
|
|
919
|
+
if (balanceFailure) {
|
|
920
|
+
unparseable(`The balance sheet does not add up for the current year: ${balanceFailure}`);
|
|
921
|
+
}
|
|
922
|
+
let income = null;
|
|
923
|
+
if (sections.income.valueRows > 0) {
|
|
924
|
+
try {
|
|
925
|
+
income = readIncome(sections.income, sections.documentContext);
|
|
926
|
+
}
|
|
927
|
+
catch (error) {
|
|
928
|
+
if (!(error instanceof FinancialStatementError) || error.code !== 'unparseable') {
|
|
929
|
+
throw error;
|
|
930
|
+
}
|
|
931
|
+
notes.push(`The income statement was left out: ${error.message}`);
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
const priorFailures = [
|
|
935
|
+
balanceOutcome.get('prior') ? `the balance sheet does not add up for it: ${balanceOutcome.get('prior')}` : null,
|
|
936
|
+
income?.priorFailure ? `the income statement does not add up for it: ${income.priorFailure}` : null,
|
|
937
|
+
].filter(notNull);
|
|
938
|
+
const priorPrinted = balanceOutcome.has('prior') || (income?.rows.rows.some((rowArg) => printedAmount(rowArg, 'prior')) ?? false);
|
|
939
|
+
const kept = new Set(['current']);
|
|
940
|
+
if (priorPrinted && priorFailures.length === 0) {
|
|
941
|
+
kept.add('prior');
|
|
942
|
+
}
|
|
943
|
+
else if (priorFailures.length > 0) {
|
|
944
|
+
notes.push(`The prior year's figures were left out: ${priorFailures.join('; ')}`);
|
|
945
|
+
}
|
|
946
|
+
const equityNode = liabilities.roots.find((rootArg) => /^Eigenkapital/i.test(rootArg.row.label)) ?? null;
|
|
947
|
+
const balanceNetIncome = equityNode ? findNode(descendantsOf(equityNode), /^(?:Konzern-?)?jahres(?:überschuss|fehlbetrag)/i) : null;
|
|
948
|
+
const revenueNode = income ? findNode(income.part.nodes, /^Umsatzerlöse/i) : null;
|
|
949
|
+
const keyFiguresOf = (periodArg) => ({
|
|
950
|
+
totalAssets: amountText(assets.total ? printedAmount(assets.total.row, periodArg) : null),
|
|
951
|
+
equity: amountText(equityNode ? contributionOf(equityNode, periodArg) : null),
|
|
952
|
+
netIncome: amountText(income?.years.get(periodArg)?.netIncome ?? (balanceNetIncome ? contributionOf(balanceNetIncome, periodArg) : null)),
|
|
953
|
+
revenue: amountText(revenueNode ? contributionOf(revenueNode, periodArg) : null),
|
|
954
|
+
});
|
|
955
|
+
const contexts = [...sections.balance.contexts, ...sections.income.contexts, ...sections.documentContext];
|
|
956
|
+
const columnOf = (periodArg) => balanceRows.columns[periodArg] ?? income?.rows.columns[periodArg] ?? null;
|
|
957
|
+
const incomeRange = rangeIn(sections.income.contexts);
|
|
958
|
+
const documentRange = rangeIn(sections.documentContext);
|
|
959
|
+
const currentEnd = balanceDateIn(sections.balance.contexts) ??
|
|
960
|
+
columnOf('current')?.date ??
|
|
961
|
+
incomeRange?.end ??
|
|
962
|
+
documentRange?.end ??
|
|
963
|
+
balanceDateIn(sections.documentContext);
|
|
964
|
+
const currentStart = currentEnd === null
|
|
965
|
+
? null
|
|
966
|
+
: ([incomeRange, documentRange, rangeIn(contexts.filter((lineArg) => periodIn(lineArg).end === currentEnd))].find((rangeArg) => rangeArg?.end === currentEnd)?.start ?? null);
|
|
967
|
+
const periodOf = (periodArg, startArg, endArg) => ({
|
|
968
|
+
heading: columnOf(periodArg)?.heading || null,
|
|
969
|
+
start: startArg,
|
|
970
|
+
end: endArg,
|
|
971
|
+
});
|
|
972
|
+
const incomeKinds = new Map();
|
|
973
|
+
let incomeStatement = null;
|
|
974
|
+
if (income) {
|
|
975
|
+
for (const node of income.years.get('current')?.subtotals ?? []) {
|
|
976
|
+
incomeKinds.set(node, 'subtotal');
|
|
977
|
+
}
|
|
978
|
+
for (const node of income.part.roots) {
|
|
979
|
+
if (node.row.total) {
|
|
980
|
+
incomeKinds.set(node, 'subtotal');
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
const netNode = income.part.roots.find((rootArg) => netIncomePattern.test(rootArg.row.label));
|
|
984
|
+
if (netNode) {
|
|
985
|
+
incomeKinds.set(netNode, 'total');
|
|
986
|
+
}
|
|
987
|
+
incomeStatement = {
|
|
988
|
+
unit: income.rows.unit,
|
|
989
|
+
method: methodOf(income.part),
|
|
990
|
+
expenses: income.expenses,
|
|
991
|
+
positions: positionsOf(income.part, incomeKinds, kept),
|
|
992
|
+
};
|
|
993
|
+
}
|
|
994
|
+
return {
|
|
995
|
+
standard: 'hgb',
|
|
996
|
+
currency: 'EUR',
|
|
997
|
+
periods: {
|
|
998
|
+
current: periodOf('current', currentStart, currentEnd),
|
|
999
|
+
prior: kept.has('prior') ? periodOf('prior', null, columnOf('prior')?.date ?? null) : null,
|
|
1000
|
+
},
|
|
1001
|
+
keyFigures: {
|
|
1002
|
+
current: keyFiguresOf('current'),
|
|
1003
|
+
prior: kept.has('prior') ? keyFiguresOf('prior') : null,
|
|
1004
|
+
},
|
|
1005
|
+
balanceSheet: {
|
|
1006
|
+
unit: balanceRows.unit,
|
|
1007
|
+
assets: positionsOf(assets, new Map(), kept),
|
|
1008
|
+
equityAndLiabilities: positionsOf(liabilities, new Map(), kept),
|
|
1009
|
+
},
|
|
1010
|
+
incomeStatement,
|
|
1011
|
+
notes,
|
|
1012
|
+
};
|
|
1013
|
+
};
|
|
1014
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuaGdiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZmluYW5jaWFsc3RhdGVtZW50cy9wYXJzZS5oZ2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0UsT0FBTyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osZUFBZSxFQUNmLGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsVUFBVSxFQUNWLFFBQVEsRUFDUixPQUFPLEVBQ1AsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osVUFBVSxHQUVYLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBb0I5RixNQUFNLGdCQUFnQixHQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRXpELE1BQU0sT0FBTyxHQUFHLENBQUksUUFBa0IsRUFBaUIsRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFFNUUsZ0dBQWdHO0FBQ2hHLDZDQUE2QztBQUU3Qyx5RUFBeUU7QUFDekUsTUFBTSxnQkFBZ0IsR0FDcEIsb1FBQW9RLENBQUM7QUFFdlEsaUVBQWlFO0FBQ2pFLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRS9ILHNFQUFzRTtBQUN0RSxNQUFN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
|