From 0dd0e58ec12a90524e18f61382a8d9a383344630 Mon Sep 17 00:00:00 2001 From: tristan Date: Tue, 21 Apr 2026 08:55:02 +0200 Subject: [PATCH] feat : DTO et mapper pour IpBGetRetourDossiers --- src/Bovin/Dto/ReturnedDossiersDto.php | 22 ++++++ src/Bovin/Mapper/ReturnedDossiersMapper.php | 50 ++++++++++++++ .../Mapper/ReturnedDossiersMapperTest.php | 67 +++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/Bovin/Dto/ReturnedDossiersDto.php create mode 100644 src/Bovin/Mapper/ReturnedDossiersMapper.php create mode 100644 tests/Unit/Bovin/Mapper/ReturnedDossiersMapperTest.php 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); + } +}