Files
vda-to-edifact-converter/js/edifact-to-vda.js
2026-03-13 09:53:40 +01:00

79 lines
2.3 KiB
JavaScript

/**
* DELFOR to VDA 4905 Mapping Logic
*/
window.EDIBridge = window.EDIBridge || {};
class DELFORToVDA4905 {
static convert(ediContent) {
const EDIFACTLogic = window.EDIBridge.EDIFACTLogic;
const segments = EDIFACTLogic.parseSegments(ediContent);
const records = [];
// Header Record 511
records.push(this.format511({
senderId: this.getNAD(segments, 'SE'),
receiverId: this.getNAD(segments, 'BY'),
date: this.getDTM(segments, '137')
}));
let currentMaterial = null;
for (const seg of segments) {
if (seg.tag === 'LIN') {
currentMaterial = seg.elements[2][0];
}
if (seg.tag === 'QTY' && currentMaterial) {
records.push(this.format512({ material: currentMaterial }));
records.push(this.format513({
quantity: seg.elements[0][1],
date: '240520'
}));
}
}
records.push(this.format519(records.length + 1));
return records.join('\n');
}
static getNAD(segments, qualifier) {
const seg = segments.find(s => s.tag === 'NAD' && s.elements[0][0] === qualifier);
return seg ? seg.elements[1][0] : 'UNKNOWN';
}
static getDTM(segments, qualifier) {
const seg = segments.find(s => s.tag === 'DTM' && s.elements[0][0] === qualifier);
return seg ? seg.elements[0][1] : '240101';
}
static format511(data) {
let s = '511';
s += '01';
s += String(data.senderId).padEnd(9, ' ');
s += String(data.receiverId).padEnd(9, ' ');
s += '00001';
s += String(data.date).substring(2, 8);
return s.padEnd(128, ' ');
}
static format512(data) {
let s = '512';
s += '01';
s += String(data.material).padEnd(22, ' ');
return s.padEnd(128, ' ');
}
static format513(data) {
let s = '513';
s += '01';
s += String(data.date).padEnd(6, ' ');
s += String(Math.round(parseFloat(data.quantity))).padStart(12, '0');
return s.padEnd(128, ' ');
}
static format519(count) {
return ('519' + '01' + String(count).padStart(7, '0')).padEnd(128, ' ');
}
}
window.EDIBridge.DELFORToVDA4905 = DELFORToVDA4905;