diff --git a/src/ApiResource/BovineSyncInventoryResult.php b/src/ApiResource/BovineSyncInventoryResult.php new file mode 100644 index 0000000..adf32ad --- /dev/null +++ b/src/ApiResource/BovineSyncInventoryResult.php @@ -0,0 +1,42 @@ + + */ +final class BovineSyncInventoryProcessor implements ProcessorInterface +{ + public function __construct( + private BovinApiInterface $bovinApi, + private EntityManagerInterface $em, + ) {} + + public function process( + mixed $data, + Operation $operation, + array $uriVariables = [], + array $context = [], + ): BovineSyncInventoryResult { + $inventory = $this->bovinApi->getInventory(new DateTimeImmutable('2000-01-01')); + + $result = new BovineSyncInventoryResult(); + $result->total = count($inventory->animals); + + $existingByNationalNumber = []; + foreach ($this->em->getRepository(Bovine::class)->findAll() as $bovine) { + $existingByNationalNumber[$bovine->getNationalNumber()] = $bovine; + } + + $seen = []; + foreach ($inventory->animals as $animal) { + $nationalNumber = $animal->identification?->bovin?->nationalNumber; + if (null === $nationalNumber || '' === $nationalNumber) { + continue; + } + $seen[$nationalNumber] = true; + + if (isset($existingByNationalNumber[$nationalNumber])) { + $bovine = $existingByNationalNumber[$nationalNumber]; + ++$result->updated; + } else { + $bovine = new Bovine(); + $bovine->setNationalNumber($nationalNumber); + $this->em->persist($bovine); + ++$result->created; + } + + $this->applyEdnotifData($bovine, $animal); + $bovine->setExitedAt(null); + } + + $now = new DateTimeImmutable(); + foreach ($existingByNationalNumber as $nationalNumber => $bovine) { + if (isset($seen[$nationalNumber])) { + continue; + } + if (null !== $bovine->getExitedAt()) { + continue; + } + $bovine->setExitedAt($now); + ++$result->exited; + } + + $this->em->flush(); + + return $result; + } + + private function applyEdnotifData(Bovine $bovine, AnimalSummaryDto $animal): void + { + $identification = $animal->identification; + if (null !== $identification) { + $bovine->setSex($identification->sex); + $bovine->setBreedCode($identification->breedType); + $bovine->setWorkNumber($identification->workNumber); + $bovine->setBirthDate($identification->birthDate?->date); + } + + foreach ($animal->presencePeriods as $period) { + if (null === $period->exit && null !== $period->entry?->date) { + $bovine->setArrivalDate($period->entry->date); + + break; + } + } + } +}