diff --git a/src/HasRetrievableSegments.php b/src/HasRetrievableSegments.php new file mode 100644 index 0000000..762c78b --- /dev/null +++ b/src/HasRetrievableSegments.php @@ -0,0 +1,28 @@ +> + */ + abstract public function allSegments(): array; + + /** + * @return array + */ + public function segmentsByTag(string $tag): array + { + return $this->allSegments()[$tag] ?? []; + } + + public function segmentByTagAndSubId(string $tag, string $subId): ?SegmentInterface + { + return $this->allSegments()[$tag][$subId] ?? null; + } +} diff --git a/src/LineItem.php b/src/LineItem.php new file mode 100644 index 0000000..401af82 --- /dev/null +++ b/src/LineItem.php @@ -0,0 +1,24 @@ +> $data + */ + public function __construct(private array $data) + { + } + + public function allSegments(): array + { + return $this->data; + } +} diff --git a/src/MessageDataBuilder/Builder.php b/src/MessageDataBuilder/Builder.php index 85ad416..9437950 100644 --- a/src/MessageDataBuilder/Builder.php +++ b/src/MessageDataBuilder/Builder.php @@ -4,6 +4,7 @@ namespace EdifactParser\MessageDataBuilder; +use EdifactParser\LineItem; use EdifactParser\Segments\LINLineItem; use EdifactParser\Segments\SegmentInterface; use EdifactParser\Segments\UNSSectionControl; @@ -40,9 +41,15 @@ public function buildSegments(): array return $this->buildWhereBuilderIs(SimpleBuilder::class); } + /** + * @returns array + */ public function buildLineItems(): array { - return $this->buildWhereBuilderIs(DetailsSectionBuilder::class); + return array_map( + static fn ($data) => new LineItem($data), + $this->buildWhereBuilderIs(DetailsSectionBuilder::class), + ); } /** diff --git a/src/TransactionMessage.php b/src/TransactionMessage.php index f3e4323..f9a9ce2 100644 --- a/src/TransactionMessage.php +++ b/src/TransactionMessage.php @@ -12,9 +12,11 @@ /** @psalm-immutable */ final class TransactionMessage { + use HasRetrievableSegments; + /** - * @param array> $groupedSegments - * @param array>> $lineItems + * @param array> $groupedSegments + * @param array $lineItems */ public function __construct( private array $groupedSegments, @@ -49,29 +51,24 @@ public static function groupSegmentsByMessage(SegmentInterface ...$segments): ar } /** - * @return array> + * @return array */ - public function allSegments(): array - { - return $this->groupedSegments; - } - public function lineItems(): array { return $this->lineItems; } - /** - * @return array - */ - public function segmentsByTag(string $tag): array + public function lineItemById(string|int $lineItemId): ?LineItem { - return $this->groupedSegments[$tag] ?? []; + return $this->lineItems[(string) $lineItemId] ?? null; } - public function segmentByTagAndSubId(string $tag, string $subId): ?SegmentInterface + /** + * @return array> + */ + public function allSegments(): array { - return $this->groupedSegments[$tag][$subId] ?? null; + return $this->groupedSegments; } /** diff --git a/tests/Functional/EdifactParserTest.php b/tests/Functional/EdifactParserTest.php index 31993f0..e1c3d35 100644 --- a/tests/Functional/EdifactParserTest.php +++ b/tests/Functional/EdifactParserTest.php @@ -147,7 +147,7 @@ public function handles_unknown_segments_in_line_items(): void $transactionResult = EdifactParser::createWithDefaultSegments()->parse($fileContent); $message = $transactionResult[0]; - self::assertNotNull($message->lineItems()[1]['UNK']['first']); - self::assertNotNull($message->lineItems()[2]['UNK']['first']); + self::assertNotNull($message->lineItemById(1)?->segmentByTagAndSubId('UNK', 'first')); + self::assertNotNull($message->lineItemById(2)?->segmentByTagAndSubId('UNK', 'first')); } } diff --git a/tests/Unit/MessageBuilder/MessageBuilderTest.php b/tests/Unit/MessageBuilder/MessageBuilderTest.php index d1e08f2..dfca620 100644 --- a/tests/Unit/MessageBuilder/MessageBuilderTest.php +++ b/tests/Unit/MessageBuilder/MessageBuilderTest.php @@ -4,6 +4,7 @@ namespace EdifactParser\Tests\Unit\MessageBuilder; +use EdifactParser\LineItem; use EdifactParser\MessageDataBuilder\Builder as MessageDataBuilder; use EdifactParser\Segments\DTMDateTimePeriod; use EdifactParser\Segments\LINLineItem; @@ -103,14 +104,14 @@ public function build_line_items(): void ], $builder->buildSegments()); self::assertEquals([ - '1' => [ + '1' => new LineItem([ 'LIN' => ['1' => $this->lineSegment], 'QTY' => ['21' => $this->quantitySegment], - ], - '2' => [ + ]), + '2' => new LineItem([ 'LIN' => ['2' => $this->otherLineSegment], 'QTY' => ['23' => $this->otherQuantitySegment], - ], + ]), ], $builder->buildLineItems()); } @@ -133,13 +134,13 @@ public function groups_segments_within_line_items(): void ], $builder->buildSegments()); self::assertEquals([ - '1' => [ + '1' => new LineItem([ 'LIN' => ['1' => $this->lineSegment], 'QTY' => [ '21' => $this->quantitySegment, '23' => $this->otherQuantitySegment, ], - ], + ]), ], $builder->buildLineItems()); } } diff --git a/tests/Unit/TransactionMessageTest.php b/tests/Unit/TransactionMessageTest.php index 81f6989..ce1c281 100644 --- a/tests/Unit/TransactionMessageTest.php +++ b/tests/Unit/TransactionMessageTest.php @@ -5,6 +5,7 @@ namespace EdifactParser\Tests\Unit; use EDI\Parser; +use EdifactParser\LineItem; use EdifactParser\SegmentList; use EdifactParser\Segments\CNTControl; use EdifactParser\Segments\LINLineItem; @@ -278,16 +279,24 @@ public function line_items(): void $messages = $this->transactionMessages($fileContent); $firstMessage = reset($messages); + $firstLineItem = new LineItem([ + 'LIN' => ['1' => new LINLineItem(['LIN', 1])], + 'QTY' => ['25' => new QTYQuantity(['QTY', [25, 5]])], + ]); + + $secondLineItem = new LineItem([ + 'LIN' => ['2' => new LINLineItem(['LIN', 2])], + 'QTY' => ['23' => new QTYQuantity(['QTY', [23, 10]])], + ]); + self::assertEquals([ - '1' => [ - 'LIN' => ['1' => new LINLineItem(['LIN', 1])], - 'QTY' => ['25' => new QTYQuantity(['QTY', [25, 5]])], - ], - '2' => [ - 'LIN' => ['2' => new LINLineItem(['LIN', 2])], - 'QTY' => ['23' => new QTYQuantity(['QTY', [23, 10]])], - ], + '1' => $firstLineItem, + '2' => $secondLineItem, ], $firstMessage->lineItems()); + + self::assertEquals($firstLineItem, $firstMessage->lineItemById(1)); + self::assertEquals($secondLineItem, $firstMessage->lineItemById(2)); + self::assertNull($firstMessage->lineItemById(3)); } private function transactionMessages(string $fileContent): array