UNPKG

edifact_orders_iso_16033

Version:

parser for EDIFACT ORDERS ISO 16033 Ophthalmic optics and instruments

122 lines (106 loc) 3.13 kB
/* * This Module exports Edi which contains a fiew helper functions in order to interpret EDI components ans Elements * * The Edi write functionnalities are minimalistic and only work for `UNA:+.? '` */ const reSpecialChars = /(['?:+])/g; const reTrim = /(\n\s*)|(\s+$)/gm; /** Edi * this class serves as an Edi writer * * before writing a new message, you must call the `.reset` method */ class Edi{ constructor(){ this.reset(); } /** reset * this method clear the current edifact string and reset the internal state of Edi * * it has to be called before any new message. */ reset() { this.edifact = "UNA:+.? '"; this.firstComponent = undefined; } /** writeSegement * write a segment of name `segment` with a number of elements. * if an element is a complex element (= with more than one component), * all components should be passed as an array. * * If an element must be empty, pass undefined if this is not the last defined element. * @param segment {string} the name of the segment (3 UpperCase chars) * @param elements {... string | array} * * @example * const Edi = require('edifact_orders_iso_16033/edi'); * //.. * let edi = new Edi(); * edi.writeSegment('UNB',['UNOC',1],'WS','ESTORE','NOV',['20181001','1255'],'253006',undefined,'ESTORE'); */ writeSegment(segment, ...elements){ this.edifact += segment; this.writeElements(elements); this.edifact += "'"; } /** for internal use only */ writeElements(elements){ for (const element of elements){ this.edifact += '+'; this.firstComponent = true; if (Array.isArray(element)) { for (const component of element){ this.writeComponent(component); } } else { this.writeComponent(element); } } } /** for internal use only */ writeComponent(component){ if (!this.firstComponent) { this.edifact += ':'; } this.firstComponent = false; if (component !== undefined){ this.edifact += Edi.escape(component.toString()); } } /** for internal use only */ static escape(str){ return str.replace(reSpecialChars,'?$1'); } /** remove the leading,trailing and LF in order to be complient with EDIFACT * EDIFACT strings are multiline in the test only for readability */ static compact(lines){ return lines.replace(reTrim,''); } } /**return a Date from an edi date str compatible with SQL */ Edi.date = function(datestr){ let d = datestr.substr(0,4)+'-'+datestr.substr(4,2)+'-'+datestr.substr(6,2); return d; } /** * convert dt to an datetime string YYYY-MM-DD HH:MM:SS * @param {*} dt can either be an element ['YYYYMMD','HHMM'] or a YYYYMMDDHHMM string */ Edi.datetime= function(dt){ let d; if (Array.isArray(dt)){ d = dt[0].substr(0,4)+'-'+dt[0].substr(4,2)+'-'+dt[0].substr(6,2)+' '+ dt[1].substr(0,2)+':'+dt[1].substr(2,2)+':00'; } else { d = dt.substr(0,4)+'-'+dt.substr(4,2)+'-'+dt.substr(6,2)+' '+ dt.substr(8,2)+':'+dt.substr(10,2)+':00'; } return d; } module.exports = Edi;