<?php
namespace App\Entity\Whatsapp;
use App\Annotation\SiteAware;
use App\Entity\AbstractBase;
use App\Entity\Garages\Garage;
use App\Entity\Interfaces\SiteInterface;
use App\Entity\OnlineShop\Product;
use App\Entity\Traits\SiteTrait;
use App\Entity\Traits\TitleTrait;
use App\Repository\Whatsapp\WhatsappCampaignRepository;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Table(name="vulco_whatsapp_campaign", indexes={@ORM\Index(name="whatsapp_campaign_site_idx", columns={"site"})})
* @ORM\Entity(repositoryClass=WhatsappCampaignRepository::class)
* @Gedmo\SoftDeleteable(fieldName="removedAt", timeAware=false)
* @SiteAware(siteFieldName="site")
*/
class WhatsappCampaign extends AbstractBase implements SiteInterface
{
use TitleTrait;
use SiteTrait;
/**
* @ORM\ManyToOne(targetEntity="WhatsappMessageTemplate")
* @ORM\JoinColumn(name="whatsapp_message_template_id", referencedColumnName="id")
*/
private WhatsappMessageTemplate $whatsappMessageTemplate;
/**
* @ORM\Column(type="string", length=255, nullable=false)
*/
private string $title;
/**
* @ORM\Column(type="text", length=10000, nullable=true, options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"})
*/
private ?string $body = null;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
protected ?DateTimeInterface $sentAt;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\OnlineShop\Product", cascade={"persist"})
*
* @ORM\JoinTable(name="vulco_whatsapp_campaign_product",
* joinColumns={@ORM\JoinColumn(name="whatsapp_campaign_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}
* )
*
* @ORM\OrderBy({"name": "ASC"})
*/
private ?Collection $products;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Garages\Garage", cascade={"persist"})
*
* @ORM\JoinTable(name="vulco_whatsapp_campaign_garage",
* joinColumns={@ORM\JoinColumn(name="whatsapp_campaign_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="garage_id", referencedColumnName="id")}
* )
*
* @ORM\OrderBy({"name": "ASC"})
*/
private ?Collection $garages;
/**
* @ORM\OneToMany(targetEntity="WhatsappCampaignMessage", mappedBy="whatsappCampaign", cascade={"persist", "remove"})
*
* @ORM\OrderBy({"garage": "ASC"})
*/
private ?Collection $messages;
public function __construct()
{
$this->products = new ArrayCollection();
$this->garages = new ArrayCollection();
$this->messages = new ArrayCollection();
}
public function getBody(): ?string
{
return $this->body;
}
public function setBody(?string $body): self
{
$this->body = $body;
return $this;
}
public function getWhatsappMessageTemplate(): WhatsappMessageTemplate
{
return $this->whatsappMessageTemplate;
}
public function setWhatsappMessageTemplate(WhatsappMessageTemplate $whatsappMessageTemplate): self
{
$this->whatsappMessageTemplate = $whatsappMessageTemplate;
return $this;
}
public function setSentAt(?DateTimeInterface $sentAt): self
{
$this->sentAt = $sentAt;
return $this;
}
public function getSentAt(): ?DateTimeInterface
{
return $this->sentAt;
}
public function isSent(): bool
{
return $this->sentAt !== null;
}
public function getProducts(): ?Collection
{
return $this->products;
}
public function setProducts(?Collection $products): self
{
$this->products = $products;
return $this;
}
public function addProduct(Product $product): self
{
if (!$this->products->contains($product)) {
$this->products->add($product);
}
return $this;
}
public function removeProduct(Product $product): self
{
if ($this->products->contains($product)) {
$this->products->removeElement($product);
}
return $this;
}
public function getGarages(): ?Collection
{
return $this->garages;
}
public function setGarages(?Collection $garages): self
{
$this->garages = $garages;
return $this;
}
public function addGarage(Garage $garage): self
{
if (!$this->garages->contains($garage)) {
$this->garages->add($garage);
}
return $this;
}
public function removeGarage(Garage $garage): self
{
if ($this->garages->contains($garage)) {
$this->garages->removeElement($garage);
}
return $this;
}
/**
* @return Collection<WhatsappCampaignMessage>|null
*/
public function getMessages(): ?Collection
{
return $this->messages;
}
public function setMessages(?Collection $whatsappCampaignMessages): self
{
$this->messages = $whatsappCampaignMessages;
return $this;
}
public function addMessage(WhatsappCampaignMessage $message): self
{
if (!$this->messages->contains($message)) {
$this->messages->add($message);
}
return $this;
}
public function removeMessage(WhatsappCampaignMessage $message): self
{
if ($this->messages->contains($message)) {
$this->messages->removeElement($message);
}
return $this;
}
/**
* @return Collection<WhatsappCampaignMessage>
*/
public function getMessagesAccepted(): Collection
{
$messages = new ArrayCollection();
/** @var WhatsappCampaignMessage $message */
foreach ($this->getMessages() as $message) {
if ($message->getWhatsappMessage()->isAccepted()) {
$messages->add($message);
}
}
return $messages;
}
public function getMessagesAcceptedPercentage(): int
{
return ($this->getMessagesAccepted()->count() / $this->getGarages()->count() * 100);
}
/**
* @return Collection<WhatsappCampaignMessage>
*/
public function getMessagesFailed(): Collection
{
$messages = new ArrayCollection();
/** @var WhatsappCampaignMessage $message */
foreach ($this->getMessages() as $message) {
if ($message->getWhatsappMessage()->isFailed()) {
$messages->add($message);
}
}
return $messages;
}
public function getMessagesFailedPercentage(): int
{
return ($this->getMessagesFailed()->count() / $this->getGarages()->count() * 100);
}
/**
* @return Collection<WhatsappCampaignMessage>
*/
public function getMessagesSent(): Collection
{
$messages = new ArrayCollection();
/** @var WhatsappCampaignMessage $message */
foreach ($this->getMessages() as $message) {
if ($message->getWhatsappMessage()->isSent()) {
$messages->add($message);
}
}
return $messages;
}
public function getMessagesSentPercentage(): int
{
return ($this->getMessagesSent()->count() / $this->getGarages()->count() * 100);
}
/**
* @return Collection<WhatsappCampaignMessage>
*/
public function getMessagesDelivered(): Collection
{
$messages = new ArrayCollection();
/** @var WhatsappCampaignMessage $message */
foreach ($this->getMessages() as $message) {
if ($message->getWhatsappMessage()->isDelivered()) {
$messages->add($message);
}
}
return $messages;
}
public function getMessagesDeliveredPercentage(): int
{
return ($this->getMessagesDelivered()->count() / $this->getGarages()->count() * 100);
}
/**
* @return Collection<WhatsappCampaignMessage>
*/
public function getMessagesRead(): Collection
{
$messages = new ArrayCollection();
/** @var WhatsappCampaignMessage $message */
foreach ($this->getMessages() as $message) {
if ($message->getWhatsappMessage()->isRead()) {
$messages->add($message);
}
}
return $messages;
}
public function getMessagesReadPercentage(): int
{
return ($this->getMessagesRead()->count() / $this->getGarages()->count() * 100);
}
public function getMessagesReadPhones(): array
{
$phones = array();
/** @var WhatsappCampaignMessage $message */
foreach ($this->getMessagesRead() as $message) {
$phones[] = $message->getWhatsappMessage()->getPhone();
}
return $phones;
}
public function getMessagesReadPhonesWithoutPlusSign(): array
{
$phones = array();
/** @var WhatsappCampaignMessage $message */
foreach ($this->getMessagesRead() as $message) {
$phones[] = $message->getWhatsappMessage()->getPhoneWithoutPlusSign(); // Whatsapp order webhook return phones without plus sign
}
return $phones;
}
}