<?php
namespace App\Entity;
use App\Entity\Traits\TimeStampable;
use App\Repository\MeetingRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use App\Entity\Traits\TimeStampableTrait;
#[ORM\Entity(repositoryClass: MeetingRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Meeting
{
use TimeStampable;
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(nullable: true)]
private ?\DateTimeImmutable $expectedStartDate = null;
#[ORM\Column(nullable:true)]
#[Assert\NotBlank(message: "ce champ est obligatoire.")]
#[Assert\GreaterThanOrEqual(
value: "today",
message: "La date de la réunion ne peut pas être inférieure à la date du jour."
)]
private ?\DateTimeImmutable $effectiveStartDate = null;
#[ORM\Column(length: 16, nullable: true)]
private ?string $estimatedDuration = null;
#[ORM\Column(length: 16, nullable: true)]
private ?string $effectiveDuration = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $observation = null;
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: true)]
private ?User $createdBy = null;
#[ORM\Column(length: 255)]
private ?string $location;
#[ORM\ManyToOne(targetEntity: Structure::class, inversedBy: 'meetings')]
#[ORM\JoinColumn(nullable: true)]
private ?Structure $structure = null;
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'meetings')]
#[ORM\JoinColumn(nullable: true)]
private ?User $user = null;
#[ORM\Column(length: 65, nullable: true)]
private ?string $reportFilename = null;
#[ORM\Column(length: 255)]
#[Assert\NotBlank(message: "ce champ est obligatoire.")]
private ?string $objet;
#[ORM\Column(length: 255)]
private ?string $status = null;
#[ORM\Column(length: 10, nullable: true)]
#[Assert\NotBlank(message: "ce champ est obligatoire.")]
private ?string $heureReunion = null;
#[ORM\OneToMany(mappedBy: 'meet', targetEntity: MeetParticipant::class, cascade: ['persist', 'remove'])]
private Collection $meetParticipants;
#[ORM\ManyToOne(inversedBy: 'meetings')]
#[Assert\NotBlank(message: "ce champ est obligatoire.")]
private ?MeetingCategory $meetingCategories = null;
#[ORM\OneToMany(mappedBy: 'meeting', targetEntity: Agenda::class, cascade: ['persist', 'remove'])]
private Collection $agendas;
#[ORM\Column]
private ?bool $isConfirmed = null;
public function __construct()
{
$this->createdAt = new \DateTimeImmutable();
$this->status = "Brouillon";
$this->meetParticipants = new ArrayCollection();
$this->agendas = new ArrayCollection();
$this->isConfirmed = false;
}
public function getId(): ?int
{
return $this->id;
}
public function getExpectedStartDate(): ?\DateTimeImmutable
{
return $this->expectedStartDate;
}
public function setExpectedStartDate(?\DateTimeImmutable $expectedStartDate): self
{
$this->expectedStartDate = $expectedStartDate;
return $this;
}
public function getEffectiveStartDate(): ?\DateTimeImmutable
{
return $this->effectiveStartDate;
}
public function setEffectiveStartDate(?\DateTimeImmutable $effectiveStartDate): self
{
$this->effectiveStartDate = $effectiveStartDate;
return $this;
}
public function getEstimatedDuration(): ?string
{
return $this->estimatedDuration;
}
public function setEstimatedDuration(?string $estimatedDuration): self
{
$this->estimatedDuration = $estimatedDuration;
return $this;
}
public function getEffectiveDuration(): ?string
{
return $this->effectiveDuration;
}
public function setEffectiveDuration(?string $effectiveDuration): self
{
$this->effectiveDuration = $effectiveDuration;
return $this;
}
public function getObservation(): ?string
{
return $this->observation;
}
public function setObservation(?string $observation): self
{
$this->observation = $observation;
return $this;
}
public function getCreatedBy(): ?User
{
return $this->createdBy;
}
public function setCreatedBy(?User $createdBy): self
{
$this->createdBy = $createdBy;
return $this;
}
public function getLocation(): ?string
{
return $this->location;
}
public function setLocation(?string $location): self
{
$this->location = $location;
return $this;
}
public function getStructure(): ?Structure
{
return $this->structure;
}
public function setStructure(?Structure $structure): self
{
$this->structure = $structure;
$this->user = null; // S'assurer qu'on ne garde pas les deux
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
$this->structure = null; // S'assurer qu'on ne garde pas les deux
return $this;
}
public function getReportFilename(): ?string
{
return $this->reportFilename;
}
public function setReportFilename(?string $reportFilename): self
{
$this->reportFilename = $reportFilename;
return $this;
}
public function getObjet(): ?string
{
return $this->objet;
}
public function setObjet(string $objet): self
{
$this->objet = $objet;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(string $status): self
{
$this->status = $status;
return $this;
}
public function getHeureReunion(): ?string
{
return $this->heureReunion;
}
public function setHeureReunion(?string $heureReunion): self
{
$this->heureReunion = $heureReunion;
return $this;
}
public function __toString(): string
{
return $this->objet;
}
/**
* @return Collection<int, MeetParticipant>
*/
public function getMeetParticipants(): Collection
{
return $this->meetParticipants;
}
public function addMeetParticipant(MeetParticipant $meetParticipant): self
{
if (!$this->meetParticipants->contains($meetParticipant)) {
$this->meetParticipants->add($meetParticipant);
$meetParticipant->setMeet($this);
}
return $this;
}
public function removeMeetParticipant(MeetParticipant $meetParticipant): self
{
if ($this->meetParticipants->removeElement($meetParticipant)) {
// set the owning side to null (unless already changed)
if ($meetParticipant->getMeet() === $this) {
$meetParticipant->setMeet(null);
}
}
return $this;
}
public function getMeetingCategories(): ?MeetingCategory
{
return $this->meetingCategories;
}
public function setMeetingCategories(?MeetingCategory $meetingCategories): self
{
$this->meetingCategories = $meetingCategories;
$this->meetingCategories->setIsDeleted(false);
return $this;
}
/**
* @return Collection<int, Agenda>
*/
public function getAgendas(): Collection
{
return $this->agendas;
}
public function addAgenda(Agenda $agenda): self
{
if (!$this->agendas->contains($agenda)) {
$this->agendas->add($agenda);
$agenda->setMeeting($this);
}
return $this;
}
public function removeAgenda(Agenda $agenda): self
{
if ($this->agendas->removeElement($agenda)) {
// set the owning side to null (unless already changed)
if ($agenda->getMeeting() === $this) {
$agenda->setMeeting(null);
}
}
return $this;
}
public function isIsConfirmed(): ?bool
{
return $this->isConfirmed;
}
public function setIsConfirmed(bool $isConfirmed): self
{
$this->isConfirmed = $isConfirmed;
return $this;
}
public function getUsersAssign(): array
{
$participants = [];
foreach ($this->meetParticipants as $participant) {
$participants[] = $participant->getParticipants();
}
return $participants;
}
public function getUserNotAssign(array $users): array
{
$userAssign = $this->getUsersAssign();
$userNotAssing = array_diff($users, $userAssign);
return $userNotAssing;
}
/**
* Convertit l'heure et les minutes en format heureReunion (HH:mm)
*/
public function setHeureFromDateTime(\DateTimeInterface $dateTime): self
{
$this->heureReunion = $dateTime->format('H:i');
return $this;
}
/**
* Retourne l'heure au format DateTime
*/
public function getHeureAsDateTime(): ?\DateTime
{
if (!$this->heureReunion) {
return null;
}
return \DateTime::createFromFormat('H:i', $this->heureReunion);
}
}