@accounter/pcn874-generator
Version:
Fully typed application that generates PCN874 text file
99 lines (98 loc) • 4.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.headerInfoToHeaderAndFooterStrings = exports.numToSignedString = exports.addLeadingZeros = exports.cleanNonDigitChars = exports.digitsAdjuster = void 0;
exports.sortTransactions = sortTransactions;
exports.transactionToString = transactionToString;
const schemas_js_1 = require("../schemas.js");
const index_js_1 = require("./index.js");
const digitsAdjuster = (value, length) => {
return `${'0'.repeat(length)}${value}`.slice(-length);
};
exports.digitsAdjuster = digitsAdjuster;
const cleanNonDigitChars = (value) => {
return value.replace(/\D/g, '');
};
exports.cleanNonDigitChars = cleanNonDigitChars;
const addLeadingZeros = (value = 0, length) => {
const zeros = '0'.repeat(length);
const stringNum = Math.abs(Math.round(value)).toString();
const final = (zeros + stringNum).slice(-length);
return final;
};
exports.addLeadingZeros = addLeadingZeros;
const numToSignedString = (value, length) => {
const sign = value >= 0 ? '+' : '-';
const paddedNum = (0, exports.addLeadingZeros)(value, length);
return `${sign}${paddedNum}`;
};
exports.numToSignedString = numToSignedString;
const headerInfoToHeaderAndFooterStrings = (header, options) => {
try {
const initiallyParsedHeader = schemas_js_1.headerCoreSchema.safeParse(header);
if (!initiallyParsedHeader.success) {
throw new Error(initiallyParsedHeader.error.format()._errors.join(', '));
}
let { data: parsedHeader } = initiallyParsedHeader;
if (!options.strict) {
try {
parsedHeader = schemas_js_1.headerTransformerSchema.parse(parsedHeader);
}
catch (e) {
console.log(e);
throw new Error('Error auto-fixing header', { cause: e });
}
}
const validatedHeader = schemas_js_1.headerStrictSchema.parse(parsedHeader);
return {
header: (0, index_js_1.headerBuilder)(validatedHeader),
footer: (0, index_js_1.footerBuilder)(validatedHeader),
};
}
catch (e) {
throw new Error(`Header validation error: ${e.message}`, { cause: e });
}
};
exports.headerInfoToHeaderAndFooterStrings = headerInfoToHeaderAndFooterStrings;
function sortTransactions(transactions, options) {
if (!options.sort) {
return transactions;
}
return transactions.sort((a, b) => {
const entryTypeCompare = a.entryType.localeCompare(b.entryType);
if (entryTypeCompare) {
return entryTypeCompare;
}
const invoiceDateCompare = a.invoiceDate.localeCompare(b.invoiceDate);
if (invoiceDateCompare) {
return invoiceDateCompare;
}
const vatIdCompare = (a.vatId ?? '0').localeCompare(b.vatId ?? '0');
if (vatIdCompare) {
return vatIdCompare;
}
return a.invoiceSum > b.invoiceSum ? 1 : -1;
});
}
function transactionToString(transaction, options) {
try {
const initiallyParsedTransaction = schemas_js_1.transactionCoreSchema.safeParse(transaction);
if (!initiallyParsedTransaction.success) {
throw new Error(initiallyParsedTransaction.error.format()._errors.join(', '));
}
let { data: parsedTransaction } = initiallyParsedTransaction;
if (!options.strict) {
try {
parsedTransaction = schemas_js_1.transactionTransformerSchema.parse(parsedTransaction);
}
catch (e) {
console.log(e);
throw new Error('Error auto-fixing transaction', { cause: e });
}
}
const validatedTransaction = schemas_js_1.transactionStrictSchema.parse(parsedTransaction);
return (0, index_js_1.transactionBuilder)(validatedTransaction);
}
catch (e) {
throw new Error(`Transaction validation error: ${e.message}\n\n${JSON.stringify(transaction)}`, { cause: e });
}
}