@makakwastaken/ts-edifact
Version:
Edifact parser library
391 lines • 20.1 kB
JavaScript
;
/**
* @author Roman Vottner
* @copyright 2020 Roman Vottner
* @license Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.findElement = exports.formatComponents = void 0;
exports.isDefined = isDefined;
exports.persist = persist;
exports.storeAllDefaultSpecs = storeAllDefaultSpecs;
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
const fs = __importStar(require("node:fs"));
const messageStructureParser_1 = require("./edi/messageStructureParser");
function isDefined(value) {
return value !== undefined && value !== null;
}
function stringify(data, pretty) {
const ordered = !Array.isArray(data) // Only order if assoc array
? Object.keys(data)
.sort()
.reduce((obj, key) => {
obj[key] = data[key];
return obj;
}, {})
: data;
if (pretty) {
return JSON.stringify(ordered, null, 2);
}
return JSON.stringify(ordered);
}
function persist(data, path, pretty, defaultVersion = false) {
const messageStructDef = stringify(data.messageStructureDefinition, pretty);
const messageStructDefFileName = `${(defaultVersion ? '' : `${data.version + data.release}_`) + data.messageType}.struct.json`;
const segments = stringify(data.segmentTable.entries);
const segmentsFileName = `${(defaultVersion ? '' : `${data.version + data.release}_`) + data.messageType}.segments.json`;
const components = stringify(data.componentValueTable.entries);
const componentsFileName = `${(defaultVersion ? '' : `${data.version + data.release}_`) + data.messageType}.components.json`;
let p = path;
if (!p.endsWith('/')) {
p += '/';
}
fs.writeFileSync(p + messageStructDefFileName, messageStructDef);
fs.writeFileSync(p + segmentsFileName, segments);
fs.writeFileSync(p + componentsFileName, components);
}
const formatComponents = (elements, segmentId, decimalSeparator) => {
const result = {};
result.tag = segmentId;
for (const element of elements) {
if (element.name === '__proto__' ||
element.name === 'constructor' ||
element.name === 'prototype') {
continue;
}
for (const component of element.components) {
if (component.name === '__proto__' ||
component.name === 'constructor' ||
component.name === 'prototype') {
continue;
}
if (element.components.length <= 1) {
result[element.name] = component.value;
}
else {
if (component.value) {
if (!result[element.name]) {
result[element.name] = {};
}
if (typeof result[element.name] === 'object') {
// Codes does not have any decimal separators
if (decimalSeparator && typeof component.value === 'string') {
// If decimal seperator is defined replace instances
result[element.name][component.name] = component.value.replace(decimalSeparator, '.');
}
else {
result[element.name][component.name] = component.value;
}
}
}
}
}
}
return Object(result);
};
exports.formatComponents = formatComponents;
function storeAllDefaultSpecs(version, location) {
const types = [
'APERAK', // Application error and acknowledgement message
'INVOIC', // Invoice message
'AUTHOR', // Authorization message
'BALANC', // Balance enquiry message
'DESADV', // Despatch advice message
'GENRAL', // General advice message
'IFTMIN', // Interchange control message
'INVOIC', // Invoice message
'INVRPT', // Invoice report message
'ORDERS', // Order message
'OSTENQ', // Order status enquiry message
'OSTRPT', // Order status report message
'PARTIN', // Partial invoice message
'TAXCON', // Tax control message
'VATDEC', // VAT declaration message
// 'AUTHOR', // Authorization message
// 'AVLREQ', // Availability request – interactive message
// 'AVLRSP', // Availability response – interactive message
// 'BALANC', // Balance message
// 'BANSTA', // Banking status message
// 'BAPLIE', // Bayplan/stowage plan occupied and empty locations message
// 'BAPLTE', // Bayplan/stowage plan total numbers message
// 'BERMAN', // Berth management message
// 'BMISRM', // Bulk marine inspection summary report message
// 'BOPBNK', // Bank transactions and portfolio transactions report message
// 'BOPCUS', // Balance of payment customer transaction report message
// 'BOPDIR', // Direct balance of payment declaration message
// 'BOPINF', // Balance of payment information from customer message
// 'BUSCRD', // Business credit report message
// 'CALINF', // Vessel call information message
// 'CASINT', // Request for legal administration action in civil proceedings message
// 'CASRES', // Legal administration response in civil proceedings message
// 'CHACCO', // Chart of accounts message
// 'CLASET', // Classification information set message
// 'CNTCND', // Contractual conditions message
// 'COACSU', // Commercial account summary message
// 'COARRI', // Container discharge/loading report message
// 'CODECO', // Container gate-in/gate-out report message
// 'CODENO', // Permit expiration/clearance ready notice message
// 'COEDOR', // Container stock report message
// 'COHAOR', // Container special handling order message
// 'COLREQ', // Request for a documentary collection message
// 'COMDIS', // Commercial dispute message
// 'CONAPW', // Advice on pending works message
// 'CONDPV', // Direct payment valuation message
// 'CONDRA', // Drawing administration message
// 'CONDRO', // Drawing organization message
// 'CONEST', // Establishment of contract message
// 'CONITT', // Invitation to tender message
// 'CONPVA', // Payment valuation message
// 'CONQVA', // Quantity valuation message
// 'CONRPW', // Response of pending works message
// 'CONTEN', // Tender message
// 'CONWQD', // Work item quantity determination message
// 'COPARN', // Container announcement message
// 'COPAYM', // Contributions for payment
// 'COPINO', // Container pre-notification message
// 'COPRAR', // Container discharge/loading order message
// 'COREOR', // Container release order message
// 'COSTCO', // Container stuffing/stripping confirmation message
// 'COSTOR', // Container stuffing/stripping order message
// 'CREADV', // Credit advice message
// 'CREEXT', // Extended credit advice message
// 'CREMUL', // Multiple credit advice message
// 'CUSCAR', // Customs cargo report message
// 'CUSDEC', // Customs declaration message
// 'CUSEXP', // Customs express consignment declaration message
// 'CUSPED', // Periodic customs declaration message
// 'CUSREP', // Customs conveyance report message
// 'CUSRES', // Customs response message
// 'DEBADV', // Debit advice message
// 'DEBMUL', // Multiple debit advice message
// 'DEBREC', // Debts recovery message
// 'DELFOR', // Delivery schedule message
// 'DELJIT', // Delivery just in time message
// 'DESADV', // Dispatch advice message
// 'DESTIM', // Equipment damage and repair estimate message
// 'DGRECA', // Dangerous goods recapitulation message
// 'DIRDEB', // Direct debit message
// 'DIRDEF', // Directory definition message
// 'DMRDEF', // Data maintenance request definition message
// 'DMSTAT', // Data maintenance status report/query message
// 'DOCADV', // Documentary credit advice message
// 'DOCAMA', // Advice of an amendment of a documentary credit message
// 'DOCAMI', // Documentary credit amendment information message
// 'DOCAMR', // Request for an amendment of a documentary credit message
// 'DOCAPP', // Documentary credit application message
// 'DOCARE', // Response to an amendment of a documentary credit message
// 'DOCINF', // Documentary credit issuance information message
// 'ENTREC', // Accounting entries message
// 'FINCAN', // Financial cancellation message
// 'FINPAY', // Multiple interbank funds transfer message
// 'FINSTA', // Financial statement of an account message
// 'GENRAL', // General purpose message
// 'GESMES', // Generic statistical message
// 'HANMOV', // Cargo/goods handling and movement message
// 'ICASRP', // Insurance claim assessment and reporting message
// 'ICSOLI', // Insurance claim solicitor’s instruction message
// 'IFCSUM', // Forwarding and consolidation summary message
// 'IFTCCA', // Forwarding and transport shipment charge calculation message
// 'IFTDGN', // Dangerous goods notification message
// 'IFTFCC', // International transport freight costs and other charges message
// 'IFTIAG', // Dangerous cargo list message
// 'IFTICL', // Cargo insurance claims message
// 'IFTMAN', // Arrival notice message
// 'IFTMBC', // Booking confirmation message
// 'IFTMBF', // Firm booking message
// 'IFTMBP', // Provisional booking message
// 'IFTMCA', // Consignment advice message
// 'IFTMCS', // Instruction contract status message
// 'IFTMFR', // International Forwarding And Transport
// 'IFTMIN', // Instruction message
// 'IFTRIN', // Forwarding and transport rate information message
// 'IFTSAI', // Forwarding and transport schedule and availability information me
// 'IFTSTA', // International multimodal status report message
// 'IFTSTQ', // International multimodal status request message
// 'IHCEBI', // Interactive health insurance eligibility and benefits inquiry and
// 'IHCLME', // Health care claim or encounter request and response – interactive
// 'IMPDEF', // EDI implementation guide definition message
// 'INFCON', // Infrastructure condition message
// 'INFENT', // Enterprise accounting information message
// 'INSDES', // Instruction to dispatch message
// 'INSPRE', // Insurance premium message
// 'INSREQ', // Inspection request message
// 'INSRPT', // Inspection report message
// 'INTCHG', // Interchange Control Structures
// 'INVOIC', // Invoice message
// 'INVRPT', // Inventory report message
// 'IPPOAD', // Insurance policy administration message
// 'IPPOMO', // Motor insurance policy message
// 'ISENDS', // Intermediary system enablement or disablement message
// 'ITRRPT', // In transit report detail message
// 'JAPRES', // Job application result message
// 'JINFDE', // Job information demand message
// 'JOBAPP', // Job application proposal message
// 'JOBCON', // Job order confirmation message
// 'JOBMOD', // Job order modification message
// 'JOBOFF', // Job order message
// 'JUPREQ', // Justified payment request message
// 'LEDGER', // Ledger message
// 'LREACT', // Life reinsurance activity message
// 'LRECLM', // Life reinsurance claims message
// 'MEDPID', // Person identification message
// 'MEDPRE', // Medical prescription message
// 'MEDREQ', // Medical service request message
// 'MEDRPT', // Medical service report message
// 'MEDRUC', // Medical resource usage and cost message
// 'MEQPOS', // Means of transport and equipment position message
// 'MOVINS', // Stowage instruction message
// 'MSCONS', // Metered services consumption report message
// 'ORDCHG', // Purchase order change request message
// 'ORDERS', // Purchase order message
// 'ORDRSP', // Purchase order response message
// 'OSTENQ', // Order status enquiry message
// 'OSTRPT', // Order status report message
// 'PARTIN', // Party information message
// 'PASREQ', // Travel tourism and leisure product application status request – i
// 'PASRSP', // Travel tourism and leisure product application status response –
// 'PAXLST', // Passenger list message
// 'PAYDUC', // Payroll deductions advice message
// 'PAYEXT', // Extended payment order message
// 'PAYMUL', // Multiple payment order message
// 'PAYORD', // Payment order message
// 'PRICAT', // Price/sales catalogue message
// 'PRIHIS', // Pricing history message
// 'PROCST', // Project cost reporting message
// 'PRODAT', // Product data message
// 'PRODEX', // Product exchange reconciliation message
// 'PROINQ', // Product inquiry message
// 'PROSRV', // Product service message
// 'PROTAP', // Project tasks planning message
// 'PRPAID', // Insurance premium payment message
// 'QALITY', // Quality data message
// 'QUOTES', // Quote message
// 'RDRMES', // Raw data reporting message
// 'REBORD', // Reinsurance bordereau message
// 'RECADV', // Receiving advice message
// 'RECALC', // Reinsurance calculation message
// 'RECECO', // Credit risk cover message
// 'RECLAM', // Reinsurance claims message
// 'RECORD', // Reinsurance core data message
// 'REGENT', // Registration of enterprise message
// 'RELIST', // Reinsured objects list message
// 'REMADV', // Remittance advice message
// 'REPREM', // Reinsurance premium message
// 'REQDOC', // Request for document message
// 'REQOTE', // Request for quote message
// 'RESETT', // Reinsurance settlement message
// 'RESMSG', // Reservation message
// 'RESRSP', // Reservation response – interactive message
// 'RETACC', // Reinsurance technical account message
// 'RETANN', // Announcement for returns message
// 'RETINS', // Instruction for returns message
// 'RPCALL', // Repair call message
// 'SAFHAZ', // Safety and hazard data message
// 'SANCRT', // International movement of goods governmental regulatory message
// 'SKDUPD', // Schedule update – interactive message
// 'SLSFCT', // Sales forecast message
// 'SLSRPT', // Sales data report message
// 'SOCADE', // Social administration message
// 'SSIMOD', // Modification of identity details message
// 'SSRECH', // Worker’s insurance history message
// 'SSREGW', // Notification of registration of a worker message
// 'STATAC', // Statement of account message
// 'STLRPT', // Settlement transaction reporting message
// 'SUPCOT', // Superannuation contributions advice message
// 'SUPMAN', // Superannuation maintenance message
// 'SUPRES', // Supplier response message
// 'TANSTA', // Tank status report message
// 'TAXCON', // Tax control message
// 'TIQREQ', // Travel tourism and leisure information inquiry request – interactive
// 'TIQRSP', // Travel tourism and leisure information inquiry response – interactive
// 'TPFREP', // Terminal performance message
// 'TSDUPD', // Timetable static data update – interactive message
// 'TUPREQ', // Travel, tourism and leisure data update request – interactive message
// 'UTILMD', // Utilities master data message
// 'UTILTS', // Utilities time series message
// 'VATDEC', // Value added tax message
// 'VESDEP', // Vessel departure message
// 'WASDIS', // Waste disposal information message
// 'WKGRDC', // Work grant decision message
// 'WKGRRE' // Work grant request message"
];
// Update INVOIC D07A
const structParser = new messageStructureParser_1.UNECEMessageStructureParser('d07a', 'INVOIC');
structParser
.loadTypeSpec()
.then((result) => {
persist(result, location, false, true);
})
.then(() => { })
.catch((error) => {
console.warn(`Could not load Message structure and segment/element definitions for message type INVOIC of version d07a. Reason: ${error.message}`);
});
// Update all other types
for (const typeName of types) {
const structParser = new messageStructureParser_1.UNECEMessageStructureParser(version, typeName);
structParser
.loadTypeSpec()
.then((result) => {
persist(result, location, false, true);
})
.then(() => { })
.catch((error) => {
console.warn(`Could not load Message structure and segment/element definitions for message type ${typeName} of version ${version}. Reason: ${error.message}`);
});
}
}
const findElement = (elements, // undefined for easier writing of tests
id) => {
const element = elements?.find((elementEntry) => elementEntry.id === id);
return element;
};
exports.findElement = findElement;
// Run with: npx ts-node src/util.ts
// storeAllDefaultSpecs('d01b', './src/messageSpec')
//# sourceMappingURL=util.js.map