<?php
/**
* Created by Elements.at New Media Solutions GmbH
*
*/
namespace App\Controller\BookingApi;
use App\Model\BookingApi\CartItemTicket;
use App\Model\BookingApi\Image;
use App\Model\BookingApi\LocalizedText;
use App\Service\Shop\ProductService;
use Elements\Bundle\TicketShopFrameworkBundle\Model\Shop\Cart\TicketShopCartInterface;
use Elements\Bundle\TicketShopFrameworkBundle\Service\CartService;
use OpenApi\Annotations as OA;
use Pimcore\Bundle\EcommerceFrameworkBundle\CartManager\CartInterface;
use Pimcore\Controller\FrontendController;
use Pimcore\Model\Asset;
use Pimcore\Model\DataObject\KeycardNumber;
use Pimcore\Model\DataObject\TicketConsumerCategory;
use Pimcore\Translation\Translator;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* @OA\Info(title="Matterhorn Booking API", version="1.0")
*/
class ApiAbstractController extends FrontendController
{
/**
* @var string[]
*/
protected array $languages = ['de', 'en', 'it', 'fr'];
public function __construct(
protected CartService $cartService,
protected ProductService $productService,
protected LoggerInterface $bookingapiLogger,
protected Translator $translator
) {
}
/**
* @param string $cartName
*
* @return TicketShopCartInterface
*/
public function getCart(string $cartName = 'cart'): TicketShopCartInterface
{
return $this->cartService->getCart($cartName);
}
/**
* @param CartInterface $cart
*
* @return void
*/
protected function clearCartData(CartInterface $cart): void
{
//cart clear - api is not session aware
$cart->clear();
$cart->setCheckoutData('cashback', '');
$cart->setCheckoutData('address', '');
$cart->setCheckoutData('productData', '');
}
/**
* @param string[] $errors
* @param int $code
*
* @return JsonResponse
*/
protected function sendErrors(array $errors, int $code = 400): JsonResponse
{
$response = new JsonResponse([
'success' => false,
'errors' => $errors,
]);
$response->setStatusCode($code);
return $response;
}
/**
* @param Asset\Image $image
*
* @return Image
*/
protected function formatImage(Asset\Image $image): Image
{
$host = \Pimcore\Tool::getHostUrl();
$title = new LocalizedText();
$description = new LocalizedText();
$alt = new LocalizedText();
if ($image->getHasMetaData()) {
foreach ($this->languages as $language) {
$title->$language = $image->getMetadata('title', $language) ?: '';
$description->$language = $image->getMetadata('description', $language) ?: '';
$alt->$language = $image->getMetadata('alt', $language) ?: '';
}
}
return new Image(
$host . $image->getThumbnail('bookingapi-images')->getPath(),
$image->getModificationDate() * 1000,
$title,
$description,
$alt
);
}
/**
* @param $price
*
* @return mixed
*/
protected function formatPrice(mixed $price): mixed
{
if ($price instanceof \Pimcore\Bundle\EcommerceFrameworkBundle\PriceSystem\Price) {
$price = $price->getGrossAmount()->asNumeric();
}
if ($price instanceof \Pimcore\Bundle\EcommerceFrameworkBundle\Type\Decimal) {
$price = $price->asNumeric();
}
return $price;
}
/**
* @param TicketConsumerCategory[] $consumerCategories
*
* @return \App\Model\BookingApi\TicketConsumerCategory[]
*/
protected function getConsumerCategories(array $consumerCategories = []): array
{
$apiConsumerCategories = [];
foreach ($consumerCategories as $consumerCategory) {
$apiConsumerCategory = new \App\Model\BookingApi\TicketConsumerCategory();
$apiConsumerCategory->id = $consumerCategory->getId();
$localizedText = new LocalizedText();
$localizedInfoText = new LocalizedText();
$localizedGroupName = new LocalizedText();
foreach ($this->languages as $language) {
$localizedText->$language = $consumerCategory->getName($language) ?: '';
$localizedInfoText->$language = $consumerCategory->getInfoText($language) ?: '';
$localizedGroupName->$language = $consumerCategory->getParent() instanceof TicketConsumerCategory && $consumerCategory->getParent()->getName($language) ? $consumerCategory->getParent()->getName($language) : '';
}
$apiConsumerCategory->name = $localizedText;
$apiConsumerCategory->infoText = $localizedInfoText;
$apiConsumerCategory->ageFrom = intval($consumerCategory->getYearFrom());
$apiConsumerCategory->ageTo = intval($consumerCategory->getYearTo());
$apiConsumerCategory->groupId = intval($consumerCategory->getParent() instanceof TicketConsumerCategory ? $consumerCategory->getParent()->getId() : 0);
$apiConsumerCategory->groupName = $localizedGroupName;
$apiConsumerCategories[] = $apiConsumerCategory;
}
return $apiConsumerCategories;
}
/**
* @param CartItemTicket $cartItemTicket
*
* @return bool
*/
protected function keyCardNumberShortToLongCheck(CartItemTicket $cartItemTicket): bool
{
if($cartItemTicket->getKeycardShortnumber() && empty($cartItemTicket->getKeycardNumber())) {
//requires mapping keycard short number to keycard number
$keycardNumberObj = KeycardNumber::getByShortNumber($cartItemTicket->getKeycardShortnumber(), 1);
if($keycardNumberObj && $keycardNumberObj->getNumber()) {
$cartItemTicket->setKeycardNumber($keycardNumberObj->getNumber());
} else {
return false;
}
} elseif ($cartItemTicket->getKeycardShortnumber() && $cartItemTicket->getKeycardNumber()) {
//keycard number and short number given - are they known as identical keycard?
$keycardNumberObj = KeycardNumber::getByShortNumber($cartItemTicket->getKeycardShortnumber(), 1);
if(!$keycardNumberObj || $keycardNumberObj->getNumber() != $cartItemTicket->getKeycardNumber()) {
return false;
}
}
return true;
}
}