public function encode(Interchange $interchange) { $out = $this->annotationPrinter->prepareString($interchange); foreach ($interchange->getMessages() as $message) { $out .= $this->annotationPrinter->prepareString($message); $identifier = $message->getIdentifier(); $this->segmentPrinter->setSegmentMappings($this->mappingLoader->loadSegments($identifier['version'], $identifier['release'])); foreach ($message->getSegments() as $segment) { $out .= $this->segmentPrinter->prepareString($segment); } $out .= $this->annotationPrinter->prepareString($message->createTrailer()); } $out .= $this->annotationPrinter->prepareString($interchange->createTrailer()); return $out; }
/** @test */ public function should_load_segment_mapping_from_file() { $loader = new MappingLoader(__DIR__ . '/../fixtures'); $result = $loader->loadSegments('D', '96A'); $this->assertGreaterThanOrEqual(1, count($result)); /** @var SegmentMapping $segment */ $segment = $result['ADR']; $this->assertEquals('ADR', $segment->getId()); $this->assertEquals('address', $segment->getName()); $this->assertEquals('To specify an address.', $segment->getDesc()); // Check data elements $dataElements = $segment->getDataElements(); $this->assertEquals(2, count($dataElements)); $this->assertEquals('3164', $dataElements[1]->getId()); $this->assertEquals('cityName', $dataElements[1]->getName()); $this->assertEquals('35', $dataElements[1]->getMaxLength()); $this->assertEquals('an', $dataElements[1]->getType()); $this->assertEquals('C517', $dataElements[2]->getId()); $this->assertEquals('locationIdentification', $dataElements[2]->getName()); // Check composite data elements $this->assertInstanceOf(CompositeDataElementMapping::class, $dataElements[2]); $compositeElements = $dataElements[2]->getDataElements(); $this->assertEquals('3225', $compositeElements[0]->getId()); $this->assertEquals('1131', $compositeElements[1]->getId()); }
/** * @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; }
/** * @param $version * @return Populator * @throws MappingNotFoundException */ protected function updatePopulatorConfiguration($version) { $dir = realpath($this->mappingDirectory . "/{$version}"); if (!file_exists($dir)) { throw new MappingNotFoundException(sprintf("Mapping directory '%s' not found", $this->mappingDirectory)); } $segmentsFile = $dir . '/segments.xml'; if (!file_exists($segmentsFile) || !is_readable($segmentsFile)) { throw new MappingNotFoundException(sprintf("segments.xml mapping file not found in directory '%s'", $this->mappingDirectory)); } $this->populator->setSegments($this->mappingLoader->loadSegments($segmentsFile)); $codesFile = $dir . '/codes.xml'; if (!file_exists($codesFile) || !is_readable($codesFile)) { throw new MappingNotFoundException(sprintf("codes.xml mapping file not found in directory '%s'", $this->mappingDirectory)); } $this->populator->setCodes($this->mappingLoader->loadCodes($codesFile)); }