@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 @@
1
+ {"version":3,"file":"index.js","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;AAExB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAExE,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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Belgian minimum chart of accounts (PCMN / MAR) → reporting codes of the
3
+ * abridged annual accounts, and the arithmetic that turns a trial balance
4
+ * into the `values` expected by the generator.
5
+ *
6
+ * Input convention: `balance` is `debit − credit` for every account, both for
7
+ * the current and the previous year. The functions below apply the sign
8
+ * conventions of the standardised form (liabilities, equity and revenue shown
9
+ * as positive amounts).
10
+ */
11
+ import type { BnbCode, YearValues } from '../types.js';
12
+ export interface ReportingLine {
13
+ /** Reporting code, e.g. `"21/28"`. Empty for a heading. */
14
+ code: BnbCode;
15
+ /** French label of the standardised form. */
16
+ label: string;
17
+ /** PCMN account prefixes summed into this line (leaf lines only). */
18
+ accountPrefixes: string[];
19
+ /** Codes summed into this line (subtotal lines only). */
20
+ sumOf?: BnbCode[];
21
+ /** Computed by a formula rather than from accounts or children. */
22
+ computed?: boolean;
23
+ /** Indentation level in the printed form. */
24
+ indent: number;
25
+ style: 'total' | 'section' | 'subsection' | 'category' | 'detail';
26
+ }
27
+ export interface AccountBalance {
28
+ /** PCMN account number, e.g. `"400000"`. */
29
+ account: string;
30
+ /** Current year, debit − credit. */
31
+ balance: number;
32
+ /** Previous year, debit − credit. */
33
+ priorBalance: number;
34
+ }
35
+ export interface Pair {
36
+ current: number;
37
+ prior: number;
38
+ }
39
+ export type Section = 'assets' | 'liabilities' | 'income' | 'appropriation';
40
+ /** Balance sheet after appropriation — assets. */
41
+ export declare const ASSETS: readonly ReportingLine[];
42
+ /** Balance sheet after appropriation — equity and liabilities. */
43
+ export declare const LIABILITIES: readonly ReportingLine[];
44
+ /** Income statement (abridged: starts at gross margin). */
45
+ export declare const INCOME_STATEMENT: readonly ReportingLine[];
46
+ /** Appropriation of the result. */
47
+ export declare const APPROPRIATION: readonly ReportingLine[];
48
+ /**
49
+ * Balance sheet side from a trial balance. Liabilities and equity are
50
+ * negated so that credit balances read as positive amounts.
51
+ */
52
+ export declare function computeBalanceSheet(side: 'assets' | 'liabilities', accounts: readonly AccountBalance[]): Map<BnbCode, Pair>;
53
+ /** Income statement from a trial balance, including the computed results. */
54
+ export declare function computeIncomeStatement(accounts: readonly AccountBalance[]): Map<BnbCode, Pair>;
55
+ /**
56
+ * Appropriation from a trial balance. Needs the income statement for `9905`.
57
+ * `14P` (result carried forward from the previous year) is read from the
58
+ * previous-year balance of account 14.
59
+ */
60
+ export declare function computeAppropriation(accounts: readonly AccountBalance[], incomeStatement: ReadonlyMap<BnbCode, Pair>): Map<BnbCode, Pair>;
61
+ /**
62
+ * Everything at once: the four sections from one trial balance, merged into
63
+ * the `values` shape expected by the generator (amounts rounded to the cent).
64
+ */
65
+ export declare function valuesFromTrialBalance(accounts: readonly AccountBalance[]): Record<BnbCode, YearValues>;
66
+ /** Merges section maps into generator values; later sections win on conflicts. */
67
+ export declare function mergeSections(...sections: ReadonlyMap<BnbCode, Pair>[]): Record<BnbCode, YearValues>;
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pcmn/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,IAAI,EAAE,OAAO,CAAC;IACd,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;CACnE;AAED,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,eAAe,CAAC;AAS5E,kDAAkD;AAClD,eAAO,MAAM,MAAM,EAAE,SAAS,aAAa,EA0B1C,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,WAAW,EAAE,SAAS,aAAa,EAqD/C,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EA0BpD,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,aAAa,EAAE,SAAS,aAAa,EAcjD,CAAC;AAyCF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,GAAG,aAAa,EAC9B,QAAQ,EAAE,SAAS,cAAc,EAAE,GAClC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CASpB;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CA2D9F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,eAAe,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,GAC1C,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAYpB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAQvG;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,GAAG,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAQpG"}
@@ -0,0 +1,266 @@
1
+ import { roundCurrency } from '../rounding.js';
2
+ const leaf = (code, label, accountPrefixes, indent, style) => ({ code, label, accountPrefixes, indent, style });
3
+ const subtotal = (code, label, sumOf, indent, style) => ({ code, label, accountPrefixes: [], sumOf, indent, style });
4
+ const computed = (code, label, indent, style) => ({ code, label, accountPrefixes: [], computed: true, indent, style });
5
+ /** Balance sheet after appropriation — assets. */
6
+ export const ASSETS = [
7
+ leaf('20', "Frais d'établissement", ['20'], 0, 'section'),
8
+ subtotal('21/28', 'Actifs immobilisés', ['21', '22/27', '28'], 0, 'section'),
9
+ leaf('21', 'Immobilisations incorporelles', ['21'], 1, 'subsection'),
10
+ subtotal('22/27', 'Immobilisations corporelles', ['22', '23', '24', '25', '26', '27'], 1, 'subsection'),
11
+ leaf('22', 'Terrains et constructions', ['22'], 2, 'detail'),
12
+ leaf('23', 'Installations, machines et outillage', ['23'], 2, 'detail'),
13
+ leaf('24', 'Mobilier et matériel roulant', ['24'], 2, 'detail'),
14
+ leaf('25', 'Location-financement et droits similaires', ['25'], 2, 'detail'),
15
+ leaf('26', 'Autres immobilisations corporelles', ['26'], 2, 'detail'),
16
+ leaf('27', 'Immobilisations en cours et acomptes versés', ['27'], 2, 'detail'),
17
+ leaf('28', 'Immobilisations financières', ['28'], 1, 'subsection'),
18
+ subtotal('29/58', 'Actifs circulants', ['29', '3', '40/41', '50/53', '54/58', '490/1'], 0, 'section'),
19
+ leaf('29', "Créances à plus d'un an", ['29'], 1, 'subsection'),
20
+ leaf('290', 'Créances commerciales', ['290'], 2, 'detail'),
21
+ leaf('291', 'Autres créances', ['291'], 2, 'detail'),
22
+ subtotal('3', "Stocks et commandes en cours d'exécution", ['30/36', '37'], 1, 'subsection'),
23
+ leaf('30/36', 'Stocks', ['30', '31', '32', '33', '34', '35', '36'], 2, 'detail'),
24
+ leaf('37', "Commandes en cours d'exécution", ['37'], 2, 'detail'),
25
+ subtotal('40/41', 'Créances à un an au plus', ['40', '41'], 1, 'subsection'),
26
+ leaf('40', 'Créances commerciales', ['40'], 2, 'detail'),
27
+ leaf('41', 'Autres créances', ['41'], 2, 'detail'),
28
+ leaf('50/53', 'Placements de trésorerie', ['50', '51', '52', '53'], 1, 'subsection'),
29
+ leaf('54/58', 'Valeurs disponibles', ['54', '55', '56', '57', '58'], 1, 'subsection'),
30
+ leaf('490/1', 'Comptes de régularisation', ['490', '491'], 1, 'subsection'),
31
+ subtotal('20/58', "Total de l'actif", ['20', '21/28', '29/58'], 0, 'total'),
32
+ ];
33
+ /** Balance sheet after appropriation — equity and liabilities. */
34
+ export const LIABILITIES = [
35
+ subtotal('10/15', 'Capitaux propres', ['10/11', '12', '13', '14', '15', '19'], 0, 'section'),
36
+ subtotal('10/11', 'Apport', ['10', '11'], 1, 'subsection'),
37
+ leaf('10', 'Capital', ['10'], 2, 'category'),
38
+ leaf('100', 'Capital souscrit', ['100'], 3, 'detail'),
39
+ leaf('101', 'Capital non appelé', ['101'], 3, 'detail'),
40
+ leaf('11', 'En dehors du capital', ['11'], 2, 'category'),
41
+ leaf('1100/10', "Primes d'émission", ['1100', '1101', '1102', '1103', '1104', '1105', '1106', '1107', '1108', '1110'], 3, 'detail'),
42
+ leaf('1109/19', 'Autres', ['1109', '1119'], 3, 'detail'),
43
+ leaf('12', 'Plus-values de réévaluation', ['12'], 1, 'subsection'),
44
+ subtotal('13', 'Réserves', ['130/1', '132', '133'], 1, 'subsection'),
45
+ subtotal('130/1', 'Réserves indisponibles', ['130', '1311', '1312', '1313', '1319'], 2, 'category'),
46
+ leaf('130', 'Réserve légale', ['130'], 3, 'detail'),
47
+ leaf('1311', 'Réserves statutairement indisponibles', ['1311'], 3, 'detail'),
48
+ leaf('1312', "Acquisition d'actions propres", ['1312'], 3, 'detail'),
49
+ leaf('1313', 'Soutien financier', ['1313'], 3, 'detail'),
50
+ leaf('1319', 'Autres', ['1319'], 3, 'detail'),
51
+ leaf('132', 'Réserves immunisées', ['132'], 2, 'detail'),
52
+ leaf('133', 'Réserves disponibles', ['133'], 2, 'detail'),
53
+ leaf('14', 'Bénéfice (perte) reporté(e)', ['14'], 1, 'subsection'),
54
+ leaf('15', 'Subsides en capital', ['15'], 1, 'subsection'),
55
+ leaf('19', "Avance aux associés sur la répartition de l'actif net", ['19'], 1, 'subsection'),
56
+ subtotal('16', 'Provisions et impôts différés', ['160/5', '168'], 0, 'section'),
57
+ subtotal('160/5', 'Provisions pour risques et charges', ['160', '161', '162', '163', '164/5'], 1, 'subsection'),
58
+ leaf('160', 'Pensions et obligations similaires', ['160'], 2, 'detail'),
59
+ leaf('161', 'Charges fiscales', ['161'], 2, 'detail'),
60
+ leaf('162', 'Grosses réparations et gros entretien', ['162'], 2, 'detail'),
61
+ leaf('163', 'Obligations environnementales', ['163'], 2, 'detail'),
62
+ leaf('164/5', 'Autres risques et charges', ['164', '165'], 2, 'detail'),
63
+ leaf('168', 'Impôts différés', ['168'], 1, 'subsection'),
64
+ subtotal('17/49', 'Dettes', ['17', '42/48', '492/3'], 0, 'section'),
65
+ subtotal('17', "Dettes à plus d'un an", ['170/4', '175', '176', '178/9'], 1, 'subsection'),
66
+ leaf('170/4', 'Dettes financières', ['170', '171', '172', '173', '174'], 2, 'category'),
67
+ leaf('172/3', 'Établissements de crédit, dettes de location-financement et dettes assimilées', ['172', '173'], 3, 'detail'),
68
+ leaf('174/0', 'Autres emprunts', ['174', '170'], 3, 'detail'),
69
+ leaf('175', 'Dettes commerciales', ['175'], 2, 'detail'),
70
+ leaf('176', 'Acomptes sur commandes', ['176'], 2, 'detail'),
71
+ leaf('178/9', 'Autres dettes', ['178', '179'], 2, 'detail'),
72
+ subtotal('42/48', 'Dettes à un an au plus', ['42', '43', '44', '46', '45', '47/48'], 1, 'subsection'),
73
+ leaf('42', "Dettes à plus d'un an échéant dans l'année", ['42'], 2, 'detail'),
74
+ leaf('43', 'Dettes financières', ['43'], 2, 'category'),
75
+ leaf('430/8', 'Établissements de crédit', ['430', '431', '432', '433', '434', '435', '436', '437', '438'], 3, 'detail'),
76
+ leaf('439', 'Autres emprunts', ['439'], 3, 'detail'),
77
+ leaf('44', 'Dettes commerciales', ['44'], 2, 'category'),
78
+ leaf('440/4', 'Fournisseurs', ['440', '441', '442', '443', '444'], 3, 'detail'),
79
+ leaf('441', 'Effets à payer', ['441'], 3, 'detail'),
80
+ leaf('46', 'Acomptes sur commandes', ['46'], 2, 'detail'),
81
+ leaf('45', 'Dettes fiscales, salariales et sociales', ['45'], 2, 'category'),
82
+ leaf('450/3', 'Impôts', ['450', '451', '452', '453'], 3, 'detail'),
83
+ leaf('454/9', 'Rémunérations et charges sociales', ['454', '455', '456', '457', '458', '459'], 3, 'detail'),
84
+ leaf('47/48', 'Autres dettes', ['47', '48'], 2, 'detail'),
85
+ leaf('492/3', 'Comptes de régularisation', ['492', '493'], 1, 'subsection'),
86
+ subtotal('10/49', 'Total du passif', ['10/15', '16', '17/49'], 0, 'total'),
87
+ ];
88
+ /** Income statement (abridged: starts at gross margin). */
89
+ export const INCOME_STATEMENT = [
90
+ computed('9900', 'Marge brute', 1, 'subsection'),
91
+ leaf('70', "Chiffre d'affaires", ['70'], 2, 'detail'),
92
+ leaf('60/61', 'Approvisionnements, marchandises, services et biens divers', ['60', '61'], 2, 'detail'),
93
+ leaf('62', 'Rémunérations, charges sociales et pensions', ['62'], 1, 'subsection'),
94
+ leaf('630', "Amortissements et réductions de valeur sur frais d'établissement, sur immobilisations incorporelles et corporelles", ['630'], 1, 'subsection'),
95
+ leaf('631/4', "Réductions de valeur sur stocks, sur commandes en cours d'exécution et sur créances commerciales", ['631', '632', '633', '634'], 1, 'subsection'),
96
+ leaf('635/8', 'Provisions pour risques et charges', ['635', '636', '637', '638'], 1, 'subsection'),
97
+ leaf('640/8', "Autres charges d'exploitation", ['640', '641', '642', '643', '644', '645', '646', '647', '648'], 1, 'subsection'),
98
+ leaf('649', "Charges d'exploitation portées à l'actif au titre de frais de restructuration", ['649'], 1, 'subsection'),
99
+ computed('9901', "Bénéfice (perte) d'exploitation", 0, 'section'),
100
+ subtotal('75/76B', 'Produits financiers', ['75', '76B'], 1, 'subsection'),
101
+ leaf('75', 'Produits financiers récurrents', ['75'], 2, 'detail'),
102
+ leaf('753', 'Dont : subsides en capital et en intérêts', ['753'], 3, 'detail'),
103
+ leaf('76B', 'Produits financiers non récurrents', ['76'], 2, 'detail'),
104
+ subtotal('65/66B', 'Charges financières', ['65', '66B'], 1, 'subsection'),
105
+ leaf('65', 'Charges financières récurrentes', ['65'], 2, 'detail'),
106
+ leaf('66B', 'Charges financières non récurrentes', ['66'], 2, 'detail'),
107
+ computed('9903', "Bénéfice (perte) de l'exercice avant impôts", 0, 'section'),
108
+ leaf('780', 'Prélèvement sur les impôts différés', ['780'], 1, 'detail'),
109
+ leaf('680', 'Transfert aux impôts différés', ['680'], 1, 'detail'),
110
+ leaf('67/77', 'Impôts sur le résultat', ['67', '77'], 1, 'subsection'),
111
+ computed('9904', "Bénéfice (perte) de l'exercice", 0, 'section'),
112
+ leaf('789', 'Prélèvement sur les réserves immunisées', ['789'], 1, 'detail'),
113
+ leaf('689', 'Transfert aux réserves immunisées', ['689'], 1, 'detail'),
114
+ computed('9905', "Bénéfice (perte) de l'exercice à affecter", 0, 'total'),
115
+ ];
116
+ /** Appropriation of the result. */
117
+ export const APPROPRIATION = [
118
+ computed('9906', 'Bénéfice (perte) à affecter', 0, 'section'),
119
+ computed('14P', "Bénéfice (perte) reporté(e) de l'exercice précédent", 1, 'detail'),
120
+ leaf('791/2', 'Prélèvement sur les capitaux propres', ['791', '792'], 0, 'subsection'),
121
+ subtotal('691/2', 'Affectation aux capitaux propres', ['691', '6920', '6921'], 0, 'subsection'),
122
+ leaf('691', "À l'apport", ['691'], 1, 'detail'),
123
+ leaf('6920', 'À la réserve légale', ['6920'], 1, 'detail'),
124
+ leaf('6921', 'Aux autres réserves', ['6921'], 1, 'detail'),
125
+ leaf('794', 'Intervention des associés dans la perte', ['794'], 0, 'subsection'),
126
+ subtotal('694/7', 'Bénéfice à distribuer', ['694', '695', '696', '697'], 0, 'subsection'),
127
+ leaf('694', "Rémunération de l'apport", ['694'], 1, 'detail'),
128
+ leaf('695', 'Administrateurs ou gérants', ['695'], 1, 'detail'),
129
+ leaf('696', 'Travailleurs', ['696'], 1, 'detail'),
130
+ leaf('697', 'Autres allocataires', ['697'], 1, 'detail'),
131
+ ];
132
+ function sumByPrefix(accounts, prefixes, negate = false) {
133
+ let current = 0;
134
+ let prior = 0;
135
+ for (const acc of accounts) {
136
+ if (prefixes.some((p) => acc.account.startsWith(p))) {
137
+ current += acc.balance;
138
+ prior += acc.priorBalance;
139
+ }
140
+ }
141
+ return negate ? { current: neg(current), prior: neg(prior) } : { current, prior };
142
+ }
143
+ /** Negation that never yields `-0`. */
144
+ function neg(x) {
145
+ return x === 0 ? 0 : -x;
146
+ }
147
+ function resolveSubtotals(lines, values) {
148
+ // Iterate until stable: handles chains such as 20/58 → 21/28 → 22/27.
149
+ let changed = true;
150
+ let guard = lines.length;
151
+ while (changed && guard-- > 0) {
152
+ changed = false;
153
+ for (const line of lines) {
154
+ if (!line.sumOf || values.has(line.code))
155
+ continue;
156
+ if (!line.sumOf.every((c) => values.has(c)))
157
+ continue;
158
+ const total = line.sumOf.reduce((acc, c) => {
159
+ const v = values.get(c);
160
+ return { current: acc.current + v.current, prior: acc.prior + v.prior };
161
+ }, { current: 0, prior: 0 });
162
+ values.set(line.code, total);
163
+ changed = true;
164
+ }
165
+ }
166
+ }
167
+ /**
168
+ * Balance sheet side from a trial balance. Liabilities and equity are
169
+ * negated so that credit balances read as positive amounts.
170
+ */
171
+ export function computeBalanceSheet(side, accounts) {
172
+ const lines = side === 'assets' ? ASSETS : LIABILITIES;
173
+ const values = new Map();
174
+ for (const line of lines) {
175
+ if (line.sumOf || line.computed || line.accountPrefixes.length === 0)
176
+ continue;
177
+ values.set(line.code, sumByPrefix(accounts, line.accountPrefixes, side === 'liabilities'));
178
+ }
179
+ resolveSubtotals(lines, values);
180
+ return values;
181
+ }
182
+ /** Income statement from a trial balance, including the computed results. */
183
+ export function computeIncomeStatement(accounts) {
184
+ const v = new Map();
185
+ const revenue = (prefixes) => sumByPrefix(accounts, prefixes, true);
186
+ const expense = (prefixes) => sumByPrefix(accounts, prefixes);
187
+ const add = (...pairs) => pairs.reduce((acc, p) => 'negate' in p
188
+ ? { current: acc.current - p.negate.current, prior: acc.prior - p.negate.prior }
189
+ : { current: acc.current + p.current, prior: acc.prior + p.prior }, { current: 0, prior: 0 });
190
+ const not = (p) => ({ negate: p });
191
+ const turnover = revenue(['70']);
192
+ v.set('70', turnover);
193
+ const supplies = expense(['60', '61']);
194
+ v.set('60/61', supplies);
195
+ // Gross margin = 70 + 71 + 72 + 74 − 60/61
196
+ const grossMargin = add(turnover, revenue(['71']), revenue(['72']), revenue(['74']), not(supplies));
197
+ v.set('9900', grossMargin);
198
+ v.set('62', expense(['62']));
199
+ v.set('630', expense(['630']));
200
+ v.set('631/4', expense(['631', '632', '633', '634']));
201
+ v.set('635/8', expense(['635', '636', '637', '638']));
202
+ v.set('640/8', expense(['640', '641', '642', '643', '644', '645', '646', '647', '648']));
203
+ v.set('649', expense(['649']));
204
+ const operating = add(grossMargin, not(v.get('62')), not(v.get('630')), not(v.get('631/4')), not(v.get('635/8')), not(v.get('640/8')), v.get('649'));
205
+ v.set('9901', operating);
206
+ v.set('75', revenue(['75']));
207
+ v.set('753', revenue(['753']));
208
+ v.set('76B', revenue(['76']));
209
+ v.set('75/76B', add(v.get('75'), v.get('76B')));
210
+ v.set('65', expense(['65']));
211
+ v.set('66B', expense(['66']));
212
+ v.set('65/66B', add(v.get('65'), v.get('66B')));
213
+ const beforeTax = add(operating, v.get('75/76B'), not(v.get('65/66B')));
214
+ v.set('9903', beforeTax);
215
+ v.set('780', revenue(['780']));
216
+ v.set('680', expense(['680']));
217
+ v.set('67/77', expense(['67', '77']));
218
+ const result = add(beforeTax, v.get('780'), not(v.get('680')), not(v.get('67/77')));
219
+ v.set('9904', result);
220
+ v.set('789', revenue(['789']));
221
+ v.set('689', expense(['689']));
222
+ v.set('9905', add(result, v.get('789'), not(v.get('689'))));
223
+ return v;
224
+ }
225
+ /**
226
+ * Appropriation from a trial balance. Needs the income statement for `9905`.
227
+ * `14P` (result carried forward from the previous year) is read from the
228
+ * previous-year balance of account 14.
229
+ */
230
+ export function computeAppropriation(accounts, incomeStatement) {
231
+ const v = new Map();
232
+ const toAppropriate = incomeStatement.get('9905') ?? { current: 0, prior: 0 };
233
+ const carried = sumByPrefix(accounts, ['14'], true);
234
+ v.set('14P', { current: carried.prior, prior: 0 });
235
+ v.set('9906', { current: toAppropriate.current + carried.prior, prior: toAppropriate.prior });
236
+ for (const line of APPROPRIATION) {
237
+ if (line.sumOf || line.computed || line.accountPrefixes.length === 0)
238
+ continue;
239
+ v.set(line.code, sumByPrefix(accounts, line.accountPrefixes));
240
+ }
241
+ resolveSubtotals(APPROPRIATION, v);
242
+ return v;
243
+ }
244
+ /**
245
+ * Everything at once: the four sections from one trial balance, merged into
246
+ * the `values` shape expected by the generator (amounts rounded to the cent).
247
+ */
248
+ export function valuesFromTrialBalance(accounts) {
249
+ const income = computeIncomeStatement(accounts);
250
+ return mergeSections(computeBalanceSheet('assets', accounts), computeBalanceSheet('liabilities', accounts), income, computeAppropriation(accounts, income));
251
+ }
252
+ /** Merges section maps into generator values; later sections win on conflicts. */
253
+ export function mergeSections(...sections) {
254
+ const values = {};
255
+ for (const section of sections) {
256
+ for (const [code, pair] of section) {
257
+ values[code] = { n: round2(pair.current), p: round2(pair.prior) };
258
+ }
259
+ }
260
+ return values;
261
+ }
262
+ /** The one rounding rule, at two decimals. See `../rounding.ts`. */
263
+ function round2(v) {
264
+ return roundCurrency(v, 2);
265
+ }
266
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pcmn/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The one rounding rule of Ekwo: **half up, on the absolute value, at the
3
+ * currency's decimals**.
4
+ *
5
+ * Three packages used to answer this differently — `Math.round((v + EPSILON) *
6
+ * 100) / 100`, `Math.round(v * 100) / 100` and `Number.prototype.toFixed(2)` —
7
+ * and the three disagreed on the two cases that matter: a negative half, where
8
+ * `Math.round` goes towards positive infinity and turns -0.005 into -0.00, and
9
+ * a value a binary float cannot hold, where 2.675 becomes 2.67 because
10
+ * `2.675 * 100` is really 267.49999999999994. A credit note is a sale with the
11
+ * sign flipped; a rule that treats the two differently puts a cent between an
12
+ * invoice and its credit note, and the cent is found by the person filing the
13
+ * return.
14
+ *
15
+ * Half up on the absolute value is what an invoice, a VAT return and a set of
16
+ * annual accounts are written with, and it is symmetric by construction: the
17
+ * rounding of -x is the rounding of x with the sign put back.
18
+ *
19
+ * The file is deliberately identical in every package that holds a copy. A
20
+ * format brick may not import the core or another brick, so the rule is
21
+ * duplicated rather than shared — and `tests/rounding.test.ts` reads the
22
+ * copies and refuses one that has drifted. See `docs/decisions.md`.
23
+ */
24
+ export declare function roundCurrency(value: number, decimals?: number): number;
25
+ //# sourceMappingURL=rounding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rounding.d.ts","sourceRoot":"","sources":["../src/rounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAUjE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The one rounding rule of Ekwo: **half up, on the absolute value, at the
3
+ * currency's decimals**.
4
+ *
5
+ * Three packages used to answer this differently — `Math.round((v + EPSILON) *
6
+ * 100) / 100`, `Math.round(v * 100) / 100` and `Number.prototype.toFixed(2)` —
7
+ * and the three disagreed on the two cases that matter: a negative half, where
8
+ * `Math.round` goes towards positive infinity and turns -0.005 into -0.00, and
9
+ * a value a binary float cannot hold, where 2.675 becomes 2.67 because
10
+ * `2.675 * 100` is really 267.49999999999994. A credit note is a sale with the
11
+ * sign flipped; a rule that treats the two differently puts a cent between an
12
+ * invoice and its credit note, and the cent is found by the person filing the
13
+ * return.
14
+ *
15
+ * Half up on the absolute value is what an invoice, a VAT return and a set of
16
+ * annual accounts are written with, and it is symmetric by construction: the
17
+ * rounding of -x is the rounding of x with the sign put back.
18
+ *
19
+ * The file is deliberately identical in every package that holds a copy. A
20
+ * format brick may not import the core or another brick, so the rule is
21
+ * duplicated rather than shared — and `tests/rounding.test.ts` reads the
22
+ * copies and refuses one that has drifted. See `docs/decisions.md`.
23
+ */
24
+ export function roundCurrency(value, decimals = 2) {
25
+ const factor = 10 ** decimals;
26
+ const scaled = Math.abs(value) * factor;
27
+ // The nudge is proportional to the number, which is what makes it work at
28
+ // 1.005 and at 1000000.005 alike, and far too small to move a value that is
29
+ // not already within a bit of the halfway point.
30
+ const rounded = Math.round(scaled + Number.EPSILON * scaled);
31
+ // `-0` is a value of its own in JavaScript and it prints as "-0.00".
32
+ // Adding zero turns it back into `0`.
33
+ return (value < 0 ? -rounded : rounded) / factor + 0;
34
+ }
35
+ //# sourceMappingURL=rounding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rounding.js","sourceRoot":"","sources":["../src/rounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,QAAQ,GAAG,CAAC;IACvD,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IACxC,0EAA0E;IAC1E,4EAA4E;IAC5E,iDAAiD;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IAC7D,qEAAqE;IACrE,sCAAsC;IACtC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Reporting codes of the CBSO taxonomy — framework 26.0, model `m01-f`
3
+ * (abridged annual accounts, companies with capital).
4
+ *
5
+ * The taxonomy is dimensional: the reporting code is carried by the DIMENSIONS
6
+ * of the context, never by the element name, which is one of a handful of
7
+ * generic metrics. One entry = one cell of one section of the model.
8
+ *
9
+ * The previous-period column is the `dim:prd` member `prd:m2`, in a context
10
+ * whose period stays the closing date of the current financial year.
11
+ *
12
+ * Generated by `scripts/build-taxonomy.mjs` from the taxonomy package
13
+ * published by the National Bank of Belgium. Do not edit by hand.
14
+ */
15
+ import type { TemplateFact } from '../types.js';
16
+ export declare const CBSO_26_M01F_FACTS: readonly TemplateFact[];
17
+ //# sourceMappingURL=cbso-26-m01-f.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cbso-26-m01-f.d.ts","sourceRoot":"","sources":["../../src/taxonomy/cbso-26-m01-f.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,kBAAkB,EAAE,SAAS,YAAY,EA+arD,CAAC"}