public function readEdiData($edi_id) { echo '$edi_id=' . $edi_id . PHP_EOL; $error = array(); $edifact = Edifact::model()->FindByPk($edi_id); $parser = new EDI\Parser(); $f = explode(PHP_EOL, $edifact->message); $parser->parse($f); $EdiReader = new ContainerReader($f); $dateTimePreparation = $EdiReader->readDateTimePreparation(); $terminal = $EdiReader->readEdiDataValue('UNB', 2); $MessageType = $EdiReader->readUNHmessageType(); $MessageCode = $EdiReader->readEdiDataValue('BGM', 1); if ($terminal == 'RIXBCT' || $terminal == 'LVRIXKRA') { if ($MessageType == 'COARRI') { //TDT 8067 Mode of transport, coded: codes // '1' maritime transport // '8' inland water transport $ModeOfTransport = $EdiReader->readEdiDataValue(['TDT', [1 => 20]], 3, 1); $container_count = $EdiReader->readEdiDataValue('CNT', 1, 1); if ($container_count == 1) { $containers = [$EdiReader->getParsedFile()]; } else { $containers = $EdiReader->readGroups('NAD', 'EQD', 'NAD', 'CNT'); } if ($container_count != count($containers)) { $error[] = 'Mismatch contaier count. CNT=' . $container_count . ' groups=' . count($containers); EcntContainer::saveEdiData(array(), $EdiReader, $error, $edifact); return false; } foreach ($containers as $container) { $error = []; $ecnt_data = []; $EdiReader->resetErrors(); //PARTY QUALIFIER //CA Carrier //(3126) Party undertaking or arranging transport of goods between named points. $ecnt_data['ecnt_fwd'] = $EdiReader->readEdiDataValue(['NAD', ['1' => 'CA']], 2, 0); //8051 TRANSPORT STAGE QUALIFIER: // '20' (main carriage) // Read: 8028 CONVEYANCE REFERENCE NUMBER: the vessel operator's loading voyage number $ecnt_data['ecnt_transport_id'] = $EdiReader->readEdiDataValue(['TDT', ['1' => 20]], 2); //var_dump($container); $ConEdiReader = new ContainerReader(); $ConEdiReader->setParsedFile($container); $container_number = $ConEdiReader->readEdiDataValue('EQD', 2); $ecnt_data['ecnt_edifact_id'] = $edifact->id; $ecnt_data['ecnt_container_nr'] = $container_number; $ecnt_data['ecnt_terminal'] = $terminal; $ecnt_data['ecnt_message_type'] = $MessageType; $ecnt_data['ecnt_iso_type'] = $ConEdiReader->readEdiDataValue('EQD', 3, 0); //2005 Date/time/period qualifier: code //‘203' Execution date $ecnt_data['ecnt_datetime'] = $ConEdiReader->readEdiSegmentDTM(203); //$LoadingLocationIdentification = $EdiReader->readEdiDataValue(['LOC',[1=>9]],2,0); //$DischargingLocationIdentification = $ConEdiReader->readEdiDataValue(['LOC',[1=>11]],2,0); if ($MessageCode == 270) { $ecnt_data['ecnt_operation'] = EcntContainer::ECNT_OPERATION_VESSEL_LOAD; $ecnt_data['ecnt_ib_carrier'] = 'TRUCK'; } elseif ($MessageCode == 98) { $ecnt_data['ecnt_operation'] = EcntContainer::ECNT_OPERATION_VESSEL_DISCHARGE; $ecnt_data['ecnt_ob_carrier'] = 'TRUCK'; } else { $error[] = 'Neatrada operation - vessel load/unload!' . '/Loading:' . $LoadingLocationIdentification . '/Discharging:' . $DischargingLocationIdentification . '/MessageCode:' . $MessageCode; } $ecnt_data['ecnt_weight'] = $ConEdiReader->readEdiDataValue(['MEA', ['2' => 'G']], 3, 1); $ecnt_data['ecnt_booking'] = $ConEdiReader->readEdiDataValue(['RFF', ['1.0' => 'BN']], 1, 1); $ecnt_data['ecnt_statuss'] = $ConEdiReader->readFullEmpty(); EcntContainer::saveEdiData($ecnt_data, $EdiReader, $error, $edifact); } return; } elseif ($MessageType == 'CODECO') { //get count of containers $container_count = $EdiReader->readEdiDataValue('CNT', 1, 1); //get container group detais if ($container_count == 1) { $containers = [$EdiReader->getParsedFile()]; } else { $containers = $EdiReader->readGroups('NAD', 'EQD', 'TDT', 'CNT'); } if ($container_count != count($containers)) { $error[] = 'Mismatch contaier count. CNT=' . $container_count . ' groups=' . count($containers); EcntContainer::saveEdiData(array(), $EdiReader, $error, $edifact); return false; } //LOC Place of loading // 9 - [3334] Seaport, airport, freight terminal, // rail station or other place at which the goods (cargo) // are loaded on to the means of transport being used for their carriage. // TRUCK IN //11 - Place of discharge // [3392] Seaport, airport, freight terminal, rail station or other // place at which goods are unloaded from the means of transport // having been used for their carriage. // TRUCK OUT $LocationFunctionPlaceLoading = $EdiReader->readEdiDataValue(['LOC', [1 => 9]], 2); $LocationFunctionPlaceDischarge = $EdiReader->readEdiDataValue(['LOC', [1 => 11]], 2); $LocationFunctionKS = $EdiReader->readEdiDataValue(['LOC', [1 => 165]], 2); if (!empty($LocationFunctionPlaceLoading)) { $ecnt_operation = EcntContainer::ECNT_OPERATION_TRUCK_IN; } elseif (!empty($LocationFunctionPlaceDischarge)) { $ecnt_operation = EcntContainer::ECNT_OPERATION_TRUCK_OUT; } elseif (!empty($LocationFunctionKS)) { $ecnt_operation = EcntContainer::ECNT_OPERATION_TRUCK_OUT; } else { $error[] = 'Neatrada operation - truck in/out'; } //PARTY QUALIFIER //CF Container operator/lessee // Party to whom the possession of specified property (e.g. container) has been conveyed for a period of time in return for rental payments. $ecnt_fwd = $EdiReader->readEdiDataValue(['NAD', ['1' => 'CF']], 2); //process all containers foreach ($containers as $container) { $error = []; $EdiReader->resetErrors(); $ConEdiReader = new ContainerReader(); $ConEdiReader->setParsedFile($container); $ecnt_data = []; $ecnt_data['ecnt_terminal'] = $terminal; $ecnt_data['ecnt_container_nr'] = $ConEdiReader->readEdiDataValue('EQD', 2); $ecnt_data['ecnt_iso_type'] = $ConEdiReader->readEdiDataValue('EQD', 3, 0); $ecnt_data['ecnt_message_type'] = $MessageType; $ecnt_data['ecnt_operation'] = $ecnt_operation; $ecnt_data['ecnt_fwd'] = $ecnt_fwd; //2005 Date/time/period qualifier: code // 7 - efective datetime $ecnt_data['ecnt_datetime'] = $ConEdiReader->readEdiSegmentDTM(7); $ecnt_data['ecnt_transport_id'] = $ConEdiReader->readTDTtransportIdentification(1); if (!empty($ecnt_data['ecnt_transport_id'])) { $ecnt_data['ecnt_ib_carrier'] = 'TRUCK'; } $ecnt_data['ecnt_statuss'] = $ConEdiReader->readFullEmpty(); EcntContainer::saveEdiData($ecnt_data, $EdiReader, $error, $edifact); } return; } else { $error[] = 'Unknown message type:' . $MessageType; EcntContainer::saveEdiData(array(), $EdiReader, $error, $edifact); return; } } elseif ($terminal == 'RIXCT') { if ($MessageType == 'COARRI') { $ecnt_data = []; $ecnt_data['ecnt_terminal'] = $terminal; $ecnt_data['ecnt_message_type'] = $MessageType; $ecnt_data['ecnt_fwd'] = $EdiReader->readEdiDataValue(['NAD', ['1' => 'CA']], 2, 0); $ecnt_data['ecnt_transport_id'] = $EdiReader->readEdiDataValue(['TDT', ['1' => 20]], 2); $ecnt_data['ecnt_edifact_id'] = $edifact->id; $ecnt_data['ecnt_container_nr'] = $EdiReader->readEdiDataValue('EQD', 2); $ecnt_data['ecnt_iso_type'] = $EdiReader->readEdiDataValue('EQD', 3, 0); $ecnt_data['ecnt_datetime'] = $EdiReader->readEdiSegmentDTM(203); //2005 Date/time/period qualifier: code //‘203' Execution date $ecnt_data['ecnt_datetime'] = $EdiReader->readEdiSegmentDTM(203); if ($MessageCode == 270) { $ecnt_data['ecnt_operation'] = EcntContainer::ECNT_OPERATION_VESSEL_LOAD; $ecnt_data['ecnt_ib_carrier'] = 'TRUCK'; } elseif ($MessageCode == 98) { $ecnt_data['ecnt_operation'] = EcntContainer::ECNT_OPERATION_VESSEL_DISCHARGE; $ecnt_data['ecnt_ob_carrier'] = 'TRUCK'; } else { $error[] = 'Neatrada operation - vessel load/unload!' . '/Loading:' . $LoadingLocationIdentification . '/Discharging:' . $DischargingLocationIdentification . '/MessageCode:' . $MessageCode; } $ecnt_data['ecnt_weight'] = $EdiReader->readEdiDataValue(['MEA', ['2' => 'G']], 3, 1); $ecnt_data['ecnt_statuss'] = $EdiReader->readFullEmpty(); EcntContainer::saveEdiData($ecnt_data, $EdiReader, $error, $edifact); return true; } elseif ($MessageType == 'CODECO') { $ecnt_data = []; $ecnt_data['ecnt_terminal'] = $terminal; $ecnt_data['ecnt_message_type'] = $MessageType; $ecnt_data['ecnt_container_nr'] = $EdiReader->readEdiDataValue('EQD', 2); $ecnt_data['ecnt_iso_type'] = $EdiReader->readEdiDataValue('EQD', 3, 0); $ecnt_data['ecnt_fwd'] = $EdiReader->readEdiDataValue(['NAD', ['1' => 'CF']], 2); // 1001 Document name code $DocumentNameCode = $EdiReader->readEdiDataValue('BGM', 1); if ($DocumentNameCode == 34) { $ecnt_data['ecnt_operation'] = EcntContainer::ECNT_OPERATION_TRUCK_IN; } elseif ($DocumentNameCode == 36) { $ecnt_data['ecnt_operation'] = EcntContainer::ECNT_OPERATION_TRUCK_OUT; } else { $error[] = 'Neatrada operation - truck in/out'; } $ecnt_data['ecnt_statuss'] = $EdiReader->readFullEmpty(); //Effective from date/time $ecnt_data['ecnt_datetime'] = $EdiReader->readEdiSegmentDTM('181'); $ecnt_data['ecnt_transport_id'] = $EdiReader->readEdiDataValue(['TDT', ['1' => '1']], 8, 0); if (!empty($ecnt_data['ecnt_transport_id'])) { $ecnt_data['ecnt_ib_carrier'] = 'TRUCK'; } $ecnt_data['ecnt_weight'] = $EdiReader->readEdiDataValue(['MEA', ['2' => 'AAE']], 3, 1); $ecnt_data['ecnt_booking'] = $EdiReader->readEdiDataValue(['RFF', ['1.0' => 'BN']], 1, 1); EcntContainer::saveEdiData($ecnt_data, $EdiReader, $error, $edifact); return true; } else { $error[] = 'Unknown message type:' . $MessageType; EcntContainer::saveEdiData(array(), $EdiReader, $error, $edifact); return true; } } $error[] = 'Unrecognised message'; EcntContainer::saveEdiData(array(), $EdiReader, $error, $edifact); return false; }
<?php if (!empty($model->ecnt_edifact_id)) { ?> <div class="space-12"></div> <div class="row"> <h3 class="header blue lighter smaller"> EDI File Readable </h3> <div class="span12"> <pre> <?php $edifact = Edifact::model()->FindByPk($model->ecntEdifact->id); $EdiParser = new EDI\Parser(); $f = explode(PHP_EOL, $edifact->message); $parsed = $EdiParser->parse($f); $analyser = new EDI\Analyser(); $analyser->edi_message = $edifact->message; $mapping_segments = realpath(Yii::getPathOfAlias('edifact-data')) . '/D95B/segments.xml'; $analyser->loadSegmentsXml($mapping_segments); echo $analyser->process($parsed); ?> </pre> </div> </div> <?php } ?> <div class="space-12"></div>