This commit is contained in:
2025-05-27 20:09:35 +00:00
parent 079feddaa6
commit 9e46a55057
10 changed files with 161 additions and 60 deletions

View File

@ -82,11 +82,18 @@ export class UBLEncoder extends UBLBaseEncoder {
const typeCode = documentType === UBLDocumentType.INVOICE ? '380' : '381';
this.appendElement(doc, root, 'cbc:InvoiceTypeCode', typeCode);
// Notes
// Notes - include subject as first note if it exists
const allNotes: string[] = [];
if (invoice.subject && invoice.subject.trim()) {
allNotes.push(invoice.subject);
}
if (invoice.notes && invoice.notes.length > 0) {
for (const note of invoice.notes) {
this.appendElement(doc, root, 'cbc:Note', note);
}
allNotes.push(...invoice.notes);
}
// Write all notes
for (const note of allNotes) {
this.appendElement(doc, root, 'cbc:Note', note);
}
// Document Currency Code

View File

@ -164,18 +164,31 @@ export class XRechnungDecoder extends UBLBaseDecoder {
const periodEnd = this.getText('//cac:InvoicePeriod/cbc:EndDate', this.doc);
const deliveryDate = this.getText('//cac:Delivery/cbc:ActualDeliveryDate', this.doc);
// Extract notes
const notes: string[] = [];
const noteNodes = this.select('//cbc:Note', this.doc);
// Extract notes (excluding PaymentTerms notes)
const allNotes: string[] = [];
const noteNodes = this.select('//cbc:Note[not(parent::cac:PaymentTerms)]', this.doc);
if (noteNodes && Array.isArray(noteNodes)) {
for (let i = 0; i < noteNodes.length; i++) {
const noteText = noteNodes[i].textContent || '';
if (noteText) {
notes.push(noteText);
allNotes.push(noteText);
}
}
}
// Extract subject and notes separately
// If we have notes, the first one might be the subject
let subject = `Invoice ${invoiceId}`;
let notes = [...allNotes];
// If the first note doesn't look like a payment term or other standard note,
// treat it as the subject
if (allNotes.length > 0 && !allNotes[0].toLowerCase().includes('due in') &&
!allNotes[0].toLowerCase().includes('payment')) {
subject = allNotes[0];
notes = allNotes.slice(1); // Remove subject from notes
}
// Extract seller and buyer information
const seller = this.extractParty('//cac:AccountingSupplierParty/cac:Party');
const buyer = this.extractParty('//cac:AccountingCustomerParty/cac:Party');
@ -196,7 +209,7 @@ export class XRechnungDecoder extends UBLBaseDecoder {
incidenceId: invoiceId,
from: seller,
to: buyer,
subject: notes.length > 0 ? notes[0] : `Invoice ${invoiceId}`,
subject: subject,
items: items,
dueInDays: dueInDays,
reverseCharge: false,