<?php
declare(strict_types=1);
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Tracking des notifications album envoyées aux parents.
* Garantit un envoi unique par parent + album (produit).
*
* @ORM\Entity(repositoryClass="App\Repository\AlbumParentNotificationRepository")
* @ORM\Table(name="album_parent_notifications", uniqueConstraints={
* @ORM\UniqueConstraint(name="uq_album_parent", columns={"album_id", "parent_id"})
* }, indexes={
* @ORM\Index(name="idx_apn_notified", columns={"notified_at"}),
* @ORM\Index(name="idx_apn_opened", columns={"opened"}),
* @ORM\Index(name="idx_apn_reminder", columns={"reminder_sent_at"})
* })
*/
class AlbumParentNotification
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\Column(type="integer")
*/
private ?int $id = null;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Produit")
* @ORM\JoinColumn(name="album_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
private Produit $album;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
private User $parent;
/**
* @ORM\Column(name="email_sent", type="boolean", options={"default":false})
*/
private bool $emailSent = false;
/**
* @ORM\Column(name="sms_sent", type="boolean", options={"default":false})
*/
private bool $smsSent = false;
/**
* @ORM\Column(name="opened", type="boolean", options={"default":false})
*/
private bool $opened = false;
/**
* @ORM\Column(name="opened_at", type="datetime_immutable", nullable=true)
*/
private ?\DateTimeImmutable $openedAt = null;
/**
* @ORM\Column(name="purchased", type="boolean", options={"default":false})
*/
private bool $purchased = false;
/**
* @ORM\Column(name="notified_at", type="datetime_immutable", nullable=true)
*/
private ?\DateTimeImmutable $notifiedAt = null;
/**
* @ORM\Column(name="reminder_sent_at", type="datetime_immutable", nullable=true)
*/
private ?\DateTimeImmutable $reminderSentAt = null;
/**
* @ORM\Column(name="magic_link_token", type="string", length=64, nullable=true)
*/
private ?string $magicLinkToken = null;
/**
* Token pour pixel de suivi ouverture email.
* @ORM\Column(name="email_tracking_token", type="string", length=64, nullable=true)
*/
private ?string $emailTrackingToken = null;
/**
* @ORM\Column(name="email_opened_at", type="datetime_immutable", nullable=true)
*/
private ?\DateTimeImmutable $emailOpenedAt = null;
/**
* @ORM\Column(name="email_open_count", type="integer", options={"default":0})
*/
private int $emailOpenCount = 0;
/**
* Email « vous n'avez pas reçu notre SMS » envoyé (fallback).
* @ORM\Column(name="sms_fallback_email_sent", type="boolean", options={"default":false})
*/
private bool $smsFallbackEmailSent = false;
public function getId(): ?int { return $this->id; }
public function getAlbum(): Produit { return $this->album; }
public function setAlbum(Produit $album): self { $this->album = $album; return $this; }
public function getParent(): User { return $this->parent; }
public function setParent(User $parent): self { $this->parent = $parent; return $this; }
public function isEmailSent(): bool { return $this->emailSent; }
public function setEmailSent(bool $v): self { $this->emailSent = $v; return $this; }
public function isSmsSent(): bool { return $this->smsSent; }
public function setSmsSent(bool $v): self { $this->smsSent = $v; return $this; }
public function isOpened(): bool { return $this->opened; }
public function setOpened(bool $v): self { $this->opened = $v; return $this; }
public function getOpenedAt(): ?\DateTimeImmutable { return $this->openedAt; }
public function setOpenedAt(?\DateTimeImmutable $v): self { $this->openedAt = $v; return $this; }
public function isPurchased(): bool { return $this->purchased; }
public function setPurchased(bool $v): self { $this->purchased = $v; return $this; }
public function getNotifiedAt(): ?\DateTimeImmutable { return $this->notifiedAt; }
public function setNotifiedAt(?\DateTimeImmutable $v): self { $this->notifiedAt = $v; return $this; }
public function getReminderSentAt(): ?\DateTimeImmutable { return $this->reminderSentAt; }
public function setReminderSentAt(?\DateTimeImmutable $v): self { $this->reminderSentAt = $v; return $this; }
public function getMagicLinkToken(): ?string { return $this->magicLinkToken; }
public function setMagicLinkToken(?string $v): self { $this->magicLinkToken = $v; return $this; }
public function getEmailTrackingToken(): ?string { return $this->emailTrackingToken; }
public function setEmailTrackingToken(?string $v): self { $this->emailTrackingToken = $v; return $this; }
public function getEmailOpenedAt(): ?\DateTimeImmutable { return $this->emailOpenedAt; }
public function setEmailOpenedAt(?\DateTimeImmutable $v): self { $this->emailOpenedAt = $v; return $this; }
public function getEmailOpenCount(): int { return $this->emailOpenCount; }
public function setEmailOpenCount(int $v): self { $this->emailOpenCount = $v; return $this; }
public function incrementEmailOpenCount(): self { $this->emailOpenCount++; return $this; }
public function isSmsFallbackEmailSent(): bool { return $this->smsFallbackEmailSent; }
public function setSmsFallbackEmailSent(bool $v): self { $this->smsFallbackEmailSent = $v; return $this; }
}