/** * @param array $data * @return Message[] * @throws \EDI\Exception\MandatorySegmentPieceMissing */ public function populate(&$data) { $messages = []; $remainingData = null; $segment = $this->getNextSegment($data); while ($segment && $segment->getCode() == 'UNH') { $message = new Message(); $this->fillProperties($message, $segment); $identifier = $message->getIdentifier(); $mapping = $this->mappingLoader->loadMessage($identifier['version'], $identifier['release'], $identifier['type']); $this->segmentPopulator->setSegmentConfig($this->mappingLoader->loadSegments($identifier['version'], $identifier['release'])); $expectedSegments = $mapping->getSegments(); $segment = $this->getNextSegment($data); $this->nextExpectedSegment($expectedSegments); // Ignore the header, already processed when creating Message $expected = $this->nextExpectedSegment($expectedSegments); while ('UNT' != $segment->getCode()) { /** @var MessageSegmentMapping $expected */ if (!$expected) { break; } if ($expected->acceptSegment($segment)) { $segment = $this->getNextSegment($data); } else { $message->addSegments($expected->getSegments()); $expected = $this->nextExpectedSegment($expectedSegments); } } if ($expected && $expected->hasSegments()) { $message->addSegments($expected->getSegments()); } $trailer = new MessageTrailer(); $this->fillProperties($trailer, $segment); $message->setTrailer($trailer); $messages[] = $message; $remainingData = reset($data); $segment = $this->getNextSegment($data); } if ($remainingData) { array_unshift($data, $remainingData); } return $messages; }
/** @test */ public function should_ignore_missing_nonrequired_fields() { $segmentMapping = new SegmentMapping('XXX'); $segmentMapping->addDataElement(1, new DataElementMapping(7583, true, DataElementType::ID, 'ajdi', '', 3)); $segmentMapping->addDataElement(2, new DataElementMapping(3415, false, DataElementType::A, 'field', '', 35)); $populator = new SegmentPopulator(); $populator->setSegmentConfig(['XXX' => $segmentMapping]); $data = [['XXX', '345']]; $segment = $populator->populate($data); $this->assertEquals(345, $segment->ajdi); $this->assertNull($segment->field); }