@accounter/shaam-uniform-format-generator 0.1.0 → 0.1.1

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 (269) hide show
  1. package/README.md +366 -13
  2. package/dist/README.md +476 -0
  3. package/dist/cjs/api/generate-report-legacy.js +6 -0
  4. package/dist/cjs/api/generate-report.js +328 -0
  5. package/dist/cjs/constants.js +11 -0
  6. package/dist/cjs/generator/format/encoder.js +86 -0
  7. package/dist/cjs/generator/records/a000-sum.js +66 -0
  8. package/dist/cjs/generator/records/a000.js +349 -0
  9. package/dist/cjs/generator/records/a100.js +107 -0
  10. package/dist/cjs/generator/records/b100.js +305 -0
  11. package/dist/cjs/generator/records/b110.js +255 -0
  12. package/dist/cjs/generator/records/c100.js +338 -0
  13. package/dist/cjs/generator/records/d110.js +272 -0
  14. package/dist/cjs/generator/records/d120.js +278 -0
  15. package/{cjs → dist/cjs}/generator/records/index.js +1 -0
  16. package/dist/cjs/generator/records/m100.js +177 -0
  17. package/dist/cjs/generator/records/z900.js +93 -0
  18. package/{cjs → dist/cjs}/index.js +3 -0
  19. package/dist/cjs/records/a100.js +78 -0
  20. package/dist/cjs/records/index.js +20 -0
  21. package/dist/cjs/records/z900.js +82 -0
  22. package/dist/cjs/types/enums.js +457 -0
  23. package/{cjs → dist/cjs}/types/index.js +6 -1
  24. package/dist/cjs/utils/file-helpers.js +198 -0
  25. package/dist/cjs/utils/index.js +8 -0
  26. package/dist/cjs/utils/key-generator.js +71 -0
  27. package/dist/esm/api/generate-report-legacy.js +2 -0
  28. package/dist/esm/api/generate-report.js +325 -0
  29. package/dist/esm/constants.js +8 -0
  30. package/dist/esm/generator/format/encoder.js +77 -0
  31. package/dist/esm/generator/records/a000-sum.js +61 -0
  32. package/dist/esm/generator/records/a000.js +344 -0
  33. package/dist/esm/generator/records/a100.js +102 -0
  34. package/dist/esm/generator/records/b100.js +300 -0
  35. package/dist/esm/generator/records/b110.js +250 -0
  36. package/dist/esm/generator/records/c100.js +333 -0
  37. package/dist/esm/generator/records/d110.js +267 -0
  38. package/dist/esm/generator/records/d120.js +273 -0
  39. package/{esm → dist/esm}/generator/records/index.js +1 -0
  40. package/dist/esm/generator/records/m100.js +172 -0
  41. package/dist/esm/generator/records/z900.js +88 -0
  42. package/{esm → dist/esm}/index.js +3 -0
  43. package/dist/esm/records/a100.js +73 -0
  44. package/dist/esm/records/index.js +11 -0
  45. package/dist/esm/records/z900.js +77 -0
  46. package/dist/esm/types/enums.js +454 -0
  47. package/{esm → dist/esm}/types/index.js +5 -1
  48. package/dist/esm/utils/file-helpers.js +188 -0
  49. package/dist/esm/utils/index.js +5 -0
  50. package/dist/esm/utils/key-generator.js +65 -0
  51. package/dist/package.json +54 -0
  52. package/dist/typings/api/generate-report-legacy.d.cts +1 -0
  53. package/dist/typings/api/generate-report-legacy.d.ts +1 -0
  54. package/dist/typings/constants.d.cts +8 -0
  55. package/dist/typings/constants.d.ts +8 -0
  56. package/dist/typings/generator/format/encoder.d.cts +57 -0
  57. package/dist/typings/generator/format/encoder.d.ts +57 -0
  58. package/dist/typings/generator/records/a000-sum.d.cts +40 -0
  59. package/dist/typings/generator/records/a000-sum.d.ts +40 -0
  60. package/dist/typings/generator/records/a000.d.cts +238 -0
  61. package/dist/typings/generator/records/a000.d.ts +238 -0
  62. package/dist/typings/generator/records/a100.d.cts +59 -0
  63. package/dist/typings/generator/records/a100.d.ts +59 -0
  64. package/dist/typings/generator/records/b100.d.cts +101 -0
  65. package/dist/typings/generator/records/b100.d.ts +101 -0
  66. package/dist/typings/generator/records/b110.d.cts +89 -0
  67. package/dist/typings/generator/records/b110.d.ts +89 -0
  68. package/dist/typings/generator/records/c100.d.cts +133 -0
  69. package/dist/typings/generator/records/c100.d.ts +133 -0
  70. package/dist/typings/generator/records/d110.d.cts +98 -0
  71. package/dist/typings/generator/records/d110.d.ts +98 -0
  72. package/dist/typings/generator/records/d120.d.cts +95 -0
  73. package/dist/typings/generator/records/d120.d.ts +95 -0
  74. package/{typings → dist/typings}/generator/records/index.d.cts +1 -0
  75. package/{typings → dist/typings}/generator/records/index.d.ts +1 -0
  76. package/dist/typings/generator/records/m100.d.cts +69 -0
  77. package/dist/typings/generator/records/m100.d.ts +69 -0
  78. package/dist/typings/generator/records/z900.d.cts +61 -0
  79. package/dist/typings/generator/records/z900.d.ts +61 -0
  80. package/{typings → dist/typings}/index.d.cts +3 -0
  81. package/{typings → dist/typings}/index.d.ts +3 -0
  82. package/dist/typings/records/a100.d.cts +35 -0
  83. package/dist/typings/records/a100.d.ts +35 -0
  84. package/dist/typings/records/index.d.cts +2 -0
  85. package/dist/typings/records/index.d.ts +2 -0
  86. package/dist/typings/records/z900.d.cts +38 -0
  87. package/dist/typings/records/z900.d.ts +38 -0
  88. package/dist/typings/types/enums.d.cts +162 -0
  89. package/dist/typings/types/enums.d.ts +162 -0
  90. package/{typings → dist/typings}/types/index.d.cts +17 -14
  91. package/{typings → dist/typings}/types/index.d.ts +17 -14
  92. package/dist/typings/utils/file-helpers.d.cts +131 -0
  93. package/dist/typings/utils/file-helpers.d.ts +131 -0
  94. package/dist/typings/utils/index.d.cts +5 -0
  95. package/dist/typings/utils/index.d.ts +5 -0
  96. package/dist/typings/utils/key-generator.d.cts +41 -0
  97. package/dist/typings/utils/key-generator.d.ts +41 -0
  98. package/documentation/IncomeTax_IncomeTaxSoftwareHousesInfo_horaot1.31_2_05.pdf +0 -0
  99. package/documentation/_4D6963726F736F667420576F7264202D20F8E5E0E9ED20F8E7E5F720F8E5E0E9ED20F9F7E5F32E646F63_.pdf +0 -0
  100. package/documentation/a000-sum.csv +3 -0
  101. package/documentation/a000.csv +37 -0
  102. package/documentation/a100.csv +7 -0
  103. package/documentation/b100.csv +29 -0
  104. package/documentation/b110.csv +26 -0
  105. package/documentation/c100.csv +37 -0
  106. package/documentation/d110.csv +27 -0
  107. package/documentation/d120.csv +26 -0
  108. package/documentation/m100.csv +17 -0
  109. package/documentation/z900.csv +8 -0
  110. package/package.json +50 -29
  111. package/prompt_plan.md +259 -0
  112. package/spec.md +206 -0
  113. package/src/api/generate-report.ts +366 -0
  114. package/src/api/parse-files.ts +33 -0
  115. package/src/constants.ts +9 -0
  116. package/src/format/index.ts +6 -0
  117. package/src/format/newline.ts +8 -0
  118. package/src/format/padding.ts +39 -0
  119. package/src/generator/format/decoder.ts +15 -0
  120. package/src/generator/format/encoder.ts +95 -0
  121. package/src/generator/format/index.ts +6 -0
  122. package/src/generator/index.ts +6 -0
  123. package/src/generator/records/a000-sum.ts +78 -0
  124. package/src/generator/records/a000.ts +373 -0
  125. package/src/generator/records/a100.ts +118 -0
  126. package/src/generator/records/b100.ts +317 -0
  127. package/src/generator/records/b110.ts +267 -0
  128. package/src/generator/records/c100.ts +347 -0
  129. package/src/generator/records/d110.ts +286 -0
  130. package/src/generator/records/d120.ts +293 -0
  131. package/src/generator/records/index.ts +14 -0
  132. package/src/generator/records/m100.ts +185 -0
  133. package/src/generator/records/z900.ts +104 -0
  134. package/src/index.ts +18 -0
  135. package/src/parser/data-parser.ts +14 -0
  136. package/src/parser/index.ts +6 -0
  137. package/src/parser/ini-parser.ts +14 -0
  138. package/src/types/enums.ts +531 -0
  139. package/src/types/index.ts +110 -0
  140. package/src/utils/file-helpers.ts +221 -0
  141. package/src/utils/index.ts +6 -0
  142. package/src/utils/key-generator.ts +75 -0
  143. package/src/validation/errors.ts +35 -0
  144. package/src/validation/index.ts +6 -0
  145. package/src/validation/validate-input.ts +67 -0
  146. package/tests/debug-output.test.ts +81 -0
  147. package/tests/format/crlf-join.test.ts +124 -0
  148. package/tests/format/encoder.test.ts +80 -0
  149. package/tests/format/newline.test.ts +19 -0
  150. package/tests/format/padding.test.ts +74 -0
  151. package/tests/index.test.ts +29 -0
  152. package/tests/ini-text.test.ts +122 -0
  153. package/tests/integration/comprehensive.integration.test.ts +350 -0
  154. package/tests/integration/roundtrip.integration.test.ts +377 -0
  155. package/tests/records/a000-sum.test.ts +278 -0
  156. package/tests/records/a000.test.ts +318 -0
  157. package/tests/records/a100.test.ts +239 -0
  158. package/tests/records/b100.test.ts +419 -0
  159. package/tests/records/b110.test.ts +445 -0
  160. package/tests/records/c100.test.ts +333 -0
  161. package/tests/records/d110.test.ts +93 -0
  162. package/tests/records/d120.test.ts +275 -0
  163. package/tests/records/m100.test.ts +437 -0
  164. package/tests/records/z900.test.ts +254 -0
  165. package/tests/types/enums.test.ts +290 -0
  166. package/tests/utils/file-helpers.test.ts +276 -0
  167. package/tests/utils/key-generator.test.ts +121 -0
  168. package/tests/validation/document-type-validation.test.ts +521 -0
  169. package/tests/validation/validate-input.test.ts +219 -0
  170. package/todo.md +203 -0
  171. package/tsconfig.json +10 -0
  172. package/vitest.config.ts +11 -0
  173. package/cjs/api/generate-report.js +0 -53
  174. package/cjs/generator/format/encoder.js +0 -46
  175. package/cjs/generator/records/a000.js +0 -8
  176. package/cjs/generator/records/a100.js +0 -8
  177. package/cjs/generator/records/b100.js +0 -8
  178. package/cjs/generator/records/b110.js +0 -8
  179. package/cjs/generator/records/c100.js +0 -8
  180. package/cjs/generator/records/d110.js +0 -8
  181. package/cjs/generator/records/d120.js +0 -8
  182. package/cjs/generator/records/m100.js +0 -8
  183. package/cjs/generator/records/z900.js +0 -8
  184. package/esm/api/generate-report.js +0 -50
  185. package/esm/generator/format/encoder.js +0 -42
  186. package/esm/generator/records/a000.js +0 -5
  187. package/esm/generator/records/a100.js +0 -5
  188. package/esm/generator/records/b100.js +0 -5
  189. package/esm/generator/records/b110.js +0 -5
  190. package/esm/generator/records/c100.js +0 -5
  191. package/esm/generator/records/d110.js +0 -5
  192. package/esm/generator/records/d120.js +0 -5
  193. package/esm/generator/records/m100.js +0 -5
  194. package/esm/generator/records/z900.js +0 -5
  195. package/typings/generator/format/encoder.d.cts +0 -33
  196. package/typings/generator/format/encoder.d.ts +0 -33
  197. package/typings/generator/records/a000.d.cts +0 -4
  198. package/typings/generator/records/a000.d.ts +0 -4
  199. package/typings/generator/records/a100.d.cts +0 -4
  200. package/typings/generator/records/a100.d.ts +0 -4
  201. package/typings/generator/records/b100.d.cts +0 -4
  202. package/typings/generator/records/b100.d.ts +0 -4
  203. package/typings/generator/records/b110.d.cts +0 -4
  204. package/typings/generator/records/b110.d.ts +0 -4
  205. package/typings/generator/records/c100.d.cts +0 -4
  206. package/typings/generator/records/c100.d.ts +0 -4
  207. package/typings/generator/records/d110.d.cts +0 -4
  208. package/typings/generator/records/d110.d.ts +0 -4
  209. package/typings/generator/records/d120.d.cts +0 -4
  210. package/typings/generator/records/d120.d.ts +0 -4
  211. package/typings/generator/records/m100.d.cts +0 -4
  212. package/typings/generator/records/m100.d.ts +0 -4
  213. package/typings/generator/records/z900.d.cts +0 -4
  214. package/typings/generator/records/z900.d.ts +0 -4
  215. /package/{cjs → dist/cjs}/api/parse-files.js +0 -0
  216. /package/{cjs → dist/cjs}/format/index.js +0 -0
  217. /package/{cjs → dist/cjs}/format/newline.js +0 -0
  218. /package/{cjs → dist/cjs}/format/padding.js +0 -0
  219. /package/{cjs → dist/cjs}/generator/format/decoder.js +0 -0
  220. /package/{cjs → dist/cjs}/generator/format/index.js +0 -0
  221. /package/{cjs → dist/cjs}/generator/index.js +0 -0
  222. /package/{cjs → dist/cjs}/package.json +0 -0
  223. /package/{cjs → dist/cjs}/parser/data-parser.js +0 -0
  224. /package/{cjs → dist/cjs}/parser/index.js +0 -0
  225. /package/{cjs → dist/cjs}/parser/ini-parser.js +0 -0
  226. /package/{cjs → dist/cjs}/validation/errors.js +0 -0
  227. /package/{cjs → dist/cjs}/validation/index.js +0 -0
  228. /package/{cjs → dist/cjs}/validation/validate-input.js +0 -0
  229. /package/{esm → dist/esm}/api/parse-files.js +0 -0
  230. /package/{esm → dist/esm}/format/index.js +0 -0
  231. /package/{esm → dist/esm}/format/newline.js +0 -0
  232. /package/{esm → dist/esm}/format/padding.js +0 -0
  233. /package/{esm → dist/esm}/generator/format/decoder.js +0 -0
  234. /package/{esm → dist/esm}/generator/format/index.js +0 -0
  235. /package/{esm → dist/esm}/generator/index.js +0 -0
  236. /package/{esm → dist/esm}/parser/data-parser.js +0 -0
  237. /package/{esm → dist/esm}/parser/index.js +0 -0
  238. /package/{esm → dist/esm}/parser/ini-parser.js +0 -0
  239. /package/{esm → dist/esm}/validation/errors.js +0 -0
  240. /package/{esm → dist/esm}/validation/index.js +0 -0
  241. /package/{esm → dist/esm}/validation/validate-input.js +0 -0
  242. /package/{typings → dist/typings}/api/generate-report.d.cts +0 -0
  243. /package/{typings → dist/typings}/api/generate-report.d.ts +0 -0
  244. /package/{typings → dist/typings}/api/parse-files.d.cts +0 -0
  245. /package/{typings → dist/typings}/api/parse-files.d.ts +0 -0
  246. /package/{typings → dist/typings}/format/index.d.cts +0 -0
  247. /package/{typings → dist/typings}/format/index.d.ts +0 -0
  248. /package/{typings → dist/typings}/format/newline.d.cts +0 -0
  249. /package/{typings → dist/typings}/format/newline.d.ts +0 -0
  250. /package/{typings → dist/typings}/format/padding.d.cts +0 -0
  251. /package/{typings → dist/typings}/format/padding.d.ts +0 -0
  252. /package/{typings → dist/typings}/generator/format/decoder.d.cts +0 -0
  253. /package/{typings → dist/typings}/generator/format/decoder.d.ts +0 -0
  254. /package/{typings → dist/typings}/generator/format/index.d.cts +0 -0
  255. /package/{typings → dist/typings}/generator/format/index.d.ts +0 -0
  256. /package/{typings → dist/typings}/generator/index.d.cts +0 -0
  257. /package/{typings → dist/typings}/generator/index.d.ts +0 -0
  258. /package/{typings → dist/typings}/parser/data-parser.d.cts +0 -0
  259. /package/{typings → dist/typings}/parser/data-parser.d.ts +0 -0
  260. /package/{typings → dist/typings}/parser/index.d.cts +0 -0
  261. /package/{typings → dist/typings}/parser/index.d.ts +0 -0
  262. /package/{typings → dist/typings}/parser/ini-parser.d.cts +0 -0
  263. /package/{typings → dist/typings}/parser/ini-parser.d.ts +0 -0
  264. /package/{typings → dist/typings}/validation/errors.d.cts +0 -0
  265. /package/{typings → dist/typings}/validation/errors.d.ts +0 -0
  266. /package/{typings → dist/typings}/validation/index.d.cts +0 -0
  267. /package/{typings → dist/typings}/validation/index.d.ts +0 -0
  268. /package/{typings → dist/typings}/validation/validate-input.d.cts +0 -0
  269. /package/{typings → dist/typings}/validation/validate-input.d.ts +0 -0
package/README.md CHANGED
@@ -27,18 +27,18 @@ uniform format files. It allows you to:
27
27
  ### `INI.TXT`
28
28
 
29
29
  - `A000` — Header
30
- - `B100`, `B110`, `C100`, `D110`, `D120`, `M100` Count summary records
30
+ - `A000Sum` Count summary records for each record type
31
31
 
32
32
  ### `BKMVDATA.TXT`
33
33
 
34
- - `A100` — Opening
34
+ - `A100` — Business opening record
35
35
  - `C100` — Document header
36
36
  - `D110` — Document line
37
37
  - `D120` — Payment/receipt
38
38
  - `B100` — Journal entry line
39
39
  - `B110` — Account
40
40
  - `M100` — Inventory item
41
- - `Z900` — Closing
41
+ - `Z900` — Closing record
42
42
 
43
43
  ## 🛠️ Installation
44
44
 
@@ -48,36 +48,367 @@ npm install @accounter/shaam-uniform-format-generator
48
48
  yarn add @accounter/shaam-uniform-format-generator
49
49
  ```
50
50
 
51
- ## 📖 Usage
51
+ ## 📖 API Documentation
52
+
53
+ ### Main Functions
54
+
55
+ #### `generateUniformFormatReport(input, options?)`
56
+
57
+ Generates SHAAM uniform format report files from a high-level JSON input object.
52
58
 
53
59
  ```typescript
54
- import { generateUniformFormatReport } from '@accounter/shaam-uniform-format-generator'
60
+ import {
61
+ generateUniformFormatReport,
62
+ type ReportInput
63
+ } from '@accounter/shaam-uniform-format-generator'
55
64
 
56
- const reportInput = {
65
+ const reportInput: ReportInput = {
57
66
  business: {
58
- // Business metadata
67
+ businessId: '12345',
68
+ name: 'Example Business Ltd',
69
+ taxId: '123456789',
70
+ reportingPeriod: {
71
+ startDate: '2023-01-01',
72
+ endDate: '2023-12-31'
73
+ }
59
74
  },
60
75
  documents: [
61
- // Document records
76
+ {
77
+ id: 'INV001',
78
+ type: '320', // Invoice
79
+ date: '2023-06-15',
80
+ amount: 1000.0,
81
+ description: 'Service invoice'
82
+ }
62
83
  ],
63
84
  journalEntries: [
64
- // Journal entry records
85
+ {
86
+ id: 'JE001',
87
+ date: '2023-06-15',
88
+ amount: 1000.0,
89
+ accountId: '1100',
90
+ description: 'Revenue entry'
91
+ }
65
92
  ],
66
93
  accounts: [
67
- // Account records
94
+ {
95
+ id: '1100',
96
+ name: 'Revenue Account',
97
+ type: '4', // Revenue
98
+ balance: 1000.0
99
+ }
68
100
  ],
69
101
  inventory: [
70
- // Inventory records
102
+ {
103
+ id: 'ITEM001',
104
+ name: 'Service Item',
105
+ quantity: 1,
106
+ unitPrice: 1000.0
107
+ }
71
108
  ]
72
109
  }
73
110
 
74
- const result = generateUniformFormatReport(reportInput)
111
+ const result = generateUniformFormatReport(reportInput, {
112
+ validationMode: 'fail-fast', // or 'collect-all'
113
+ fileNameBase: 'my-report'
114
+ })
75
115
 
76
116
  console.log(result.iniText) // INI.TXT content
77
117
  console.log(result.dataText) // BKMVDATA.TXT content
78
118
  console.log(result.summary) // Generation summary
79
119
  ```
80
120
 
121
+ #### `parseUniformFormatFiles(iniContent, dataContent)`
122
+
123
+ Parses SHAAM uniform format files back into structured JSON.
124
+
125
+ ```typescript
126
+ import { parseUniformFormatFiles } from '@accounter/shaam-uniform-format-generator'
127
+
128
+ const parsedData = parseUniformFormatFiles(iniFileContent, dataFileContent)
129
+ console.log(parsedData.business) // Parsed business metadata
130
+ console.log(parsedData.documents) // Parsed documents
131
+ ```
132
+
133
+ ### Types and Interfaces
134
+
135
+ #### `ReportInput`
136
+
137
+ ```typescript
138
+ interface ReportInput {
139
+ business: BusinessMetadata
140
+ documents: Document[]
141
+ journalEntries: JournalEntry[]
142
+ accounts: Account[]
143
+ inventory: InventoryItem[]
144
+ }
145
+ ```
146
+
147
+ #### `BusinessMetadata`
148
+
149
+ ```typescript
150
+ interface BusinessMetadata {
151
+ businessId: string
152
+ name: string
153
+ taxId: string
154
+ reportingPeriod: {
155
+ startDate: string // YYYY-MM-DD format
156
+ endDate: string // YYYY-MM-DD format
157
+ }
158
+ }
159
+ ```
160
+
161
+ #### `Document`
162
+
163
+ ```typescript
164
+ interface Document {
165
+ id: string
166
+ type: DocumentType // e.g., "320" for invoice, "330" for credit note
167
+ date: string // YYYY-MM-DD format
168
+ amount: number
169
+ description?: string
170
+ }
171
+ ```
172
+
173
+ #### `JournalEntry`
174
+
175
+ ```typescript
176
+ interface JournalEntry {
177
+ id: string
178
+ date: string // YYYY-MM-DD format
179
+ amount: number
180
+ accountId: string
181
+ description?: string
182
+ }
183
+ ```
184
+
185
+ #### `Account`
186
+
187
+ ```typescript
188
+ interface Account {
189
+ id: string
190
+ name: string
191
+ type: string // Account type code
192
+ balance: number
193
+ }
194
+ ```
195
+
196
+ #### `InventoryItem`
197
+
198
+ ```typescript
199
+ interface InventoryItem {
200
+ id: string
201
+ name: string
202
+ quantity: number
203
+ unitPrice: number
204
+ }
205
+ ```
206
+
207
+ #### `ReportOutput`
208
+
209
+ ```typescript
210
+ interface ReportOutput {
211
+ iniText: string // INI.TXT file content
212
+ dataText: string // BKMVDATA.TXT file content
213
+ iniFile: File // Virtual File object for INI.TXT
214
+ dataFile: File // Virtual File object for BKMVDATA.TXT
215
+ summary: {
216
+ totalRecords: number
217
+ perType: Record<string, number>
218
+ errors?: ValidationError[]
219
+ }
220
+ }
221
+ ```
222
+
223
+ ### Options
224
+
225
+ #### `GenerationOptions`
226
+
227
+ ```typescript
228
+ interface GenerationOptions {
229
+ validationMode?: 'fail-fast' | 'collect-all' // Default: 'fail-fast'
230
+ fileNameBase?: string // Default: 'report'
231
+ }
232
+ ```
233
+
234
+ - **`validationMode`**:
235
+ - `'fail-fast'`: Stop validation on first error and throw immediately
236
+ - `'collect-all'`: Collect all validation errors before throwing
237
+ - **`fileNameBase`**: Base name for generated files (without extension)
238
+
239
+ ### Enums and Constants
240
+
241
+ The package exports comprehensive enums for SHAAM code tables:
242
+
243
+ ```typescript
244
+ import {
245
+ CountryCodeEnum,
246
+ CurrencyCodeEnum,
247
+ DocumentTypeEnum,
248
+ PaymentMethodEnum
249
+ } from '@accounter/shaam-uniform-format-generator'
250
+
251
+ // Document types
252
+ const invoiceType = DocumentTypeEnum.enum['320'] // Invoice
253
+ const creditNoteType = DocumentTypeEnum.enum['330'] // Credit note
254
+
255
+ // Currency codes
256
+ const ils = CurrencyCodeEnum.enum.ILS // Israeli Shekel
257
+ const usd = CurrencyCodeEnum.enum.USD // US Dollar
258
+
259
+ // Payment methods
260
+ const cash = PaymentMethodEnum.enum['1'] // Cash
261
+ const check = PaymentMethodEnum.enum['2'] // Check
262
+ ```
263
+
264
+ ## 🎯 Complete Example
265
+
266
+ ```typescript
267
+ import {
268
+ generateUniformFormatReport,
269
+ parseUniformFormatFiles,
270
+ type ReportInput
271
+ } from '@accounter/shaam-uniform-format-generator'
272
+
273
+ // 1. Prepare your data
274
+ const reportData: ReportInput = {
275
+ business: {
276
+ businessId: 'COMP001',
277
+ name: 'Acme Corp Ltd',
278
+ taxId: '123456789',
279
+ reportingPeriod: {
280
+ startDate: '2023-01-01',
281
+ endDate: '2023-12-31'
282
+ }
283
+ },
284
+ documents: [
285
+ {
286
+ id: 'INV-2023-001',
287
+ type: '320', // Invoice
288
+ date: '2023-03-15',
289
+ amount: 2340.0,
290
+ description: 'Consulting services'
291
+ },
292
+ {
293
+ id: 'CN-2023-001',
294
+ type: '330', // Credit note
295
+ date: '2023-04-10',
296
+ amount: -340.0,
297
+ description: 'Service adjustment'
298
+ }
299
+ ],
300
+ journalEntries: [
301
+ {
302
+ id: 'JE-2023-001',
303
+ date: '2023-03-15',
304
+ amount: 2340.0,
305
+ accountId: '4000',
306
+ description: 'Consulting revenue'
307
+ },
308
+ {
309
+ id: 'JE-2023-002',
310
+ date: '2023-04-10',
311
+ amount: -340.0,
312
+ accountId: '4000',
313
+ description: 'Revenue adjustment'
314
+ }
315
+ ],
316
+ accounts: [
317
+ {
318
+ id: '4000',
319
+ name: 'Consulting Revenue',
320
+ type: '4', // Revenue account
321
+ balance: 2000.0
322
+ },
323
+ {
324
+ id: '1200',
325
+ name: 'Accounts Receivable',
326
+ type: '1', // Asset account
327
+ balance: 1500.0
328
+ }
329
+ ],
330
+ inventory: [
331
+ {
332
+ id: 'SERV-001',
333
+ name: 'Consulting Hour',
334
+ quantity: 20,
335
+ unitPrice: 117.0
336
+ }
337
+ ]
338
+ }
339
+
340
+ // 2. Generate the files
341
+ try {
342
+ const result = generateUniformFormatReport(reportData, {
343
+ validationMode: 'fail-fast',
344
+ fileNameBase: 'quarterly-report-2023-q1'
345
+ })
346
+
347
+ // 3. Access the generated content
348
+ console.log('Generated INI.TXT:')
349
+ console.log(result.iniText)
350
+
351
+ console.log('\nGenerated BKMVDATA.TXT:')
352
+ console.log(result.dataText)
353
+
354
+ console.log('\nSummary:')
355
+ console.log(`Total records: ${result.summary.totalRecords}`)
356
+ console.log('Records per type:', result.summary.perType)
357
+
358
+ // 4. Save files (example using Node.js fs)
359
+ // import { writeFileSync } from 'fs'
360
+ // writeFileSync('report.INI.TXT', result.iniText, 'utf8')
361
+ // writeFileSync('report.BKMVDATA.TXT', result.dataText, 'utf8')
362
+
363
+ // 5. Parse files back (round-trip test)
364
+ const parsedData = parseUniformFormatFiles(result.iniText, result.dataText)
365
+ console.log('\nParsed business data:', parsedData.business)
366
+ } catch (error) {
367
+ console.error('Generation failed:', error.message)
368
+ if (error.errors) {
369
+ console.error('Validation errors:', error.errors)
370
+ }
371
+ }
372
+ ```
373
+
374
+ ## 🔧 Advanced Usage
375
+
376
+ ### Custom Validation
377
+
378
+ ```typescript
379
+ import { ReportInputSchema } from '@accounter/shaam-uniform-format-generator'
380
+
381
+ // Validate data before generation
382
+ const validationResult = ReportInputSchema.safeParse(yourData)
383
+ if (!validationResult.success) {
384
+ console.error('Validation errors:', validationResult.error.issues)
385
+ }
386
+ ```
387
+
388
+ ### Working with Individual Records
389
+
390
+ ```typescript
391
+ import { encodeC100, parseC100, type C100Input } from '@accounter/shaam-uniform-format-generator'
392
+
393
+ // Encode a single document record
394
+ const documentRecord: C100Input = {
395
+ code: 'C100',
396
+ recordNumber: '1',
397
+ vatId: '123456789',
398
+ documentType: '320',
399
+ documentId: 'INV001',
400
+ documentIssueDate: '20230315'
401
+ // ... other fields
402
+ }
403
+
404
+ const encodedLine = encodeC100(documentRecord)
405
+ console.log(encodedLine) // Fixed-width formatted line
406
+
407
+ // Parse it back
408
+ const parsedRecord = parseC100(encodedLine)
409
+ console.log(parsedRecord) // Structured object
410
+ ```
411
+
81
412
  ## 🏗️ Development
82
413
 
83
414
  This project uses:
@@ -109,7 +440,24 @@ yarn lint
109
440
  - Node.js ^20.0.0 || >= 22
110
441
  - TypeScript support
111
442
 
112
- ## 📄 License
443
+ ## Error Handling
444
+
445
+ The library provides detailed error information:
446
+
447
+ ```typescript
448
+ import { ShaamFormatError } from '@accounter/shaam-uniform-format-generator'
449
+
450
+ try {
451
+ const result = generateUniformFormatReport(invalidData)
452
+ } catch (error) {
453
+ if (error instanceof ShaamFormatError) {
454
+ console.error('SHAAM format error:', error.message)
455
+ console.error('Validation errors:', error.errors)
456
+ }
457
+ }
458
+ ```
459
+
460
+ ## �📄 License
113
461
 
114
462
  MIT
115
463
 
@@ -121,3 +469,8 @@ repository.
121
469
  ## 📚 Documentation
122
470
 
123
471
  For detailed documentation about SHAAM format specifications, see the `documentation/` folder.
472
+
473
+ ## 🔗 Related
474
+
475
+ - [SHAAM Specification 1.31](documentation/) - Official specification documents
476
+ - [Israeli Tax Authority](https://www.gov.il/he/departments/taxes) - Official tax authority website