src/EventSubscriber/Import/EntityMapper/ProductAvailability/EntityPreInitSubscriber.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Import\EntityMapper\ProductAvailability;
  3. use App\Application\EntityImportBundle\Event\EntityPreInitEvent;
  4. use App\Application\EntityImportBundle\ValueObject\ConfigItemPropertiesValue;
  5. use App\Entity\Product;
  6. use App\Entity\ProductAvailability;
  7. use App\EventSubscriber\Import\EntityMapper\BasePreInitSubscriber;
  8. class EntityPreInitSubscriber extends BasePreInitSubscriber
  9. {
  10.     private $productEntity;
  11.     private $territory;
  12.     private $window;
  13.     private $data;
  14.     public static function getSubscribedEvents(): array
  15.     {
  16.         return [
  17.             EntityPreInitEvent::class => 'onEntityPreInit',
  18.         ];
  19.     }
  20.     public function onEntityPreInit(EntityPreInitEvent $event): void
  21.     {
  22.         if (
  23.             Product::class !== $event->getTargetClassName()
  24.             || 'titleCode' !== $event->getPrimaryProperty()->getName()
  25.         ) {
  26.             return;
  27.         }
  28.         $configuredProperties $event->getConfigurationProperties();
  29.         [$titleCodeProperty$windowProperty$territoryProperty] = [
  30.             $event->getPrimaryProperty(),
  31.             $this->filterConfiguredProperty('window'$configuredPropertiestrue),
  32.             $this->filterConfiguredProperty('territory'$configuredPropertiestrue),
  33.         ];
  34.         if (null === $titleCodeProperty || null === $windowProperty || null === $territoryProperty) {
  35.             $event->setSkipRowProcessing(true);
  36.             return;
  37.         }
  38.         $this->data $event->getData();
  39.         if (!$titleCode $this->getValue($titleCodeProperty$this->data)) {
  40.             $event->setSkipRowProcessing(true);
  41.             return;
  42.         }
  43.         if (!$this->window $this->getValue($windowProperty$this->data)) {
  44.             $event->setSkipRowProcessing(true);
  45.             return;
  46.         }
  47.         if (!$this->territory $this->getValue($territoryProperty$this->data)) {
  48.             $event->setSkipRowProcessing(true);
  49.             return;
  50.         }
  51.         $repository $this->getEntityManager()->getRepository(Product::class);
  52.         if (!$this->productEntity $repository->findOneByNavCode($titleCode)) {
  53.             $event->setSkipRowProcessing(true);
  54.             return;
  55.         }
  56.         $startDateProperty $this->filterConfiguredProperty('startDate'$configuredProperties);
  57.         $endDateProperty $this->filterConfiguredProperty('endDate'$configuredProperties);
  58.         $foundAvailability false;
  59.         foreach ($this->productEntity->getProductAvailability() as $availability) {
  60.             /** @var \App\Entity\ProductAvailability $availability */
  61.             if ($this->window === $availability->getWindow() && $this->territory === $availability->getTerritory()) {
  62.                 $this->setStartDate($availability$startDateProperty);
  63.                 $this->setEndDate($availability$endDateProperty);
  64.                 $foundAvailability true;
  65.                 $this->getEntityManager()->persist($availability);
  66.             }
  67.         }
  68.         if (!$foundAvailability) {
  69.             $this->createNewAvailability($startDateProperty$endDateProperty);
  70.         }
  71.         $event->setEntity($this->productEntity);
  72.     }
  73.     private function createNewAvailability($startDateProperty$endDateProperty)
  74.     {
  75.         $newProductAvailability = new ProductAvailability();
  76.         $newProductAvailability->setWindow($this->window);
  77.         $newProductAvailability->setTerritory($this->territory);
  78.         $this->setStartDate($newProductAvailability$startDateProperty);
  79.         $this->setEndDate($newProductAvailability$endDateProperty);
  80.         $this->productEntity->addProductAvailability($newProductAvailability);
  81.     }
  82.     private function setStartDate(ProductAvailability $entityConfigItemPropertiesValue $property): void
  83.     {
  84.         $value $this->getValue($property$this->data);
  85.         if ($value && $this->getAllowedNullableCharacter() === $value) {
  86.             $entity->setStartDate(null);
  87.             return;
  88.         }
  89.         if (!$dateTime \DateTime::createFromFormat('d-m-Y'$value)) {
  90.             return;
  91.         }
  92.         $entity->setStartDate($dateTime);
  93.     }
  94.     private function setEndDate(ProductAvailability $entityConfigItemPropertiesValue $property): void
  95.     {
  96.         $value $this->getValue($property$this->data);
  97.         if ($value && $this->getAllowedNullableCharacter() === $value) {
  98.             $entity->setEndDate(null);
  99.             return;
  100.         }
  101.         if (!$dateTime \DateTime::createFromFormat('d-m-Y'$value)) {
  102.             return;
  103.         }
  104.         $entity->setEndDate($dateTime);
  105.     }
  106. }