diff --git a/src/Bovin/Dto/ReturnedDossiersDto.php b/src/Bovin/Dto/ReturnedDossiersDto.php new file mode 100644 index 0000000..1822847 --- /dev/null +++ b/src/Bovin/Dto/ReturnedDossiersDto.php @@ -0,0 +1,22 @@ + $animals + */ + public function __construct( + public StandardResponseDto $standardResponse, + public int $nbBovins, + public ?DateTimeImmutable $startDate, + public array $animals, + public ?object $rawSoapResponse, + ) {} +} diff --git a/src/Bovin/Mapper/ReturnedDossiersMapper.php b/src/Bovin/Mapper/ReturnedDossiersMapper.php new file mode 100644 index 0000000..29b2af5 --- /dev/null +++ b/src/Bovin/Mapper/ReturnedDossiersMapper.php @@ -0,0 +1,50 @@ +standardResponseMapper->map($soapResponse->ReponseStandard ?? null); + $nbBovins = $this->toNullableInt($soapResponse->ReponseSpecifique->NbBovins ?? null) ?? 0; + + $startDate = null; + $animals = []; + + if (is_object($unzippedMessage)) { + $infoNode = $unzippedMessage->InformationsMessage ?? null; + if (is_object($infoNode)) { + $startDate = $this->toNullableDate($infoNode->DateDebut ?? null); + } + + $bovinsNode = $unzippedMessage->Bovins->Bovin ?? null; + foreach ($this->normalizeToList($bovinsNode) as $bovinNode) { + if (!is_object($bovinNode)) { + continue; + } + $animals[] = $this->animalSummaryMapper->map($bovinNode); + } + } + + return new ReturnedDossiersDto( + standardResponse: $standardResponse, + nbBovins: $nbBovins, + startDate: $startDate, + animals: $animals, + rawSoapResponse: $soapResponse, + ); + } +} diff --git a/tests/Unit/Bovin/Mapper/ReturnedDossiersMapperTest.php b/tests/Unit/Bovin/Mapper/ReturnedDossiersMapperTest.php new file mode 100644 index 0000000..1158bd2 --- /dev/null +++ b/tests/Unit/Bovin/Mapper/ReturnedDossiersMapperTest.php @@ -0,0 +1,67 @@ +ReponseStandard = new stdClass(); + $soapResponse->ReponseStandard->Resultat = true; + $soapResponse->ReponseSpecifique = new stdClass(); + $soapResponse->ReponseSpecifique->NbBovins = 1; + + $message = new stdClass(); + $message->InformationsMessage = new stdClass(); + $message->InformationsMessage->DateDebut = '2026-03-01'; + $message->Bovins = new stdClass(); + $message->Bovins->Bovin = new stdClass(); + $message->Bovins->Bovin->IdentiteBovin = new stdClass(); + $message->Bovins->Bovin->IdentiteBovin->Bovin = new stdClass(); + $message->Bovins->Bovin->IdentiteBovin->Bovin->NumeroNational = 'FR789'; + $message->Bovins->Bovin->PeriodesPresences = new stdClass(); + $message->Bovins->Bovin->PeriodesPresences->PeriodePresence = new stdClass(); + + $dto = $mapper->map($soapResponse, $message); + + self::assertInstanceOf(ReturnedDossiersDto::class, $dto); + self::assertEquals(new DateTimeImmutable('2026-03-01'), $dto->startDate); + self::assertSame(1, $dto->nbBovins); + self::assertCount(1, $dto->animals); + self::assertSame('FR789', $dto->animals[0]->identification?->bovin?->nationalNumber); + } + + public function testMapWithoutMessageReturnsEmptyAnimals(): void + { + $mapper = new ReturnedDossiersMapper(new AnimalSummaryMapper(), new StandardResponseMapper()); + + $soapResponse = new stdClass(); + $soapResponse->ReponseStandard = new stdClass(); + $soapResponse->ReponseStandard->Resultat = true; + $soapResponse->ReponseSpecifique = new stdClass(); + $soapResponse->ReponseSpecifique->NbBovins = 0; + + $dto = $mapper->map($soapResponse, null); + + self::assertSame(0, $dto->nbBovins); + self::assertSame([], $dto->animals); + } +}