<?php
declare(strict_types=1);
namespace App\Entity\Vista;
use App\Entity\Local\OrderSeat;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Swagger\Annotations as SWG;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity(repositoryClass="App\Repository\OrderRepositoryORMDecorator")
* @ORM\HasLifecycleCallbacks()
* @ORM\Table(name="orders")
*/
class Order implements PayableInterface
{
use OrderAndBooking;
const STATE_NEW = 'new';
const STATE_PAYMENT_STARTED = 'payment_started';
const STATE_PAYMENT_FINISHED = 'payment_finished';
const STATE_RESERVED = 'reserved';
const STATE_CANCELED = 'canceled';
/**
* @var string
* @ORM\Id()
* @ORM\Column(type="guid")
* @ORM\GeneratedValue(strategy="UUID")
*/
protected $id;
/**
* Original
*
* @Groups({"new_order"})
* @var string|null
* @ORM\Column(type="string", nullable=true)
*/
protected $cinemaId;
/**
* Original
*
* @var string
* @ORM\Column(type="string")
*/
protected $userSessionId;
/**
* Original
*
* @var integer|null
* @ORM\Column(type="integer", nullable=true)
*/
protected $orderTotalValueInCents;
/**
* Original
*
* @ORM\ManyToOne(targetEntity="App\Entity\Vista\OrderSession", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="session_guid", referencedColumnName="uuid")
* @var OrderSession
*/
protected $session;
/**
* @var Ticket[]|Collection
* @ORM\OneToMany(
* targetEntity="Ticket",
* mappedBy="order",
* cascade={"persist", "remove"},
* orphanRemoval=true)
*/
protected $tickets;
/**
* @var OrderConcessionItem[]|Collection
* @ORM\OneToMany(
* targetEntity="OrderConcessionItem",
* mappedBy="order",
* cascade={"persist", "remove"},
* orphanRemoval=true)
*/
protected $orderConcessionItem;
/**
* @var string
* @ORM\Column(type="string")
*/
protected $state = self::STATE_NEW;
/**
* @var LoyaltyMember|null
* @ORM\ManyToOne(targetEntity="App\Entity\Vista\LoyaltyMember")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $user;
/**
* @var \DateTime
* @ORM\Column(type="date_immutable", nullable=true)
*/
protected $bookingDate;
/**
* @var \DateTimeImmutable
* @ORM\Column(type="datetime_immutable")
*/
protected $createdAt;
/**
* @var \DateTimeImmutable
* @ORM\Column(type="datetime_immutable")
*/
protected $modifiedAt;
/**
* @SWG\Property(type="array", @SWG\Items(type="string"))
* @ORM\Column(type="array", nullable=true)
* @var Seat[]|null
*/
protected $selection;
/**
* @var ConcessionItem
* @ORM\Column(type="object", nullable=true)
*/
protected $concessionItem;
/**
* @var string
* @ORM\Column(type="string", nullable=true)
*/
protected $cinemaName;
public function __construct()
{
$this->tickets = new ArrayCollection();
$this->orderConcessionItem = new ArrayCollection();
}
/**
* @return string
*/
public function getId(): string
{
return $this->id;
}
/**
* @param string $id
*
* @return Order
*/
public function setId(string $id): Order
{
$this->id = $id;
return $this;
}
/**
* @return string|null
*/
public function getCinemaId(): ?string
{
return $this->cinemaId;
}
/**
* @param string|null $cinemaId
* @return Order
*/
public function setCinemaId(?string $cinemaId): Order
{
$this->cinemaId = $cinemaId;
return $this;
}
/**
* @return string
*/
public function getUserSessionId(): string
{
return $this->userSessionId;
}
/**
* @param string $userSessionId
* @return Order
*/
public function setUserSessionId(string $userSessionId): Order
{
$this->userSessionId = $userSessionId;
return $this;
}
/**
* @return int|null
*/
public function getOrderTotalValueInCents(): ?int
{
return $this->orderTotalValueInCents;
}
/**
* @param int|null $orderTotalValueInCents
* @return Order
*/
public function setOrderTotalValueInCents(?int $orderTotalValueInCents): Order
{
$this->orderTotalValueInCents = $orderTotalValueInCents;
return $this;
}
/**
* @param OrderSession[] $sessions
* @return Order
*/
public function setSessions($sessions): Order
{
if (empty($sessions)) {
return $this;
}
$session = array_shift($sessions);
return $this->setSession($session);
}
/**
* @return OrderSession
*/
public function getSession(): ?OrderSession
{
return $this->session;
}
/**
* @param OrderSession $session
*
* @return Order
*/
public function setSession(OrderSession $session): Order
{
if( $session->getStartTime()){
$this->setBookingDate(\DateTimeImmutable::createFromMutable($session->getStartTime()));
$session->setCinemaId($this->cinemaId);
$this->session = $session;
}
return $this;
}
/**
* @return string
*/
public function getState(): ?string
{
return $this->state;
}
/**
* @param string $state
*
* @return Order
*/
public function setState(string $state): Order
{
$this->state = $state;
return $this;
}
/**
* @return LoyaltyMember|null
*/
public function getUser(): ?LoyaltyMember
{
return $this->user;
}
/**
* @param LoyaltyMember $user
*
* @return Order
*/
public function setUser(LoyaltyMember $user): Order
{
$this->user = $user;
return $this;
}
/**
* @return Ticket[]|Collection
*/
public function getTickets(): Collection
{
return $this->tickets;
}
/**
* @param Ticket[]|Collection $tickets
*
* @return Order
*/
public function setTickets($tickets): Order
{
if (is_array($tickets)) {
$this->tickets = new ArrayCollection($tickets);
} else {
$this->tickets = $tickets;
}
return $this;
}
/**
* @return \DateTimeImmutable
*/
public function getBookingDate(): \DateTimeImmutable
{
if ($this->session) {
return \DateTimeImmutable::createFromMutable($this->session->getStartTime());
}
return $this->createdAt;
}
/**
* @param \DateTimeImmutable $bookingDate
*
* @return Order
*/
public function setBookingDate(\DateTimeImmutable $bookingDate): Order
{
$this->bookingDate = $bookingDate;
return $this;
}
/**
* @return \DateTimeImmutable
*/
public function getCreatedAt(): \DateTimeImmutable
{
return $this->createdAt;
}
/**
* @param \DateTimeImmutable $createdAt
*
* @return Order
*/
public function setCreatedAt(\DateTimeImmutable $createdAt): Order
{
$this->createdAt = $createdAt;
return $this;
}
/**
* @return \DateTimeImmutable
*/
public function getModifiedAt(): \DateTimeImmutable
{
return $this->modifiedAt;
}
/**
* @param \DateTimeImmutable $modifiedAt
*
* @return Order
*/
public function setModifiedAt(\DateTimeImmutable $modifiedAt): Order
{
$this->modifiedAt = $modifiedAt;
return $this;
}
/**
* @ORM\PrePersist()
*/
public function onPrePersist()
{
$this->setCreatedAt(new \DateTimeImmutable());
$this->setModifiedAt(new \DateTimeImmutable());
}
/**
* @ORM\PreUpdate()
*/
public function onPreUpdate()
{
$this->setModifiedAt(new \DateTimeImmutable());
}
/**
* Get tickets count
*
* @return int
*/
public function getTicketsCount(): int
{
if ($this->getConcessionItem() instanceof ConcessionItem) {
return 1;
}
$cnt = 0;
foreach ($this->getTickets() as $ticket) {
$cnt += count($ticket->getSeats());
}
return $cnt;
}
/**
* Get bonus tickets count
*
* @return int
*/
public function getBonusTicketsCount(): int
{
$cnt = 0;
foreach ($this->getTickets() as $ticket) {
if ($ticket->isLoyaltyTicket()) {
$cnt += count($ticket->getSeats());
}
}
return $cnt;
}
/**
* @inheritdoc
*/
public function getPaymentId(): string
{
return $this->getUserSessionId();
}
/**
* @inheritdoc
*/
public function getPriceInCents(): int
{
return $this->getOrderTotalValueInCents();
}
/**
* @return Seat[]
*/
public function getSelection(): array
{
return $this->selection ?? [];
}
/**
* @param Seat[]|null $selection
* @return Order
*/
public function setSelection(?array $selection): Order
{
$this->selection = $selection;
return $this;
}
/**
* @return ConcessionItem
*/
public function getConcessionItem(): ?ConcessionItem
{
return $this->concessionItem;
}
/**
* @param ConcessionItem $concessionItem
*
* @return Order
*/
public function setConcessionItem(ConcessionItem $concessionItem): Order
{
$this->concessionItem = $concessionItem;
return $this;
}
/**
* @return OrderConcessionItem[]|Collection
*/
public function getOrderConcessionItem(): ?Collection
{
return $this->orderConcessionItem;
}
/**
* @param OrderConcessionItem[]|Collection $orderConcessionItem
*
* @return Order
*/
public function setOrderConcessionItem($orderConcessionItem): Order
{
$this->orderConcessionItem = $orderConcessionItem;
return $this;
}
/**
* @return Order
*/
public function setConcessions($concessions): Order
{
if( is_array($concessions)){
if (!empty($concessions)) {
$oci = new ArrayCollection();
foreach($concessions as $concession){
$oci->add((new OrderConcessionItem())
->setId($concession['id'])
->setItemId($concession['itemId'])
->setDescription($concession['description'])
->setFinalPriceInCents($concession['finalPriceInCents'])
->setOrder($this)
);
}
$this->setOrderConcessionItem($oci);
} else {
// clear concessions
$this->setOrderConcessionItem(new ArrayCollection());
}
} else {
$this->setOrderConcessionItem($concessions);
}
return $this;
}
/**
* @return string
*/
public function getCinemaName(): ?string
{
return $this->cinemaName;
}
/**
* @param string $cinemaName
*
* @return Order
*/
public function setCinemaName(string $cinemaName): Order
{
$this->cinemaName = $cinemaName;
return $this;
}
/**
* Get movie name
*
* @return string
*/
public function getDescription(): string
{
if ($this->getSession() instanceof OrderSession) {
return $this->getSession()->getFilmTitle();
} elseif ($this->getConcessionItem() instanceof ConcessionItem) {
return $this->getConcessionItem()->getDescription();
} else {
return '';
}
}
protected function getTicketsRowLabel(array $data = [])
{
/** @var Ticket $ticket */
$ticket = $data['ticket'];
$seats = array_values($ticket->getSeats() ? $ticket->getSeats()->toArray() : []);
if (!$seats) {
return null;
}
/** @var OrderSeat $item */
$item = $seats[0];
return $item->getRowDisplay();
}
protected function getTicketsColumnsLabels()
{
$result = [];
foreach ($this->tickets ?: [] as $ticket) {
foreach ($ticket->getSeats() as $seat) {
$result[] = $seat->getColumnDisplay() ?: '';
}
}
return $result;
}
public function getSessionDate(): ?DateTimeImmutable
{
if ($this->getSession()) {
return DateTimeImmutable::createFromMutable($this->getSession()->getStartTime());
} else {
return null;
}
}
}