Browse Source

Ajout de la gestion des lieux et des catégories

Vincent 4 months ago
parent
commit
142a559ef6

+ 30 - 0
src/ApiResources/Freemium/FreemiumEvent.php

@@ -17,6 +17,7 @@ use ApiPlatform\Metadata\Post;
 use App\ApiResources\ApiResourcesInterface;
 use App\Attribute\OrganizationDefaultValue;
 use App\Entity\Booking\Event;
+use App\Entity\Core\Categories;
 use App\Entity\Core\Country;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
@@ -24,7 +25,9 @@ use App\Entity\Place\Place;
 use App\Enum\Booking\PricingEventEnum;
 use App\State\Processor\Freemium\FreemiumEventProcessor;
 use App\State\Provider\Freemium\FreemiumEventProvider;
+use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\Common\Collections\Collection;
+use JetBrains\PhpStorm\Pure;
 use Symfony\Component\ObjectMapper\Attribute\Map;
 use App\Validator\Constraints as OpentalentAssert;
 
@@ -120,4 +123,31 @@ class FreemiumEvent implements ApiResourcesInterface
     public ?float $priceMini = null;
 
     public ?float $priceMaxi = null;
+
+    #[Pure]
+    public function __construct()
+    {
+        $this->categories = new ArrayCollection();
+    }
+
+    public function getCategories(): Collection
+    {
+        return $this->categories;
+    }
+
+    public function addCategory(Categories $categories): self
+    {
+        if (!$this->categories->contains($categories)) {
+            $this->categories[] = $categories;
+        }
+
+        return $this;
+    }
+
+    public function removeCategory(Categories $categories): self
+    {
+        $this->categories->removeElement($categories);
+
+        return $this;
+    }
 }

+ 9 - 0
src/Entity/Booking/Event.php

@@ -311,6 +311,15 @@ class Event extends AbstractBooking
         return $this;
     }
 
+    public function removeAllCategories(): self
+    {
+        foreach ($this->categories as $category) {
+            $this->removeCategory($category);
+        }
+
+        return $this;
+    }
+
     /**
      * @return Collection<int, EventReport>
      */

+ 38 - 22
src/Service/ApiResourceBuilder/Freemium/FreemiumEventBuilder.php

@@ -6,13 +6,14 @@ namespace App\Service\ApiResourceBuilder\Freemium;
 
 use App\ApiResources\Freemium\FreemiumEvent;
 use App\Entity\Booking\Event;
+use App\Entity\Core\AddressPostal;
 use App\Entity\Place\Place;
-use App\Repository\Place\PlaceRepository;
+use Doctrine\ORM\EntityManagerInterface;
 
 class FreemiumEventBuilder
 {
     public function __construct(
-        private PlaceRepository $placeRepository
+        private EntityManagerInterface $em
     )
     {
     }
@@ -24,19 +25,6 @@ class FreemiumEventBuilder
      * @param FreemiumEvent $freemiumEvent : objet source
      */
     public function mapInformations(Event $event, FreemiumEvent $freemiumEvent): void
-    {
-        // Mapping des infos principales
-        $this->mapEventInformations($event, $freemiumEvent);
-      //  $this->mapPlaceInformations($this->getEventPlace($freemiumEvent), $freemiumEvent);
-    }
-
-    /**
-     * Mapping des informations de Event depuis FreemiumEvent.
-     *
-     * @param Event         $event         : objet target
-     * @param FreemiumEvent $freemiumEvent : objet source
-     */
-    private function mapEventInformations(Event $event, FreemiumEvent $freemiumEvent): void
     {
         $event->setName($freemiumEvent->name);
         $event->setOrganization($freemiumEvent->organization);
@@ -49,10 +37,13 @@ class FreemiumEventBuilder
         $event->setPricing($freemiumEvent->pricing);
         $event->setPriceMini($freemiumEvent->priceMini);
         $event->setPriceMaxi($freemiumEvent->priceMaxi);
-        //$event->addCategory($freemiumEvent->categories);
-    }
 
-    private function mapPlaceInformations(Place $place, FreemiumEvent $freemiumEvent){
+        $event->removeAllCategories();
+        foreach ($freemiumEvent->categories as $category){
+            $event->addCategory($category);
+        }
+
+        $event->setPlace($this->getEventPlace($freemiumEvent));
     }
 
     /**
@@ -60,11 +51,36 @@ class FreemiumEventBuilder
      * @return Place|array|object[]
      */
     private function getEventPlace(FreemiumEvent $freemiumEvent){
-        //@todo: vérifier que l'on ne peux pas mettre n'importe quel ID de place => sécurité avec organisation_id
+
         if($freemiumEvent->place){
-            return $this->placeRepository->findBy(['id' => $freemiumEvent->place]);
-        }else{
-            return new Place();
+            return $freemiumEvent->place;
+        }else if(
+            $freemiumEvent->placeName ||
+            $freemiumEvent->streetAddress ||
+            $freemiumEvent->streetAddressSecond ||
+            $freemiumEvent->streetAddressThird ||
+            $freemiumEvent->postalCode ||
+            $freemiumEvent->addressCity
+        )
+        {
+            $place = new Place();
+            $addressPostal = new AddressPostal();
+            $addressPostal
+                ->setStreetAddress($freemiumEvent->streetAddress)
+                ->setStreetAddressSecond($freemiumEvent->streetAddressSecond)
+                ->setStreetAddressThird($freemiumEvent->streetAddressThird)
+                ->setPostalCode($freemiumEvent->postalCode)
+                ->setAddressCity($freemiumEvent->addressCity)
+                ->setAddressCountry($freemiumEvent->addressCountry)
+                ->setLatitude($freemiumEvent->latitude)
+                ->setLongitude($freemiumEvent->longitude)
+            ;
+            $place
+                ->setName($freemiumEvent->placeName)
+                ->setAddressPostal($addressPostal);
+
+            $this->em->persist($place);
+            return $place;
         }
     }
 }

+ 1 - 4
src/State/Provider/Freemium/FreemiumEventProvider.php

@@ -84,10 +84,7 @@ final class FreemiumEventProvider implements ProviderInterface
         $this->filtersConfigurationService->restoreTimeConstraintFilters();
 
         $freemiumEvent = $this->objectMapper->map($event, FreemiumEvent::class);
-
-        $freemiumEvent->categories = $event->getCategories()->map(
-            fn(Categories $cat) => $this->iriConverter->getIriFromResource($cat)
-        );
+        $freemiumEvent->categories = $event->getCategories();
 
         return $freemiumEvent;
     }