<?php
namespace App\Entity\ChannelUserData\Cursus;
use Nellapp\Bundle\SDKBundle\TrackData\Attribute\TrackEntity;
use Nellapp\Bundle\SDKBundle\TrackData\Attribute\TrackFIeld;
use App\Entity\Channel\Company;
use App\Entity\ChannelUserData\AdminChannelUserData;
use App\Entity\Common\Address;
use App\Enum\ChannelUserData\Activity\CursusActivityTagEnum;
use App\Repository\ChannelUserData\Cursus\InternshipRepository;
use DateTimeImmutable;
use DateTimeInterface;
use Doctrine\ORM\Mapping as ORM;
use DrosalysWeb\ObjectExtensions\Blame\Model\BlameInterface;
use DrosalysWeb\ObjectExtensions\Blame\Model\BlameTrait;
use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampInterface;
use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampTrait;
use Nellapp\Bundle\SDKBundle\Utils\NellappFormatService;
use Symfony\Component\Validator\Constraints as Assert;
#[
ORM\Entity(repositoryClass: InternshipRepository::class),
ORM\Table(name: 'channel_user_data_cursus_internship'),
TrackEntity(
name: 'internship.entity.track_data.entity.name',
fieldGroups: [
'internship' => [
'tags' => [ CursusActivityTagEnum::INTERNSHIP ]
],
],
),
]
class Internship implements TimestampInterface, BlameInterface
{
use TimestampTrait;
use BlameTrait;
public const START_DELAY = '-1 weeks';
public const END_DELAY = '+2 weeks';
#[ORM\Id, ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private ?int $id = null;
#[ORM\ManyToOne(targetEntity: AbstractCursus::class, inversedBy: 'internships')]
#[ORM\JoinColumn(nullable: false, onDelete: "CASCADE")]
private ?AbstractCursus $cursus = null;
#[ORM\Column(type: 'date')]
#[
Assert\NotBlank,
]
#[TrackFIeld(name: 'internship.entity.startAt.label', fieldKey: 'internship', callable: 'format', callableParams: ['d/m/Y'])]
private ?DateTimeInterface $startAt = null;
#[ORM\Column(type: 'date')]
#[
Assert\NotBlank,
]
#[TrackFIeld(name: 'internship.entity.endAt.label', fieldKey: 'internship', callable: 'format', callableParams: ['d/m/Y'])]
private ?DateTimeInterface $endAt = null;
#[ORM\Column(type: 'integer', nullable: true)]
#[TrackFIeld(name: 'internship.entity.duration.label', fieldKey: 'internship', callable: 'formatDuration', callableClass: NellappFormatService::class)]
#[Assert\GreaterThanOrEqual(value: 0)]
private ?int $duration = null;
#[ORM\Embedded(class: Address::class)]
#[Assert\Valid()]
#[TrackFIeld(name: 'internship.entity.address.label', fieldKey: 'internship', embeddedFields: [
'address.street' => 'internship.entity.addressStreet.label',
'address.postCode' => 'internship.entity.addressPostCode.label',
'address.city' => 'internship.entity.addressCity.label',
'address.country' => 'internship.entity.addressCountry.label',
])]
private ?Address $address = null;
#[ORM\ManyToOne(targetEntity: Company::class, cascade: ['persist'], inversedBy: 'internships')]
#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
#[TrackFIeld(name: 'internship.entity.company.label', fieldKey: 'internship')]
private ?Company $company = null;
#[ORM\ManyToOne(targetEntity: AdminChannelUserData::class, fetch: 'EAGER', inversedBy: 'internships')]
#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
#[TrackFIeld(name: 'internship.entity.tutor.label', fieldKey: 'internship')]
private ?AdminChannelUserData $tutor = null;
public function getId(): ?int
{
return $this->id;
}
public function getCursus(): ?AbstractCursus
{
return $this->cursus;
}
public function setCursus(?AbstractCursus $cursus): static
{
$this->cursus = $cursus;
return $this;
}
public function getStartAt(): ?DateTimeInterface
{
return $this->startAt;
}
public function setStartAt(?DateTimeInterface $startAt): static
{
$this->startAt = $startAt;
return $this;
}
public function getEndAt(): ?DateTimeInterface
{
return $this->endAt;
}
public function setEndAt(?DateTimeInterface $endAt): static
{
$this->endAt = $endAt;
return $this;
}
public function isActiveWithDelays(): bool
{
$now = new DateTimeImmutable();
$start = $this->getStartAt()?->modify(self::START_DELAY) ?? null;
$end = $this->getEndAt()?->modify(self::END_DELAY) ?? null;
if ($start && $now < $start) {
return false;
}
if ($end && $now > $end) {
return false;
}
return true;
}
public function isEnded(): bool
{
return $this->endAt !==null && $this->endAt < new DateTimeImmutable();
}
public function isActive(): bool
{
return !$this->isEnded();
}
public function getDuration(): ?int
{
return $this->duration;
}
public function setDuration(?int $duration): static
{
$this->duration = $duration;
return $this;
}
public function getAddress(): ?Address
{
return $this->address;
}
public function setAddress(?Address $address): static
{
$this->address = $address;
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): static
{
$this->company = $company;
return $this;
}
public function getTutor(): ?AdminChannelUserData
{
return $this->tutor;
}
public function setTutor(?AdminChannelUserData $tutor): static
{
$this->tutor = $tutor;
return $this;
}
}