feat(compliance): improve compliance
This commit is contained in:
@ -143,6 +143,72 @@ export class XRechnungEncoder extends UBLEncoder {
|
||||
partyElement.appendChild(endpointNode);
|
||||
}
|
||||
}
|
||||
|
||||
// Add GLN (Global Location Number) if available
|
||||
if (party.gln && !existingEndpoint) {
|
||||
const endpointNode = doc.createElement('cbc:EndpointID');
|
||||
endpointNode.setAttribute('schemeID', '0088'); // GLN scheme ID
|
||||
endpointNode.textContent = party.gln;
|
||||
|
||||
// Insert as first child of party element
|
||||
if (partyElement.firstChild) {
|
||||
partyElement.insertBefore(endpointNode, partyElement.firstChild);
|
||||
} else {
|
||||
partyElement.appendChild(endpointNode);
|
||||
}
|
||||
}
|
||||
|
||||
// Add PartyIdentification for additional identifiers
|
||||
if (party.additionalIdentifiers) {
|
||||
for (const identifier of party.additionalIdentifiers) {
|
||||
const partyId = doc.createElement('cac:PartyIdentification');
|
||||
const id = doc.createElement('cbc:ID');
|
||||
if (identifier.scheme) {
|
||||
id.setAttribute('schemeID', identifier.scheme);
|
||||
}
|
||||
id.textContent = identifier.value;
|
||||
partyId.appendChild(id);
|
||||
|
||||
// Insert after EndpointID or at beginning
|
||||
const endpoint = partyElement.getElementsByTagName('cbc:EndpointID')[0];
|
||||
if (endpoint && endpoint.nextSibling) {
|
||||
partyElement.insertBefore(partyId, endpoint.nextSibling);
|
||||
} else if (partyElement.firstChild) {
|
||||
partyElement.insertBefore(partyId, partyElement.firstChild);
|
||||
} else {
|
||||
partyElement.appendChild(partyId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add company registration number to PartyLegalEntity
|
||||
if (party.registrationDetails?.registrationId) {
|
||||
let legalEntity = partyElement.getElementsByTagName('cac:PartyLegalEntity')[0];
|
||||
if (!legalEntity) {
|
||||
legalEntity = doc.createElement('cac:PartyLegalEntity');
|
||||
// Insert after PostalAddress
|
||||
const postalAddress = partyElement.getElementsByTagName('cac:PostalAddress')[0];
|
||||
if (postalAddress && postalAddress.nextSibling) {
|
||||
partyElement.insertBefore(legalEntity, postalAddress.nextSibling);
|
||||
} else {
|
||||
partyElement.appendChild(legalEntity);
|
||||
}
|
||||
}
|
||||
|
||||
// Add registration name if not present
|
||||
if (!legalEntity.getElementsByTagName('cbc:RegistrationName')[0]) {
|
||||
const regName = doc.createElement('cbc:RegistrationName');
|
||||
regName.textContent = party.registrationDetails.registrationName || party.name;
|
||||
legalEntity.appendChild(regName);
|
||||
}
|
||||
|
||||
// Add company ID if not present
|
||||
if (!legalEntity.getElementsByTagName('cbc:CompanyID')[0]) {
|
||||
const companyId = doc.createElement('cbc:CompanyID');
|
||||
companyId.textContent = party.registrationDetails.registrationId;
|
||||
legalEntity.appendChild(companyId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -256,6 +322,13 @@ export class XRechnungEncoder extends UBLEncoder {
|
||||
paymentMeans.appendChild(paymentId);
|
||||
}
|
||||
|
||||
// Add PaymentDueDate
|
||||
if (paymentInfo.paymentDueDate && !paymentMeans.getElementsByTagName('cbc:PaymentDueDate')[0]) {
|
||||
const dueDate = doc.createElement('cbc:PaymentDueDate');
|
||||
dueDate.textContent = paymentInfo.paymentDueDate;
|
||||
paymentMeans.appendChild(dueDate);
|
||||
}
|
||||
|
||||
// Add IBAN and BIC
|
||||
if (paymentInfo.iban || paymentInfo.bic) {
|
||||
let payeeAccount = paymentMeans.getElementsByTagName('cac:PayeeFinancialAccount')[0];
|
||||
@ -271,37 +344,42 @@ export class XRechnungEncoder extends UBLEncoder {
|
||||
payeeAccount.appendChild(iban);
|
||||
}
|
||||
|
||||
// Add BIC
|
||||
if (paymentInfo.bic) {
|
||||
// Add account name (must come after ID but before FinancialInstitutionBranch)
|
||||
if (paymentInfo.accountName && !payeeAccount.getElementsByTagName('cbc:Name')[0]) {
|
||||
const accountName = doc.createElement('cbc:Name');
|
||||
accountName.textContent = paymentInfo.accountName;
|
||||
// Insert after ID but before FinancialInstitutionBranch
|
||||
const id = payeeAccount.getElementsByTagName('cbc:ID')[0];
|
||||
const finInstBranch = payeeAccount.getElementsByTagName('cac:FinancialInstitutionBranch')[0];
|
||||
if (finInstBranch) {
|
||||
payeeAccount.insertBefore(accountName, finInstBranch);
|
||||
} else if (id && id.nextSibling) {
|
||||
payeeAccount.insertBefore(accountName, id.nextSibling);
|
||||
} else {
|
||||
payeeAccount.appendChild(accountName);
|
||||
}
|
||||
}
|
||||
|
||||
// Add BIC and bank name
|
||||
if (paymentInfo.bic || paymentInfo.bankName) {
|
||||
let finInstBranch = payeeAccount.getElementsByTagName('cac:FinancialInstitutionBranch')[0];
|
||||
if (!finInstBranch) {
|
||||
finInstBranch = doc.createElement('cac:FinancialInstitutionBranch');
|
||||
payeeAccount.appendChild(finInstBranch);
|
||||
}
|
||||
|
||||
let finInst = finInstBranch.getElementsByTagName('cac:FinancialInstitution')[0];
|
||||
if (!finInst) {
|
||||
finInst = doc.createElement('cac:FinancialInstitution');
|
||||
finInstBranch.appendChild(finInst);
|
||||
// Add BIC as branch ID
|
||||
if (paymentInfo.bic && !finInstBranch.getElementsByTagName('cbc:ID')[0]) {
|
||||
const bicElement = doc.createElement('cbc:ID');
|
||||
bicElement.textContent = paymentInfo.bic;
|
||||
finInstBranch.appendChild(bicElement);
|
||||
}
|
||||
|
||||
if (!finInst.getElementsByTagName('cbc:ID')[0]) {
|
||||
const bic = doc.createElement('cbc:ID');
|
||||
bic.textContent = paymentInfo.bic;
|
||||
finInst.appendChild(bic);
|
||||
}
|
||||
}
|
||||
|
||||
// Add account name
|
||||
if (paymentInfo.accountName && !payeeAccount.getElementsByTagName('cbc:Name')[0]) {
|
||||
const accountName = doc.createElement('cbc:Name');
|
||||
accountName.textContent = paymentInfo.accountName;
|
||||
// Insert after ID
|
||||
const id = payeeAccount.getElementsByTagName('cbc:ID')[0];
|
||||
if (id && id.nextSibling) {
|
||||
payeeAccount.insertBefore(accountName, id.nextSibling);
|
||||
} else {
|
||||
payeeAccount.appendChild(accountName);
|
||||
// Add bank name
|
||||
if (paymentInfo.bankName && !finInstBranch.getElementsByTagName('cbc:Name')[0]) {
|
||||
const bankNameElement = doc.createElement('cbc:Name');
|
||||
bankNameElement.textContent = paymentInfo.bankName;
|
||||
finInstBranch.appendChild(bankNameElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user