<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-05-06
* Time: 16:30
*/
namespace App\Entity\Sales;
use App\Entity\Location\City;
use App\Entity\Profile\Profile;
use App\Repository\PaidPlacementsOrderRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Table(name: 'profile_paid_placements_order')]
#[ORM\Entity(repositoryClass: PaidPlacementsOrderRepository::class)]
class PaidPlacementsOrder
{
const ORDER_GROUP_ULTRA_VIP = 1;
const ORDER_GROUP_VIP = 10;
const ORDER_GROUP_STANDARD_APPROVED = 50;
const ORDER_GROUP_STANDARD = 60;
const ORDER_GROUP_WITHOUT_OWNER_APPROVED = 100;
const ORDER_GROUP_WITHOUT_OWNER = 120;
#[ORM\JoinColumn(name: 'city_id', referencedColumnName: 'id')]
#[ORM\Id]
#[ORM\OneToOne(targetEntity: City::class)]
protected City $city;
#[ORM\Id]
#[ORM\Column(name: 'order_group', type: 'smallint')]
protected int $orderGroup;
/**
* Время изменения статуса одной из анкет
*/
#[ORM\Column(name: 'status_changed_at', type: 'datetimetz_immutable')]
protected \DateTimeImmutable $statusChangedAt;
/**
* Время последней ротации списка без изменения статусов
*/
#[ORM\Column(name: 'rotated_at', type: 'datetimetz_immutable')]
protected \DateTimeImmutable $rotatedAt;
/** @var null|int[] */
#[ORM\Column(name: 'placement_order', type: 'simple_array', nullable: true)]
protected ?array $placementOrder;
public function __construct(City $city, int $orderGroup, \DateTimeImmutable $changedAt, array $placementOrder = [])
{
$this->city = $city;
$this->orderGroup = $orderGroup;
$this->statusChangedAt = $changedAt;
$this->rotatedAt = $changedAt;
$this->placementOrder = $placementOrder;
}
public function placeAtFirstPosition(Profile $profile, \DateTimeImmutable $changedAt): void
{
$this->removePlacement($profile);
$reordered = $this->placementOrder;
array_unshift($reordered, $profile->getId());
$this->placementOrder = $reordered;
$this->statusChangedAt = $changedAt;
$this->rotatedAt = $changedAt;
}
public function removePlacement(Profile $profile): void
{
$key = array_search($profile->getId(), $this->placementOrder);
if (false !== $key) {
$reordered = $this->placementOrder;
unset($reordered[$key]);
$this->placementOrder = $reordered;
}
}
public function rotatePlacements(\DateTimeImmutable $rotatedAt): void
{
$this->placementOrder = $this->doRotate($this->placementOrder);
$this->rotatedAt = $rotatedAt;
}
private function doRotate(array $placements): array
{
if (empty($placements)) {
return $placements;
}
$reordered = $placements;
$lastPlacement = array_pop($reordered);
array_unshift($reordered, $lastPlacement);
return $reordered;
}
public function getStatusChangedAt(): \DateTimeImmutable
{
return $this->statusChangedAt;
}
public function getRotatedAt(): \DateTimeImmutable
{
return $this->rotatedAt;
}
/**
* @return null|int[]
*/
public function getPlacementOrder(): ?array
{
return $this->placementOrder;
}
}