@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.
Files changed (89) hide show
  1. package/.smartconfig.json +6 -2
  2. package/dist_ts/00_commitinfo_data.js +3 -3
  3. package/dist_ts/financialstatements/amounts.d.ts +58 -0
  4. package/dist_ts/financialstatements/amounts.js +130 -0
  5. package/dist_ts/financialstatements/classes.financialstatementerror.d.ts +24 -0
  6. package/dist_ts/financialstatements/classes.financialstatementerror.js +10 -0
  7. package/dist_ts/financialstatements/constants.d.ts +16 -0
  8. package/dist_ts/financialstatements/constants.js +20 -0
  9. package/dist_ts/financialstatements/dates.d.ts +16 -0
  10. package/dist_ts/financialstatements/dates.js +72 -0
  11. package/dist_ts/financialstatements/html.d.ts +21 -0
  12. package/dist_ts/financialstatements/html.js +92 -0
  13. package/dist_ts/financialstatements/index.d.ts +6 -0
  14. package/dist_ts/financialstatements/index.js +11 -0
  15. package/dist_ts/financialstatements/interfaces.d.ts +258 -0
  16. package/dist_ts/financialstatements/interfaces.js +2 -0
  17. package/dist_ts/financialstatements/layout.d.ts +20 -0
  18. package/dist_ts/financialstatements/layout.html.d.ts +8 -0
  19. package/dist_ts/financialstatements/layout.html.js +125 -0
  20. package/dist_ts/financialstatements/layout.js +2 -0
  21. package/dist_ts/financialstatements/layout.pdf.d.ts +6 -0
  22. package/dist_ts/financialstatements/layout.pdf.js +229 -0
  23. package/dist_ts/financialstatements/mediatypes.d.ts +3 -0
  24. package/dist_ts/financialstatements/mediatypes.js +11 -0
  25. package/dist_ts/financialstatements/outline.d.ts +22 -0
  26. package/dist_ts/financialstatements/outline.js +26 -0
  27. package/dist_ts/financialstatements/parse.esef.d.ts +13 -0
  28. package/dist_ts/financialstatements/parse.esef.js +349 -0
  29. package/dist_ts/financialstatements/parse.hgb.d.ts +9 -0
  30. package/dist_ts/financialstatements/parse.hgb.js +1014 -0
  31. package/dist_ts/financialstatements/parse.statement.d.ts +8 -0
  32. package/dist_ts/financialstatements/parse.statement.js +25 -0
  33. package/dist_ts/financialstatements/plugins.d.ts +10 -0
  34. package/dist_ts/financialstatements/plugins.js +15 -0
  35. package/dist_ts/financialstatements/read.d.ts +10 -0
  36. package/dist_ts/financialstatements/read.js +113 -0
  37. package/dist_ts/gleif/classes.gleifclient.d.ts +26 -0
  38. package/dist_ts/gleif/classes.gleifclient.js +214 -0
  39. package/dist_ts/gleif/classes.gleiferror.d.ts +6 -0
  40. package/dist_ts/gleif/classes.gleiferror.js +11 -0
  41. package/dist_ts/gleif/crosswalk.d.ts +7 -0
  42. package/dist_ts/gleif/crosswalk.js +25 -0
  43. package/dist_ts/gleif/csv.d.ts +2 -0
  44. package/dist_ts/gleif/csv.js +75 -0
  45. package/dist_ts/gleif/data.crosswalk.d.ts +12 -0
  46. package/dist_ts/gleif/data.crosswalk.js +1265 -0
  47. package/dist_ts/gleif/index.d.ts +6 -0
  48. package/dist_ts/gleif/index.js +7 -0
  49. package/dist_ts/gleif/interfaces.d.ts +101 -0
  50. package/dist_ts/gleif/interfaces.js +2 -0
  51. package/dist_ts/gleif/plugins.d.ts +1 -0
  52. package/dist_ts/gleif/plugins.js +3 -0
  53. package/dist_ts/gleif/records.d.ts +6 -0
  54. package/dist_ts/gleif/records.js +107 -0
  55. package/dist_ts/gleif/stream.zip.d.ts +2 -0
  56. package/dist_ts/gleif/stream.zip.js +54 -0
  57. package/dist_ts/plugins.d.ts +2 -0
  58. package/dist_ts/plugins.js +4 -1
  59. package/package.json +20 -5
  60. package/readme.md +156 -5
  61. package/ts/00_commitinfo_data.ts +2 -2
  62. package/ts/financialstatements/amounts.ts +181 -0
  63. package/ts/financialstatements/classes.financialstatementerror.ts +35 -0
  64. package/ts/financialstatements/constants.ts +24 -0
  65. package/ts/financialstatements/dates.ts +89 -0
  66. package/ts/financialstatements/html.ts +107 -0
  67. package/ts/financialstatements/index.ts +17 -0
  68. package/ts/financialstatements/interfaces.ts +268 -0
  69. package/ts/financialstatements/layout.html.ts +130 -0
  70. package/ts/financialstatements/layout.pdf.ts +268 -0
  71. package/ts/financialstatements/layout.ts +16 -0
  72. package/ts/financialstatements/mediatypes.ts +14 -0
  73. package/ts/financialstatements/outline.ts +44 -0
  74. package/ts/financialstatements/parse.esef.ts +394 -0
  75. package/ts/financialstatements/parse.hgb.ts +1235 -0
  76. package/ts/financialstatements/parse.statement.ts +26 -0
  77. package/ts/financialstatements/plugins.ts +29 -0
  78. package/ts/financialstatements/read.ts +135 -0
  79. package/ts/gleif/classes.gleifclient.ts +170 -0
  80. package/ts/gleif/classes.gleiferror.ts +8 -0
  81. package/ts/gleif/crosswalk.ts +29 -0
  82. package/ts/gleif/csv.ts +60 -0
  83. package/ts/gleif/data.crosswalk.ts +1271 -0
  84. package/ts/gleif/index.ts +6 -0
  85. package/ts/gleif/interfaces.ts +107 -0
  86. package/ts/gleif/plugins.ts +2 -0
  87. package/ts/gleif/records.ts +104 -0
  88. package/ts/gleif/stream.zip.ts +43 -0
  89. 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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