@accounter/server
Version:
Accounter GraphQL server
79 lines • 3.9 kB
JavaScript
/**
* Safely parses a string to an integer with a fallback value
* @param value The string to parse
* @param fallback The fallback value if parsing fails
* @returns The parsed integer or fallback value
*/
function parseIntWithFallback(value, fallback) {
const trimmed = value.trim();
if (!trimmed)
return fallback;
const parsed = parseInt(trimmed);
return Number.isNaN(parsed) ? fallback : parsed;
}
/**
* Safely parses a single character to an integer with a fallback value
* @param char The character to parse
* @param fallback The fallback value if parsing fails
* @returns The parsed integer or fallback value
*/
function parseCharWithFallback(char, fallback) {
if (!char)
return fallback;
const parsed = parseInt(char);
return Number.isNaN(parsed) ? fallback : parsed;
}
/**
* Safely extracts a string field with optional trimming
* @param str The source string
* @param start The starting index (inclusive)
* @param end The ending index (exclusive)
* @param makeUndefinedIfEmpty Whether to return undefined for empty strings
* @returns The extracted substring or undefined
*/
function extractString(str, start, end, makeUndefinedIfEmpty = true) {
const value = str.substring(start, end).trim();
return value || (makeUndefinedIfEmpty ? undefined : value);
}
/**
* Parses the header section of the report content
* @param headerLine - The line containing header information
* @returns A HeaderRecord object
*/
export function parseHeaderRecord(headerLine) {
// Ensure we have data to parse
if (!headerLine || headerLine.length < 142) {
throw new Error('Invalid header line: Insufficient data');
}
// Extract header fields according to the specification
const header = {
taxFileNumber: extractString(headerLine, 0, 9, false) || '',
taxYear: extractString(headerLine, 9, 13, false) || '',
idNumber: extractString(headerLine, 13, 22, false) || '',
vatFileNumber: extractString(headerLine, 22, 31),
withholdingTaxFileNumber: extractString(headerLine, 31, 40),
industryCode: extractString(headerLine, 40, 44, false) || '',
businessDescription: extractString(headerLine, 44, 94),
businessType: parseIntWithFallback(headerLine.substring(94, 96), 0),
reportingMethod: parseIntWithFallback(headerLine.substring(96, 98), 0),
accountingMethod: parseIntWithFallback(headerLine.substring(98, 100), 0),
accountingSystem: parseIntWithFallback(headerLine.substring(100, 102), 0),
isPartnership: parseCharWithFallback(headerLine.charAt(102), undefined),
includesProfitLoss: parseCharWithFallback(headerLine.charAt(103), 0),
includesTaxAdjustment: parseCharWithFallback(headerLine.charAt(104), 0),
includesBalanceSheet: parseCharWithFallback(headerLine.charAt(105), 0),
profitLossEntryCount: parseIntWithFallback(headerLine.substring(106, 109), undefined),
taxAdjustmentEntryCount: parseIntWithFallback(headerLine.substring(109, 112), undefined),
balanceSheetEntryCount: parseIntWithFallback(headerLine.substring(112, 115), undefined),
ifrsImplementationYear: extractString(headerLine, 115, 119),
ifrsReportingOption: parseCharWithFallback(headerLine.charAt(119), undefined),
softwareRegistrationNumber: extractString(headerLine, 120, 128),
partnershipCount: parseIntWithFallback(headerLine.substring(128, 131), undefined),
partnershipProfitShare: parseIntWithFallback(headerLine.substring(131, 137), undefined),
currencyType: parseIntWithFallback(headerLine.substring(137, 139), 0),
auditOpinionType: parseIntWithFallback(headerLine.substring(139, 141), undefined),
amountsInThousands: parseCharWithFallback(headerLine.charAt(141), 2),
};
return header;
}
//# sourceMappingURL=parse-header.js.map