@ekwo-ai/xbrl-cbso 0.4.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 (56) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/LICENSE +21 -0
  3. package/README.md +202 -0
  4. package/dist/enterprise-number.d.ts +9 -0
  5. package/dist/enterprise-number.d.ts.map +1 -0
  6. package/dist/enterprise-number.js +18 -0
  7. package/dist/enterprise-number.js.map +1 -0
  8. package/dist/equations.d.ts +35 -0
  9. package/dist/equations.d.ts.map +1 -0
  10. package/dist/equations.js +77 -0
  11. package/dist/equations.js.map +1 -0
  12. package/dist/errors.d.ts +9 -0
  13. package/dist/errors.d.ts.map +1 -0
  14. package/dist/errors.js +12 -0
  15. package/dist/errors.js.map +1 -0
  16. package/dist/fact-keys.d.ts +68 -0
  17. package/dist/fact-keys.d.ts.map +1 -0
  18. package/dist/fact-keys.js +121 -0
  19. package/dist/fact-keys.js.map +1 -0
  20. package/dist/generator.d.ts +73 -0
  21. package/dist/generator.d.ts.map +1 -0
  22. package/dist/generator.js +394 -0
  23. package/dist/generator.js.map +1 -0
  24. package/dist/index.d.ts +11 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +8 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/pcmn/index.d.ts +68 -0
  29. package/dist/pcmn/index.d.ts.map +1 -0
  30. package/dist/pcmn/index.js +266 -0
  31. package/dist/pcmn/index.js.map +1 -0
  32. package/dist/rounding.d.ts +25 -0
  33. package/dist/rounding.d.ts.map +1 -0
  34. package/dist/rounding.js +35 -0
  35. package/dist/rounding.js.map +1 -0
  36. package/dist/taxonomy/cbso-26-m01-f.d.ts +17 -0
  37. package/dist/taxonomy/cbso-26-m01-f.d.ts.map +1 -0
  38. package/dist/taxonomy/cbso-26-m01-f.js +433 -0
  39. package/dist/taxonomy/cbso-26-m01-f.js.map +1 -0
  40. package/dist/taxonomy/identification.d.ts +13 -0
  41. package/dist/taxonomy/identification.d.ts.map +1 -0
  42. package/dist/taxonomy/identification.js +16 -0
  43. package/dist/taxonomy/identification.js.map +1 -0
  44. package/dist/taxonomy/index.d.ts +27 -0
  45. package/dist/taxonomy/index.d.ts.map +1 -0
  46. package/dist/taxonomy/index.js +83 -0
  47. package/dist/taxonomy/index.js.map +1 -0
  48. package/dist/types.d.ts +149 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +2 -0
  51. package/dist/types.js.map +1 -0
  52. package/dist/validate.d.ts +4 -0
  53. package/dist/validate.d.ts.map +1 -0
  54. package/dist/validate.js +84 -0
  55. package/dist/validate.js.map +1 -0
  56. package/package.json +65 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Fact keys — the dimensional way to name a line of the annual accounts.
3
+ *
4
+ * The CBSO taxonomy has no element per reporting code: a code is a generic
5
+ * metric plus a set of explicit dimension members. A fact key writes that
6
+ * signature down, metric first:
7
+ *
8
+ * met:am1|bas:m9|rst:m2 → "Créances à un an au plus" (40/41)
9
+ * met:am2|bas:m44|ntr:m4 → "Bénéfice (Perte) reporté(e)" (14)
10
+ *
11
+ * A key names the members that matter and leaves the rest implicit, so it can
12
+ * be stored next to a statement line without repeating the whole context. It
13
+ * resolves against the template to exactly one reporting code, or throws.
14
+ */
15
+ import { CbsoInputError } from './errors.js';
16
+ /** Thrown when a fact key names no line of the model, or more than one. */
17
+ export class CbsoFactKeyError extends CbsoInputError {
18
+ key;
19
+ candidates;
20
+ constructor(message,
21
+ /** The key that could not be resolved. */
22
+ key,
23
+ /** Reporting codes the key could stand for, when it is ambiguous. */
24
+ candidates = []) {
25
+ super(message, `xbrl_element[${key}]`);
26
+ this.key = key;
27
+ this.candidates = candidates;
28
+ this.name = 'CbsoFactKeyError';
29
+ }
30
+ }
31
+ /** Dimensions the taxonomy uses to place a fact in a column, not to name it. */
32
+ const POSITIONAL = new Set(['dim:part', 'dim:prd']);
33
+ /** `"met:am1|bas:m9|rst:m2"` → metric plus `{ "dim:bas": "bas:m9", … }`. */
34
+ export function parseFactKey(key) {
35
+ const parts = key
36
+ .split('|')
37
+ .map((p) => p.trim())
38
+ .filter(Boolean);
39
+ const metric = parts.shift();
40
+ if (!metric?.startsWith('met:')) {
41
+ throw new CbsoFactKeyError('a fact key starts with its metric, e.g. "met:am1"', key);
42
+ }
43
+ const members = {};
44
+ for (const part of parts) {
45
+ const prefix = part.split(':')[0];
46
+ if (!prefix || !part.includes(':')) {
47
+ throw new CbsoFactKeyError(`"${part}" is not a domain member such as "bas:m9"`, key);
48
+ }
49
+ members[`dim:${prefix}`] = part;
50
+ }
51
+ return { metric, members };
52
+ }
53
+ /**
54
+ * Reporting code a fact key stands for.
55
+ *
56
+ * Candidates are the facts of the template that carry the key's metric and
57
+ * every one of its members; the winner is the one that adds the fewest members
58
+ * of its own — `met:am1|bas:m2` is "ACTIFS IMMOBILISÉS" (21/28) and not one of
59
+ * the three lines under it. A tie means the key does not say enough: the error
60
+ * lists the codes it could stand for.
61
+ */
62
+ export function resolveFactKey(key, template) {
63
+ const { metric, members } = parseFactKey(key);
64
+ const entries = Object.entries(members);
65
+ let best = null;
66
+ const winners = new Map();
67
+ for (const fact of template.facts) {
68
+ if (fact.elem !== metric)
69
+ continue;
70
+ const [kind, code] = fact.role.split(':');
71
+ if (kind !== 'rubrique' || !code)
72
+ continue;
73
+ if (entries.some(([dim, member]) => fact.dims[dim] !== member))
74
+ continue;
75
+ const extra = Object.keys(fact.dims).filter((dim) => !POSITIONAL.has(dim) && !(dim in members)).length;
76
+ if (best === null || extra < best) {
77
+ best = extra;
78
+ winners.clear();
79
+ }
80
+ if (extra === best)
81
+ winners.set(code, true);
82
+ }
83
+ const codes = [...winners.keys()].sort();
84
+ if (codes.length === 0) {
85
+ throw new CbsoFactKeyError('no line of this model carries that signature', key);
86
+ }
87
+ if (codes.length > 1) {
88
+ throw new CbsoFactKeyError(`signature shared by ${codes.join(', ')} — add the member that separates them (usually a "part:" member)`, key, codes);
89
+ }
90
+ return codes[0];
91
+ }
92
+ /**
93
+ * Turns statement lines keyed by fact signature into the `values` map of
94
+ * {@link CbsoInput}. Lines whose two amounts are both absent are skipped; a
95
+ * code reached twice with conflicting figures is an error, not a silent
96
+ * overwrite.
97
+ */
98
+ export function valuesFromFactKeys(lines, template) {
99
+ const values = {};
100
+ for (const line of lines) {
101
+ if (line.amount == null && line.previous_amount == null)
102
+ continue;
103
+ const code = resolveFactKey(line.xbrl_element, template);
104
+ const previous = values[code];
105
+ const next = { n: line.amount ?? null, p: line.previous_amount ?? null };
106
+ if (previous && (previous.n !== next.n || previous.p !== next.p)) {
107
+ throw new CbsoFactKeyError(`two lines resolve to ${code} with different amounts`, line.xbrl_element, [code]);
108
+ }
109
+ values[code] = next;
110
+ }
111
+ return values;
112
+ }
113
+ /** Fact key of one template fact, in the same syntax {@link parseFactKey} reads. */
114
+ export function factKeyOf(fact) {
115
+ const members = Object.entries(fact.dims)
116
+ .filter(([dim]) => !POSITIONAL.has(dim))
117
+ .map(([, member]) => member)
118
+ .sort();
119
+ return [fact.elem, ...members].join('|');
120
+ }
121
+ //# sourceMappingURL=fact-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fact-keys.js","sourceRoot":"","sources":["../src/fact-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { CbsoInput, CbsoTemplate, GenerateOptions, YearValues } from './types.js';
2
+ export declare function escapeXml(s: string): string;
3
+ /**
4
+ * Builds one XBRL instance. Use {@link generateCbsoXbrl} unless you need to
5
+ * plug a custom template.
6
+ */
7
+ export declare class XbrlCbso {
8
+ private readonly input;
9
+ private readonly template;
10
+ private readonly options;
11
+ private readonly entityNumber;
12
+ private readonly administrators;
13
+ private readonly values;
14
+ constructor(input: CbsoInput, template?: CbsoTemplate, options?: GenerateOptions);
15
+ /** The XBRL document, as a UTF-8 string ready to be imported in Filing. */
16
+ generate(): string;
17
+ /** Facts driven by the template: identification fields and reporting codes. */
18
+ private templateFacts;
19
+ private templateValue;
20
+ /**
21
+ * Identification enumerations absent from the metric template: legal form,
22
+ * enterprise court, postal code and country of the registered office.
23
+ */
24
+ private identificationFacts;
25
+ /**
26
+ * Postal code and country of an address (`bas:m31`). Belgium → postal-code
27
+ * enumeration (the municipality follows from it); abroad → free text.
28
+ */
29
+ private addressEnumFacts;
30
+ /**
31
+ * Board members. Natural persons are keyed by first and last name
32
+ * (`afnp`/`annp`), legal entities by name (`anlp`), permanent
33
+ * representatives by entity name plus their own names (`aprf`/`aprn`).
34
+ */
35
+ private administratorFacts;
36
+ private buildContexts;
37
+ }
38
+ /**
39
+ * Numbers follow the facets of the metric elements: integers for `met:int*`,
40
+ * one decimal for `met:dec*` (full-time equivalents), two decimals for amounts.
41
+ */
42
+ export declare function formatNumber(v: number, elem: string): string;
43
+ /**
44
+ * The figures a filing will actually carry: {@link CbsoInput.values} plus the
45
+ * lines of {@link CbsoInput.lines} resolved against the template. A code given
46
+ * on both sides with two different figures is an error rather than a silent
47
+ * overwrite.
48
+ */
49
+ export declare function mergeValues(input: CbsoInput, template?: CbsoTemplate): Record<string, YearValues>;
50
+ /**
51
+ * Codes of `values` that the template does not know and that
52
+ * {@link generateCbsoXbrl} would therefore not emit. Useful to surface, before
53
+ * filing, figures that belong to another model (full, micro) or to an annex
54
+ * absent from the abridged form.
55
+ */
56
+ export declare function unknownCodes(values: Record<string, unknown>, template?: CbsoTemplate): string[];
57
+ /**
58
+ * Figures that would be dropped: a code the model does not have, or a code
59
+ * whose column the model does not have — the annex boxes the NBB itself
60
+ * suffixes with `P` (`8059P`, `1003P`) exist only in the previous-year column,
61
+ * so a figure left under `n` would never reach the filing.
62
+ */
63
+ export declare function unfiledValues(input: CbsoInput, template?: CbsoTemplate): Array<{
64
+ code: string;
65
+ column: 'n' | 'p';
66
+ reason: 'unknown code' | 'no such column';
67
+ }>;
68
+ /**
69
+ * One call: {@link CbsoInput} → XBRL instance string, ready for
70
+ * `filing.cbso.nbb.be` (« Import one or more XBRL forms »).
71
+ */
72
+ export declare function generateCbsoXbrl(input: CbsoInput, options?: GenerateOptions): string;
73
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAEV,SAAS,EACT,YAAY,EACZ,eAAe,EAGf,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO3C;AAOD;;;GAGG;AACH,qBAAa,QAAQ;IAMjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;gBAGjC,KAAK,EAAE,SAAS,EAChB,QAAQ,GAAE,YAA2B,EACrC,OAAO,GAAE,eAAoB;IAQhD,2EAA2E;IAC3E,QAAQ,IAAI,MAAM;IA2DlB,+EAA+E;IAC/E,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IA2CrB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAqE1B,OAAO,CAAC,aAAa;CAkCtB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAChB,QAAQ,GAAE,YAA2B,GACpC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAc5B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,GAAE,YAA2B,GACpC,MAAM,EAAE,CAOV;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,QAAQ,GAAE,YAA2B,GACpC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CAAA;CAAE,CAAC,CAmBvF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAEpF"}
@@ -0,0 +1,394 @@
1
+ /**
2
+ * XBRL instance generator for the Belgian standardised annual accounts
3
+ * (National Bank of Belgium, Central Balance Sheet Office — CBSO).
4
+ *
5
+ * Template-driven: every emitted fact carries the signature the taxonomy gives
6
+ * it — generic `met:*` element, explicit dimension members, period, unit. The
7
+ * reporting codes come from the taxonomy package itself (see `docs/sources.md`);
8
+ * the identification fields, which carry no reporting code, reproduce a filing
9
+ * the NBB accepted. The generator materialises the dimensional contexts
10
+ * (deduplicated) and only emits the facts for which a value is provided, so a
11
+ * partial form stays importable, as in the Filing editor.
12
+ */
13
+ import { NAMESPACES, CBSO_26_M01F } from './taxonomy/index.js';
14
+ import { valuesFromFactKeys } from './fact-keys.js';
15
+ import { CbsoInputError } from './errors.js';
16
+ import { normalizeEnterpriseNumber } from './enterprise-number.js';
17
+ import { validateInput } from './validate.js';
18
+ const XML_HEADER = '<?xml version="1.0" encoding="UTF-8"?>\n';
19
+ /** Prefixes always declared: XBRL core plus the axes of every context. */
20
+ const CORE_PREFIXES = ['', 'link', 'xbrldi', 'xlink', 'iso4217', 'dim', 'open'];
21
+ /** Type of the administrator record (`atc` domain), constant in the abridged model. */
22
+ const ADMINISTRATOR_TYPE = 'atc:m001';
23
+ const DEFAULT_DECLARATIONS = { m1: true, m2: false, m39: false };
24
+ const INSTANT_N = { type: 'instant', ref: 'N' };
25
+ export function escapeXml(s) {
26
+ return s
27
+ .replace(/&/g, '&amp;')
28
+ .replace(/</g, '&lt;')
29
+ .replace(/>/g, '&gt;')
30
+ .replace(/'/g, '&apos;')
31
+ .replace(/"/g, '&quot;');
32
+ }
33
+ function prefixOf(qname) {
34
+ const i = qname.indexOf(':');
35
+ return i > 0 ? qname.slice(0, i) : null;
36
+ }
37
+ /**
38
+ * Builds one XBRL instance. Use {@link generateCbsoXbrl} unless you need to
39
+ * plug a custom template.
40
+ */
41
+ export class XbrlCbso {
42
+ input;
43
+ template;
44
+ options;
45
+ entityNumber;
46
+ administrators;
47
+ values;
48
+ constructor(input, template = CBSO_26_M01F, options = {}) {
49
+ this.input = input;
50
+ this.template = template;
51
+ this.options = options;
52
+ if (options.validate !== false)
53
+ validateInput(input);
54
+ this.entityNumber = normalizeEnterpriseNumber(input.entityNumber);
55
+ this.administrators = input.administrators ?? [];
56
+ this.values = mergeValues(input, template);
57
+ }
58
+ /** The XBRL document, as a UTF-8 string ready to be imported in Filing. */
59
+ generate() {
60
+ const facts = [
61
+ ...this.templateFacts(),
62
+ ...this.identificationFacts(),
63
+ ...this.administratorFacts(),
64
+ ];
65
+ const { contextXml, contextIdOf } = this.buildContexts(facts);
66
+ const usedPrefixes = new Set(CORE_PREFIXES);
67
+ const use = (qname) => {
68
+ const p = prefixOf(qname);
69
+ if (p)
70
+ usedPrefixes.add(p);
71
+ };
72
+ for (const f of facts) {
73
+ use(f.elem);
74
+ for (const [d, m] of Object.entries(f.dims)) {
75
+ use(d);
76
+ use(m);
77
+ }
78
+ for (const [d, el] of f.typed) {
79
+ use(d);
80
+ use(el);
81
+ }
82
+ use(f.value);
83
+ }
84
+ const nsAttrs = Object.entries(NAMESPACES)
85
+ .filter(([p]) => usedPrefixes.has(p))
86
+ .map(([p, uri]) => (p ? ` xmlns:${p}="${uri}"` : ` xmlns="${uri}"`))
87
+ .join('\n');
88
+ const units = [...new Set(facts.map((f) => f.unit).filter((u) => !!u))];
89
+ const unitXml = units
90
+ .map((u) => {
91
+ const measure = u.toUpperCase().includes('EUR') ? 'iso4217:EUR' : 'pure';
92
+ return `<unit id="${u}"><measure>${measure}</measure></unit>`;
93
+ })
94
+ .join('\n');
95
+ const factXml = facts
96
+ .map((f) => {
97
+ const attrs = [
98
+ `contextRef="${contextIdOf(f)}"`,
99
+ f.unit ? `unitRef="${f.unit}"` : '',
100
+ f.dec != null ? `decimals="${f.dec}"` : '',
101
+ ]
102
+ .filter(Boolean)
103
+ .join(' ');
104
+ return `<${f.elem} ${attrs}>${escapeXml(f.value)}</${f.elem}>`;
105
+ })
106
+ .join('\n');
107
+ return (XML_HEADER +
108
+ `<xbrl xml:lang="${this.options.lang ?? 'fr'}"\n${nsAttrs}>\n` +
109
+ `<link:schemaRef xlink:type="simple" xlink:href="${this.template.schemaRef}"/>\n` +
110
+ `${contextXml}\n${unitXml}\n${factXml}\n</xbrl>\n`);
111
+ }
112
+ /** Facts driven by the template: identification fields and reporting codes. */
113
+ templateFacts() {
114
+ const out = [];
115
+ for (const t of this.template.facts) {
116
+ const value = this.templateValue(t);
117
+ if (value == null)
118
+ continue;
119
+ out.push({ elem: t.elem, dims: t.dims, typed: [], period: t.period, value, unit: t.unit, dec: t.dec });
120
+ }
121
+ return out;
122
+ }
123
+ templateValue(t) {
124
+ const [kind, key, col] = t.role.split(':');
125
+ if (!key)
126
+ return null;
127
+ if (kind === 'rubrique') {
128
+ const v = col === 'P' ? this.values[key]?.p : this.values[key]?.n;
129
+ return v == null ? null : formatNumber(v, t.elem);
130
+ }
131
+ if (kind !== 'ident')
132
+ return null;
133
+ const i = this.input;
134
+ switch (key) {
135
+ case 'entity_number':
136
+ return this.entityNumber;
137
+ case 'denomination':
138
+ return i.denomination;
139
+ case 'street':
140
+ return i.address.street;
141
+ case 'number':
142
+ return i.address.number;
143
+ case 'box':
144
+ return i.address.box ?? null;
145
+ case 'ga_date':
146
+ return i.gaDate;
147
+ case 'deed_date':
148
+ return i.deedDate;
149
+ case 'period_start':
150
+ return i.periodStart;
151
+ case 'period_end':
152
+ return i.periodEnd;
153
+ case 'prev_period_start':
154
+ return i.prevPeriodStart;
155
+ case 'prev_period_end':
156
+ return i.prevPeriodEnd;
157
+ case 'decl': {
158
+ // role = ident:decl:dcl:mX → t.role.split(':') = ['ident','decl','dcl','mX']
159
+ const member = t.role.split(':')[3];
160
+ const value = i.declarations?.[member] ?? DEFAULT_DECLARATIONS[member];
161
+ return value == null ? null : String(value);
162
+ }
163
+ default:
164
+ return null;
165
+ }
166
+ }
167
+ /**
168
+ * Identification enumerations absent from the metric template: legal form,
169
+ * enterprise court, postal code and country of the registered office.
170
+ */
171
+ identificationFacts() {
172
+ const entity = { 'dim:part': 'part:m2', 'dim:psn': 'psn:m1' };
173
+ return [
174
+ { elem: 'lgf-enum:list2', dims: { 'dim:bas': 'bas:m30', ...entity }, typed: [], period: INSTANT_N, value: this.input.legalForm },
175
+ { elem: 'cct-enum:list1', dims: { 'dim:bas': 'bas:m32', 'dim:part': 'part:m2' }, typed: [], period: INSTANT_N, value: this.input.court },
176
+ ...this.addressEnumFacts(entity, [], this.input.address),
177
+ ];
178
+ }
179
+ /**
180
+ * Postal code and country of an address (`bas:m31`). Belgium → postal-code
181
+ * enumeration (the municipality follows from it); abroad → free text.
182
+ */
183
+ addressEnumFacts(dims, typed, address) {
184
+ const country = (address.country ?? 'BE').toUpperCase();
185
+ const out = [];
186
+ if (country === 'BE') {
187
+ out.push({
188
+ elem: 'pcd-enum:list1',
189
+ dims: { 'dim:bas': 'bas:m31', 'dim:ctc': 'ctc:m4', ...dims },
190
+ typed,
191
+ period: INSTANT_N,
192
+ value: `pcd:m${address.postalCode.replace(/\D/g, '')}`,
193
+ });
194
+ }
195
+ else {
196
+ for (const [ctc, value] of [
197
+ ['ctc:m4', address.postalCode],
198
+ ['ctc:m5', address.city],
199
+ ]) {
200
+ if (!value)
201
+ continue;
202
+ out.push({ elem: 'met:str2', dims: { 'dim:bas': 'bas:m31', 'dim:ctc': ctc, ...dims }, typed, period: INSTANT_N, value });
203
+ }
204
+ }
205
+ out.push({
206
+ elem: 'cty-enum:list1',
207
+ dims: { 'dim:bas': 'bas:m31', 'dim:ctc': 'ctc:m6', ...dims },
208
+ typed,
209
+ period: INSTANT_N,
210
+ value: `cty:m${country}`,
211
+ });
212
+ return out;
213
+ }
214
+ /**
215
+ * Board members. Natural persons are keyed by first and last name
216
+ * (`afnp`/`annp`), legal entities by name (`anlp`), permanent
217
+ * representatives by entity name plus their own names (`aprf`/`aprn`).
218
+ */
219
+ administratorFacts() {
220
+ const out = [];
221
+ const person = (psn) => ({ 'dim:part': 'part:m2', 'dim:psn': psn });
222
+ const addressFacts = (psn, typed, address) => {
223
+ for (const [ctc, value] of [
224
+ ['ctc:m1', address.street],
225
+ ['ctc:m2', address.number],
226
+ ['ctc:m3', address.box],
227
+ ]) {
228
+ if (!value)
229
+ continue;
230
+ out.push({ elem: 'met:str2', dims: { 'dim:bas': 'bas:m31', 'dim:ctc': ctc, ...person(psn) }, typed, period: INSTANT_N, value });
231
+ }
232
+ out.push(...this.addressEnumFacts(person(psn), typed, address));
233
+ out.push({
234
+ elem: 'atc-enum:list1',
235
+ dims: { 'dim:bas': 'bas:m31', 'dim:dcl': 'dcl:m7', ...person(psn) },
236
+ typed,
237
+ period: INSTANT_N,
238
+ value: ADMINISTRATOR_TYPE,
239
+ });
240
+ };
241
+ for (const admin of this.administrators) {
242
+ if (admin.kind === 'person') {
243
+ const typed = [
244
+ ['dim:afnp', 'open:str', admin.firstName],
245
+ ['dim:annp', 'open:str', admin.lastName],
246
+ ];
247
+ addressFacts('psn:m12', typed, admin);
248
+ continue;
249
+ }
250
+ const typed = [['dim:anlp', 'open:str', admin.name]];
251
+ if (admin.enterpriseNumber) {
252
+ // Identifier of the entity: type (enumeration for a Belgian entity, free
253
+ // label otherwise) and number. Required by Filing for any entity with a
254
+ // Belgian address.
255
+ const typeDims = { 'dim:bas': 'bas:m26', 'dim:dcl': 'dcl:m7', ...person('psn:m10') };
256
+ if (admin.identifierLabel) {
257
+ out.push({ elem: 'met:str2', dims: typeDims, typed, period: INSTANT_N, value: admin.identifierLabel });
258
+ }
259
+ else {
260
+ out.push({ elem: 'nmt-enum:list1', dims: typeDims, typed, period: INSTANT_N, value: 'nmt:m1' });
261
+ }
262
+ const number = (admin.country ?? 'BE').toUpperCase() === 'BE'
263
+ ? normalizeEnterpriseNumber(admin.enterpriseNumber)
264
+ : admin.enterpriseNumber;
265
+ out.push({
266
+ elem: 'met:str2',
267
+ dims: { 'dim:bas': 'bas:m26', 'dim:qlt': 'qlt:m1', ...person('psn:m10') },
268
+ typed,
269
+ period: INSTANT_N,
270
+ value: number,
271
+ });
272
+ }
273
+ addressFacts('psn:m10', typed, admin);
274
+ if (admin.representative) {
275
+ const repTyped = [
276
+ ['dim:anlp', 'open:str', admin.name],
277
+ ['dim:aprf', 'open:str', admin.representative.firstName],
278
+ ['dim:aprn', 'open:str', admin.representative.lastName],
279
+ ];
280
+ addressFacts('psn:m11', repTyped, admin);
281
+ }
282
+ }
283
+ return out;
284
+ }
285
+ buildContexts(facts) {
286
+ const i = this.input;
287
+ const ids = new Map();
288
+ const xml = [];
289
+ const keyOf = (f) => JSON.stringify([f.period, f.dims, f.typed]);
290
+ for (const f of facts) {
291
+ const key = keyOf(f);
292
+ if (ids.has(key))
293
+ continue;
294
+ const id = `c${ids.size + 1}`;
295
+ ids.set(key, id);
296
+ const current = f.period.ref === 'N';
297
+ const periodXml = f.period.type === 'instant'
298
+ ? `<period><instant>${current ? i.periodEnd : i.prevPeriodEnd}</instant></period>`
299
+ : `<period><startDate>${current ? i.periodStart : i.prevPeriodStart}</startDate><endDate>${current ? i.periodEnd : i.prevPeriodEnd}</endDate></period>`;
300
+ const explicit = Object.entries(f.dims)
301
+ .sort(([a], [b]) => a.localeCompare(b))
302
+ .map(([d, m]) => `<xbrldi:explicitMember dimension="${d}">${m}</xbrldi:explicitMember>`)
303
+ .join('');
304
+ const typed = f.typed
305
+ .map(([d, el, v]) => `<xbrldi:typedMember dimension="${d}"><${el}>${escapeXml(v)}</${el}></xbrldi:typedMember>`)
306
+ .join('');
307
+ const scenario = explicit || typed ? `<scenario>${explicit}${typed}</scenario>` : '';
308
+ xml.push(`<context id="${id}"><entity><identifier scheme="http://www.fgov.be">${this.entityNumber}</identifier></entity>${periodXml}${scenario}</context>`);
309
+ }
310
+ return { contextXml: xml.join('\n'), contextIdOf: (f) => ids.get(keyOf(f)) };
311
+ }
312
+ }
313
+ /**
314
+ * Numbers follow the facets of the metric elements: integers for `met:int*`,
315
+ * one decimal for `met:dec*` (full-time equivalents), two decimals for amounts.
316
+ */
317
+ export function formatNumber(v, elem) {
318
+ if (elem.startsWith('met:int'))
319
+ return String(Math.round(v));
320
+ if (elem.startsWith('met:dec'))
321
+ return String(Math.round(v * 10) / 10);
322
+ return v.toFixed(2);
323
+ }
324
+ /**
325
+ * The figures a filing will actually carry: {@link CbsoInput.values} plus the
326
+ * lines of {@link CbsoInput.lines} resolved against the template. A code given
327
+ * on both sides with two different figures is an error rather than a silent
328
+ * overwrite.
329
+ */
330
+ export function mergeValues(input, template = CBSO_26_M01F) {
331
+ const fromLines = input.lines ? valuesFromFactKeys(input.lines, template) : {};
332
+ const merged = { ...fromLines };
333
+ for (const [code, value] of Object.entries(input.values ?? {})) {
334
+ const line = fromLines[code];
335
+ if (line && (line.n !== (value.n ?? null) || line.p !== (value.p ?? null))) {
336
+ throw new CbsoInputError('given both as a reporting code and as a statement line, with different figures', `values.${code}`);
337
+ }
338
+ merged[code] = value;
339
+ }
340
+ return merged;
341
+ }
342
+ /**
343
+ * Codes of `values` that the template does not know and that
344
+ * {@link generateCbsoXbrl} would therefore not emit. Useful to surface, before
345
+ * filing, figures that belong to another model (full, micro) or to an annex
346
+ * absent from the abridged form.
347
+ */
348
+ export function unknownCodes(values, template = CBSO_26_M01F) {
349
+ const known = new Set();
350
+ for (const t of template.facts) {
351
+ const [kind, code] = t.role.split(':');
352
+ if (kind === 'rubrique' && code)
353
+ known.add(code);
354
+ }
355
+ return Object.keys(values).filter((code) => !known.has(code)).sort();
356
+ }
357
+ /**
358
+ * Figures that would be dropped: a code the model does not have, or a code
359
+ * whose column the model does not have — the annex boxes the NBB itself
360
+ * suffixes with `P` (`8059P`, `1003P`) exist only in the previous-year column,
361
+ * so a figure left under `n` would never reach the filing.
362
+ */
363
+ export function unfiledValues(input, template = CBSO_26_M01F) {
364
+ const columns = new Map();
365
+ for (const t of template.facts) {
366
+ const [kind, code, col] = t.role.split(':');
367
+ if (kind !== 'rubrique' || !code)
368
+ continue;
369
+ const set = columns.get(code) ?? new Set();
370
+ set.add(col === 'P' ? 'p' : 'n');
371
+ columns.set(code, set);
372
+ }
373
+ const out = [];
374
+ for (const [code, value] of Object.entries(mergeValues(input, template))) {
375
+ const known = columns.get(code);
376
+ for (const column of ['n', 'p']) {
377
+ if (value[column] == null)
378
+ continue;
379
+ if (!known)
380
+ out.push({ code, column, reason: 'unknown code' });
381
+ else if (!known.has(column))
382
+ out.push({ code, column, reason: 'no such column' });
383
+ }
384
+ }
385
+ return out.sort((a, b) => a.code.localeCompare(b.code) || a.column.localeCompare(b.column));
386
+ }
387
+ /**
388
+ * One call: {@link CbsoInput} → XBRL instance string, ready for
389
+ * `filing.cbso.nbb.be` (« Import one or more XBRL forms »).
390
+ */
391
+ export function generateCbsoXbrl(input, options) {
392
+ return new XbrlCbso(input, CBSO_26_M01F, options).generate();
393
+ }
394
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { generateCbsoXbrl, unknownCodes, unfiledValues, mergeValues, XbrlCbso, formatNumber, escapeXml, } from './generator.js';
2
+ export { parseFactKey, resolveFactKey, valuesFromFactKeys, factKeyOf, CbsoFactKeyError, } from './fact-keys.js';
3
+ export type { FactKeyLine } from './fact-keys.js';
4
+ export { checkBnbEquations, ABRIDGED_IDENTITIES } from './equations.js';
5
+ export type { EquationViolation } from './equations.js';
6
+ export { validateInput } from './validate.js';
7
+ export { CbsoInputError } from './errors.js';
8
+ export { normalizeEnterpriseNumber, isValidEnterpriseNumber } from './enterprise-number.js';
9
+ export { CBSO_26_M01F, FRAMEWORK, NAMESPACES, LegalForm, EnterpriseCourt } from './taxonomy/index.js';
10
+ export type { Administrator, BnbCode, CbsoInput, CbsoTemplate, Declarations, GenerateOptions, IsoDate, LegalEntityAdministrator, NaturalPersonAdministrator, PostalAddress, TemplateFact, YearValues, } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtG,YAAY,EACV,aAAa,EACb,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,OAAO,EACP,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { generateCbsoXbrl, unknownCodes, unfiledValues, mergeValues, XbrlCbso, formatNumber, escapeXml, } from './generator.js';
2
+ export { parseFactKey, resolveFactKey, valuesFromFactKeys, factKeyOf, CbsoFactKeyError, } from './fact-keys.js';
3
+ export { checkBnbEquations, ABRIDGED_IDENTITIES } from './equations.js';
4
+ export { validateInput } from './validate.js';
5
+ export { CbsoInputError } from './errors.js';
6
+ export { normalizeEnterpriseNumber, isValidEnterpriseNumber } from './enterprise-number.js';
7
+ export { CBSO_26_M01F, FRAMEWORK, NAMESPACES, LegalForm, EnterpriseCourt } from './taxonomy/index.js';
8
+ //# sourceMappingURL=index.js.map