src/Entity/Whatsapp/WhatsappCampaign.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Whatsapp;
  3. use App\Annotation\SiteAware;
  4. use App\Entity\AbstractBase;
  5. use App\Entity\Garages\Garage;
  6. use App\Entity\Interfaces\SiteInterface;
  7. use App\Entity\OnlineShop\Product;
  8. use App\Entity\Traits\SiteTrait;
  9. use App\Entity\Traits\TitleTrait;
  10. use App\Repository\Whatsapp\WhatsappCampaignRepository;
  11. use DateTimeInterface;
  12. use Doctrine\Common\Collections\ArrayCollection;
  13. use Doctrine\Common\Collections\Collection;
  14. use Doctrine\ORM\Mapping as ORM;
  15. use Gedmo\Mapping\Annotation as Gedmo;
  16. /**
  17.  * @ORM\Table(name="vulco_whatsapp_campaign", indexes={@ORM\Index(name="whatsapp_campaign_site_idx", columns={"site"})})
  18.  * @ORM\Entity(repositoryClass=WhatsappCampaignRepository::class)
  19.  * @Gedmo\SoftDeleteable(fieldName="removedAt", timeAware=false)
  20.  * @SiteAware(siteFieldName="site")
  21.  */
  22. class WhatsappCampaign extends AbstractBase implements SiteInterface
  23. {
  24.     use TitleTrait;
  25.     use SiteTrait;
  26.     /**
  27.      * @ORM\ManyToOne(targetEntity="WhatsappMessageTemplate")
  28.      * @ORM\JoinColumn(name="whatsapp_message_template_id", referencedColumnName="id")
  29.      */
  30.     private WhatsappMessageTemplate $whatsappMessageTemplate;
  31.     /**
  32.      * @ORM\Column(type="string", length=255, nullable=false)
  33.      */
  34.     private string $title;
  35.     /**
  36.      * @ORM\Column(type="text", length=10000, nullable=true, options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"})
  37.      */
  38.     private ?string $body null;
  39.     /**
  40.      * @ORM\Column(type="datetime", nullable=true)
  41.      */
  42.     protected ?DateTimeInterface $sentAt;
  43.     /**
  44.      * @ORM\ManyToMany(targetEntity="App\Entity\OnlineShop\Product", cascade={"persist"})
  45.      *
  46.      * @ORM\JoinTable(name="vulco_whatsapp_campaign_product",
  47.      *     joinColumns={@ORM\JoinColumn(name="whatsapp_campaign_id", referencedColumnName="id")},
  48.      *     inverseJoinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}
  49.      * )
  50.      *
  51.      * @ORM\OrderBy({"name": "ASC"})
  52.      */
  53.     private ?Collection $products;
  54.     /**
  55.      * @ORM\ManyToMany(targetEntity="App\Entity\Garages\Garage", cascade={"persist"})
  56.      *
  57.      * @ORM\JoinTable(name="vulco_whatsapp_campaign_garage",
  58.      *     joinColumns={@ORM\JoinColumn(name="whatsapp_campaign_id", referencedColumnName="id")},
  59.      *     inverseJoinColumns={@ORM\JoinColumn(name="garage_id", referencedColumnName="id")}
  60.      * )
  61.      *
  62.      * @ORM\OrderBy({"name": "ASC"})
  63.      */
  64.     private ?Collection $garages;
  65.     /**
  66.      * @ORM\OneToMany(targetEntity="WhatsappCampaignMessage", mappedBy="whatsappCampaign", cascade={"persist", "remove"})
  67.      *
  68.      * @ORM\OrderBy({"garage": "ASC"})
  69.      */
  70.     private ?Collection $messages;
  71.     public function __construct()
  72.     {
  73.         $this->products = new ArrayCollection();
  74.         $this->garages = new ArrayCollection();
  75.         $this->messages = new ArrayCollection();
  76.     }
  77.     public function getBody(): ?string
  78.     {
  79.         return $this->body;
  80.     }
  81.     public function setBody(?string $body): self
  82.     {
  83.         $this->body $body;
  84.         return $this;
  85.     }
  86.     public function getWhatsappMessageTemplate(): WhatsappMessageTemplate
  87.     {
  88.         return $this->whatsappMessageTemplate;
  89.     }
  90.     public function setWhatsappMessageTemplate(WhatsappMessageTemplate $whatsappMessageTemplate): self
  91.     {
  92.         $this->whatsappMessageTemplate $whatsappMessageTemplate;
  93.         return $this;
  94.     }
  95.     public function setSentAt(?DateTimeInterface $sentAt): self
  96.     {
  97.         $this->sentAt $sentAt;
  98.         return $this;
  99.     }
  100.     public function getSentAt(): ?DateTimeInterface
  101.     {
  102.         return $this->sentAt;
  103.     }
  104.     public function isSent(): bool
  105.     {
  106.         return $this->sentAt !== null;
  107.     }
  108.     public function getProducts(): ?Collection
  109.     {
  110.         return $this->products;
  111.     }
  112.     public function setProducts(?Collection $products): self
  113.     {
  114.         $this->products $products;
  115.         return $this;
  116.     }
  117.     public function addProduct(Product $product): self
  118.     {
  119.         if (!$this->products->contains($product)) {
  120.             $this->products->add($product);
  121.         }
  122.         return $this;
  123.     }
  124.     public function removeProduct(Product $product): self
  125.     {
  126.         if ($this->products->contains($product)) {
  127.             $this->products->removeElement($product);
  128.         }
  129.         return $this;
  130.     }
  131.     public function getGarages(): ?Collection
  132.     {
  133.         return $this->garages;
  134.     }
  135.     public function setGarages(?Collection $garages): self
  136.     {
  137.         $this->garages $garages;
  138.         return $this;
  139.     }
  140.     public function addGarage(Garage $garage): self
  141.     {
  142.         if (!$this->garages->contains($garage)) {
  143.             $this->garages->add($garage);
  144.         }
  145.         return $this;
  146.     }
  147.     public function removeGarage(Garage $garage): self
  148.     {
  149.         if ($this->garages->contains($garage)) {
  150.             $this->garages->removeElement($garage);
  151.         }
  152.         return $this;
  153.     }
  154.     /**
  155.      * @return Collection<WhatsappCampaignMessage>|null
  156.      */
  157.     public function getMessages(): ?Collection
  158.     {
  159.         return $this->messages;
  160.     }
  161.     public function setMessages(?Collection $whatsappCampaignMessages): self
  162.     {
  163.         $this->messages $whatsappCampaignMessages;
  164.         return $this;
  165.     }
  166.     public function addMessage(WhatsappCampaignMessage $message): self
  167.     {
  168.         if (!$this->messages->contains($message)) {
  169.             $this->messages->add($message);
  170.         }
  171.         return $this;
  172.     }
  173.     public function removeMessage(WhatsappCampaignMessage $message): self
  174.     {
  175.         if ($this->messages->contains($message)) {
  176.             $this->messages->removeElement($message);
  177.         }
  178.         return $this;
  179.     }
  180.     /**
  181.      * @return Collection<WhatsappCampaignMessage>
  182.      */
  183.     public function getMessagesAccepted(): Collection
  184.     {
  185.         $messages = new ArrayCollection();
  186.         /** @var WhatsappCampaignMessage $message */
  187.         foreach ($this->getMessages() as $message) {
  188.             if ($message->getWhatsappMessage()->isAccepted()) {
  189.                 $messages->add($message);
  190.             }
  191.         }
  192.         return $messages;
  193.     }
  194.     public function getMessagesAcceptedPercentage(): int
  195.     {
  196.         return ($this->getMessagesAccepted()->count() / $this->getGarages()->count() * 100);
  197.     }
  198.     /**
  199.      * @return Collection<WhatsappCampaignMessage>
  200.      */
  201.     public function getMessagesFailed(): Collection
  202.     {
  203.         $messages = new ArrayCollection();
  204.         /** @var WhatsappCampaignMessage $message */
  205.         foreach ($this->getMessages() as $message) {
  206.             if ($message->getWhatsappMessage()->isFailed()) {
  207.                 $messages->add($message);
  208.             }
  209.         }
  210.         return $messages;
  211.     }
  212.     public function getMessagesFailedPercentage(): int
  213.     {
  214.         return ($this->getMessagesFailed()->count() / $this->getGarages()->count() * 100);
  215.     }
  216.     /**
  217.      * @return Collection<WhatsappCampaignMessage>
  218.      */
  219.     public function getMessagesSent(): Collection
  220.     {
  221.         $messages = new ArrayCollection();
  222.         /** @var WhatsappCampaignMessage $message */
  223.         foreach ($this->getMessages() as $message) {
  224.             if ($message->getWhatsappMessage()->isSent()) {
  225.                 $messages->add($message);
  226.             }
  227.         }
  228.         return $messages;
  229.     }
  230.     public function getMessagesSentPercentage(): int
  231.     {
  232.         return ($this->getMessagesSent()->count() / $this->getGarages()->count() * 100);
  233.     }
  234.     /**
  235.      * @return Collection<WhatsappCampaignMessage>
  236.      */
  237.     public function getMessagesDelivered(): Collection
  238.     {
  239.         $messages = new ArrayCollection();
  240.         /** @var WhatsappCampaignMessage $message */
  241.         foreach ($this->getMessages() as $message) {
  242.             if ($message->getWhatsappMessage()->isDelivered()) {
  243.                 $messages->add($message);
  244.             }
  245.         }
  246.         return $messages;
  247.     }
  248.     public function getMessagesDeliveredPercentage(): int
  249.     {
  250.         return ($this->getMessagesDelivered()->count() / $this->getGarages()->count() * 100);
  251.     }
  252.     /**
  253.      * @return Collection<WhatsappCampaignMessage>
  254.      */
  255.     public function getMessagesRead(): Collection
  256.     {
  257.         $messages = new ArrayCollection();
  258.         /** @var WhatsappCampaignMessage $message */
  259.         foreach ($this->getMessages() as $message) {
  260.             if ($message->getWhatsappMessage()->isRead()) {
  261.                 $messages->add($message);
  262.             }
  263.         }
  264.         return $messages;
  265.     }
  266.     public function getMessagesReadPercentage(): int
  267.     {
  268.         return ($this->getMessagesRead()->count() / $this->getGarages()->count() * 100);
  269.     }
  270.     public function getMessagesReadPhones(): array
  271.     {
  272.         $phones = array();
  273.         /** @var WhatsappCampaignMessage $message */
  274.         foreach ($this->getMessagesRead() as $message) {
  275.             $phones[] = $message->getWhatsappMessage()->getPhone();
  276.         }
  277.         return $phones;
  278.     }
  279.     public function getMessagesReadPhonesWithoutPlusSign(): array
  280.     {
  281.         $phones = array();
  282.         /** @var WhatsappCampaignMessage $message */
  283.         foreach ($this->getMessagesRead() as $message) {
  284.             $phones[] = $message->getWhatsappMessage()->getPhoneWithoutPlusSign(); // Whatsapp order webhook return phones without plus sign
  285.         }
  286.         return $phones;
  287.     }
  288. }