EventMappingBuilder.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\ApiResourceBuilder\Freemium;
  4. use App\ApiResources\Freemium\FreemiumEvent;
  5. use App\Entity\Booking\Event;
  6. use App\Entity\Core\AddressPostal;
  7. use App\Entity\Place\Place;
  8. use App\Enum\Booking\VisibilityEnum;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Ramsey\Uuid\Uuid;
  11. /**
  12. * Mapping des informations d'un Event avec comme source un FreemiumEvent.
  13. */
  14. class EventMappingBuilder
  15. {
  16. public function __construct(
  17. private EntityManagerInterface $em,
  18. ) {
  19. }
  20. /**
  21. * Mapping des informations.
  22. *
  23. * @param Event $event : objet target
  24. * @param FreemiumEvent $freemiumEvent : objet source
  25. */
  26. public function mapInformations(Event $event, FreemiumEvent $freemiumEvent): void
  27. {
  28. $this->mapEventInformations($event, $freemiumEvent);
  29. $this->mapEventPlaceInformations($event, $freemiumEvent);
  30. }
  31. /**
  32. * Mapping des informations générales.
  33. *
  34. * @param Event $event : objet target
  35. * @param FreemiumEvent $freemiumEvent : objet source
  36. */
  37. protected function mapEventInformations(Event $event, FreemiumEvent $freemiumEvent): void
  38. {
  39. // General informations
  40. $event->setName($freemiumEvent->name);
  41. $event->setOrganization($freemiumEvent->organization);
  42. $event->setDatetimeStart($freemiumEvent->datetimeStart);
  43. $event->setDatetimeEnd($freemiumEvent->datetimeEnd);
  44. $event->setDescription($freemiumEvent->description);
  45. $event->setImage($freemiumEvent->image);
  46. $event->setUrl($freemiumEvent->url);
  47. $event->setUrlTicket($freemiumEvent->urlTicket);
  48. $event->setPricing($freemiumEvent->pricing);
  49. $event->setPriceMini($freemiumEvent->priceMini);
  50. $event->setPriceMaxi($freemiumEvent->priceMaxi);
  51. $event->setGender($freemiumEvent->gender);
  52. $event->setVisibility(VisibilityEnum::PUBLIC_VISIBILITY);
  53. $event->setUuid(Uuid::uuid4()->toString());
  54. // Catégories
  55. $event->removeAllCategories();
  56. foreach ($freemiumEvent->categories as $category) {
  57. $event->addCategory($category);
  58. }
  59. }
  60. /**
  61. * Recherche et mapping du lieu de lévénement.
  62. */
  63. protected function mapEventPlaceInformations(Event $event, FreemiumEvent $freemiumEvent): void
  64. {
  65. $place = $this->getPlace($freemiumEvent);
  66. if ($place !== null) {
  67. $this->mapPlaceInformations($place, $freemiumEvent);
  68. $this->em->persist($place);
  69. }
  70. $event->setPlace($place);
  71. }
  72. /**
  73. * Mapping des informations du lieux et de son adresse postale.
  74. */
  75. protected function mapPlaceInformations(Place $place, FreemiumEvent $freemiumEvent): void
  76. {
  77. $addressPostal = $this->getAddressPostal($place);
  78. // Mapping des informations de l'adresse
  79. $addressPostal
  80. ->setStreetAddress($freemiumEvent->streetAddress)
  81. ->setStreetAddressSecond($freemiumEvent->streetAddressSecond)
  82. ->setStreetAddressThird($freemiumEvent->streetAddressThird)
  83. ->setPostalCode($freemiumEvent->postalCode)
  84. ->setAddressCity($freemiumEvent->addressCity)
  85. ->setAddressCountry($freemiumEvent->addressCountry)
  86. ->setLatitude($freemiumEvent->latitude)
  87. ->setLongitude($freemiumEvent->longitude);
  88. // Mapping des informations du lieu
  89. $place
  90. ->setOrganization($freemiumEvent->organization)
  91. ->setName($freemiumEvent->placeName)
  92. ->setAddressPostal($addressPostal);
  93. }
  94. /**
  95. * Récupération de la place si définie, sinon on en créer une si un minimum d'information est fournies.
  96. */
  97. protected function getPlace(FreemiumEvent $freemiumEvent): ?Place
  98. {
  99. if ($freemiumEvent->place) {
  100. return $freemiumEvent->place;
  101. } elseif (
  102. $freemiumEvent->placeName
  103. || $freemiumEvent->streetAddress
  104. || $freemiumEvent->streetAddressSecond
  105. || $freemiumEvent->streetAddressThird
  106. || $freemiumEvent->postalCode
  107. || $freemiumEvent->addressCity
  108. ) {
  109. return new Place();
  110. }
  111. return null;
  112. }
  113. /**
  114. * Récupération de l'adresse postale si définie, sinon on en créer une nouvelle.
  115. */
  116. protected function getAddressPostal(Place $place): AddressPostal
  117. {
  118. if ($place->getAddressPostal()) {
  119. return $place->getAddressPostal();
  120. }
  121. return new AddressPostal();
  122. }
  123. }