src/Entity/LearningCourses/LearningCourse.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Entity\LearningCourses;
  3. use App\Annotation\SiteAware;
  4. use App\Entity\AbstractBase;
  5. use App\Entity\Interfaces\SiteInterface;
  6. use App\Entity\MiniAbstractBase;
  7. use App\Entity\Traits\ActiveTrait;
  8. use App\Entity\Traits\DescriptionTrait;
  9. use App\Entity\Traits\ImageFileNameTrait;
  10. use App\Entity\Traits\ImageFileTrait;
  11. use App\Entity\Traits\NameTrait;
  12. use App\Entity\Traits\SiteTrait;
  13. use App\Entity\User;
  14. use App\Enum\LearningCourseTypeEnum;
  15. use App\Repository\LearningCourses\LearningCourseRepository;
  16. use DateTimeImmutable;
  17. use DateTimeInterface;
  18. use Doctrine\Common\Collections\ArrayCollection;
  19. use Doctrine\Common\Collections\Collection;
  20. use Doctrine\ORM\Mapping as ORM;
  21. use Gedmo\Mapping\Annotation as Gedmo;
  22. use Symfony\Component\HttpFoundation\File\File;
  23. use Symfony\Component\Security\Core\User\UserInterface;
  24. use Vich\UploaderBundle\Mapping\Annotation as Vich;
  25. /**
  26.  * @ORM\Table(name="vulco_learning_course", indexes={@ORM\Index(name="learning_course_site_idx", columns={"site"})})
  27.  * @ORM\Entity(repositoryClass=LearningCourseRepository::class)
  28.  * @Gedmo\SoftDeleteable(fieldName="removedAt", timeAware=false)
  29.  * @SiteAware(siteFieldName="site")
  30.  * @Vich\Uploadable
  31.  */
  32. class LearningCourse extends AbstractBase implements SiteInterface
  33. {
  34.     use ActiveTrait;
  35.     use DescriptionTrait;
  36.     use ImageFileTrait;
  37.     use ImageFileNameTrait;
  38.     use NameTrait;
  39.     use SiteTrait;
  40.     /**
  41.      * @ORM\ManyToMany(targetEntity="App\Entity\User")
  42.      * @ORM\JoinTable(name="vulco_learning_courses_users",
  43.      *     joinColumns={@ORM\JoinColumn(name="learning_course_id", referencedColumnName="id")},
  44.      *     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
  45.      * )
  46.      */
  47.     private ?Collection $associatedUsers;
  48.     /**
  49.      * @ORM\ManyToOne(targetEntity="LearningCourseCategory", inversedBy="courses")
  50.      */
  51.     private ?LearningCourseCategory $category null;
  52.     /**
  53.      * @ORM\OneToMany(targetEntity="LearningCourseRegistration", mappedBy="course", cascade={"persist", "remove"})
  54.      */
  55.     private ?Collection $registrations// order here is important because cascade remove will remove registrations before sessions
  56.     /**
  57.      * @ORM\OneToMany(targetEntity="LearningCourseSession", mappedBy="course", cascade={"persist", "remove"})
  58.      * @ORM\OrderBy({"date": "ASC"})
  59.      */
  60.     private ?Collection $sessions;
  61.     /**
  62.      * @ORM\Column(type="string", length=255, nullable=false)
  63.      */
  64.     private string $name;
  65.     /**
  66.      * @ORM\Column(type="text", length=10000, nullable=true)
  67.      */
  68.     private ?string $description;
  69.     /**
  70.      * @Vich\UploadableField(mapping="learning_course_image", fileNameProperty="imageFileName")
  71.      */
  72.     private ?File $imageFile null;
  73.     /**
  74.      * @ORM\Column(type="string", length=255, nullable=true)
  75.      */
  76.     private ?string $imageFileName null;
  77.     /**
  78.      * @ORM\Column(type="integer", nullable=false, options={"default": 0})
  79.      */
  80.     private int $type 0;
  81.     /**
  82.      * @ORM\Column(type="integer", nullable=false, options={"default": 0})
  83.      */
  84.     private int $status 0;
  85.     /**
  86.      * @ORM\Column(type="string", length=255, nullable=true)
  87.      */
  88.     private ?string $totalHours '';
  89.     /**
  90.      * @ORM\Column(type="integer", nullable=false, options={"default": 0})
  91.      */
  92.     private int $maximumCapacity 0;
  93.     /**
  94.      * @ORM\Column(type="boolean", nullable=false, options={"default": 1})
  95.      */
  96.     private bool $limitRegistrationsPerGarage true;
  97.     /**
  98.      * @ORM\Column(type="datetime", nullable=true)
  99.      */
  100.     private ?DateTimeInterface $endRegistrationPeriod;
  101.     /**
  102.      * @ORM\Column(type="boolean", nullable=false, options={"default": 1})
  103.      */
  104.     private bool $active true;
  105.     public function __construct()
  106.     {
  107.         $this->associatedUsers = new ArrayCollection();
  108.         $this->sessions = new ArrayCollection();
  109.         $this->registrations = new ArrayCollection();
  110.     }
  111.     public function getAssociatedUsersAmount(): int
  112.     {
  113.         return $this->getAssociatedUsers()->count();
  114.     }
  115.     public function getAssociatedUsers(): Collection
  116.     {
  117.         return $this->associatedUsers;
  118.     }
  119.     public function setAssociatedUsers(?Collection $associatedUsers): self
  120.     {
  121.         $this->associatedUsers $associatedUsers;
  122.         return $this;
  123.     }
  124.     public function addAssociatedUser(User $associatedUser): self
  125.     {
  126.         if (!$this->associatedUsers->contains($associatedUser)) {
  127.             $this->associatedUsers->add($associatedUser);
  128.         }
  129.         return $this;
  130.     }
  131.     public function removeAssociatedUser(User $associatedUser): self
  132.     {
  133.         if ($this->associatedUsers->contains($associatedUser)) {
  134.             $this->associatedUsers->removeElement($associatedUser);
  135.         }
  136.         return $this;
  137.     }
  138.     public function getSessions(): Collection
  139.     {
  140.         return $this->sessions;
  141.     }
  142.     public function addSession(LearningCourseSession $session): self
  143.     {
  144.         if (!$this->getSessions()->contains($session)) {
  145.             $session->setCourse($this);
  146.             $this->sessions->add($session);
  147.         }
  148.         return $this;
  149.     }
  150.     public function removeSession(LearningCourseSession $session): self
  151.     {
  152.         if ($this->getSessions()->contains($session)) {
  153.             $this->sessions->removeElement($session);
  154.         }
  155.         return $this;
  156.     }
  157.     public function getSessionsAmount(): int
  158.     {
  159.         return $this->getSessions()->count();
  160.     }
  161.     public function getRegistrations(): Collection
  162.     {
  163.         return $this->registrations;
  164.     }
  165.     public function getRegistrationsAmount(): int
  166.     {
  167.         return $this->getRegistrations()->count();
  168.     }
  169.     public function addRegistration(LearningCourseRegistration $registration): self
  170.     {
  171.         if (!$this->getRegistrations()->contains($registration)) {
  172.             $registration->setCourse($this);
  173.             $this->getRegistrations()->add($registration);
  174.         }
  175.         return $this;
  176.     }
  177.     public function removeRegistration(LearningCourseRegistration $registration): self
  178.     {
  179.         if ($this->getRegistrations()->contains($registration)) {
  180.             $this->getRegistrations()->removeElement($registration);
  181.         }
  182.         return $this;
  183.     }
  184.     public function getCategory(): ?LearningCourseCategory
  185.     {
  186.         return $this->category;
  187.     }
  188.     public function getCategoryName(): string
  189.     {
  190.         return $this->getCategory() ? $this->getCategory()->getName() : MiniAbstractBase::DEFAULT_EMPTY_STRING;
  191.     }
  192.     public function setCategory(?LearningCourseCategory $category): self
  193.     {
  194.         $this->category $category;
  195.         return $this;
  196.     }
  197.     public function getType(): int
  198.     {
  199.         return $this->type;
  200.     }
  201.     public function getTypeAsTranlationKeyString(): string
  202.     {
  203.         return LearningCourseTypeEnum::getTranslatedEnumArray()[$this->getType()];
  204.     }
  205.     public function setType(int $type): self
  206.     {
  207.         $this->type $type;
  208.         return $this;
  209.     }
  210.     public function getStatus(): int
  211.     {
  212.         return $this->status;
  213.     }
  214.     public function setStatus(int $status): self
  215.     {
  216.         $this->status $status;
  217.         return $this;
  218.     }
  219.     public function getTotalHours(): ?string
  220.     {
  221.         return $this->totalHours;
  222.     }
  223.     public function setTotalHours(?string $totalHours): self
  224.     {
  225.         $this->totalHours $totalHours;
  226.         return $this;
  227.     }
  228.     public function getMaximumCapacity(): int
  229.     {
  230.         return $this->maximumCapacity;
  231.     }
  232.     public function getCurrentCapacity(): int
  233.     {
  234.         return $this->getRegistrationsAmount();
  235.     }
  236.     public function getAvailableRegistersAmount(): int
  237.     {
  238.         return $this->getMaximumCapacity() - $this->getRegistrationsAmount();
  239.     }
  240.     public function isFull(): bool
  241.     {
  242.         return $this->getAvailableRegistersAmount() <= 0;
  243.     }
  244.     public function isRegistered(UserInterface $user): bool
  245.     {
  246.         /** @var LearningCourseRegistration $registration */
  247.         foreach ($this->getRegistrations() as $registration) {
  248.             if ($registration->getAssociatedUser() === $user) {
  249.                 return true;
  250.             }
  251.         }
  252.         return false;
  253.     }
  254.     public function setMaximumCapacity(int $maximumCapacity): self
  255.     {
  256.         $this->maximumCapacity $maximumCapacity;
  257.         return $this;
  258.     }
  259.     public function isLimitRegistrationsPerGarage(): bool
  260.     {
  261.         return $this->limitRegistrationsPerGarage;
  262.     }
  263.     public function setLimitRegistrationsPerGarage(bool $limitRegistrationsPerGarage): LearningCourse
  264.     {
  265.         $this->limitRegistrationsPerGarage $limitRegistrationsPerGarage;
  266.         return $this;
  267.     }
  268.     public function getEndRegistrationPeriod(): ?DateTimeInterface
  269.     {
  270.         return $this->endRegistrationPeriod;
  271.     }
  272.     public function isEndRegistrationPeriodExpired(): bool
  273.     {
  274.         return $this->getEndRegistrationPeriod() && (new DateTimeImmutable())->format('Y/m/d') > $this->getEndRegistrationPeriod()->format('Y/m/d');
  275.     }
  276.     public function getEndRegistrationPeriodAsString(): string
  277.     {
  278.         return $this->getDateAsString($this->endRegistrationPeriod);
  279.     }
  280.     public function setEndRegistrationPeriod(?DateTimeInterface $endRegistrationPeriod): self
  281.     {
  282.         $this->endRegistrationPeriod $endRegistrationPeriod;
  283.         return $this;
  284.     }
  285.     public function getCourseBeginDate(): ?DateTimeInterface
  286.     {
  287.         $firstDate null;
  288.         if ($this->getSessionsAmount() > 0) {
  289.             /** @var LearningCourseSession $session */
  290.             foreach ($this->getSessions() as $session) {
  291.                 if (is_null($firstDate)) {
  292.                     $firstDate $session->getDate();
  293.                 } elseif ($firstDate->format(MiniAbstractBase::DEFAULT_DATE_DATABASE_FORMAT) > $session->getDate()->format(MiniAbstractBase::DEFAULT_DATE_DATABASE_FORMAT)) {
  294.                     $firstDate $session->getDate();
  295.                 }
  296.             }
  297.         }
  298.         return $firstDate;
  299.     }
  300.     public function getCourseBeginDateAsString(): string
  301.     {
  302.         return $this->getDateAsString($this->getCourseBeginDate());
  303.     }
  304.     public function getCourseEndDate(): ?DateTimeInterface
  305.     {
  306.         $lastDate null;
  307.         if ($this->getSessionsAmount() > 0) {
  308.             /** @var LearningCourseSession $session */
  309.             foreach ($this->getSessions() as $session) {
  310.                 if (is_null($lastDate)) {
  311.                     $lastDate $session->getDate();
  312.                 } elseif ($lastDate->format(MiniAbstractBase::DEFAULT_DATE_DATABASE_FORMAT) <= $session->getDate()->format(MiniAbstractBase::DEFAULT_DATE_DATABASE_FORMAT)) {
  313.                     $lastDate $session->getDate();
  314.                 }
  315.             }
  316.         }
  317.         return $lastDate;
  318.     }
  319.     public function getCourseEndDateAsString(): string
  320.     {
  321.         return $this->getDateAsString($this->getCourseEndDate());
  322.     }
  323.     public function isExpired(): bool
  324.     {
  325.         return $this->getCourseEndDate() && (new DateTimeImmutable())->format('Y/m/d') > $this->getCourseEndDate()->format('Y/m/d');
  326.     }
  327. }