<?php
namespace App\Entity;
use App\Repository\CollaboratorRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Uid\Uuid;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: CollaboratorRepository::class)]
class Collaborator
{
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 100)]
private string $firstName;
#[ORM\Column(length: 100)]
private string $lastName;
#[ORM\Column(length: 255)]
private string $email;
#[ORM\Column(length:255)]
private string $token;
// Stocke un tableau de couples [email => uuid]
#[ORM\Column(type: 'json')]
private array $clientEmails = [];
#[ORM\ManyToOne(targetEntity: AccountingFirm::class, inversedBy:'collaborators')]
private AccountingFirm $accountingFirm;
#[ORM\ManyToMany(targetEntity: SatisfactionClientSurvey::class, mappedBy: 'collaborators')]
private Collection $surveys;
private array $stats;
public function __construct()
{
$this->surveys = new ArrayCollection();
$this->accountingFirm = new AccountingFirm();
}
public function getId(): ?int
{
return $this->id;
}
public function getFirstName(): string
{
return $this->firstName;
}
public function setFirstName(string $firstName): self
{
$this->firstName = $firstName;
return $this;
}
public function getLastName(): string
{
return $this->lastName;
}
public function getFullName(): string
{
return $this->firstName . ' ' . $this->lastName;
}
public function setLastName(string $lastName): self
{
$this->lastName = $lastName;
return $this;
}
public function getEmail(): string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function getClientEmails(): array
{
return $this->clientEmails;
}
public function setClientEmails(array $clientEmails): self
{
$this->clientEmails = $clientEmails;
return $this;
}
/**
* Définit les clients à partir d'une chaîne d'emails séparés par virgule.
*/
public function setClientEmailsFromRawString(string $rawEmails): self
{
$emails = array_filter(array_map('trim', explode(',', $rawEmails)));
return $this->setClientEmailsFromArray($emails);
}
public function addClientEmailIfNotExists(string $email): self
{
if (!$this->hasClientEmail($email)) {
$this->clientEmails[] = [
'email' => $email,
'uuid' => Uuid::v4()->toRfc4122()
];
}
return $this;
}
/**
* Définit les clients à partir d’un tableau d’emails simples (et génère les UUID).
*/
public function setClientEmailsFromArray(array $emails): self
{
$this->clientEmails = array_map(function (string $email) {
return [
'email' => $email,
'uuid' => Uuid::v4()->toRfc4122()
];
}, array_filter(array_map('trim', $emails)));
return $this;
}
/**
* Retourne le token UUID associé à une adresse email, ou null si non trouvé.
*/
public function getTokenForClientEmail(string $email): ?string
{
foreach ($this->clientEmails as $entry) {
if (isset($entry['email']) && $entry['email'] === $email) {
return $entry['uuid'] ?? null;
}
}
return null;
}
/**
* @return Collection<int, SatisfactionClientSurvey>
*/
public function getSurveys(): Collection
{
return $this->surveys;
}
public function addSurvey(SatisfactionClientSurvey $survey): self
{
if (!$this->surveys->contains($survey)) {
$this->surveys->add($survey);
$survey->addCollaborator($this);
}
return $this;
}
public function removeSurvey(SatisfactionClientSurvey $survey): self
{
if ($this->surveys->removeElement($survey)) {
$survey->removeCollaborator($this);
}
return $this;
}
public function getAccountingFirm(): AccountingFirm
{
return $this->accountingFirm;
}
public function setAccountingFirm(AccountingFirm $accountingFirm): self
{
$this->accountingFirm = $accountingFirm;
return $this;
}
public function getStatsByCollaborator(): array
{
return $this->stats;
}
public function setStatsByCollaborator(array $statsByCollaborator): self
{
$this->stats = $statsByCollaborator;
return $this;
}
public function getToken(): ?string
{
return $this->token;
}
public function genToken(): self
{
$this->token = Uuid::v4()->toRfc4122();
return $this;
}
public function hasClientEmail(string $email): bool
{
foreach ($this->clientEmails as $entry) {
if (isset($entry['email']) && strtolower($entry['email']) === strtolower($email)) {
return true;
}
}
return false;
}
}