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

@ -72,7 +72,19 @@ export class FacturXDecoder extends CIIBaseDecoder {
const totalAmount = this.getNumber('//ram:GrandTotalAmount');
// Extract notes
const notes = this.extractNotes();
const allNotes = this.extractNotes();
// Extract subject and notes separately
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
}
// Check for reverse charge
const reverseCharge = this.exists('//ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode[text()="62"]');
@ -93,7 +105,7 @@ export class FacturXDecoder extends CIIBaseDecoder {
incidenceId: invoiceId,
from: seller,
to: buyer,
subject: `Invoice ${invoiceId}`,
subject: subject,
items: items,
dueInDays: dueInDays,
reverseCharge: reverseCharge,

View File

@ -145,15 +145,22 @@ export class FacturXEncoder extends CIIBaseEncoder {
issueDateElement.appendChild(dateStringElement);
documentElement.appendChild(issueDateElement);
// Add notes if present
// Add 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) {
const noteElement = doc.createElement('ram:IncludedNote');
const contentElement = doc.createElement('ram:Content');
contentElement.textContent = note;
noteElement.appendChild(contentElement);
documentElement.appendChild(noteElement);
}
allNotes.push(...invoice.notes);
}
// Write all notes
for (const note of allNotes) {
const noteElement = doc.createElement('ram:IncludedNote');
const contentElement = doc.createElement('ram:Content');
contentElement.textContent = note;
noteElement.appendChild(contentElement);
documentElement.appendChild(noteElement);
}
// Create transaction element if it doesn't exist

View File

@ -70,7 +70,20 @@ export class ZUGFeRDDecoder extends CIIBaseDecoder {
// const totalAmount = this.getNumber('//ram:GrandTotalAmount');
// Extract notes
const notes = this.extractNotes();
const allNotes = this.extractNotes();
// 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
}
// Check for reverse charge
const reverseCharge = this.exists('//ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode[text()="62"]');
@ -91,7 +104,7 @@ export class ZUGFeRDDecoder extends CIIBaseDecoder {
incidenceId: invoiceId,
from: seller,
to: buyer,
subject: `Invoice ${invoiceId}`,
subject: subject,
items: items,
dueInDays: dueInDays,
reverseCharge: reverseCharge,

View File

@ -152,15 +152,22 @@ export class ZUGFeRDEncoder extends CIIBaseEncoder {
issueDateElement.appendChild(dateStringElement);
documentElement.appendChild(issueDateElement);
// Add notes if available
// Add 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) {
const noteElement = doc.createElement('ram:IncludedNote');
const contentElement = doc.createElement('ram:Content');
contentElement.textContent = note;
noteElement.appendChild(contentElement);
documentElement.appendChild(noteElement);
}
allNotes.push(...invoice.notes);
}
// Write all notes
for (const note of allNotes) {
const noteElement = doc.createElement('ram:IncludedNote');
const contentElement = doc.createElement('ram:Content');
contentElement.textContent = note;
noteElement.appendChild(contentElement);
documentElement.appendChild(noteElement);
}
// Create transaction element if it doesn't exist

View File

@ -85,7 +85,20 @@ export class ZUGFeRDV1Decoder extends CIIBaseDecoder {
// const totalAmount = this.getNumber('//ram:GrandTotalAmount');
// Extract notes
const notes = this.extractNotes();
const allNotes = this.extractNotes();
// 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
}
// Check for reverse charge
const reverseCharge = this.exists('//ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode[text()="62"]');
@ -106,7 +119,7 @@ export class ZUGFeRDV1Decoder extends CIIBaseDecoder {
incidenceId: invoiceId,
from: seller,
to: buyer,
subject: `Invoice ${invoiceId}`,
subject: subject,
items: items,
dueInDays: dueInDays,
reverseCharge: reverseCharge,