UNPKG

@accounter/shaam-uniform-format-generator

Version:

Fully typed application that generates, parses, and validates SHAAM uniform format tax reports (INI.TXT and BKMVDATA.TXT).

67 lines (66 loc) 2.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.A000SumInputSchema = exports.A000SumSchema = void 0; exports.encodeA000Sum = encodeA000Sum; exports.parseA000Sum = parseA000Sum; const zod_1 = require("zod"); const encoder_js_1 = require("../format/encoder.js"); /** * A000Sum Record Schema - Record count summary for INI.TXT * Fields 1050-1051 based on SHAAM uniform format specification */ exports.A000SumSchema = zod_1.z.object({ // Field 1050: Record Code (4) - Required - Alphanumeric code: zod_1.z.string().min(1).max(4).describe('Record type code being summarized'), // Field 1051: Record Count (15) - Required - Numeric recordCount: zod_1.z .string() .min(1) .max(15) .regex(/^\d+$/) .describe('Total number of records of this type'), }); /** * A000Sum Input Schema - for user input (no auto-generated fields) */ exports.A000SumInputSchema = exports.A000SumSchema; /** * Encodes an A000Sum record to fixed-width string format * Total line width: 19 characters + CRLF */ function encodeA000Sum(input) { const fullRecord = { ...input, }; const fields = [ (0, encoder_js_1.formatField)(fullRecord.code, 4, 'left'), // Field 1050: Record code (4) (0, encoder_js_1.formatNumericField)(fullRecord.recordCount, 15), // Field 1051: Record count (15) ]; return (0, encoder_js_1.joinFields)(fields); } /** * Parses a fixed-width A000Sum record line back to object * Expected line length: 19 characters (excluding CRLF) */ function parseA000Sum(line) { // Remove CRLF if present const cleanLine = line.replace(/\r?\n$/, ''); if (cleanLine.length !== 19) { throw new Error(`Invalid A000Sum record length: expected 19 characters, got ${cleanLine.length}`); } let offset = 0; // Extract fields at their fixed positions const code = cleanLine.slice(offset, offset + 4).trim(); offset += 4; // Field 1050 (4) const recordCount = cleanLine .slice(offset, offset + 15) .trim() .replace(/^0+/, '') || '0'; offset += 15; // Field 1051 (15) const parsed = { code, recordCount, }; // Validate against schema return exports.A000SumSchema.parse(parsed); }