edifact_orders_iso_16033
Version:
parser for EDIFACT ORDERS ISO 16033 Ophthalmic optics and instruments
234 lines (198 loc) • 7.37 kB
JavaScript
const Message = require('./message');
const Edi = require('./edi');
const {segments, elements} = require("./iso16033");
const _ = require("lodash");
/** Order16033
* a parser for ORDERS according to ISO16033
*/
class Order16033 extends Message {
constructor(){
super('UNOC',segments,elements);
this._currentNAD = undefined;
// properties of the order
this.data = {
lines: [],
party: {}
};
}
/**
* reset must be call before interpreting a new message.
*/
reset() {
this.data = {
messages: []
};
}
segmentUNB(s) {
this.expectVal(0,0,'UNOC');
this.expectVal(0,1,'1');
this.data.senderIdentification = s.val(1,0);
this.data.recipientIdentification = s.val(2,0);
this.data.dateOfPreparation = Edi.datetime(s.val(3));
this.data.interchangeReference = s.val(4,0);
this.data.applicationReference = s.val(6,0);
this.data.testIndicator = s.val(9,0) || '0';
}
segmentUNH(s) {
this._currentMessage = {lines:[],party:{}};
this.data.messages.push(this._currentMessage);
this._currentMessage.messageReferenceNumber = s.val(0,0);
this._segmentNumberInMessage = 1;
this._section = 'Header'; // or Detail or Summary cf(https://service.unece.org/trade/untdid/d00a/trmd/orders_c.htm)
this.expect(s.val(1,0),'ORDERS','message type identifier');
this.expect(s.val(1,1),'D','message type version number');
this.expect(s.val(1,2),'96B','message type release number');
this.expect(s.val(1,3),'UN','controlling Agency');
this.expect(s.val(1,4),'INFO32','association assigned code');
};
segmentDTM(s) {
this.expect(s.val(0,0),'4','date time qualifier');
this._currentMessage.dateOfOrder = Edi.datetime(s.val(0,1));
this.expect(s.val(0,2),'203','date time format qualifier');
};
segmentBGM(s) {
if (s.val(0,0) !== '105') {
this.notImplemented('only purchase order (BGM+105) are implemented');
}
this._currentMessage.documentNumber = s.val(1,0);
if (this._currentMessage.documentNumber === undefined) {
this.unexpected('document number must be specified');
}
}
segmentUNS(s){
this.expect(s.val(0,0),'S');
this._section = 'Summary'
this._currentLine = undefined;
}
segmentNAD(s) {
let nad = {};
this.setProp(nad,'partyId',1,0);
this.setProp(nad,'codeListQualifier',1,1);
this.setProp(nad,'codeListResponsibleAgency',1,2);
this.setProp(nad,'nameAndAddress',2);
this.setProp(nad,'partyName',3);
this.setProp(nad,'street',4);
this.setProp(nad,'cityName',5,0);
this.setProp(nad,'countrySubEntityDetails',6);
this.setProp(nad,'postalIdentificationCode',7,0);
this.setProp(nad,'countryNameCode',8,0);
const partyQualifier = s.val(0,0);
const context = this._currentLine || this._currentMessage;
context.party = context.party || {};
context.party[partyQualifier] = nad;
this._currentNAD = nad;
this._currentCTA = undefined;
};
// segment group 5 http://www.unece.org/fileadmin/DAM/trade/untdid/d01a/trmd/orders_c.htm#0220_X
segmentCTA(s) {
if (this._currentNAD === undefined){
this.unexpected('got a CTA segment before any NAD.');
}
this._currentNAD.CTA = this._currentNAD.CTA || {};
this._currentCTA = {};
this.setProp(this._currentCTA,'departmentOrEmployee',1,1);
this.setProp(this._currentCTA,'departmentOrEmployeeIdentification',1,0);
this._currentNAD.CTA[s.val(0,0)] = this._currentCTA;
}
segmentCOM(s){
if (this._currentCTA === undefined){
this.unexpected('got a COM segment before any CTA.');
}
_.set(this._currentCTA,['COM',s.val(0,1)],s.val(0,0));
}
segmentRFF(s) {
const context = this._currentLine || this._currentMessage;
if (context === undefined) {
this.unexpected('got a RFF segment out of a order message (BGM) or a line (LIN) context')
}
switch (s.val(0,0)) {
case 'FI':
this.expect(s.val(0,1),['3','4'],'Type of line must be either 3=contacto or 4=other (including solutions)');
context.typeOfLine=s.val(0,1);
break;
case 'AEG':
context.opticianReferenceNumber = s.val(0,1);
break;
default:
this.notImplemented(`reference qualifier ${s.val(0,0)} of RFF`);
}
};
segmentIMD(s) {
this.expect(s.val(0,0),'F','item DescriptionCode must be "F"=Free form');
this.expect(s.val(1,0),'8','item characteristic coded must be "8"= product');
this._currentLine.itemDescription1 = s.val(2,3);
this._currentLine.itemDescription2 = s.val(2,4);
};
segmentLIN(s) {
if (this._section === 'Header') {
this._section = 'Detail';
this._announcedNumberOfLine = parseInt(s.val(0,0));
this.expect(s.val(2,0),this._currentMessage.documentNumber,'plan number must equal document number');
this.expect(s.val(3,0),'0','introduction line');
}
else {
this._currentLine = {lineItemNumber:parseInt(s.val(0,0))};
this._currentMessage.lines.push(this._currentLine);
if (this._currentMessage.lines.length > this._announcedNumberOfLine) {
this.unexpected(`announced number of lines was ${this._announcedNumberOfLine} and found line number LIN+${lineNr}`);
}
this.setProp(this._currentLine,'actionCoded',1,0);
this.setProp(this._currentLine,'itemNumber',2,0);
this.setProp(this._currentLine,'itemNumberType',2,1);
this.setProp(this._currentLine,'codeListQualifier',2,2);
this.setProp(this._currentLine,'codeListResponsibleAgency',2,3);
this.setProp(this._currentLine,'subLineIndicator',3,0);
this.setProp(this._currentLine,'subLineItemNumber',3,1);
this.setProp(this._currentLine,'configurationLevel',4,0);
this.setProp(this._currentLine,'configuration',5,0);
}
}
segmentPIA(s) {
if (s.val(0,0) === '5') {
this._currentLine.ItemNumber = s.val(1,0);
this._currentLine.ItemNumberType = this.expect(s.val(1,1),['SA','EN'],`ItemNumberType`);
}
else if (s.val(0,0) === '1') {
// nothing to do
}
else {
this.notImplemented(`product qualifer != 5 or 1`);
}
}
segmentQTY(s) {
this.expect(s.val(0,0),'21','qualifier');
this._currentLine.quantity = s.val(0,1)
this.expect(s.val(0,2),'CU','measure unit qualifier');
}
segmentCCI(s) {
this.expect(s.val(2,0),'ABO',`caracteristic`);
this._currentCCI = s.val(2,3);
}
segmentMEA(s) {
if (s.val(0,0) !== 'AAE') {
this.notImplemented(`qualifier MEA+${s[0][0]}`);
}
this._currentLine[this._currentCCI] = s.val(2,1);
}
segmentMOA(s) {
//TODO
}
segmentPRI(s) {
//TODO
}
segmentCNT(s) {
//TODO
}
segmentUNT(s){
this.expect(parseInt(s.val(0,0)),this._segmentNumberInMessage,'number of segment in message');
this.expect(s.val(1,0),this._currentMessage.messageReferenceNumber,'message reference number');
this._currentLine = undefined;
this._currentNAD = undefined;
this._currentCCI = undefined;
}
segmentUNZ(s){
this.expect(s.val(0,0),this.data.messages.length.toString(),'interchange message count must match the number of message');
this.expect(s.val(1,0),this.data.interchangeReference,'interchange reference must match with UNB segment');
}
}
module.exports = Order16033;