src/Aqarmap/Bundle/ListingBundle/EventListener/CompoundFieldListener.php line 34

Open in your IDE?
  1. <?php
  2. namespace Aqarmap\Bundle\ListingBundle\EventListener;
  3. use Aqarmap\Bundle\ListingBundle\Constant\ListingStatus;
  4. use Aqarmap\Bundle\ListingBundle\Entity\Listing;
  5. use Aqarmap\Bundle\ListingBundle\Event\ListingEvent;
  6. use Doctrine\ORM\EntityManager;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. class CompoundFieldListener implements EventSubscriberInterface
  10. {
  11.     public const PRIORITY_ONE 1;
  12.     /**
  13.      * Doctrine entity manager.
  14.      *
  15.      * @var EntityManager
  16.      */
  17.     protected $entityManager;
  18.     public function __construct(EntityManagerInterface $entityManager)
  19.     {
  20.         $this->entityManager $entityManager;
  21.     }
  22.     /**
  23.      * Update compound minimun Price upon changs in its units prices.
  24.      *
  25.      * @throws \Doctrine\ORM\ORMException
  26.      * @throws \Doctrine\ORM\OptimisticLockException
  27.      */
  28.     public function postSaveProjectUnitEvent(ListingEvent $event): void
  29.     {
  30.         $listing $event->getListing();
  31.         $parentListing $listing->getParent();
  32.         if ($parentListing && $parentListing->getCompoundField()) {
  33.             $listingHasCompoundFieldRecord $parentListing->getCompoundField();
  34.             $listingHasNullMinPrice $listingHasCompoundFieldRecord && null === $listingHasCompoundFieldRecord->getMinPrice();
  35.             $listingHasNullMinArea $listingHasCompoundFieldRecord && null === $listingHasCompoundFieldRecord->getMinArea();
  36.             $isEqualToPrice = !$this->isLiveListing($listing) && $listing->getPrice() == $this->getMinimumPrice($parentListing);
  37.             $isLiveListing $this->isLiveListing($listing);
  38.             $listingChildrenCount $this->entityManager->getRepository(Listing::class)->getListingChildrenCount($parentListing);
  39.             $this->setMinArea($listing$listingHasNullMinArea$parentListing);
  40.             $parentListing->getCompoundField()->setUpdatedAt(new \DateTime());
  41.             if ($listingHasNullMinPrice || $isLiveListing || $isEqualToPrice) {
  42.                 $this->setMinimumPrice($listing);
  43.             }
  44.             if (!$isLiveListing && == $listingChildrenCount) {
  45.                 $this->resetCompoundFieldData($parentListing);
  46.             }
  47.             $this->entityManager->persist($parentListing);
  48.             $this->entityManager->flush();
  49.         }
  50.     }
  51.     public static function getSubscribedEvents()
  52.     {
  53.         return [
  54.             'aqarmap.project.re_calculate.min_price_area' => ['postSaveProjectUnitEvent'self::PRIORITY_ONE],
  55.         ];
  56.     }
  57.     /**
  58.      * @return int
  59.      */
  60.     private function getMinimumPrice($parentListing)
  61.     {
  62.         $minimumPrice null;
  63.         if (null !== $parentListing->getCompoundField()) {
  64.             $minimumPrice $parentListing->getCompoundField()->getMinPrice();
  65.         }
  66.         return $minimumPrice;
  67.     }
  68.     /**
  69.      * @param Listing
  70.      *
  71.      * @return Listing
  72.      */
  73.     private function setMinimumPrice($listing)
  74.     {
  75.         $projectUntistMinPrice $this->entityManager->getRepository(Listing::class)->getProjectUnitsMinPrice($listing);
  76.         $parentListing $listing->getParent();
  77.         $parentListing->getCompoundField()->setMinPrice($projectUntistMinPrice);
  78.         return $parentListing;
  79.     }
  80.     /**
  81.      * @return int
  82.      */
  83.     private function getMinimumArea($parentListing)
  84.     {
  85.         $minimumArea null;
  86.         if (null !== $parentListing->getCompoundField()) {
  87.             $minimumArea $parentListing->getCompoundField()->getMinArea();
  88.         }
  89.         return $minimumArea;
  90.     }
  91.     /**
  92.      * @param Listing
  93.      *
  94.      * @return Listing
  95.      */
  96.     private function setMinimumArea($listing)
  97.     {
  98.         $projectUntistMinArea $this->entityManager->getRepository(Listing::class)->getProjectUnitsMinArea($listing);
  99.         $parentListing $listing->getParent();
  100.         $parentListing->getCompoundField()->setMinArea($projectUntistMinArea);
  101.         return $parentListing;
  102.     }
  103.     /**
  104.      * @return bool
  105.      */
  106.     private function isLiveListing($listing)
  107.     {
  108.         return ListingStatus::LIVE == $listing->getStatus();
  109.     }
  110.     /**
  111.      * @param Listing
  112.      *
  113.      * @return Listing
  114.      */
  115.     private function setMinArea($listing$listingHasNullMinArea$parentListing)
  116.     {
  117.         $isEqualToArea = !$this->isLiveListing($listing) && $listing->getArea() == $this->getMinimumArea($parentListing);
  118.         $isLiveListing $this->isLiveListing($listing);
  119.         if ($listingHasNullMinArea || $isEqualToArea || $isLiveListing) {
  120.             $parentListing $this->setMinimumArea($listing);
  121.         }
  122.         return $parentListing;
  123.     }
  124.     /**
  125.      * @param Listing
  126.      *
  127.      * @return Listing
  128.      */
  129.     private function resetCompoundFieldData($listing)
  130.     {
  131.         $listing->getCompoundField()->setMinArea(null);
  132.         $listing->getCompoundField()->setMinPrice(null);
  133.         return $listing;
  134.     }
  135. }