<?php
namespace App\Entity\Channel;
use App\Entity\Account\User;
use App\Entity\Common\ImportableData\ImportableDataInterface;
use App\Entity\Common\ImportableData\ImportableDataTrait;
use App\Entity\Sync\SyncableInterface;
use App\Repository\Channel\SessionRepository;
use App\Validator\Constraints as AppAssert;
use Doctrine\ORM\Mapping as ORM;
use Drosalys\Bundle\ApiBundle\Serializer\Attributes\IdGroups;
use Nellapp\Bundle\SDKBundle\Channel\Entity\ChannelInterface;
use Nellapp\Bundle\SDKBundle\Channel\Entity\Session\SessionInterface;
use Nellapp\Bundle\SDKBundle\Channel\Entity\Session\SessionMethodTrait;
use Nellapp\Bundle\SDKBundle\Enum\Session\SessionStatusEnum;
use Nellapp\Bundle\SDKBundle\Notification\Entity\NotifiableInterface;
use Nellapp\Bundle\SDKBundle\Notification\Entity\NotifiableTrait;
use Nellapp\Bundle\SDKBundle\Permission\Entity\ChannelResourceInterface;
use Nellapp\Bundle\SDKBundle\Sync\EntityKeys;
use Symfony\Component\Serializer\Annotation as Serial;
use Symfony\Component\Validator\Constraints as Assert;
#[
ORM\Entity(repositoryClass: SessionRepository::class),
ORM\Table(name: 'channel_sessions')
]
class Session implements SyncableInterface, SessionInterface, ChannelResourceInterface, ImportableDataInterface, NotifiableInterface
{
use NotifiableTrait;
use SessionMethodTrait;
use ImportableDataTrait;
#[ORM\Id, ORM\GeneratedValue, ORM\Column(type: 'integer')]
#[Serial\Groups(['Manager', 'Sync'])]
protected ?int $id = null;
#[ORM\Column(type: 'datetime')]
#[Assert\NotBlank(groups: ['Default', 'flow_sessionCreate_step1'])]
#[Serial\Groups(['Manager', 'Sync'])]
private ?\DateTimeInterface $startAt = null;
#[ORM\Column(type: 'datetime', nullable: true)]
#[
Assert\GreaterThanOrEqual(propertyPath: 'startAt', message: 'channel.session.endAt.GreaterThan', groups: ['Default', 'flow_sessionCreate_step1']),
AppAssert\DateWithinIntervalOf(reference: 'startAt', maxInterval: 'P5Y', message: 'channel.session.endAt.MaxDate', groups: ['Default', 'flow_sessionCreate_step1']),
Assert\NotBlank(groups: ['Default', 'flow_sessionCreate_step1'])
]
#[Serial\Groups(['Manager', 'Sync'])]
private ?\DateTimeInterface $endAt = null;
#[ORM\ManyToOne(targetEntity: Training::class, cascade: ['persist'])]
#[IdGroups(groups: 'Sync')]
#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
private ?Training $training = null;
#[ORM\OneToOne(inversedBy: 'session', targetEntity: Group::class, cascade: ['persist', 'remove'])]
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
#[Assert\Valid(groups: ['Default', 'flow_sessionCreate_step1'])]
#[IdGroups(groups: 'Sync')]
#[Serial\Groups(['Manager'])]
private ?Group $group = null;
#[ORM\Column(type: 'text', length: 5000, nullable: true)]
#[Assert\Length(max: 5000, maxMessage: 'channel.session.description.Length.max', groups: ['Default', 'flow_sessionCreate_step2'])]
#[Serial\Groups(['Manager', 'Sync'])]
private ?string $description = null;
#[ORM\Column(type: 'boolean', options: ['default' => false])]
#[Serial\Groups(['Sync'])]
private bool $hasSignaturesDeactivated = false;
#[ORM\Column(type: 'boolean', options: ['default' => true])]
#[Serial\Groups(['Sync'])]
private bool $hasCanalVisible = true;
#[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])]
#[
Assert\GreaterThanOrEqual(value: 0, message: 'session.durationInCenter.GreaterThan', groups: ['Default', 'flow_sessionCreate_step2']),
Assert\NotBlank(groups: ['Default', 'flow_sessionCreate_step2'])
]
private int $durationInCenter = 0;
#[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])]
#[
Assert\GreaterThanOrEqual(value: 0, message: 'session.durationInCompany.GreaterThan', groups: ['Default', 'flow_sessionCreate_step2']),
Assert\NotBlank(groups: ['Default', 'flow_sessionCreate_step2'])
]
private int $durationInCompany = 0;
#[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])]
#[
Assert\GreaterThanOrEqual(value: 0, message: 'session.durationInVisio.GreaterThan', groups: ['Default', 'flow_sessionCreate_step2']),
Assert\NotBlank(groups: ['Default', 'flow_sessionCreate_step2'])
]
private int $durationInVisio = 0;
#[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])]
#[
Assert\GreaterThanOrEqual(value: 0, message: 'session.durationInELearning.GreaterThan', groups: ['Default', 'flow_sessionCreate_step2']),
Assert\NotBlank(groups: ['Default', 'flow_sessionCreate_step2'])
]
private int $durationInELearning = 0;
#[ORM\Column(type: 'integer', nullable: false, options: ['default' => 0])]
#[
Assert\GreaterThanOrEqual(value: 0, message: 'session.durationInExam.GreaterThan', groups: ['Default', 'flow_sessionCreate_step2']),
Assert\NotBlank(groups: ['Default', 'flow_sessionCreate_step2'])
]
private int $durationInExam = 0;
public static function getPermissionResourceClass(): string
{
return ChannelUserSessionPermission::class;
}
public function getOwnerChannel(): ?ChannelInterface
{
return $this->getChannel();
}
public function getStatus(): string
{
$now = (new \DateTime())->setTime(0, 0, 0);
if ($this->getStartAt() > $now) {
return SessionStatusEnum::NOT_STARTED;
} else if($this->getEndAt() < $now) {
return SessionStatusEnum::FINISHED;
}
return SessionStatusEnum::RUNNING;
}
public function getPlace(): ?Place
{
return $this->getGroup()?->getPlace();
}
public static function getSyncKey(): string
{
return EntityKeys::CHANNEL_SESSION;
}
public function getSyncDisplayLabel(): string
{
return $this->getLabel() ?? '';
}
public function getDurationInCenter(): int
{
return $this->durationInCenter;
}
public function setDurationInCenter(int $durationInCenter): static
{
$this->durationInCenter = $durationInCenter;
return $this;
}
public function getDurationInCompany(): int
{
return $this->durationInCompany;
}
public function setDurationInCompany(int $durationInCompany): static
{
$this->durationInCompany = $durationInCompany;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getUserIds(): array
{
if (null === $group = $this->getGroup()) {
return [];
}
return $group->getUsers()->map(function (User $user) {
return $user->getId();
})->filter(function (?string $id) {
return null !== $id;
})->toArray();
}
public function getTraining(): ?Training
{
return $this->training;
}
public function setTraining(?Training $training): static
{
$this->training = $training;
return $this;
}
public function getDurationInVisio(): int
{
return $this->durationInVisio;
}
public function setDurationInVisio(int $durationInVisio): static
{
$this->durationInVisio = $durationInVisio;
return $this;
}
public function getDurationInELearning(): int
{
return $this->durationInELearning;
}
public function setDurationInELearning(int $durationInELearning): static
{
$this->durationInELearning = $durationInELearning;
return $this;
}
public function getDurationInExam(): int
{
return $this->durationInExam;
}
public function setDurationInExam(int $durationInExam): static
{
$this->durationInExam = $durationInExam;
return $this;
}
public function getTotalDuration(): int
{
return $this->durationInCenter + $this->durationInVisio + $this->durationInELearning + $this->durationInExam + $this->durationInCompany;
}
}