src/Entity/ChannelUserData/Cursus/Internship.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Entity\ChannelUserData\Cursus;
  3. use Nellapp\Bundle\SDKBundle\TrackData\Attribute\TrackEntity;
  4. use Nellapp\Bundle\SDKBundle\TrackData\Attribute\TrackFIeld;
  5. use App\Entity\Channel\Company;
  6. use App\Entity\ChannelUserData\AdminChannelUserData;
  7. use App\Entity\Common\Address;
  8. use App\Enum\ChannelUserData\Activity\CursusActivityTagEnum;
  9. use App\Repository\ChannelUserData\Cursus\InternshipRepository;
  10. use DateTimeImmutable;
  11. use DateTimeInterface;
  12. use Doctrine\ORM\Mapping as ORM;
  13. use DrosalysWeb\ObjectExtensions\Blame\Model\BlameInterface;
  14. use DrosalysWeb\ObjectExtensions\Blame\Model\BlameTrait;
  15. use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampInterface;
  16. use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampTrait;
  17. use Nellapp\Bundle\SDKBundle\Utils\NellappFormatService;
  18. use Symfony\Component\Validator\Constraints as Assert;
  19. #[
  20.     ORM\Entity(repositoryClass: InternshipRepository::class),
  21.     ORM\Table(name: 'channel_user_data_cursus_internship'),
  22.     TrackEntity(
  23.         name: 'internship.entity.track_data.entity.name',
  24.         fieldGroups: [
  25.             'internship' => [
  26.                 'tags' => [ CursusActivityTagEnum::INTERNSHIP ]
  27.             ],
  28.         ],
  29.     ),
  30. ]
  31. class Internship implements TimestampInterface, BlameInterface
  32. {
  33.     use TimestampTrait;
  34.     use BlameTrait;
  35.     public const START_DELAY = '-1 weeks';
  36.     public const END_DELAY   = '+2 weeks';
  37.     #[ORM\Id, ORM\GeneratedValue]
  38.     #[ORM\Column(type: 'integer')]
  39.     private ?int $id = null;
  40.     #[ORM\ManyToOne(targetEntity: AbstractCursus::class, inversedBy: 'internships')]
  41.     #[ORM\JoinColumn(nullable: false, onDelete: "CASCADE")]
  42.     private ?AbstractCursus $cursus = null;
  43.     #[ORM\Column(type: 'date')]
  44.     #[
  45.         Assert\NotBlank,
  46.     ]
  47.     #[TrackFIeld(name: 'internship.entity.startAt.label', fieldKey: 'internship', callable: 'format', callableParams: ['d/m/Y'])]
  48.     private ?DateTimeInterface $startAt = null;
  49.     #[ORM\Column(type: 'date')]
  50.     #[
  51.         Assert\NotBlank,
  52.     ]
  53.     #[TrackFIeld(name: 'internship.entity.endAt.label', fieldKey: 'internship', callable: 'format', callableParams: ['d/m/Y'])]
  54.     private ?DateTimeInterface $endAt = null;
  55.     #[ORM\Column(type: 'integer', nullable: true)]
  56.     #[TrackFIeld(name: 'internship.entity.duration.label', fieldKey: 'internship', callable: 'formatDuration', callableClass: NellappFormatService::class)]
  57.     #[Assert\GreaterThanOrEqual(value: 0)]
  58.     private ?int $duration = null;
  59.     #[ORM\Embedded(class: Address::class)]
  60.     #[Assert\Valid()]
  61.     #[TrackFIeld(name: 'internship.entity.address.label', fieldKey: 'internship', embeddedFields: [
  62.         'address.street' => 'internship.entity.addressStreet.label',
  63.         'address.postCode' => 'internship.entity.addressPostCode.label',
  64.         'address.city' => 'internship.entity.addressCity.label',
  65.         'address.country' => 'internship.entity.addressCountry.label',
  66.     ])]
  67.     private ?Address $address = null;
  68.     #[ORM\ManyToOne(targetEntity: Company::class, cascade: ['persist'], inversedBy: 'internships')]
  69.     #[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
  70.     #[TrackFIeld(name: 'internship.entity.company.label', fieldKey: 'internship')]
  71.     private ?Company $company = null;
  72.     #[ORM\ManyToOne(targetEntity: AdminChannelUserData::class, fetch: 'EAGER', inversedBy: 'internships')]
  73.     #[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
  74.     #[TrackFIeld(name: 'internship.entity.tutor.label', fieldKey: 'internship')]
  75.     private ?AdminChannelUserData $tutor = null;
  76.     public function getId(): ?int
  77.     {
  78.         return $this->id;
  79.     }
  80.     public function getCursus(): ?AbstractCursus
  81.     {
  82.         return $this->cursus;
  83.     }
  84.     public function setCursus(?AbstractCursus $cursus): static
  85.     {
  86.         $this->cursus = $cursus;
  87.         return $this;
  88.     }
  89.     public function getStartAt(): ?DateTimeInterface
  90.     {
  91.         return $this->startAt;
  92.     }
  93.     public function setStartAt(?DateTimeInterface $startAt): static
  94.     {
  95.         $this->startAt = $startAt;
  96.         return $this;
  97.     }
  98.     public function getEndAt(): ?DateTimeInterface
  99.     {
  100.         return $this->endAt;
  101.     }
  102.     public function setEndAt(?DateTimeInterface $endAt): static
  103.     {
  104.         $this->endAt = $endAt;
  105.         return $this;
  106.     }
  107.     public function isActiveWithDelays(): bool
  108.     {
  109.         $now = new DateTimeImmutable();
  110.         $start = $this->getStartAt()?->modify(self::START_DELAY) ?? null;
  111.         $end = $this->getEndAt()?->modify(self::END_DELAY) ?? null;
  112.         if ($start && $now < $start) {
  113.             return false;
  114.         }
  115.         if ($end && $now > $end) {
  116.             return false;
  117.         }
  118.         return true;
  119.     }
  120.     public function isEnded(): bool
  121.     {
  122.         return $this->endAt !==null && $this->endAt < new DateTimeImmutable();
  123.     }
  124.     public function isActive(): bool
  125.     {
  126.         return !$this->isEnded();
  127.     }
  128.     public function getDuration(): ?int
  129.     {
  130.         return $this->duration;
  131.     }
  132.     public function setDuration(?int $duration): static
  133.     {
  134.         $this->duration = $duration;
  135.         return $this;
  136.     }
  137.     public function getAddress(): ?Address
  138.     {
  139.         return $this->address;
  140.     }
  141.     public function setAddress(?Address $address): static
  142.     {
  143.         $this->address = $address;
  144.         return $this;
  145.     }
  146.     public function getCompany(): ?Company
  147.     {
  148.         return $this->company;
  149.     }
  150.     public function setCompany(?Company $company): static
  151.     {
  152.         $this->company = $company;
  153.         return $this;
  154.     }
  155.     public function getTutor(): ?AdminChannelUserData
  156.     {
  157.         return $this->tutor;
  158.     }
  159.     public function setTutor(?AdminChannelUserData $tutor): static
  160.     {
  161.         $this->tutor = $tutor;
  162.         return $this;
  163.     }
  164. }