src/Entity/Channel/ChannelContact.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Channel;
  3. use App\Entity\Common\Contact;
  4. use App\Entity\Crm\Opportunity\Opportunity;
  5. use App\Entity\Crm\Target\TargetableInterface;
  6. use App\Enum\Serialization\ContactSerializationGroups;
  7. use App\Enum\Serialization\ReverseSyncSerializationGroups;
  8. use App\Enum\TargetTypeEnum;
  9. use App\Repository\Channel\ChannelContactRepository;
  10. use Doctrine\Common\Collections\ArrayCollection;
  11. use Doctrine\Common\Collections\Collection;
  12. use Drosalys\Bundle\ApiBundle\Serializer\Attributes\IdGroups;
  13. use Nellapp\Bundle\SDKBundle\Archivable\Entity\ArchivableTrait;
  14. use Nellapp\Bundle\SDKBundle\Channel\Entity\ChannelContact\ChannelContactInterface;
  15. use Nellapp\Bundle\SDKBundle\Channel\Entity\ChannelContact\ChannelContactMethodTrait;
  16. use Nellapp\Bundle\SDKBundle\ReverseSync\Entity\ReverseSyncableInterface;
  17. use Doctrine\ORM\Mapping as ORM;
  18. use Nellapp\Bundle\SDKBundle\Planning\Entity\PlanningResourceInterface;
  19. use Nellapp\Bundle\SDKBundle\Planning\Entity\PlanningResourceTrait;
  20. use Nellapp\Bundle\SDKBundle\ReverseSync\EntityKeys;
  21. use Nellapp\Bundle\SDKBundle\Serializer\SerialRelation\Attribute\SerialRelation;
  22. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  23. use Symfony\Component\Serializer\Annotation as Serial;
  24. use Symfony\Component\Validator\Constraints as Assert;
  25. #[ORM\Entity(repositoryClassChannelContactRepository::class),
  26.     ORM\Table(name'channel_contacts'),
  27.     ORM\UniqueConstraint(fields: ['channel''contact']),
  28.     UniqueEntity(fields: ['channel''contact'], message'channel_contact.UniqueEntity'errorPath'contact')]
  29. class ChannelContact implements
  30.     ChannelContactInterface,
  31.     ReverseSyncableInterface,
  32.     TargetableInterface,
  33.     \Stringable,
  34.     PlanningResourceInterface
  35. {
  36.     use ArchivableTrait;
  37.     use ChannelContactMethodTrait;
  38.     use PlanningResourceTrait;
  39.     #[ORM\Id,
  40.         ORM\GeneratedValue(strategy'NONE'),
  41.         ORM\Column(type'string'length36)]
  42.     #[Serial\Groups([
  43.         ReverseSyncSerializationGroups::REVERSE_SYNC,
  44.         ContactSerializationGroups::COLLECTION,
  45.         ContactSerializationGroups::DETAIL,
  46.     ])]
  47.     private ?string $id null;
  48.     #[ORM\ManyToOne(targetEntityChannel::class)]
  49.     #[ORM\JoinColumn(nullablefalseonDelete'CASCADE')]
  50.     #[IdGroups([ReverseSyncSerializationGroups::REVERSE_SYNC])]
  51.     private ?Channel $channel null;
  52.     #[ORM\ManyToOne(targetEntityContact::class, cascade: ['persist'])]
  53.     #[ORM\JoinColumn(nullablefalseonDelete'CASCADE')]
  54.     #[IdGroups([ReverseSyncSerializationGroups::REVERSE_SYNC])]
  55.     #[Serial\Groups([
  56.         ContactSerializationGroups::COLLECTION,
  57.         ContactSerializationGroups::DETAIL,
  58.         ContactSerializationGroups::CREATE,
  59.     ])]
  60.     #[
  61.         Assert\NotNull,
  62.         Assert\Valid(),
  63.     ]
  64.     private ?Contact $contact null;
  65.     #[ORM\OneToMany(mappedBy'channelContact'targetEntityCompanyContact::class)]
  66.     private Collection $companyContacts;
  67.     #[ORM\OneToMany(mappedBy'targetContact'targetEntityOpportunity::class)]
  68.     private Collection $opportunities;
  69.     public function __construct()
  70.     {
  71.         $this->initChannelContactMethod();
  72.         $this->companyContacts = new ArrayCollection();
  73.         $this->opportunities = new ArrayCollection();
  74.     }
  75.     public static function getReverseSyncKey(): string
  76.     {
  77.         return EntityKeys::CHANNEL_CONTACT;
  78.     }
  79.     public function getDisplayName(): string
  80.     {
  81.         return $this->getContact() ?? '';
  82.     }
  83.     #[Serial\Groups([
  84.         ContactSerializationGroups::COLLECTION,
  85.         ContactSerializationGroups::DETAIL,
  86.     ])]
  87.     public function getFullAddress(): ?string
  88.     {
  89.         return $this->getContact()?->getFullAddress() ?? '';
  90.     }
  91.     #[SerialRelation(targetEntityCompany::class, multipletruegroups: [
  92.         ContactSerializationGroups::COLLECTION,
  93.         ContactSerializationGroups::DETAIL,
  94.     ])]
  95.     public function getCompanies(): Collection
  96.     {
  97.         return $this->getCompanyContacts()->map(fn(CompanyContact $companyContact) => $companyContact->getCompany());
  98.     }
  99.     public function getOpportunityTargetType(): string
  100.     {
  101.         return TargetTypeEnum::CONTACT;
  102.     }
  103.     /**
  104.      * @return Collection<int, Opportunity>
  105.      */
  106.     public function getOpportunities(): Collection
  107.     {
  108.         return $this->opportunities;
  109.     }
  110.     public function addOpportunity(Opportunity $opportunity): static
  111.     {
  112.         if (!$this->opportunities->contains($opportunity)) {
  113.             $this->opportunities->add($opportunity);
  114.             $opportunity->setTargetContact($this);
  115.         }
  116.         return $this;
  117.     }
  118.     public function removeOpportunity(Opportunity $opportunity): static
  119.     {
  120.         if ($this->opportunities->removeElement($opportunity)) {
  121.             if ($opportunity->getTargetContact() === $this) {
  122.                 $opportunity->setTargetContact(null);
  123.             }
  124.         }
  125.         return $this;
  126.     }
  127.     public function __toString(): string
  128.     {
  129.         return $this->getDisplayName();
  130.     }
  131. }