@@ -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