<?php
namespace App\Entity;
use App\Entity\PartnerInfo\PartnerCompany;
use App\Entity\PartnerInfo\PartnerInfo;
use App\Entity\PartnerInfo\PartnerIP;
use App\Entity\Price\PartnerComplexPrice;
use App\Enum\Bitrix\CompanyType;
use App\Enum\NotaryCompanyRegistrationStatus;
use App\Model\BitrixSerialize;
use App\Repository\PartnerRepository;
use App\Service\BitrixSender;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=PartnerRepository::class)
*/
class Partner extends User
{
/**
* @ORM\Column(type="integer")
*
* По-умолчанию для партнеров направление 3 - для оценщика
* @var int
*/
protected $selectedServiceGroupId = 3;
/**
* @ORM\Column(type="string", length=255, nullable=false)
*
*/
private $publicName;
/**
* @ORM\OneToMany(targetEntity=Worker::class, mappedBy="partner")
*/
private $workers;
/**
* @ORM\ManyToOne(targetEntity=Region::class, inversedBy="partners")
* @ORM\JoinColumn(nullable=false)
*/
private $region;
/**
* @ORM\OneToMany(targetEntity=PartnerComplexPrice::class, mappedBy="partner")
*/
private $partnerComplexPrices;
/**
* @ORM\OneToOne(targetEntity=PartnerInfo::class, cascade={"persist", "remove"})
*/
private $information;
/**
* @ORM\OneToMany(targetEntity=WorkerMailRequest::class, mappedBy="partner", orphanRemoval=true)
*/
private $workerMailRequests;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $bitrixId;
/**
* @ORM\ManyToOne(targetEntity=Service::class, inversedBy="partners")
* @ORM\JoinColumn(nullable=true)
*/
private ?Service $service = null;
public function __construct()
{
$this->workers = new ArrayCollection();
$this->partnerComplexPrices = new ArrayCollection();
$this->workerMailRequests = new ArrayCollection();
}
/**
* @return Collection|Worker[]
*/
public function getWorkers(): Collection
{
return $this->workers;
}
public function addWorker(Worker $worker): self
{
if (!$this->workers->contains($worker)) {
$this->workers[] = $worker;
$worker->setPartner($this);
}
return $this;
}
public function removeWorker(Worker $worker): self
{
if ($this->workers->contains($worker)) {
$this->workers->removeElement($worker);
// set the owning side to null (unless already changed)
if ($worker->getPartner() === $this) {
$worker->setPartner(null);
}
}
return $this;
}
public function getRegion(): ?Region
{
return $this->region;
}
public function setRegion(?Region $region): self
{
$this->region = $region;
return $this;
}
/**
* @return Collection|PartnerComplexPrice[]
*/
public function getPartnerComplexPrices(): Collection
{
return $this->partnerComplexPrices;
}
public function addPartnerComplexPrice(PartnerComplexPrice $partnerComplexPrice): self
{
if (!$this->partnerComplexPrices->contains($partnerComplexPrice)) {
$this->partnerComplexPrices[] = $partnerComplexPrice;
$partnerComplexPrice->setPartner($this);
}
return $this;
}
public function removePartnerComplexPrice(PartnerComplexPrice $partnerComplexPrice): self
{
if ($this->partnerComplexPrices->contains($partnerComplexPrice)) {
$this->partnerComplexPrices->removeElement($partnerComplexPrice);
// set the owning side to null (unless already changed)
if ($partnerComplexPrice->getPartner() === $this) {
$partnerComplexPrice->setPartner(null);
}
}
return $this;
}
/**
* @return mixed
*/
public function getPublicName()
{
return $this->publicName;
}
/**
* @param mixed $publicName
*/
public function setPublicName($publicName): void
{
$this->publicName = $publicName;
}
public function getInformation(): ?PartnerInfo
{
return $this->information;
}
public function setInformation(?PartnerInfo $information): self
{
$this->information = $information;
return $this;
}
/**
* @return Collection|WorkerMailRequest[]
*/
public function getWorkerMailRequests(): Collection
{
return $this->workerMailRequests;
}
public function addWorkerMailRequest(WorkerMailRequest $workerMailRequest): self
{
if (!$this->workerMailRequests->contains($workerMailRequest)) {
$this->workerMailRequests[] = $workerMailRequest;
$workerMailRequest->setPartner($this);
}
return $this;
}
public function removeWorkerMailRequest(WorkerMailRequest $workerMailRequest): self
{
if ($this->workerMailRequests->contains($workerMailRequest)) {
$this->workerMailRequests->removeElement($workerMailRequest);
// set the owning side to null (unless already changed)
if ($workerMailRequest->getPartner() === $this) {
$workerMailRequest->setPartner(null);
}
}
return $this;
}
public function serializeBitrixCompany(): array
{
$information = $this->getInformation();
$data = [
"UF_CRM_SERVICE_ID" => $this->getId(),
"TITLE" => $this->getPublicName(),
"HAS_EMAIL" => "Y",// Если есть емл.
"ASSIGNED_BY_ID" => BitrixSender::ASSIGNED_SUPER_ADMIN_IN_BITRIX,
'EMAIL' => [
"n0" => [
"VALUE" => $this->getEmail(),
"VALUE_TYPE" => "WORK",
]
],
"UF_CRM_REGION" => $this->getRegion()->getBitrixId(),
...($information?->serializeBitrix() ?: [])
];
$workers = array_map(fn(Worker $worker) => $worker, $this->getWorkers()->toArray());
$workersBitrixId = array_map(
fn(Worker $worker) => $worker->getBitrixId(),
array_filter($workers, static fn(Worker $worker) => (bool)$worker->getBitrixId())
);
$ordersBitrixId = array_reduce(
$workers,
static function (array $ids, Worker $worker) {
array_push($ids, ...array_map(
fn(Order $order) => $order->getBitrixId(),
$worker->getOrders(filterFn: static fn(Order $order) => (bool)$order->getBitrixId())
));
return $ids;
},
[]
);
$data['UF_CRM_PARTNEREMPLOYEES'] = $workersBitrixId;
$data['UF_CRM_PARTNEREMPLOYEEDEALS'] = $ordersBitrixId;
$data['UF_CRM_REGISTRATION_STATUS'] = NotaryCompanyRegistrationStatus::REGISTERED->value;
if ($information?->getPhone()) {
$data['HAS_PHONE'] = 'Y';
$data['PHONE'] = [
'n0' => [
'VALUE' => $information->getPhone(),
'VALUE_TYPE' => 'WORK',
]
];
}
return $data;
}
public function getBitrixId(): ?int
{
return $this->bitrixId;
}
public function setBitrixId(?int $bitrixId): self
{
$this->bitrixId = $bitrixId;
return $this;
}
public function getService(): ?Service
{
return $this->service;
}
public function setService(?Service $service): self
{
$this->service = $service;
return $this;
}
}