@openade/pem
Version:
Punto di Emissione (Emission Point) - Device library for fiscal receipts
57 lines • 2.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DocumentBuilder = void 0;
class DocumentBuilder {
constructor(config) {
this.vatNumber = config.vatNumber;
this.businessName = config.businessName;
this.pemId = config.pemId;
}
build(lines, documentNumber) {
const now = new Date();
const dataOra = now.toISOString();
const dettaglioLinee = lines.map((line, index) => ({
numeroLinea: index + 1,
descrizione: line.description,
quantita: line.quantity,
prezzoUnitario: line.unitPrice,
prezzoTotale: line.quantity * line.unitPrice,
aliquotaIVA: line.vatRate,
}));
const vatGroups = new Map();
lines.forEach((line) => {
const total = line.quantity * line.unitPrice;
const taxable = total / (1 + line.vatRate / 100);
const tax = total - taxable;
const existing = vatGroups.get(line.vatRate) || { imponibile: 0, imposta: 0 };
existing.imponibile += taxable;
existing.imposta += tax;
vatGroups.set(line.vatRate, existing);
});
const datiRiepilogo = Array.from(vatGroups.entries()).map(([rate, amounts]) => ({
aliquotaIVA: rate,
imponibile: Math.round(amounts.imponibile * 100) / 100,
imposta: Math.round(amounts.imposta * 100) / 100,
}));
const totalAmount = lines.reduce((sum, line) => sum + line.quantity * line.unitPrice, 0);
return {
versione: '1.0',
contribuente: {
partitaIVA: this.vatNumber,
denominazione: this.businessName,
regimeFiscale: 'RF01',
},
identificativoPEM: this.pemId,
datiGenerali: {
tipoDocumento: 'TD01',
numero: documentNumber,
dataOra,
},
dettaglioLinee,
datiRiepilogo,
importoTotale: Math.round(totalAmount * 100) / 100,
};
}
}
exports.DocumentBuilder = DocumentBuilder;
//# sourceMappingURL=document.builder.js.map