Files
ludikevent_crm/src/Entity/Customer.php
Serreau Jovann 454b748973 ```
 feat(UtmEvent): Ajoute le tracking Umami des utilisateurs connectés.

Ajoute l'identification des utilisateurs Umami et enregistre la session.
Implémente une bannière de consentement pour les cookies et gère l'état.
```
2026-01-27 20:24:02 +01:00

361 lines
8.4 KiB
PHP

<?php
namespace App\Entity;
use App\Repository\CustomerRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
#[ORM\Entity(repositoryClass: CustomerRepository::class)]
class Customer implements UserInterface, PasswordAuthenticatedUserInterface
{
public const ROLE_CUSTOMER = 'ROLE_CUSTOMER';
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
// --- CHAMPS SÉCURITÉ & COMPTE ---
#[ORM\Column(length: 180, unique: true)]
private ?string $email = null;
#[ORM\Column(nullable: true)]
private array $roles = [];
#[ORM\Column(nullable: true)]
private ?string $password = null;
#[ORM\Column(options: ["default" => false])]
private bool $isAccountConfigured = false;
#[ORM\Column(length: 6, nullable: true)]
private ?string $verificationCode = null;
#[ORM\Column(nullable: true)]
private ?\DateTimeImmutable $verificationCodeExpiresAt = null;
// --- CHAMPS IDENTITÉ ---
#[ORM\Column(length: 255)]
private ?string $civ = null;
#[ORM\Column(length: 255)]
private ?string $name = null;
#[ORM\Column(length: 255)]
private ?string $surname = null;
#[ORM\Column(length: 255)]
private ?string $phone = null;
#[ORM\Column(length: 255)]
private ?string $type = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $siret = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $customerId = null;
// --- RELATIONS ---
/**
* @var Collection<int, CustomerAddress>
*/
#[ORM\OneToMany(targetEntity: CustomerAddress::class, mappedBy: 'customer')]
private Collection $customerAddresses;
/**
* @var Collection<int, Devis>
*/
#[ORM\OneToMany(targetEntity: Devis::class, mappedBy: 'customer')]
private Collection $devis;
/**
* @var Collection<int, ProductReserve>
*/
#[ORM\OneToMany(targetEntity: ProductReserve::class, mappedBy: 'customer')]
private Collection $productReserves;
/**
* @var Collection<int, Contrats>
*/
#[ORM\OneToMany(targetEntity: Contrats::class, mappedBy: 'customer')]
private Collection $contrats;
/**
* @var Collection<int, CustomerTracking>
*/
#[ORM\OneToMany(targetEntity: CustomerTracking::class, mappedBy: 'customer')]
private Collection $customerTrackings;
public function __construct()
{
$this->customerAddresses = new ArrayCollection();
$this->devis = new ArrayCollection();
$this->productReserves = new ArrayCollection();
$this->contrats = new ArrayCollection();
// Configuration par défaut
$this->roles = [self::ROLE_CUSTOMER];
$this->isAccountConfigured = false;
$this->customerTrackings = new ArrayCollection();
}
// --- MÉTHODES INTERFACES (SECURITY) ---
public function getUserIdentifier(): string
{
return (string) $this->email;
}
public function getRoles(): array
{
$roles = $this->roles;
$roles[] = self::ROLE_CUSTOMER;
return array_unique($roles);
}
public function setRoles(array $roles): static
{
$this->roles = $roles;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(?string $password): static
{
$this->password = $password;
return $this;
}
public function eraseCredentials(): void
{
}
// --- GETTERS & SETTERS PROPRES ---
public function getId(): ?int
{
return $this->id;
}
public function isAccountConfigured(): bool
{
return $this->isAccountConfigured;
}
public function setIsAccountConfigured(bool $isAccountConfigured): static
{
$this->isAccountConfigured = $isAccountConfigured;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): static
{
$this->email = $email;
return $this;
}
public function getCiv(): ?string
{
return $this->civ;
}
public function setCiv(string $civ): static
{
$this->civ = $civ;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): static
{
$this->name = $name;
return $this;
}
public function getSurname(): ?string
{
return $this->surname;
}
public function setSurname(string $surname): static
{
$this->surname = $surname;
return $this;
}
public function getPhone(): ?string
{
return $this->phone;
}
public function setPhone(string $phone): static
{
$this->phone = $phone;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(string $type): static
{
$this->type = $type;
return $this;
}
public function getSiret(): ?string
{
return $this->siret;
}
public function setSiret(?string $siret): static
{
$this->siret = $siret;
return $this;
}
public function getCustomerId(): ?string
{
return $this->customerId;
}
public function setCustomerId(?string $customerId): static
{
$this->customerId = $customerId;
return $this;
}
// --- LOGIQUE DES COLLECTIONS ---
/** @return Collection<int, CustomerAddress> */
public function getCustomerAddresses(): Collection
{
return $this->customerAddresses;
}
public function addCustomerAddress(CustomerAddress $address): static
{
if (!$this->customerAddresses->contains($address)) {
$this->customerAddresses->add($address);
$address->setCustomer($this);
}
return $this;
}
/** @return Collection<int, Devis> */
public function getDevis(): Collection
{
return $this->devis;
}
public function addDevi(Devis $devi): static
{
if (!$this->devis->contains($devi)) {
$this->devis->add($devi);
$devi->setCustomer($this);
}
return $this;
}
/** @return Collection<int, Contrats> */
public function getContrats(): Collection
{
return $this->contrats;
}
public function addContrat(Contrats $contrat): static
{
if (!$this->contrats->contains($contrat)) {
$this->contrats->add($contrat);
$contrat->setCustomer($this);
}
return $this;
}
/**
* @return string|null
*/
public function getVerificationCode(): ?string
{
return $this->verificationCode;
}
/**
* @return \DateTimeImmutable|null
*/
public function getVerificationCodeExpiresAt(): ?\DateTimeImmutable
{
return $this->verificationCodeExpiresAt;
}
/**
* @param \DateTimeImmutable|null $verificationCodeExpiresAt
*/
public function setVerificationCodeExpiresAt(?\DateTimeImmutable $verificationCodeExpiresAt): void
{
$this->verificationCodeExpiresAt = $verificationCodeExpiresAt;
}
/**
* @param string|null $verificationCode
*/
public function setVerificationCode(?string $verificationCode): void
{
$this->verificationCode = $verificationCode;
}
/**
* @return Collection<int, CustomerTracking>
*/
public function getCustomerTrackings(): Collection
{
return $this->customerTrackings;
}
public function addCustomerTracking(CustomerTracking $customerTracking): static
{
if (!$this->customerTrackings->contains($customerTracking)) {
$this->customerTrackings->add($customerTracking);
$customerTracking->setCustomer($this);
}
return $this;
}
public function removeCustomerTracking(CustomerTracking $customerTracking): static
{
if ($this->customerTrackings->removeElement($customerTracking)) {
// set the owning side to null (unless already changed)
if ($customerTracking->getCustomer() === $this) {
$customerTracking->setCustomer(null);
}
}
return $this;
}
}