/** @test */ public function should_load_messages_from_file() { $loader = new MappingLoader(__DIR__ . '/../fixtures'); $result = $loader->loadMessage('D', '96A', 'MESSAGE'); $this->assertInstanceOf(MessageMapping::class, $result); $defaults = $result->getDefaults(); $this->assertEquals('INVOIC', $defaults['0065']); $this->assertEquals('D', $defaults['0052']); $this->assertEquals('96A', $defaults['0054']); $this->assertEquals('UN', $defaults['0051']); $segments = $result->getSegments(); $this->assertInstanceOf(MessageSegmentMapping::class, $segments[0]); $this->assertEquals('UNH', $segments[0]->getCode()); $this->assertEquals(1, $segments[0]->getMaxRepeat()); $this->assertEquals(true, $segments[0]->isRequired()); $this->assertInstanceOf(MessageSegmentGroupMapping::class, $segments[7]); $this->assertEquals('SG1', $segments[7]->getCode()); $this->assertEquals(99, $segments[7]->getMaxRepeat()); $this->assertEquals(false, $segments[7]->isRequired()); $groupSegments = $segments[7]->getSegmentMappings(); $this->assertInstanceOf(MessageSegmentMapping::class, $groupSegments[0]); $this->assertEquals('RFF', $groupSegments[0]->getCode()); $this->assertEquals(1, $groupSegments[0]->getMaxRepeat()); $this->assertEquals(true, $groupSegments[0]->isRequired()); }
/** * @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; }