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(repositoryClass: SaloonAdBoardPlacementRepository::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(targetEntity: Saloon::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', nullable: true)]
  60.     #[ORM\ManyToOne(targetEntity: PaidPlacementPrice::class)]
  61.     protected ?PaidPlacementPrice $placementPrice;
  62.     public static function standard(Saloon $saloon, int $position, PaidPlacementPrice $paidPlacementPrice, \DateTimeImmutable $placedAt, \DateTimeImmutable $placedUntil): self
  63.     {
  64.         $positionGroup = $saloon->hasOwner() ? self::POSITION_GROUP_STANDARD : self::POSITION_GROUP_WITHOUT_OWNER;
  65.         return new static($saloon, AdBoardPlacementType::standard(), $paidPlacementPrice, $positionGroup, $position, $placedAt, $placedUntil);
  66.     }
  67.     public static function vip(Saloon $saloon, int $position, PaidPlacementPrice $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($saloon, AdBoardPlacementType::vip(), $paidPlacementPrice, $positionGroup, $position, $placedAt, $placedUntil);
  74.     }
  75.     public static function ultraVip(Saloon $saloon, int $position, PaidPlacementPrice $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($saloon, AdBoardPlacementType::ultraVip(), $paidPlacementPrice, $positionGroup, $position, $placedAt, $placedUntil);
  82.     }
  83.     protected function __construct(Saloon $saloon, AdBoardPlacementType $type, PaidPlacementPrice $paidPlacementPrice, int $positionGroup, int $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. }