UNPKG

@accounter/shaam6111-generator

Version:

Fully typed application that generates, parses, and validates SHAAM 6111 tax reports.

246 lines (230 loc) • 10.7 kB
import { parseHeaderRecord } from '../src/parsers/parse-header.js'; import { AccountingMethod, AccountingSystem, BusinessType, CurrencyType, ReportingMethod, YesNo, } from '../src/types/index.js'; describe('parseHeaderRecord', () => { // Test for valid header line it('should correctly parse a valid header line', () => { // Create a sample valid header line const validHeaderLine = '123456789' + // taxFileNumber '2025' + // taxYear '987654321' + // idNumber '123456789' + // vatFileNumber '987654321' + // withholdingTaxFileNumber '1234' + // industryCode 'Tech Company ' + // businessDescription '01' + // businessType '01' + // reportingMethod '01' + // accountingMethod '01' + // accountingSystem '1' + // isPartnership '1' + // includesProfitLoss '1' + // includesTaxAdjustment '1' + // includesBalanceSheet '010' + // profitLossEntryCount '020' + // taxAdjustmentEntryCount '030' + // balanceSheetEntryCount '2025' + // ifrsImplementationYear '1' + // ifrsReportingOption '12345678' + // softwareRegistrationNumber '005' + // partnershipCount '001000' + // partnershipProfitShare '01' + // currencyType '01' + // auditOpinionType '1' + // amountsInThousands // Pad to ensure sufficient length ' '; const result = parseHeaderRecord(validHeaderLine); // Assert the parsed values expect(result.taxFileNumber).toBe('123456789'); expect(result.taxYear).toBe('2025'); expect(result.idNumber).toBe('987654321'); expect(result.vatFileNumber).toBe('123456789'); expect(result.withholdingTaxFileNumber).toBe('987654321'); expect(result.industryCode).toBe('1234'); expect(result.businessDescription).toBe('Tech Company'); expect(result.businessType).toBe(BusinessType.INDUSTRIAL); expect(result.reportingMethod).toBe(ReportingMethod.CASH); expect(result.accountingMethod).toBe(AccountingMethod.SINGLE_ENTRY); expect(result.accountingSystem).toBe(AccountingSystem.MANUAL); expect(result.isPartnership).toBe(YesNo.YES); expect(result.includesProfitLoss).toBe(YesNo.YES); expect(result.includesTaxAdjustment).toBe(YesNo.YES); expect(result.includesBalanceSheet).toBe(YesNo.YES); expect(result.profitLossEntryCount).toBe(10); expect(result.taxAdjustmentEntryCount).toBe(20); expect(result.balanceSheetEntryCount).toBe(30); expect(result.ifrsImplementationYear).toBe('2025'); expect(result.softwareRegistrationNumber).toBe('12345678'); expect(result.partnershipCount).toBe(5); expect(result.partnershipProfitShare).toBe(1000); expect(result.currencyType).toBe(CurrencyType.SHEKELS); expect(result.amountsInThousands).toBe(YesNo.YES); }); // Test for minimum valid header line it('should correctly parse a header line with minimum required fields', () => { // Create a sample header with just the minimum required fields const minimalHeaderLine = '123456789' + // taxFileNumber '2025' + // taxYear '987654321' + // idNumber ' ' + // vatFileNumber (empty) ' ' + // withholdingTaxFileNumber (empty) '1234' + // industryCode ' ' + // businessDescription (empty) '01' + // businessType '01' + // reportingMethod '01' + // accountingMethod '01' + // accountingSystem ' ' + // isPartnership (empty) '1' + // includesProfitLoss '1' + // includesTaxAdjustment '1' + // includesBalanceSheet ' ' + // profitLossEntryCount (empty) ' ' + // taxAdjustmentEntryCount (empty) ' ' + // balanceSheetEntryCount (empty) ' ' + // ifrsImplementationYear (empty) ' ' + // ifrsReportingOption (empty) ' ' + // softwareRegistrationNumber (empty) ' ' + // partnershipCount (empty) ' ' + // partnershipProfitShare (empty) '01' + // currencyType ' ' + // auditOpinionType (empty) '2' + // amountsInThousands // Pad to ensure sufficient length ' '; const result = parseHeaderRecord(minimalHeaderLine); // Assert the parsed values expect(result.taxFileNumber).toBe('123456789'); expect(result.taxYear).toBe('2025'); expect(result.idNumber).toBe('987654321'); expect(result.vatFileNumber).toBeUndefined(); expect(result.withholdingTaxFileNumber).toBeUndefined(); expect(result.industryCode).toBe('1234'); expect(result.businessDescription).toBeUndefined(); expect(result.businessType).toBe(BusinessType.INDUSTRIAL); expect(result.reportingMethod).toBe(ReportingMethod.CASH); expect(result.accountingMethod).toBe(AccountingMethod.SINGLE_ENTRY); expect(result.accountingSystem).toBe(AccountingSystem.MANUAL); expect(result.isPartnership).toBeUndefined(); expect(result.includesProfitLoss).toBe(YesNo.YES); expect(result.includesTaxAdjustment).toBe(YesNo.YES); expect(result.includesBalanceSheet).toBe(YesNo.YES); expect(result.profitLossEntryCount).toBeUndefined(); expect(result.taxAdjustmentEntryCount).toBeUndefined(); expect(result.balanceSheetEntryCount).toBeUndefined(); expect(result.ifrsImplementationYear).toBeUndefined(); expect(result.ifrsReportingOption).toBeUndefined(); expect(result.softwareRegistrationNumber).toBeUndefined(); expect(result.partnershipCount).toBeUndefined(); expect(result.partnershipProfitShare).toBeUndefined(); expect(result.currencyType).toBe(CurrencyType.SHEKELS); expect(result.auditOpinionType).toBeUndefined(); expect(result.amountsInThousands).toBe(YesNo.NO); }); // Test for invalid header line (too short) it('should throw an error for a header line that is too short', () => { const shortHeaderLine = '12345678920259876'; expect(() => parseHeaderRecord(shortHeaderLine)).toThrow( 'Invalid header line: Insufficient data', ); }); // Test for invalid header line (empty) it('should throw an error for an empty header line', () => { expect(() => parseHeaderRecord('')).toThrow('Invalid header line: Insufficient data'); }); // Test for invalid header line (null) it('should throw an error for a null header line', () => { expect(() => parseHeaderRecord(null as unknown as string)).toThrow( 'Invalid header line: Insufficient data', ); }); // Test for handling of non-numeric fields it('should handle non-numeric fields in the header line', () => { // Create a sample header with non-numeric fields where numbers are expected const nonNumericHeaderLine = '123456789' + // taxFileNumber '2025' + // taxYear '987654321' + // idNumber ' ' + // vatFileNumber (empty) ' ' + // withholdingTaxFileNumber (empty) '1234' + // industryCode ' ' + // businessDescription (empty) ' A' + // businessType (non-numeric) ' B' + // reportingMethod (non-numeric) ' C' + // accountingMethod (non-numeric) ' D' + // accountingSystem (non-numeric) ' ' + // isPartnership (empty) 'X' + // includesProfitLoss (non-numeric) 'Y' + // includesTaxAdjustment (non-numeric) 'Z' + // includesBalanceSheet (non-numeric) 'ABC' + // profitLossEntryCount (non-numeric) 'DEF' + // taxAdjustmentEntryCount (non-numeric) 'GHI' + // balanceSheetEntryCount (non-numeric) ' ' + // ifrsImplementationYear (empty) ' ' + // ifrsReportingOption (empty) ' ' + // softwareRegistrationNumber (empty) ' ' + // partnershipCount (empty) ' ' + // partnershipProfitShare (empty) ' ' + // currencyType (non-numeric) ' ' + // auditOpinionType (empty) ' ' + // amountsInThousands (non-numeric) // Pad to ensure sufficient length ' '; const result = parseHeaderRecord(nonNumericHeaderLine); // Assert the parsed values (non-numeric values should be parsed as 0 or default values) expect(result.businessType).toBe(0); expect(result.reportingMethod).toBe(0); expect(result.accountingMethod).toBe(0); expect(result.accountingSystem).toBe(0); expect(result.includesProfitLoss).toBe(0); expect(result.includesTaxAdjustment).toBe(0); expect(result.includesBalanceSheet).toBe(0); expect(result.profitLossEntryCount).toBe(undefined); expect(result.taxAdjustmentEntryCount).toBe(undefined); expect(result.balanceSheetEntryCount).toBe(undefined); expect(result.currencyType).toBe(0); // Default value expect(result.amountsInThousands).toBe(YesNo.NO); // Default value }); it('should handle misaligned fields in the header line', () => { // Create a header line with a shifted field that would cause misalignment const misalignedHeaderLine = '123456789' + // taxFileNumber '2025' + // taxYear '987654321X' + // idNumber (extra character shifts all subsequent fields) '123456789' + // vatFileNumber '987654321' + // withholdingTaxFileNumber '1234' + // industryCode 'Tech Company ' + // businessDescription '01' + // businessType '01' + // reportingMethod '01' + // accountingMethod '01' + // accountingSystem '1' + // isPartnership '1' + // includesProfitLoss '1' + // includesTaxAdjustment '1' + // includesBalanceSheet '010' + // profitLossEntryCount '020' + // taxAdjustmentEntryCount '030' + // balanceSheetEntryCount '2025' + // ifrsImplementationYear '1' + // ifrsReportingOption '12345678' + // softwareRegistrationNumber '005' + // partnershipCount '001000' + // partnershipProfitShare '01' + // currencyType '01' + // auditOpinionType '1' + // amountsInThousands ' '; const result = parseHeaderRecord(misalignedHeaderLine); // Check that fields after the misalignment are not as expected // For example, the vatFileNumber should contain part of another field expect(result.vatFileNumber).not.toBe('123456789'); }); });