Skip to content

Commit 4025363

Browse files
committed
Interpreter: try to patch missing segments
1 parent 588f0e8 commit 4025363

File tree

1 file changed

+73
-5
lines changed

1 file changed

+73
-5
lines changed

src/EDI/Interpreter.php

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,23 @@ class Interpreter
2020

2121
public $messageTextConf = [
2222
'MISSINGREQUIREDSEGMENT' => "Missing required segment",
23+
'MISSINGREQUIREDGROUP' => "Missing required group",
2324
'NOTCONFORMANT' => "It looks like that this message isn't conformant to the mapping provided. (Not all segments were added)",
2425
'TOOMANYELEMENTS_COMPOSITE' => "This composite data element has more elements than expected",
2526
'TOOMANYELEMENTS' => "This segment has more data elements than expected",
2627
'MISSINGINTERCHANGEDELIMITER' => "The file has at least one UNB or UNZ missing",
2728
'MISSINGMESSAGEDELIMITER' => "The message has at least one UNH or UNT missing"
2829
];
2930

31+
public $segmentTemplates = [
32+
'DTM' => ['DTM', '999', 'XXX']
33+
];
34+
35+
public $groupTemplates = [
36+
'SG1' =>
37+
[['TDT', '20', 'XXX']]
38+
];
39+
3040
/**
3141
* Split multiple messages and process
3242
*
@@ -50,6 +60,36 @@ public function __construct($xmlMsg, $xmlSeg, $xmlSvc, $messageTextConf = null)
5060
};
5161
}
5262

63+
/**
64+
* Patch the error messages array
65+
*
66+
* @param $messageTextConf An array with same keys as the internal $messageTextConf
67+
* @return void
68+
*/
69+
public function setMessageTextConf($messageTextConf) {
70+
$this->messageTextConf = array_replace($this->messageTextConf, $messageTextConf);
71+
}
72+
73+
/**
74+
* Add fake segments used to patch the message if a required segment is missing
75+
*
76+
* @param $segmentTemplates An array with segments (having the segment name as key)
77+
* @return void
78+
*/
79+
public function setSegmentTemplates($segmentTemplates) {
80+
$this->segmentTemplates = $segmentTemplates;
81+
}
82+
83+
/**
84+
* Add fake groups used to patch the message if a required group is missing
85+
*
86+
* @param $groupTemplates An array with segments (having the group name as key)
87+
* @return void
88+
*/
89+
public function setGroupTemplates($groupTemplates) {
90+
$this->groupTemplates = $groupTemplates;
91+
}
92+
5393
/**
5494
* Split multiple messages and process
5595
*
@@ -195,22 +235,40 @@ private function loopMessage($message, $xml, &$errors)
195235
* Process an XML Group
196236
*
197237
*/
198-
private function processXmlGroup($elm, $message, &$segmentIdx, &$array, &$errors)
238+
private function processXmlGroup($elm, &$message, &$segmentIdx, &$array, &$errors)
199239
{
240+
$groupVisited = false;
200241
$newGroup = [];
201242
for ($g = 0; $g < $elm['maxrepeat']; $g++) {
202243
$grouptemp = [];
203244
if ($message[$segmentIdx][0] != $elm->children()[0]['id']) {
204-
break;
245+
if (!$groupVisited && isset($elm['required'])) {
246+
$elmType = $elm['id']->__toString();
247+
$fixed = false;
248+
if (isset($this->groupTemplates[$elmType])) {
249+
array_splice($message, $segmentIdx, 0, $this->groupTemplates[$elmType]);
250+
$fixed = true;
251+
}
252+
$errors[] = [
253+
"text" => $this->messageTextConf['MISSINGREQUIREDGROUP']." ".($fixed ? '(patched)' : ''),
254+
"position" => $segmentIdx,
255+
"segmentId" => $elmType
256+
];
257+
} else {
258+
break;
259+
}
205260
}
206261
foreach ($elm->children() as $elm2) {
207262
if ($elm2->getName() == "group") {
208263
$this->processXmlGroup($elm2, $message, $segmentIdx, $grouptemp, $errors);
209264
} else {
210265
$this->processXmlSegment($elm2, $message, $segmentIdx, $grouptemp, $errors);
211266
}
267+
$groupVisited = true;
212268
}
269+
213270
$newGroup[] = $grouptemp;
271+
214272
}
215273
if (count($newGroup) == 0) {
216274
return;
@@ -233,13 +291,24 @@ private function processXmlSegment($elm, $message, &$segmentIdx, &$array, &$erro
233291
$segmentIdx++;
234292
} else {
235293
if (!$segmentVisited && isset($elm['required'])) {
294+
$fixed = false;
295+
$elmType = $elm['id']->__toString();
296+
if ($elm['replacewith'] !== null) {
297+
$elmType = $elm['replacewith']->__toString();
298+
}
299+
if (isset($this->segmentTemplates[$elmType])) {
300+
$jsonMessage = $this->processSegment($this->segmentTemplates[$elmType], $this->xmlSeg, $segmentIdx, $errors);
301+
$segmentVisited = true;
302+
$fixed = true;
303+
$this->doAddArray($array, $jsonMessage);
304+
}
236305
$errors[] = [
237-
"text" => $this->messageTextConf['MISSINGREQUIREDSEGMENT'],
306+
"text" => $this->messageTextConf['MISSINGREQUIREDSEGMENT']." ".($fixed ? '(patched)' : ''),
238307
"position" => $segmentIdx,
239308
"segmentId" => $elm['id']->__toString(),
240309
];
241310
}
242-
break;
311+
return;
243312
}
244313
}
245314
}
@@ -321,7 +390,6 @@ private function processSegment($segment, &$xmlMap, $segmentIdx, &$errors = null
321390
} else { // More and more
322391
$jsoncomposite[$d_sub_desc_attr['name']][] = $d_detail;
323392
}
324-
325393
}
326394
}
327395
} else {

0 commit comments

Comments
 (0)