src/EventSubscriber/EasyAdminSubscriber.php line 89

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\City;
  4. use App\Entity\Photo;
  5. use App\Entity\Coach;
  6. use App\Entity\Client;
  7. use App\Entity\Country;
  8. use App\Entity\HealthIndicator;
  9. use App\Entity\MeasurementItem;
  10. use App\Entity\SubgoalItem;
  11. use App\Entity\ClientInvoice;
  12. use App\Entity\FoodPeriod;
  13. use App\Entity\FoodDiary;
  14. use App\Entity\Training;
  15. use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
  16. use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
  17. use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
  18. use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityDeletedEvent;
  19. use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityDeletedEvent;
  20. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  21. use App\Helper\UniqueEntityProperty;
  22. use App\Helper\AvatarManager;
  23. use App\Helper\CoachInvoiceCreator;
  24. use App\Helper\FoodPeriodSetter;
  25. use App\Helper\FoodPeriodManager;
  26. use App\Helper\TrainingManager;
  27. use App\Helper\CoachManager;
  28. use App\Helper\ClientManager;
  29. class EasyAdminSubscriber implements EventSubscriberInterface
  30. {
  31.     private $uniqueEntityProperty;
  32.     private $avatarManager;
  33.     private $coachInvoiceCreator;
  34.     private $foodPeriodSetter;
  35.     private $foodPeriodManager;
  36.     private $trainingManager;
  37.     private $coachManager;
  38.     private $clientManager;
  39.     public function __construct(
  40.         UniqueEntityProperty $uniqueEntityProperty,
  41.         AvatarManager $avatarManager,
  42.         CoachInvoiceCreator $coachInvoiceCreator,
  43.         FoodPeriodSetter $foodPeriodSetter,
  44.         FoodPeriodManager $foodPeriodManager,
  45.         TrainingManager $trainingManager,
  46.         CoachManager $coachManager,
  47.         ClientManager $clientManager
  48.     )
  49.     {
  50.         $this->uniqueEntityProperty $uniqueEntityProperty;
  51.         $this->avatarManager $avatarManager;
  52.         $this->coachInvoiceCreator $coachInvoiceCreator;
  53.         $this->foodPeriodSetter $foodPeriodSetter;
  54.         $this->foodPeriodManager $foodPeriodManager;
  55.         $this->trainingManager $trainingManager;
  56.         $this->coachManager $coachManager;
  57.         $this->clientManager $clientManager;
  58.     }
  59.     public static function getSubscribedEvents()
  60.     {
  61.         return [
  62.             BeforeEntityPersistedEvent::class => ['beforePersisted'],
  63.             BeforeEntityUpdatedEvent::class => ['beforeUpdated'],
  64.             AfterEntityPersistedEvent::class => ['afterPersisted'],
  65.             BeforeEntityDeletedEvent::class => ['beforeDeleted'],
  66.         ];
  67.     }
  68.     public function beforeDeleted(BeforeEntityDeletedEvent $event) {
  69.         $this->removeTrainingFromClientsAndCoach($event);
  70.         $this->removeCoachFromClients($event);
  71.         $this->removePeriodFromDiaries($event);
  72.         $this->removeClientFromCoaches($event);
  73.     }
  74.     public function beforeUpdated(BeforeEntityUpdatedEvent $event) {
  75.         $this->setTrainingComplete($event);
  76.         $this->addTrainingToClient($event);
  77.         $this->addCoachToClients($event);
  78.         $this->addClientsToCoach($event);
  79.         $this->setFoodDiaryPeriod($event);
  80.     }
  81.     
  82.     public function beforePersisted(BeforeEntityPersistedEvent $event) {
  83.         $this->setAvatar($event);
  84.         $this->setUniqueProperty($event);
  85.         $this->addTrainingToClient($event);
  86.         $this->addActiveTrainingToCoach($event);
  87.         $this->addCoachToClients($event);
  88.         $this->addClientsToCoach($event);
  89.     }   
  90.     public function afterPersisted(AfterEntityPersistedEvent $event) {
  91.         $this->createCoachInvoice($event);
  92.     }
  93.     public function removePeriodFromDiaries($event
  94.     {
  95.         $entity $event->getEntityInstance();
  96.         if ($entity instanceof FoodPeriod) {
  97.             $this->foodPeriodManager->removeFromDiaries($entity);
  98.         }
  99.     }
  100.     public function addClientsToCoach($event
  101.     {
  102.         $entity $event->getEntityInstance();
  103.         if ($entity instanceof Training) {
  104.             $this->clientManager->addClientToCoach($entity);
  105.         }
  106.     }
  107.     public function removeClientFromCoaches($event)
  108.     {
  109.         $entity $event->getEntityInstance();
  110.         if (!$entity instanceof Client) {
  111.             return;
  112.         }
  113.         $this->clientManager->removeClientFromCoaches($entity);
  114.     }
  115.     public function removeCoachFromClients($event)
  116.     {
  117.         $entity $event->getEntityInstance();
  118.         if ($entity instanceof Training) {
  119.             $this->coachManager->removeCarefullyCoachFromClients($entity);
  120.         } elseif ($entity instanceof Coach) {
  121.             $this->coachManager->removeCoachFromClients($entity);
  122.         }
  123.     }
  124.     public function addCoachToClients($event)
  125.     {
  126.         $entity $event->getEntityInstance();
  127.         if ($entity instanceof Training) {
  128.             $this->coachManager->addCoachToClients($entity);
  129.         }
  130.     }
  131.     
  132.     public function removeTrainingFromClientsAndCoach($event)
  133.     {
  134.         $entity $event->getEntityInstance();
  135.         if ($entity instanceof Training) {
  136.             $this->trainingManager->removeFromClient($entity);
  137.             $this->trainingManager->removeActiveFromCoach($entity);
  138.             $this->trainingManager->removeCompletedFromCoach($entity);
  139.         }
  140.     }
  141.     public function addActiveTrainingToCoach($event)
  142.     {
  143.         $entity $event->getEntityInstance();
  144.         if ($entity instanceof Training) {
  145.             $this->trainingManager->addActiveToCoach($entity);
  146.         }
  147.     }
  148.     public function addTrainingToClient($event)
  149.     {
  150.         $entity $event->getEntityInstance();
  151.         if ($entity instanceof Training) {
  152.             $this->trainingManager->addToClient($entity);
  153.         }
  154.     }
  155.     public function setTrainingComplete($event)
  156.     {
  157.         $entity $event->getEntityInstance();
  158.         if (!$entity instanceof Training) {
  159.             return;
  160.         }
  161.         // no trainings
  162.         $list $entity->getList();
  163.         if (!$list) {
  164.             return;
  165.         }
  166.         foreach ($list as $training) {
  167.             if ($training['complete']) {
  168.                 continue;
  169.             }
  170.             // incomplete training
  171.             $entity->setComplete(false);
  172.             // remove completed training from clients and coach
  173.             $this->trainingManager->removeCompletedFromClients($entity);
  174.             $this->trainingManager->removeCompletedFromCoach($entity);
  175.             $this->trainingManager->addActiveToCoach($entity);
  176.             
  177.             return;
  178.         }
  179.         // complete training pack
  180.         $entity->setComplete();
  181.         // add completed training to clients and coach
  182.         $this->trainingManager->addCompletedToClients($entity);
  183.         $this->trainingManager->addCompletedToCoach($entity);
  184.         $this->trainingManager->removeActiveFromCoach($entity);
  185.     }
  186.     public function setFoodDiaryPeriod($event)
  187.     {
  188.         $entity $event->getEntityInstance();
  189.         if ($entity instanceof FoodDiary) {
  190.             $trainingPack $this->foodPeriodSetter->set($entity->getPhotos());
  191.             $entity->setPhotos($trainingPack);
  192.         }
  193.     }
  194.     public function setAvatar(BeforeEntityPersistedEvent $event)
  195.     {
  196.         $entity $event->getEntityInstance();
  197.         // avatar for coach
  198.         if ($entity instanceof Coach) {
  199.             // $entity->setAvatar = $this->avatarManager->getPhoto($entity->getAvatarFile());
  200.         // name for country
  201.         } elseif ($entity instanceof Client) {
  202.             // $name = $this->uniqueEntityProperty->getUniqueName($entity->getTitle(), Country::class);
  203.             // $entity->setName($name);
  204.         // name for health indicator
  205.         }
  206.     }
  207.     public function setUniqueProperty(BeforeEntityPersistedEvent $event)
  208.     {
  209.         $entity $event->getEntityInstance();
  210.         // name for city
  211.         if ($entity instanceof City) {
  212.             $name $this->uniqueEntityProperty->getUniqueName($entity->getTitle(), City::class);
  213.             $entity->setName($name);
  214.         // name for country
  215.         } elseif ($entity instanceof Country) {
  216.             $name $this->uniqueEntityProperty->getUniqueName($entity->getTitle(), Country::class);
  217.             $entity->setName($name);
  218.         // name for health indicator
  219.         } elseif ($entity instanceof HealthIndicator) {
  220.             $name $this->uniqueEntityProperty->getUniqueNamestr_replace(' ''_'$entity->getTitle()), HealthIndicator::class );
  221.             $entity->setName($name);
  222.         // name for measurment item
  223.         } elseif ($entity instanceof MeasurementItem) {
  224.             $name $this->uniqueEntityProperty->getUniqueNamestr_replace(' ''_'$entity->getTitle()), MeasurementItem::class );
  225.             $entity->setName($name);
  226.         // name for subgoal item
  227.         } elseif ($entity instanceof SubgoalItem) {
  228.             $name $this->uniqueEntityProperty->getUniqueNamestr_replace(' ''_'$entity->getTitle()), SubgoalItem::class );
  229.             $entity->setName($name);
  230.         // name for food period
  231.         } elseif ($entity instanceof FoodPeriod) {
  232.             $name $this->uniqueEntityProperty->getUniqueNamestr_replace(' ''_'$entity->getTitle()), FoodPeriod::class );
  233.             $entity->setName($name);
  234.         }
  235.     }
  236.     public function createCoachInvoice(AfterEntityPersistedEvent $event) {
  237.         $entity $event->getEntityInstance();
  238.         // name for city
  239.         if ($entity instanceof ClientInvoice) {
  240.             // create new invoice for coach
  241.             $this->coachInvoiceCreator->do($entity);
  242.         }
  243.     }
  244. }