diff --git a/src/Bovin/Dto/CreateSortieResponseDto.php b/src/Bovin/Dto/CreateSortieResponseDto.php new file mode 100644 index 0000000..bdfee70 --- /dev/null +++ b/src/Bovin/Dto/CreateSortieResponseDto.php @@ -0,0 +1,28 @@ +standardResponseMapper->map($soapResponse->ReponseStandard ?? null); + + $specific = $soapResponse->ReponseSpecifique ?? null; + + $pending = false; + $identification = null; + $entryMovement = null; + $exitMovement = null; + + if (is_object($specific)) { + $pendingFlag = $specific->AttenteValidationBDNi ?? null; + if (null !== $pendingFlag) { + $pending = (bool) $this->toNullableBool($pendingFlag); + } + + $validee = $specific->SortieValidee ?? null; + if (is_object($validee)) { + $identityNode = $validee->IdentiteBovin ?? null; + if (is_object($identityNode)) { + $identification = $this->mapIdentification($identityNode); + } + + $mouvementBovin = $validee->MouvementBovin ?? null; + if (is_object($mouvementBovin)) { + $entryNode = $mouvementBovin->MouvementEntreeBovin ?? null; + if (is_object($entryNode)) { + $entryMovement = $this->mapMovement($entryNode, 'entry'); + } + + $exitNode = $mouvementBovin->MouvementSortieBovin ?? null; + if (is_object($exitNode)) { + $exitMovement = $this->mapMovement($exitNode, 'exit'); + } + } + } + } + + return new CreateSortieResponseDto( + standardResponse: $standardResponse, + pendingBdniValidation: $pending, + identification: $identification, + entryMovement: $entryMovement, + exitMovement: $exitMovement, + rawSoapResponse: $soapResponse, + ); + } +} diff --git a/tests/Unit/Bovin/Mapper/CreateSortieResponseMapperTest.php b/tests/Unit/Bovin/Mapper/CreateSortieResponseMapperTest.php new file mode 100644 index 0000000..90e7e13 --- /dev/null +++ b/tests/Unit/Bovin/Mapper/CreateSortieResponseMapperTest.php @@ -0,0 +1,77 @@ +ReponseStandard = new stdClass(); + $soapResponse->ReponseStandard->Resultat = true; + $soapResponse->ReponseSpecifique = new stdClass(); + $soapResponse->ReponseSpecifique->AttenteValidationBDNi = true; + + $dto = new CreateSortieResponseMapper(new StandardResponseMapper())->map($soapResponse); + + self::assertInstanceOf(CreateSortieResponseDto::class, $dto); + self::assertTrue($dto->pendingBdniValidation); + self::assertNull($dto->identification); + self::assertNull($dto->entryMovement); + self::assertNull($dto->exitMovement); + } + + public function testMapValidatedExit(): void + { + $soapResponse = new stdClass(); + $soapResponse->ReponseStandard = new stdClass(); + $soapResponse->ReponseStandard->Resultat = true; + $soapResponse->ReponseSpecifique = new stdClass(); + + $validee = new stdClass(); + $validee->IdentiteBovin = new stdClass(); + $validee->IdentiteBovin->Sexe = 'M'; + $validee->IdentiteBovin->Bovin = new stdClass(); + $validee->IdentiteBovin->Bovin->NumeroNational = 'FR9999999999'; + + $mouvement = new stdClass(); + $mouvement->MouvementEntreeBovin = new stdClass(); + $mouvement->MouvementEntreeBovin->DateEntree = '2024-01-10'; + $mouvement->MouvementEntreeBovin->CauseEntree = 'A'; + + $mouvement->MouvementSortieBovin = new stdClass(); + $mouvement->MouvementSortieBovin->DateSortie = '2026-04-22'; + $mouvement->MouvementSortieBovin->CauseSortie = 'B'; + + $validee->MouvementBovin = $mouvement; + + $soapResponse->ReponseSpecifique->SortieValidee = $validee; + + $dto = new CreateSortieResponseMapper(new StandardResponseMapper())->map($soapResponse); + + self::assertFalse($dto->pendingBdniValidation); + self::assertNotNull($dto->identification); + self::assertSame('M', $dto->identification->sex); + self::assertSame('FR9999999999', $dto->identification->bovin?->nationalNumber); + self::assertNotNull($dto->entryMovement); + self::assertEquals(new DateTimeImmutable('2024-01-10'), $dto->entryMovement->date); + self::assertSame('A', $dto->entryMovement->cause); + self::assertNotNull($dto->exitMovement); + self::assertEquals(new DateTimeImmutable('2026-04-22'), $dto->exitMovement->date); + self::assertSame('B', $dto->exitMovement->cause); + } +}