@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.
- package/README.md +366 -13
- package/dist/README.md +476 -0
- package/dist/cjs/api/generate-report-legacy.js +6 -0
- package/dist/cjs/api/generate-report.js +328 -0
- package/dist/cjs/constants.js +11 -0
- package/dist/cjs/generator/format/encoder.js +86 -0
- package/dist/cjs/generator/records/a000-sum.js +66 -0
- package/dist/cjs/generator/records/a000.js +349 -0
- package/dist/cjs/generator/records/a100.js +107 -0
- package/dist/cjs/generator/records/b100.js +305 -0
- package/dist/cjs/generator/records/b110.js +255 -0
- package/dist/cjs/generator/records/c100.js +338 -0
- package/dist/cjs/generator/records/d110.js +272 -0
- package/dist/cjs/generator/records/d120.js +278 -0
- package/{cjs → dist/cjs}/generator/records/index.js +1 -0
- package/dist/cjs/generator/records/m100.js +177 -0
- package/dist/cjs/generator/records/z900.js +93 -0
- package/{cjs → dist/cjs}/index.js +3 -0
- package/dist/cjs/records/a100.js +78 -0
- package/dist/cjs/records/index.js +20 -0
- package/dist/cjs/records/z900.js +82 -0
- package/dist/cjs/types/enums.js +457 -0
- package/{cjs → dist/cjs}/types/index.js +6 -1
- package/dist/cjs/utils/file-helpers.js +198 -0
- package/dist/cjs/utils/index.js +8 -0
- package/dist/cjs/utils/key-generator.js +71 -0
- package/dist/esm/api/generate-report-legacy.js +2 -0
- package/dist/esm/api/generate-report.js +325 -0
- package/dist/esm/constants.js +8 -0
- package/dist/esm/generator/format/encoder.js +77 -0
- package/dist/esm/generator/records/a000-sum.js +61 -0
- package/dist/esm/generator/records/a000.js +344 -0
- package/dist/esm/generator/records/a100.js +102 -0
- package/dist/esm/generator/records/b100.js +300 -0
- package/dist/esm/generator/records/b110.js +250 -0
- package/dist/esm/generator/records/c100.js +333 -0
- package/dist/esm/generator/records/d110.js +267 -0
- package/dist/esm/generator/records/d120.js +273 -0
- package/{esm → dist/esm}/generator/records/index.js +1 -0
- package/dist/esm/generator/records/m100.js +172 -0
- package/dist/esm/generator/records/z900.js +88 -0
- package/{esm → dist/esm}/index.js +3 -0
- package/dist/esm/records/a100.js +73 -0
- package/dist/esm/records/index.js +11 -0
- package/dist/esm/records/z900.js +77 -0
- package/dist/esm/types/enums.js +454 -0
- package/{esm → dist/esm}/types/index.js +5 -1
- package/dist/esm/utils/file-helpers.js +188 -0
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/key-generator.js +65 -0
- package/dist/package.json +54 -0
- package/dist/typings/api/generate-report-legacy.d.cts +1 -0
- package/dist/typings/api/generate-report-legacy.d.ts +1 -0
- package/dist/typings/constants.d.cts +8 -0
- package/dist/typings/constants.d.ts +8 -0
- package/dist/typings/generator/format/encoder.d.cts +57 -0
- package/dist/typings/generator/format/encoder.d.ts +57 -0
- package/dist/typings/generator/records/a000-sum.d.cts +40 -0
- package/dist/typings/generator/records/a000-sum.d.ts +40 -0
- package/dist/typings/generator/records/a000.d.cts +238 -0
- package/dist/typings/generator/records/a000.d.ts +238 -0
- package/dist/typings/generator/records/a100.d.cts +59 -0
- package/dist/typings/generator/records/a100.d.ts +59 -0
- package/dist/typings/generator/records/b100.d.cts +101 -0
- package/dist/typings/generator/records/b100.d.ts +101 -0
- package/dist/typings/generator/records/b110.d.cts +89 -0
- package/dist/typings/generator/records/b110.d.ts +89 -0
- package/dist/typings/generator/records/c100.d.cts +133 -0
- package/dist/typings/generator/records/c100.d.ts +133 -0
- package/dist/typings/generator/records/d110.d.cts +98 -0
- package/dist/typings/generator/records/d110.d.ts +98 -0
- package/dist/typings/generator/records/d120.d.cts +95 -0
- package/dist/typings/generator/records/d120.d.ts +95 -0
- package/{typings → dist/typings}/generator/records/index.d.cts +1 -0
- package/{typings → dist/typings}/generator/records/index.d.ts +1 -0
- package/dist/typings/generator/records/m100.d.cts +69 -0
- package/dist/typings/generator/records/m100.d.ts +69 -0
- package/dist/typings/generator/records/z900.d.cts +61 -0
- package/dist/typings/generator/records/z900.d.ts +61 -0
- package/{typings → dist/typings}/index.d.cts +3 -0
- package/{typings → dist/typings}/index.d.ts +3 -0
- package/dist/typings/records/a100.d.cts +35 -0
- package/dist/typings/records/a100.d.ts +35 -0
- package/dist/typings/records/index.d.cts +2 -0
- package/dist/typings/records/index.d.ts +2 -0
- package/dist/typings/records/z900.d.cts +38 -0
- package/dist/typings/records/z900.d.ts +38 -0
- package/dist/typings/types/enums.d.cts +162 -0
- package/dist/typings/types/enums.d.ts +162 -0
- package/{typings → dist/typings}/types/index.d.cts +17 -14
- package/{typings → dist/typings}/types/index.d.ts +17 -14
- package/dist/typings/utils/file-helpers.d.cts +131 -0
- package/dist/typings/utils/file-helpers.d.ts +131 -0
- package/dist/typings/utils/index.d.cts +5 -0
- package/dist/typings/utils/index.d.ts +5 -0
- package/dist/typings/utils/key-generator.d.cts +41 -0
- package/dist/typings/utils/key-generator.d.ts +41 -0
- package/documentation/IncomeTax_IncomeTaxSoftwareHousesInfo_horaot1.31_2_05.pdf +0 -0
- package/documentation/_4D6963726F736F667420576F7264202D20F8E5E0E9ED20F8E7E5F720F8E5E0E9ED20F9F7E5F32E646F63_.pdf +0 -0
- package/documentation/a000-sum.csv +3 -0
- package/documentation/a000.csv +37 -0
- package/documentation/a100.csv +7 -0
- package/documentation/b100.csv +29 -0
- package/documentation/b110.csv +26 -0
- package/documentation/c100.csv +37 -0
- package/documentation/d110.csv +27 -0
- package/documentation/d120.csv +26 -0
- package/documentation/m100.csv +17 -0
- package/documentation/z900.csv +8 -0
- package/package.json +50 -29
- package/prompt_plan.md +259 -0
- package/spec.md +206 -0
- package/src/api/generate-report.ts +366 -0
- package/src/api/parse-files.ts +33 -0
- package/src/constants.ts +9 -0
- package/src/format/index.ts +6 -0
- package/src/format/newline.ts +8 -0
- package/src/format/padding.ts +39 -0
- package/src/generator/format/decoder.ts +15 -0
- package/src/generator/format/encoder.ts +95 -0
- package/src/generator/format/index.ts +6 -0
- package/src/generator/index.ts +6 -0
- package/src/generator/records/a000-sum.ts +78 -0
- package/src/generator/records/a000.ts +373 -0
- package/src/generator/records/a100.ts +118 -0
- package/src/generator/records/b100.ts +317 -0
- package/src/generator/records/b110.ts +267 -0
- package/src/generator/records/c100.ts +347 -0
- package/src/generator/records/d110.ts +286 -0
- package/src/generator/records/d120.ts +293 -0
- package/src/generator/records/index.ts +14 -0
- package/src/generator/records/m100.ts +185 -0
- package/src/generator/records/z900.ts +104 -0
- package/src/index.ts +18 -0
- package/src/parser/data-parser.ts +14 -0
- package/src/parser/index.ts +6 -0
- package/src/parser/ini-parser.ts +14 -0
- package/src/types/enums.ts +531 -0
- package/src/types/index.ts +110 -0
- package/src/utils/file-helpers.ts +221 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/key-generator.ts +75 -0
- package/src/validation/errors.ts +35 -0
- package/src/validation/index.ts +6 -0
- package/src/validation/validate-input.ts +67 -0
- package/tests/debug-output.test.ts +81 -0
- package/tests/format/crlf-join.test.ts +124 -0
- package/tests/format/encoder.test.ts +80 -0
- package/tests/format/newline.test.ts +19 -0
- package/tests/format/padding.test.ts +74 -0
- package/tests/index.test.ts +29 -0
- package/tests/ini-text.test.ts +122 -0
- package/tests/integration/comprehensive.integration.test.ts +350 -0
- package/tests/integration/roundtrip.integration.test.ts +377 -0
- package/tests/records/a000-sum.test.ts +278 -0
- package/tests/records/a000.test.ts +318 -0
- package/tests/records/a100.test.ts +239 -0
- package/tests/records/b100.test.ts +419 -0
- package/tests/records/b110.test.ts +445 -0
- package/tests/records/c100.test.ts +333 -0
- package/tests/records/d110.test.ts +93 -0
- package/tests/records/d120.test.ts +275 -0
- package/tests/records/m100.test.ts +437 -0
- package/tests/records/z900.test.ts +254 -0
- package/tests/types/enums.test.ts +290 -0
- package/tests/utils/file-helpers.test.ts +276 -0
- package/tests/utils/key-generator.test.ts +121 -0
- package/tests/validation/document-type-validation.test.ts +521 -0
- package/tests/validation/validate-input.test.ts +219 -0
- package/todo.md +203 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +11 -0
- package/cjs/api/generate-report.js +0 -53
- package/cjs/generator/format/encoder.js +0 -46
- package/cjs/generator/records/a000.js +0 -8
- package/cjs/generator/records/a100.js +0 -8
- package/cjs/generator/records/b100.js +0 -8
- package/cjs/generator/records/b110.js +0 -8
- package/cjs/generator/records/c100.js +0 -8
- package/cjs/generator/records/d110.js +0 -8
- package/cjs/generator/records/d120.js +0 -8
- package/cjs/generator/records/m100.js +0 -8
- package/cjs/generator/records/z900.js +0 -8
- package/esm/api/generate-report.js +0 -50
- package/esm/generator/format/encoder.js +0 -42
- package/esm/generator/records/a000.js +0 -5
- package/esm/generator/records/a100.js +0 -5
- package/esm/generator/records/b100.js +0 -5
- package/esm/generator/records/b110.js +0 -5
- package/esm/generator/records/c100.js +0 -5
- package/esm/generator/records/d110.js +0 -5
- package/esm/generator/records/d120.js +0 -5
- package/esm/generator/records/m100.js +0 -5
- package/esm/generator/records/z900.js +0 -5
- package/typings/generator/format/encoder.d.cts +0 -33
- package/typings/generator/format/encoder.d.ts +0 -33
- package/typings/generator/records/a000.d.cts +0 -4
- package/typings/generator/records/a000.d.ts +0 -4
- package/typings/generator/records/a100.d.cts +0 -4
- package/typings/generator/records/a100.d.ts +0 -4
- package/typings/generator/records/b100.d.cts +0 -4
- package/typings/generator/records/b100.d.ts +0 -4
- package/typings/generator/records/b110.d.cts +0 -4
- package/typings/generator/records/b110.d.ts +0 -4
- package/typings/generator/records/c100.d.cts +0 -4
- package/typings/generator/records/c100.d.ts +0 -4
- package/typings/generator/records/d110.d.cts +0 -4
- package/typings/generator/records/d110.d.ts +0 -4
- package/typings/generator/records/d120.d.cts +0 -4
- package/typings/generator/records/d120.d.ts +0 -4
- package/typings/generator/records/m100.d.cts +0 -4
- package/typings/generator/records/m100.d.ts +0 -4
- package/typings/generator/records/z900.d.cts +0 -4
- package/typings/generator/records/z900.d.ts +0 -4
- /package/{cjs → dist/cjs}/api/parse-files.js +0 -0
- /package/{cjs → dist/cjs}/format/index.js +0 -0
- /package/{cjs → dist/cjs}/format/newline.js +0 -0
- /package/{cjs → dist/cjs}/format/padding.js +0 -0
- /package/{cjs → dist/cjs}/generator/format/decoder.js +0 -0
- /package/{cjs → dist/cjs}/generator/format/index.js +0 -0
- /package/{cjs → dist/cjs}/generator/index.js +0 -0
- /package/{cjs → dist/cjs}/package.json +0 -0
- /package/{cjs → dist/cjs}/parser/data-parser.js +0 -0
- /package/{cjs → dist/cjs}/parser/index.js +0 -0
- /package/{cjs → dist/cjs}/parser/ini-parser.js +0 -0
- /package/{cjs → dist/cjs}/validation/errors.js +0 -0
- /package/{cjs → dist/cjs}/validation/index.js +0 -0
- /package/{cjs → dist/cjs}/validation/validate-input.js +0 -0
- /package/{esm → dist/esm}/api/parse-files.js +0 -0
- /package/{esm → dist/esm}/format/index.js +0 -0
- /package/{esm → dist/esm}/format/newline.js +0 -0
- /package/{esm → dist/esm}/format/padding.js +0 -0
- /package/{esm → dist/esm}/generator/format/decoder.js +0 -0
- /package/{esm → dist/esm}/generator/format/index.js +0 -0
- /package/{esm → dist/esm}/generator/index.js +0 -0
- /package/{esm → dist/esm}/parser/data-parser.js +0 -0
- /package/{esm → dist/esm}/parser/index.js +0 -0
- /package/{esm → dist/esm}/parser/ini-parser.js +0 -0
- /package/{esm → dist/esm}/validation/errors.js +0 -0
- /package/{esm → dist/esm}/validation/index.js +0 -0
- /package/{esm → dist/esm}/validation/validate-input.js +0 -0
- /package/{typings → dist/typings}/api/generate-report.d.cts +0 -0
- /package/{typings → dist/typings}/api/generate-report.d.ts +0 -0
- /package/{typings → dist/typings}/api/parse-files.d.cts +0 -0
- /package/{typings → dist/typings}/api/parse-files.d.ts +0 -0
- /package/{typings → dist/typings}/format/index.d.cts +0 -0
- /package/{typings → dist/typings}/format/index.d.ts +0 -0
- /package/{typings → dist/typings}/format/newline.d.cts +0 -0
- /package/{typings → dist/typings}/format/newline.d.ts +0 -0
- /package/{typings → dist/typings}/format/padding.d.cts +0 -0
- /package/{typings → dist/typings}/format/padding.d.ts +0 -0
- /package/{typings → dist/typings}/generator/format/decoder.d.cts +0 -0
- /package/{typings → dist/typings}/generator/format/decoder.d.ts +0 -0
- /package/{typings → dist/typings}/generator/format/index.d.cts +0 -0
- /package/{typings → dist/typings}/generator/format/index.d.ts +0 -0
- /package/{typings → dist/typings}/generator/index.d.cts +0 -0
- /package/{typings → dist/typings}/generator/index.d.ts +0 -0
- /package/{typings → dist/typings}/parser/data-parser.d.cts +0 -0
- /package/{typings → dist/typings}/parser/data-parser.d.ts +0 -0
- /package/{typings → dist/typings}/parser/index.d.cts +0 -0
- /package/{typings → dist/typings}/parser/index.d.ts +0 -0
- /package/{typings → dist/typings}/parser/ini-parser.d.cts +0 -0
- /package/{typings → dist/typings}/parser/ini-parser.d.ts +0 -0
- /package/{typings → dist/typings}/validation/errors.d.cts +0 -0
- /package/{typings → dist/typings}/validation/errors.d.ts +0 -0
- /package/{typings → dist/typings}/validation/index.d.cts +0 -0
- /package/{typings → dist/typings}/validation/index.d.ts +0 -0
- /package/{typings → dist/typings}/validation/validate-input.d.cts +0 -0
- /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
|
+
}
|