<?php
/**
* Created by Elements.at New Media Solutions GmbH
*
*/
namespace App\Model\Shop\Ticket;
use Carbon\Carbon;
use Elements\Bundle\SkidataTicketingSwebBundle\Model\SkidataTicketProductInterface;
use Elements\Bundle\TicketShopFrameworkBundle\Model\DataObject\TicketConsumerCategory as TSF_TicketConsumerCategory;
use Pimcore\Model\DataObject\SkidataConsumerCategory;
use Pimcore\Model\DataObject\SkidataProduct;
/**
* @method ?TicketConsumerCategory getKidsOnSaturdayConsumer()
*/
class TicketConsumerCategory extends TSF_TicketConsumerCategory
{
public function getTicketConsumerForStartDate(TicketProduct $ticketProduct, Carbon $startDate, bool $ignoreSaturdayChild = false): TicketConsumerCategory
{
return !$ignoreSaturdayChild && $this->useSaturdaySpecial($ticketProduct, $startDate) ? $this->getKidsOnSaturdayConsumer() : $this;
}
/**
* @param TicketProduct $ticketProduct
* @param Carbon|null $orderStartDate
* @param bool $ignoreSaturdayChild
*
* @return null|string
*/
public function getConsumerIdForTicket(
TicketProduct $ticketProduct,
Carbon $orderStartDate = null,
bool $ignoreSaturdayChild = false
): ?string {
if ($skiDataProduct = $ticketProduct->getSkidataProduct()) {
$supportedConsumerByProduct = $this->getSupportedConsumer($skiDataProduct);
$consumer = !$ignoreSaturdayChild && $this->useSaturdaySpecial($ticketProduct, $orderStartDate) ? $this->getKidsOnSaturdayConsumer() : $this;
foreach ($consumer->getSkidataConsumerCategories() as $item) {
if (in_array($item->getId(), $supportedConsumerByProduct)) {
return $item->getUuid();
}
}
}
return null;
}
/**
* @param SkidataProduct $skiDataProduct
*
* @return int[]
*/
protected function getSupportedConsumer(SkidataProduct $skiDataProduct): array
{
/** @phpstan-ignore-next-line */
return array_map(function (SkidataConsumerCategory $item) {
return $item->getId();
}, $skiDataProduct->getConsumerCategories());
}
/**
* @param TicketProduct $ticketProduct
* @param Carbon $date
*
* @return bool
*/
public function useSaturdaySpecial(SkidataTicketProductInterface $ticketProduct, Carbon $date): bool
{
$kidsOnSaturdayConsumer = $this->getKidsOnSaturdayConsumer();
if (!empty($kidsOnSaturdayConsumer) && $ticketProduct->getValidityValue() > 1) {
$skiDataProduct = $ticketProduct->getSkidataProduct();
$haystack = $this->getSupportedConsumer($skiDataProduct);
foreach ($kidsOnSaturdayConsumer->getSkidataConsumerCategories() as $item) {
if (in_array($item->getId(), $haystack)) {
$validityDate = $date->copy()->subDay();
for ($i = 0; $i < $ticketProduct->getValidityValue(); $i++) {
$validityDate->addDay();
if ($validityDate->isSaturday()) {
return true;
}
}
}
}
}
return false;
}
}