src/Entity/Sales/Saloon/AdBoardPlacement.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Sales\Saloon;
  3. use App\Entity\Sales\PaidPlacementPrice;
  4. use App\Entity\Saloon\Saloon;
  5. use App\Repository\SaloonAdBoardPlacementRepository;
  6. use Doctrine\ORM\Mapping as ORM;
  7. /**
  8.  * Сортировка будет выглядеть следующим образом:
  9.  * 1. Ультра вип
  10.  * 2. Вип (пока не сообщается)
  11.  * 3. Стандврт
  12.  *
  13.  * где 1 - первые страницы.
  14.  *
  15.  * @see https://redminez.net/issues/27368
  16.  */
  17. #[ORM\Table(name'saloon_adboard_placements')]
  18. #[ORM\Entity(repositoryClassSaloonAdBoardPlacementRepository::class)]
  19. class AdBoardPlacement
  20. {
  21.     // Значение группы влияет на порядок сортировки на сайте
  22.     const POSITION_GROUP_ULTRA_VIP 200;
  23.     const POSITION_GROUP_VIP 100;
  24.     // Группы стандартных размещений
  25.     const POSITION_GROUP_STANDARD 50;
  26.     const POSITION_GROUP_WITHOUT_OWNER 30;
  27.     #[ORM\JoinColumn(name'saloon_id'referencedColumnName'id')]
  28.     #[ORM\Id]
  29.     #[ORM\OneToOne(targetEntitySaloon::class, inversedBy'adBoardPlacement')]
  30.     protected Saloon $saloon;
  31.     /**
  32.      * Тип размещения: ультра-вип, вип, стандарт и др.
  33.      */
  34.     #[ORM\Column(name'type'type'smallint')]
  35.     protected int $type;
  36.     #[ORM\Column(name'position_group'type'smallint')]
  37.     protected int $positionGroup;
  38.     /**
  39.      * Позиция для сортировки, меняется несколько раз в течение в часа
  40.      *
  41.      * Новые анкеты добавляются всегда с наименьшим числом (может быть и отрицательным).
  42.      * При ротации позиции увеличиваются на 2.
  43.      */
  44.     #[ORM\Column(name'position'type'integer')]
  45.     protected int $position;
  46.     /**
  47.      * Время добавления анкеты с указанным типом в список
  48.      */
  49.     #[ORM\Column(name'placed_at'type'datetimetz_immutable')]
  50.     protected \DateTimeImmutable $placedAt;
  51.     /**
  52.      * Время следующего списания за показ в списке
  53.      */
  54.     #[ORM\Column(name'placed_until'type'datetimetz_immutable')]
  55.     protected \DateTimeImmutable $placedUntil;
  56.     /**
  57.      * Цена, по которой было размещено (для продления по этой же цене)
  58.      */
  59.     #[ORM\JoinColumn(name'placement_price_id'referencedColumnName'id'nullabletrue)]
  60.     #[ORM\ManyToOne(targetEntityPaidPlacementPrice::class)]
  61.     protected ?PaidPlacementPrice $placementPrice;
  62.     public static function standard(Saloon $saloonint $positionPaidPlacementPrice $paidPlacementPrice\DateTimeImmutable $placedAt\DateTimeImmutable $placedUntil): self
  63.     {
  64.         $positionGroup $saloon->hasOwner() ? self::POSITION_GROUP_STANDARD self::POSITION_GROUP_WITHOUT_OWNER;
  65.         return new static($saloonAdBoardPlacementType::standard(), $paidPlacementPrice$positionGroup$position$placedAt$placedUntil);
  66.     }
  67.     public static function vip(Saloon $saloonint $positionPaidPlacementPrice $paidPlacementPrice\DateTimeImmutable $placedAt\DateTimeImmutable $placedUntil): self
  68.     {
  69.         if (!$saloon->hasOwner()) {
  70.             throw new \LogicException('Saloon without owner cannot be placed at VIP position');
  71.         }
  72.         $positionGroup self::POSITION_GROUP_VIP;
  73.         return new static($saloonAdBoardPlacementType::vip(), $paidPlacementPrice$positionGroup$position$placedAt$placedUntil);
  74.     }
  75.     public static function ultraVip(Saloon $saloonint $positionPaidPlacementPrice $paidPlacementPrice\DateTimeImmutable $placedAt\DateTimeImmutable $placedUntil): self
  76.     {
  77.         if (!$saloon->hasOwner()) {
  78.             throw new \LogicException('Saloon without owner cannot be placed at UltraVIP position');
  79.         }
  80.         $positionGroup self::POSITION_GROUP_ULTRA_VIP;
  81.         return new static($saloonAdBoardPlacementType::ultraVip(), $paidPlacementPrice$positionGroup$position$placedAt$placedUntil);
  82.     }
  83.     protected function __construct(Saloon $saloonAdBoardPlacementType $typePaidPlacementPrice $paidPlacementPriceint $positionGroupint $position\DateTimeImmutable $placedAt\DateTimeImmutable $placedUntil)
  84.     {
  85.         $this->saloon $saloon;
  86.         $this->type $type->getValue();
  87.         $this->positionGroup $positionGroup;
  88.         $this->position $position;
  89.         $this->placedAt $placedAt;
  90.         $this->placedUntil $placedUntil;
  91.         $this->placementPrice $paidPlacementPrice;
  92.     }
  93.     /**
  94.      * Продление показа анкеты в выдаче на сайте
  95.      */
  96.     public function prolong(\DateTimeImmutable $placedUntil): void
  97.     {
  98.         $this->placedUntil $placedUntil;
  99.     }
  100.     public function getSaloon(): Saloon
  101.     {
  102.         return $this->saloon;
  103.     }
  104.     public function getType(): AdBoardPlacementType
  105.     {
  106.         return new AdBoardPlacementType($this->type);
  107.     }
  108.     public function getPosition(): int
  109.     {
  110.         return $this->position;
  111.     }
  112.     public function getPlacedAt(): \DateTimeImmutable
  113.     {
  114.         return $this->placedAt;
  115.     }
  116.     public function getPlacedUntil(): \DateTimeImmutable
  117.     {
  118.         return $this->placedUntil;
  119.     }
  120.     public function getPlacementPrice(): ?PaidPlacementPrice
  121.     {
  122.         return $this->placementPrice;
  123.     }
  124. }