@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
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.A000InputSchema = exports.A000Schema = void 0;
4
+ exports.encodeA000 = encodeA000;
5
+ exports.parseA000 = parseA000;
6
+ const zod_1 = require("zod");
7
+ const constants_js_1 = require("../../constants.js");
8
+ const key_generator_js_1 = require("../../utils/key-generator.js");
9
+ const encoder_js_1 = require("../format/encoder.js");
10
+ /**
11
+ * A000 Record Schema - INI.TXT file header record
12
+ * Fields 1000-1035 based on SHAAM uniform format specification
13
+ */
14
+ exports.A000Schema = zod_1.z.object({
15
+ // Field 1000: Record Code (4) - Required - Alphanumeric
16
+ code: zod_1.z.literal('A000').describe('Record type code - always "A000"'),
17
+ // Field 1001: Reserved for Future Use (5) - Required - Alphanumeric
18
+ reservedFuture: zod_1.z.string().max(5).default('').describe('Reserved for future use'),
19
+ // Field 1002: Total Records in BKMVDATA (15) - Required - Numeric
20
+ totalRecords: zod_1.z.string().min(1).max(15).regex(/^\d+$/).describe('Total records in BKMVDATA file'),
21
+ // Field 1003: Tax ID (9) - Required - Numeric
22
+ vatId: zod_1.z.string().min(1).max(9).regex(/^\d+$/).describe('VAT identification number'),
23
+ // Field 1004: Primary Identifier (15) - Required - Numeric
24
+ primaryIdentifier: zod_1.z
25
+ .string()
26
+ .min(1)
27
+ .max(15)
28
+ .regex(/^\d+$/)
29
+ .describe('Fixed and unique primary identifier per file'),
30
+ // Field 1005: System Constant (8) - Required - Alphanumeric
31
+ systemConstant: zod_1.z.literal(constants_js_1.SHAAM_VERSION).describe(`System constant - always "${constants_js_1.SHAAM_VERSION}"`),
32
+ // Field 1006: Software Registration Number (8) - Required - Numeric
33
+ softwareRegNumber: zod_1.z
34
+ .string()
35
+ .min(1)
36
+ .max(8)
37
+ .regex(/^\d+$/)
38
+ .describe('Software registration number'),
39
+ // Field 1007: Software Name (20) - Required - Alphanumeric
40
+ softwareName: zod_1.z.string().min(1).max(20).describe('Software name'),
41
+ // Field 1008: Software Version (20) - Required - Alphanumeric
42
+ softwareVersion: zod_1.z.string().min(1).max(20).describe('Software version'),
43
+ // Field 1009: Vendor Tax ID (9) - Required - Numeric
44
+ vendorVatId: zod_1.z.string().min(1).max(9).regex(/^\d+$/).describe('Software vendor VAT ID'),
45
+ // Field 1010: Vendor Name (20) - Required - Alphanumeric
46
+ vendorName: zod_1.z.string().min(1).max(20).describe('Software vendor name'),
47
+ // Field 1011: Software Type (1) - Required - Numeric
48
+ softwareType: zod_1.z.enum(['1', '2']).describe('Software type: 1=Single-year, 2=Multi-year'),
49
+ // Field 1012: File Output Path (50) - Required - Alphanumeric
50
+ fileOutputPath: zod_1.z.string().min(1).max(50).describe('File output path'),
51
+ // Field 1013: Accounting Type (1) - Required - Numeric
52
+ accountingType: zod_1.z
53
+ .enum(['0', '1', '2'])
54
+ .describe('Accounting type: 0=N/A, 1=Single-entry, 2=Double-entry'),
55
+ // Field 1014: Balance Required Flag (1) - Required - Numeric
56
+ balanceRequired: zod_1.z.enum(['0', '1']).describe('Balance required flag'),
57
+ // Field 1015: Company Registrar ID (9) - Optional - Numeric
58
+ companyRegId: zod_1.z.string().max(9).regex(/^\d*$/).default('').describe('Company registrar ID'),
59
+ // Field 1016: Withholding File Number (9) - Optional - Numeric
60
+ withholdingFileNum: zod_1.z
61
+ .string()
62
+ .max(9)
63
+ .regex(/^\d*$/)
64
+ .default('')
65
+ .describe('Withholding file number'),
66
+ // Field 1017: Reserved Field (10) - Optional - Alphanumeric
67
+ reserved1017: zod_1.z.string().max(10).default('').describe('Reserved field'),
68
+ // Field 1018: Business Name (50) - Required - Alphanumeric
69
+ businessName: zod_1.z.string().min(1).max(50).describe('Business name'),
70
+ // Field 1019: Business Address - Street (50) - Optional - Alphanumeric
71
+ businessStreet: zod_1.z.string().max(50).default('').describe('Business address - street'),
72
+ // Field 1020: Business Address - House Number (10) - Optional - Alphanumeric
73
+ businessHouseNum: zod_1.z.string().max(10).default('').describe('Business address - house number'),
74
+ // Field 1021: Business Address - City (30) - Optional - Alphanumeric
75
+ businessCity: zod_1.z.string().max(30).default('').describe('Business address - city'),
76
+ // Field 1022: Business Address - ZIP (8) - Optional - Alphanumeric
77
+ businessZip: zod_1.z.string().max(8).default('').describe('Business address - ZIP code'),
78
+ // Field 1023: Tax Year (4) - Conditional - Numeric
79
+ taxYear: zod_1.z
80
+ .string()
81
+ .max(4)
82
+ .regex(/^\d*$/)
83
+ .default('')
84
+ .describe('Tax year (required if single-year software)'),
85
+ // Field 1024: Start/Cutoff Date (8) - Conditional - Numeric
86
+ startDate: zod_1.z
87
+ .string()
88
+ .max(8)
89
+ .regex(/^\d*$/)
90
+ .default('')
91
+ .describe('Start/cutoff date YYYYMMDD (required if multi-year)'),
92
+ // Field 1025: End/Cutoff Date (8) - Conditional - Numeric
93
+ endDate: zod_1.z
94
+ .string()
95
+ .max(8)
96
+ .regex(/^\d*$/)
97
+ .default('')
98
+ .describe('End/cutoff date YYYYMMDD (required if multi-year)'),
99
+ // Field 1026: Process Start Date (8) - Required - Numeric
100
+ processStartDate: zod_1.z
101
+ .string()
102
+ .length(8)
103
+ .regex(/^\d{8}$/)
104
+ .describe('Process start date YYYYMMDD'),
105
+ // Field 1027: Process Start Time (4) - Required - Numeric
106
+ processStartTime: zod_1.z
107
+ .string()
108
+ .length(4)
109
+ .regex(/^\d{4}$/)
110
+ .describe('Process start time HHMM'),
111
+ // Field 1028: Language Code (1) - Required - Numeric
112
+ languageCode: zod_1.z.enum(['0', '1', '2']).describe('Language code: 0=Hebrew, 1=Arabic, 2=Other'),
113
+ // Field 1029: Character Encoding (1) - Required - Numeric
114
+ characterEncoding: zod_1.z.enum(['1', '2']).describe('Character encoding: 1=ISO-8859-8-i, 2=CP-862'),
115
+ // Field 1030: Compression Software Name (20) - Optional - Alphanumeric
116
+ compressionSoftware: zod_1.z.string().max(20).default('').describe('Compression software name'),
117
+ // Field 1031: Reserved Field (0) - Deprecated - Alphanumeric
118
+ reserved1031: zod_1.z.string().max(0).default('').describe('Deprecated reserved field'),
119
+ // Field 1032: Base Currency Code (3) - Optional - Alphanumeric
120
+ baseCurrency: zod_1.z.string().max(3).default('ILS').describe('Base currency code (default: ILS)'),
121
+ // Field 1033: Reserved Field (0) - Deprecated - Alphanumeric
122
+ reserved1033: zod_1.z.string().max(0).default('').describe('Deprecated reserved field'),
123
+ // Field 1034: Branch Info Flag (1) - Required - Numeric
124
+ branchInfoFlag: zod_1.z.enum(['0', '1']).describe('Branch info flag: 0=No branches, 1=Has branches'),
125
+ // Field 1035: Reserved Field (46) - Optional - Alphanumeric
126
+ reserved1035: zod_1.z.string().max(46).default('').describe('Reserved field'),
127
+ });
128
+ /**
129
+ * A000 Input Schema - for user input (excludes auto-generated fields)
130
+ */
131
+ exports.A000InputSchema = exports.A000Schema.omit({
132
+ code: true,
133
+ primaryIdentifier: true,
134
+ systemConstant: true,
135
+ });
136
+ /**
137
+ * Encodes an A000 record to fixed-width string format
138
+ * Total line width: 466 characters + CRLF
139
+ */
140
+ function encodeA000(input) {
141
+ const primaryIdentifier = key_generator_js_1.defaultKeyGenerator.getPrimaryIdentifier();
142
+ const fullRecord = {
143
+ code: 'A000',
144
+ primaryIdentifier,
145
+ systemConstant: constants_js_1.SHAAM_VERSION,
146
+ ...input,
147
+ };
148
+ const fields = [
149
+ (0, encoder_js_1.formatField)(fullRecord.code, 4, 'left'), // Field 1000: Record code (4)
150
+ (0, encoder_js_1.formatField)(fullRecord.reservedFuture, 5, 'left'), // Field 1001: Reserved future (5)
151
+ (0, encoder_js_1.formatNumericField)(fullRecord.totalRecords, 15), // Field 1002: Total records (15)
152
+ (0, encoder_js_1.formatNumericField)(fullRecord.vatId, 9), // Field 1003: VAT ID (9)
153
+ (0, encoder_js_1.formatNumericField)(fullRecord.primaryIdentifier, 15), // Field 1004: Primary identifier (15)
154
+ (0, encoder_js_1.formatField)(fullRecord.systemConstant, 8, 'left'), // Field 1005: System constant (8)
155
+ (0, encoder_js_1.formatNumericField)(fullRecord.softwareRegNumber, 8), // Field 1006: Software reg number (8)
156
+ (0, encoder_js_1.formatField)(fullRecord.softwareName, 20, 'left'), // Field 1007: Software name (20)
157
+ (0, encoder_js_1.formatField)(fullRecord.softwareVersion, 20, 'left'), // Field 1008: Software version (20)
158
+ (0, encoder_js_1.formatNumericField)(fullRecord.vendorVatId, 9), // Field 1009: Vendor VAT ID (9)
159
+ (0, encoder_js_1.formatField)(fullRecord.vendorName, 20, 'left'), // Field 1010: Vendor name (20)
160
+ (0, encoder_js_1.formatNumericField)(fullRecord.softwareType, 1), // Field 1011: Software type (1)
161
+ (0, encoder_js_1.formatField)(fullRecord.fileOutputPath, 50, 'left'), // Field 1012: File output path (50)
162
+ (0, encoder_js_1.formatNumericField)(fullRecord.accountingType, 1), // Field 1013: Accounting type (1)
163
+ (0, encoder_js_1.formatNumericField)(fullRecord.balanceRequired, 1), // Field 1014: Balance required (1)
164
+ (0, encoder_js_1.formatNumericField)(fullRecord.companyRegId, 9), // Field 1015: Company reg ID (9)
165
+ (0, encoder_js_1.formatNumericField)(fullRecord.withholdingFileNum, 9), // Field 1016: Withholding file num (9)
166
+ (0, encoder_js_1.formatField)(fullRecord.reserved1017, 10, 'left'), // Field 1017: Reserved (10)
167
+ (0, encoder_js_1.formatField)(fullRecord.businessName, 50, 'left'), // Field 1018: Business name (50)
168
+ (0, encoder_js_1.formatField)(fullRecord.businessStreet, 50, 'left'), // Field 1019: Business street (50)
169
+ (0, encoder_js_1.formatField)(fullRecord.businessHouseNum, 10, 'left'), // Field 1020: Business house num (10)
170
+ (0, encoder_js_1.formatField)(fullRecord.businessCity, 30, 'left'), // Field 1021: Business city (30)
171
+ (0, encoder_js_1.formatField)(fullRecord.businessZip, 8, 'left'), // Field 1022: Business ZIP (8)
172
+ (0, encoder_js_1.formatNumericField)(fullRecord.taxYear, 4), // Field 1023: Tax year (4)
173
+ (0, encoder_js_1.formatNumericField)(fullRecord.startDate, 8), // Field 1024: Start date (8)
174
+ (0, encoder_js_1.formatNumericField)(fullRecord.endDate, 8), // Field 1025: End date (8)
175
+ (0, encoder_js_1.formatNumericField)(fullRecord.processStartDate, 8), // Field 1026: Process start date (8)
176
+ (0, encoder_js_1.formatNumericField)(fullRecord.processStartTime, 4), // Field 1027: Process start time (4)
177
+ (0, encoder_js_1.formatNumericField)(fullRecord.languageCode, 1), // Field 1028: Language code (1)
178
+ (0, encoder_js_1.formatNumericField)(fullRecord.characterEncoding, 1), // Field 1029: Character encoding (1)
179
+ (0, encoder_js_1.formatField)(fullRecord.compressionSoftware, 20, 'left'), // Field 1030: Compression software (20)
180
+ (0, encoder_js_1.formatField)(fullRecord.reserved1031, 0, 'left'), // Field 1031: Reserved (0)
181
+ (0, encoder_js_1.formatField)(fullRecord.baseCurrency, 3, 'left'), // Field 1032: Base currency (3)
182
+ (0, encoder_js_1.formatField)(fullRecord.reserved1033, 0, 'left'), // Field 1033: Reserved (0)
183
+ (0, encoder_js_1.formatNumericField)(fullRecord.branchInfoFlag, 1), // Field 1034: Branch info flag (1)
184
+ (0, encoder_js_1.formatField)(fullRecord.reserved1035, 46, 'left'), // Field 1035: Reserved (46)
185
+ ];
186
+ return (0, encoder_js_1.joinFields)(fields);
187
+ }
188
+ /**
189
+ * Parses a fixed-width A000 record line back to object
190
+ * Expected line length: 466 characters (excluding CRLF)
191
+ */
192
+ function parseA000(line) {
193
+ // Remove CRLF if present
194
+ const cleanLine = line.replace(/\r?\n$/, '');
195
+ if (cleanLine.length !== 466) {
196
+ throw new Error(`Invalid A000 record length: expected 466 characters, got ${cleanLine.length}`);
197
+ }
198
+ let offset = 0;
199
+ // Extract fields at their fixed positions
200
+ const code = cleanLine.slice(offset, offset + 4).trim();
201
+ offset += 4; // Field 1000 (4)
202
+ const reservedFuture = cleanLine.slice(offset, offset + 5).trim();
203
+ offset += 5; // Field 1001 (5)
204
+ const totalRecords = cleanLine
205
+ .slice(offset, offset + 15)
206
+ .trim()
207
+ .replace(/^0+/, '') || '0';
208
+ offset += 15; // Field 1002 (15)
209
+ const vatId = cleanLine
210
+ .slice(offset, offset + 9)
211
+ .trim()
212
+ .replace(/^0+/, '') || '0';
213
+ offset += 9; // Field 1003 (9)
214
+ const primaryIdentifier = cleanLine
215
+ .slice(offset, offset + 15)
216
+ .trim()
217
+ .replace(/^0+/, '') || '0';
218
+ offset += 15; // Field 1004 (15)
219
+ const systemConstant = cleanLine.slice(offset, offset + 8).trim();
220
+ offset += 8; // Field 1005 (8)
221
+ const softwareRegNumber = cleanLine
222
+ .slice(offset, offset + 8)
223
+ .trim()
224
+ .replace(/^0+/, '') || '0';
225
+ offset += 8; // Field 1006 (8)
226
+ const softwareName = cleanLine.slice(offset, offset + 20).trim();
227
+ offset += 20; // Field 1007 (20)
228
+ const softwareVersion = cleanLine.slice(offset, offset + 20).trim();
229
+ offset += 20; // Field 1008 (20)
230
+ const vendorVatId = cleanLine
231
+ .slice(offset, offset + 9)
232
+ .trim()
233
+ .replace(/^0+/, '') || '0';
234
+ offset += 9; // Field 1009 (9)
235
+ const vendorName = cleanLine.slice(offset, offset + 20).trim();
236
+ offset += 20; // Field 1010 (20)
237
+ const softwareType = cleanLine.slice(offset, offset + 1).trim();
238
+ offset += 1; // Field 1011 (1)
239
+ const fileOutputPath = cleanLine.slice(offset, offset + 50).trim();
240
+ offset += 50; // Field 1012 (50)
241
+ const accountingType = cleanLine.slice(offset, offset + 1).trim();
242
+ offset += 1; // Field 1013 (1)
243
+ const balanceRequired = cleanLine.slice(offset, offset + 1).trim();
244
+ offset += 1; // Field 1014 (1)
245
+ const companyRegId = cleanLine
246
+ .slice(offset, offset + 9)
247
+ .trim()
248
+ .replace(/^0+/, '') || '';
249
+ offset += 9; // Field 1015 (9)
250
+ const withholdingFileNum = cleanLine
251
+ .slice(offset, offset + 9)
252
+ .trim()
253
+ .replace(/^0+/, '') || '';
254
+ offset += 9; // Field 1016 (9)
255
+ const reserved1017 = cleanLine.slice(offset, offset + 10).trim();
256
+ offset += 10; // Field 1017 (10)
257
+ const businessName = cleanLine.slice(offset, offset + 50).trim();
258
+ offset += 50; // Field 1018 (50)
259
+ const businessStreet = cleanLine.slice(offset, offset + 50).trim();
260
+ offset += 50; // Field 1019 (50)
261
+ const businessHouseNum = cleanLine.slice(offset, offset + 10).trim();
262
+ offset += 10; // Field 1020 (10)
263
+ const businessCity = cleanLine.slice(offset, offset + 30).trim();
264
+ offset += 30; // Field 1021 (30)
265
+ const businessZip = cleanLine.slice(offset, offset + 8).trim();
266
+ offset += 8; // Field 1022 (8)
267
+ const taxYear = cleanLine
268
+ .slice(offset, offset + 4)
269
+ .trim()
270
+ .replace(/^0+/, '') || '';
271
+ offset += 4; // Field 1023 (4)
272
+ const startDate = cleanLine
273
+ .slice(offset, offset + 8)
274
+ .trim()
275
+ .replace(/^0+/, '') || '';
276
+ offset += 8; // Field 1024 (8)
277
+ const endDate = cleanLine
278
+ .slice(offset, offset + 8)
279
+ .trim()
280
+ .replace(/^0+/, '') || '';
281
+ offset += 8; // Field 1025 (8)
282
+ const processStartDate = cleanLine.slice(offset, offset + 8).trim();
283
+ offset += 8; // Field 1026 (8)
284
+ const processStartTime = cleanLine.slice(offset, offset + 4).trim();
285
+ offset += 4; // Field 1027 (4)
286
+ const languageCode = cleanLine.slice(offset, offset + 1).trim();
287
+ offset += 1; // Field 1028 (1)
288
+ const characterEncoding = cleanLine.slice(offset, offset + 1).trim();
289
+ offset += 1; // Field 1029 (1)
290
+ const compressionSoftware = cleanLine.slice(offset, offset + 20).trim();
291
+ offset += 20; // Field 1030 (20)
292
+ const reserved1031 = cleanLine.slice(offset, offset + 0).trim();
293
+ offset += 0; // Field 1031 (0)
294
+ const baseCurrency = cleanLine.slice(offset, offset + 3).trim();
295
+ offset += 3; // Field 1032 (3)
296
+ const reserved1033 = cleanLine.slice(offset, offset + 0).trim();
297
+ offset += 0; // Field 1033 (0)
298
+ const branchInfoFlag = cleanLine.slice(offset, offset + 1).trim();
299
+ offset += 1; // Field 1034 (1)
300
+ const reserved1035 = cleanLine.slice(offset, offset + 46).trim(); // Field 1035 (46)
301
+ // Validate the code field
302
+ if (code !== 'A000') {
303
+ throw new Error(`Invalid A000 record code: expected "A000", got "${code}"`);
304
+ }
305
+ // Validate the system constant field
306
+ if (systemConstant !== constants_js_1.SHAAM_VERSION) {
307
+ throw new Error(`Invalid system constant: expected "${constants_js_1.SHAAM_VERSION}", got "${systemConstant}"`);
308
+ }
309
+ const parsed = {
310
+ code,
311
+ reservedFuture,
312
+ totalRecords,
313
+ vatId,
314
+ primaryIdentifier,
315
+ systemConstant: constants_js_1.SHAAM_VERSION,
316
+ softwareRegNumber,
317
+ softwareName,
318
+ softwareVersion,
319
+ vendorVatId,
320
+ vendorName,
321
+ softwareType: softwareType,
322
+ fileOutputPath,
323
+ accountingType: accountingType,
324
+ balanceRequired: balanceRequired,
325
+ companyRegId,
326
+ withholdingFileNum,
327
+ reserved1017,
328
+ businessName,
329
+ businessStreet,
330
+ businessHouseNum,
331
+ businessCity,
332
+ businessZip,
333
+ taxYear,
334
+ startDate,
335
+ endDate,
336
+ processStartDate,
337
+ processStartTime,
338
+ languageCode: languageCode,
339
+ characterEncoding: characterEncoding,
340
+ compressionSoftware,
341
+ reserved1031,
342
+ baseCurrency,
343
+ reserved1033,
344
+ branchInfoFlag: branchInfoFlag,
345
+ reserved1035,
346
+ };
347
+ // Validate against schema
348
+ return exports.A000Schema.parse(parsed);
349
+ }
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.A100InputSchema = exports.A100Schema = void 0;
4
+ exports.encodeA100 = encodeA100;
5
+ exports.parseA100 = parseA100;
6
+ const zod_1 = require("zod");
7
+ const constants_js_1 = require("../../constants.js");
8
+ const key_generator_js_1 = require("../../utils/key-generator.js");
9
+ const index_js_1 = require("../index.js");
10
+ /**
11
+ * A100 Record Schema - Business opening record
12
+ * Fields 1100-1105 based on SHAAM 1.31 specification table
13
+ */
14
+ exports.A100Schema = zod_1.z.object({
15
+ // Field 1100: Record code (4) - Required - Alphanumeric
16
+ code: zod_1.z.literal('A100').describe('Record type code - always "A100"'),
17
+ // Field 1101: Record number in file (9) - Required - Numeric
18
+ recordNumber: zod_1.z
19
+ .string()
20
+ .min(1)
21
+ .max(9)
22
+ .regex(/^\d+$/)
23
+ .describe('Sequential record number in BKMVDATA file'),
24
+ // Field 1102: Tax ID (9) - Required - Numeric
25
+ vatId: zod_1.z.string().min(1).max(9).regex(/^\d+$/).describe('VAT identification number'),
26
+ // Field 1103: Primary identifier (15) - Required - Numeric
27
+ primaryIdentifier: zod_1.z
28
+ .string()
29
+ .min(1)
30
+ .max(15)
31
+ .regex(/^\d+$/)
32
+ .describe('Fixed and unique primary identifier - see Note 2'),
33
+ // Field 1104: System constant (8) - Required - Alphanumeric - Value: &OF1.31&
34
+ systemConstant: zod_1.z
35
+ .literal(constants_js_1.SHAAM_VERSION)
36
+ .optional()
37
+ .describe(`System constant - always "${constants_js_1.SHAAM_VERSION}"`),
38
+ // Field 1105: Reserved field (50) - Optional - Alphanumeric
39
+ reserved: zod_1.z.string().max(50).default('').describe('Reserved field for future use'),
40
+ });
41
+ /**
42
+ * A100 Input Schema - for user input (excludes auto-generated fields)
43
+ * Field 1103 (primaryIdentifier) is automatically generated
44
+ */
45
+ exports.A100InputSchema = exports.A100Schema.omit({
46
+ primaryIdentifier: true,
47
+ code: true,
48
+ systemConstant: true,
49
+ });
50
+ /**
51
+ * Encodes an A100 record to fixed-width string format
52
+ * Total line width: 95 characters + CRLF
53
+ */
54
+ function encodeA100(input) {
55
+ const primaryIdentifier = key_generator_js_1.defaultKeyGenerator.getPrimaryIdentifier();
56
+ const fullRecord = {
57
+ code: 'A100',
58
+ primaryIdentifier,
59
+ systemConstant: constants_js_1.SHAAM_VERSION,
60
+ ...input,
61
+ };
62
+ const fields = [
63
+ (0, index_js_1.formatField)(fullRecord.code, 4, 'left'), // Field 1100: Record code (4) - Alphanumeric
64
+ (0, index_js_1.formatNumericField)(fullRecord.recordNumber, 9), // Field 1101: Record number (9) - Numeric, zero-padded
65
+ (0, index_js_1.formatNumericField)(fullRecord.vatId, 9), // Field 1102: VAT ID (9) - Numeric, zero-padded
66
+ (0, index_js_1.formatNumericField)(fullRecord.primaryIdentifier, 15), // Field 1103: Primary identifier (15) - Numeric, zero-padded
67
+ (0, index_js_1.formatField)(constants_js_1.SHAAM_VERSION, 8, 'left'), // Field 1104: System constant (8) - Alphanumeric
68
+ (0, index_js_1.formatField)(fullRecord.reserved, 50, 'left'), // Field 1105: Reserved (50) - Alphanumeric
69
+ ];
70
+ return (0, index_js_1.joinFields)(fields);
71
+ }
72
+ /**
73
+ * Parses a fixed-width A100 record line back to object
74
+ * Expected line length: 95 characters (excluding CRLF)
75
+ */
76
+ function parseA100(line) {
77
+ // Remove CRLF if present
78
+ const cleanLine = line.replace(/\r?\n$/, '');
79
+ if (cleanLine.length !== 95) {
80
+ throw new Error(`Invalid A100 record length: expected 95 characters, got ${cleanLine.length}`);
81
+ }
82
+ // Extract fields at their fixed positions
83
+ const code = cleanLine.slice(0, 4).trim();
84
+ const recordNumber = cleanLine.slice(4, 13).trim().replace(/^0+/, '') || '0'; // Strip leading zeros
85
+ const vatId = cleanLine.slice(13, 22).trim().replace(/^0+/, '') || '0'; // Strip leading zeros
86
+ const primaryIdentifier = cleanLine.slice(22, 37).trim().replace(/^0+/, '') || '0'; // Strip leading zeros
87
+ const systemConstant = cleanLine.slice(37, 45).trim();
88
+ const reserved = cleanLine.slice(45, 95).trim();
89
+ // Validate the code field
90
+ if (code !== 'A100') {
91
+ throw new Error(`Invalid A100 record code: expected "A100", got "${code}"`);
92
+ }
93
+ // Validate the system constant field
94
+ if (systemConstant !== '&OF1.31&') {
95
+ throw new Error(`Invalid system constant: expected "&OF1.31&", got "${systemConstant}"`);
96
+ }
97
+ const parsed = {
98
+ code,
99
+ recordNumber,
100
+ vatId,
101
+ primaryIdentifier,
102
+ systemConstant: '&OF1.31&', // Always use the literal constant
103
+ reserved,
104
+ };
105
+ // Validate against schema
106
+ return exports.A100Schema.parse(parsed);
107
+ }