<?php
namespace App\Entity;
use App\Model\BitrixSerialize;
use App\Model\BitrixSerializeList;
use App\Repository\ServiceFormRepository;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
/**
* @ORM\Entity(repositoryClass=ServiceFormRepository::class)
*/
class ServiceForm implements \JsonSerializable, BitrixSerialize, BitrixSerializeList
{
/**
* Иконка - идентификатор формы услуги изгоовления бумажного сертификата
*/
const PAPER_COPY_ICON = 'paper-copy';
private const BITRIX_PLACE_DEMAND_ID = 24;
/**
* Базовый путь к папке с изображениями
*/
protected static string $assetsImagesPath = 'assets/notaryLandingPage/img/';
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
* @JMS\Type("integer")
*/
private $id;
/**
* @ORM\Column(type="unescaped_json")
*
* @JMS\Type("array")
*/
private $fields = [];
/**
* @ORM\ManyToOne(targetEntity=ServiceSection::class, inversedBy="serviceForms")
* @JMS\Type("Relation<App\Entity\ServiceSection>")
*/
private $serviceSection;
/**
* @ORM\Column(type="integer")
*
* @JMS\Type("integer")
*/
private $sortNumber;
/**
* @ORM\Column(type="string", length=255)
*
* @JMS\Type("string")
*/
private $name;
/**
* @ORM\Column(type="integer")
*
* @JMS\Type("string")
*/
private $price;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*
* @JMS\Type("string")
*/
private $icon;
/**
* @ORM\Column(type="integer", nullable=true)
* @JMS\Type("integer")
*/
private $cellWidth;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $bitrixServiceId;
/**
* @ORM\Column(type="integer", nullable=true)
* @JMS\Type("integer")
*/
private $clientPrice;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $vipPrice;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $announcementConfig;
/**
* @ORM\Column(type="integer")
*/
private $bitrixCategoryId;
/**
* @ORM\Column(type="string", length=5, nullable=true)
*/
private $vehicleCategoryCode;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private ?bool $isEnabled = true;
/**
*/
private string $term = '';
public function getId(): ?int
{
return $this->id;
}
public function getFields(): ?array
{
return $this->fields;
}
public function setFields(array $fields): self
{
$this->fields = $fields;
return $this;
}
public function getServiceSection(): ?ServiceSection
{
return $this->serviceSection;
}
public function setServiceSection(?ServiceSection $serviceSection): self
{
$this->serviceSection = $serviceSection;
return $this;
}
public function getSortNumber(): ?int
{
return $this->sortNumber;
}
public function setSortNumber(int $sortNumber): self
{
$this->sortNumber = $sortNumber;
return $this;
}
/**
* @param array $allowed
* @return array
*/
public function filterFields(array $allowed)
{
$newFields = [];
foreach ($this->getFields() as $formKey => $form) {
if ($formKey === 'tabs') {
foreach ($form as $tab) {
foreach ($tab['fields'] as $field) {
$added = [];
foreach ($field as $key => $value) {
if (in_array($key, $allowed)) {
$added[$key] = $value;
}
}
if ($added) {
$newFields[] = $added;
}
}
}
}
}
return $newFields;
}
/**
* @return array
*/
public function getAllFieldsIds()
{
$newFields = [];
foreach ($this->getFields() as $formKey => $form) {
if ($formKey === 'tabs') {
foreach ($form as $tab) {
foreach ($tab['fields'] as $field) {
if (!isset($field['id'])) {
continue;
}
$newFields[] = $field['id'] ?? [];
}
}
}
}
return $newFields;
}
/**
* @return array
*/
public function getB24DefaultValue()
{
$newFields = [];
foreach ($this->getFields() as $formKey => $form) {
if ($formKey === 'tabs') {
foreach ($form as $tab) {
foreach ($tab['fields'] as $field) {
if (!isset($field['id'])) {
continue;
}
foreach ($field['optionsB24'] ?? [] as $value) {
$newFields[$field['id']][$value['value']] = $value['b24value'];
}
}
}
}
}
return $newFields;
}
public function jsonSerialize(): mixed
{
return [
'id' => $this->getId(),
'fields' => $this->getFields(),
'sortNumber' => $this->getSortNumber(),
'name' => $this->getName(),
'price' => $this->getPrice(),
'serviceSection' => $this->getServiceSection()->jsonSerializeWithoutForms(),
'isEnabled' => $this->isEnabled(),
];
}
public function importToJsonFile(): array
{
return [
'fields' => $this->getFields(),
'announcement_config' => $this->getAnnouncementConfig(),
];
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getPrice(): ?int
{
return $this->price;
}
public function setPrice(int $price): self
{
$this->price = $price;
return $this;
}
public function getIcon(): ?string
{
return $this->icon;
}
public function setIcon(?string $icon): self
{
$this->icon = $icon;
return $this;
}
public function getImagePath(): ?string
{
if (empty($this->icon)) {
return null;
}
return static::$assetsImagesPath . $this->icon . ".jpg";
}
public static function setAssetsImagesPath(string $path): void
{
static::$assetsImagesPath = $path;
}
public function getCellWidth(): ?int
{
return $this->cellWidth;
}
public function setCellWidth(?int $cellWidth): self
{
$this->cellWidth = $cellWidth;
return $this;
}
public function isSelfPaperForm(): bool
{
return $this->getIcon() === 'paper-copy';
}
public function serializeBitrix(): array
{
return [
"IBLOCK_TYPE_ID" => "bitrix_processes",
"IBLOCK_ID" => 36,
"NAME" => $this->getName(),
"CURRENCY_ID" => "RUB",
"PRICE" => $this->getPrice(),
"PRICE_CLIENT" => $this->getClientPrice(),
"SORT" => $this->getSortNumber()
];
}
public function getBitrixServiceId(): ?int
{
return $this->bitrixServiceId;
}
public function setBitrixServiceId(?int $bitrixServiceId): self
{
$this->bitrixServiceId = $bitrixServiceId;
return $this;
}
public function getElementCode(): string
{
return 'service_form_'. $this->getId();
}
public function getIBlockId(): int
{
return 36;
}
public function getClientPrice(): ?int
{
return $this->clientPrice;
}
public function setClientPrice(?int $clientPrice): self
{
$this->clientPrice = $clientPrice;
return $this;
}
/**
* @param Order $order
* @return $this
*/
public function setValuesFromOrder(Order $order)
{
$values = [];
foreach ($order->getData() as $datum) {
$values[$datum['name']] = $datum['value'];
}
foreach ($this->fields['tabs'] as &$tab) {
if (!isset($tab['fields'])) {
continue;
}
foreach ($tab['fields'] as &$field) {
if (isset($values[$field['id']])) {
$field['value'] = $values[$field['id']];
}
}
}
if (isset($values['client'])) {
$this->fields['client'] = $values['client'];
}
if ($order->getId()) {
$this->fields['existsOrderId'] = $order->getId();
}
return $this;
}
public function getVipPrice(): ?int
{
return $this->vipPrice;
}
public function setVipPrice(?int $vipPrice): self
{
$this->vipPrice = $vipPrice;
return $this;
}
public function setValueToFields(string $name, $value)
{
foreach ($this->fields['tabs'] as &$tab) {
if (!isset($tab['fields'])) {
continue;
}
foreach ($tab['fields'] as &$field) {
if (empty($field['id'])) {
continue;
}
if ($field['id'] === $name) {
$field['value'] = $value;
}
}
}
return $this;
}
public function unSetFieldByName(string $name)
{
foreach ($this->fields['tabs'] as &$tab) {
if (!isset($tab['fields'])) {
continue;
}
foreach ($tab['fields'] as $key => &$field) {
if ($field['id'] === $name) {
unset($tab['fields'][$key]);
}
}
}
return $this;
}
public function getB24FieldCode(?string $fieldName): string
{
if (!$fieldName) {
return '';
}
$fieldName = str_replace('-', '_', $fieldName);
return 'UF_CRM_' . strtoupper($fieldName);
}
public function getAnnouncementConfig(): ?string
{
return $this->announcementConfig;
}
public function setAnnouncementConfig(?string $announcementConfig): self
{
$this->announcementConfig = $announcementConfig;
return $this;
}
public function getBitrixCategoryId(): ?int
{
return $this->bitrixCategoryId;
}
public function isPlaceDemand(): bool
{
return $this->getBitrixCategoryId() === self::BITRIX_PLACE_DEMAND_ID;
}
public function setBitrixCategoryId(int $bitrixCategoryId): self
{
$this->bitrixCategoryId = $bitrixCategoryId;
return $this;
}
public function getVehicleCategoryCode(): ?string
{
return $this->vehicleCategoryCode;
}
public function setVehicleCategoryCode(?string $vehicleCategoryCode): self
{
$this->vehicleCategoryCode = $vehicleCategoryCode;
return $this;
}
public function getTerm(): string
{
return $this->term;
}
public function setTerm(string $term): self
{
$this->term = $term;
return $this;
}
public function isEnabled(): bool
{
return (bool)$this->isEnabled;
}
public function setIsEnabled(bool $isEnabled): self
{
$this->isEnabled = $isEnabled;
return $this;
}
public function isActive(): bool
{
if(!$this->getServiceSection()) {
return false;
}
if(!$this->getPrice()) {
return false;
}
return true;
}
}