src/Controller/BookingApi/ApiAbstractController.php line 92

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by Elements.at New Media Solutions GmbH
  4.  *
  5.  */
  6. namespace App\Controller\BookingApi;
  7. use App\Model\BookingApi\CartItemTicket;
  8. use App\Model\BookingApi\Image;
  9. use App\Model\BookingApi\LocalizedText;
  10. use App\Service\Shop\ProductService;
  11. use App\Service\SiteConfigService;
  12. use Elements\Bundle\TicketShopFrameworkBundle\Model\Shop\Cart\TicketShopCartInterface;
  13. use Elements\Bundle\TicketShopFrameworkBundle\Service\CartService;
  14. use OpenApi\Annotations as OA;
  15. use Pimcore\Bundle\EcommerceFrameworkBundle\CartManager\CartInterface;
  16. use Pimcore\Controller\FrontendController;
  17. use Pimcore\Model\Asset;
  18. use Pimcore\Model\DataObject\KeycardNumber;
  19. use Pimcore\Model\DataObject\TicketConsumerCategory;
  20. use Pimcore\Translation\Translator;
  21. use Psr\Log\LoggerInterface;
  22. use Symfony\Component\HttpFoundation\JsonResponse;
  23. /**
  24.  * @OA\Info(title="Matterhorn Booking API", version="1.0")
  25.  */
  26. class ApiAbstractController extends FrontendController
  27. {
  28.     /**
  29.      * @var string[]
  30.      */
  31.     protected array $languages = ['de''en''it''fr'];
  32.     public function __construct(
  33.         protected CartService $cartService,
  34.         protected ProductService $productService,
  35.         protected LoggerInterface $bookingapiLogger,
  36.         protected Translator $translator,
  37.         protected SiteConfigService $siteConfigService,
  38.     ) {
  39.     }
  40.     /**
  41.      * @param string $cartName
  42.      *
  43.      * @return TicketShopCartInterface
  44.      */
  45.     public function getCart(string $cartName 'cart'): TicketShopCartInterface
  46.     {
  47.         return $this->cartService->getCart($cartName);
  48.     }
  49.     /**
  50.      * @param CartInterface $cart
  51.      *
  52.      * @return void
  53.      */
  54.     protected function clearCartData(CartInterface $cart): void
  55.     {
  56.         //cart clear - api is not session aware
  57.         $cart->clear();
  58.         $cart->setCheckoutData('cashback''');
  59.         $cart->setCheckoutData('address''');
  60.         $cart->setCheckoutData('productData''');
  61.     }
  62.     /**
  63.      * @param string[] $errors
  64.      * @param int $code
  65.      *
  66.      * @return JsonResponse
  67.      */
  68.     protected function sendErrors(array $errorsint $code 400): JsonResponse
  69.     {
  70.         $response = new JsonResponse([
  71.             'success' => false,
  72.             'errors' => $errors,
  73.         ]);
  74.         $response->setStatusCode($code);
  75.         return $response;
  76.     }
  77.     /**
  78.      * @param Asset\Image $image
  79.      *
  80.      * @return Image
  81.      */
  82.     protected function formatImage(Asset\Image $image): Image
  83.     {
  84.         $host \Pimcore\Tool::getHostUrl();
  85.         $title = new LocalizedText();
  86.         $description = new LocalizedText();
  87.         $alt = new LocalizedText();
  88.         if ($image->getHasMetaData()) {
  89.             foreach ($this->languages as $language) {
  90.                 $title->$language $image->getMetadata('title'$language) ?: '';
  91.                 $description->$language $image->getMetadata('description'$language) ?: '';
  92.                 $alt->$language $image->getMetadata('alt'$language) ?: '';
  93.             }
  94.         }
  95.         return new Image(
  96.             $host $image->getThumbnail('bookingapi-images')->getPath(),
  97.             $image->getModificationDate() * 1000,
  98.             $title,
  99.             $description,
  100.             $alt
  101.         );
  102.     }
  103.     /**
  104.      * @param $price
  105.      *
  106.      * @return mixed
  107.      */
  108.     protected function formatPrice(mixed $price): mixed
  109.     {
  110.         if ($price instanceof \Pimcore\Bundle\EcommerceFrameworkBundle\PriceSystem\Price) {
  111.             $price $price->getGrossAmount()->asNumeric();
  112.         }
  113.         if ($price instanceof \Pimcore\Bundle\EcommerceFrameworkBundle\Type\Decimal) {
  114.             $price $price->asNumeric();
  115.         }
  116.         return $price;
  117.     }
  118.     /**
  119.      * @param TicketConsumerCategory[] $consumerCategories
  120.      *
  121.      * @return \App\Model\BookingApi\TicketConsumerCategory[]
  122.      */
  123.     protected function getConsumerCategories(array $consumerCategories = []): array
  124.     {
  125.         $apiConsumerCategories = [];
  126.         foreach ($consumerCategories as $consumerCategory) {
  127.             $apiConsumerCategory = new \App\Model\BookingApi\TicketConsumerCategory();
  128.             $apiConsumerCategory->id $consumerCategory->getId();
  129.             $localizedText = new LocalizedText();
  130.             $localizedInfoText = new LocalizedText();
  131.             $localizedGroupName = new LocalizedText();
  132.             foreach ($this->languages as $language) {
  133.                 $localizedText->$language $consumerCategory->getName($language) ?: '';
  134.                 $localizedInfoText->$language $consumerCategory->getInfoText($language) ?: '';
  135.                 $localizedGroupName->$language $consumerCategory->getParent() instanceof TicketConsumerCategory && $consumerCategory->getParent()->getName($language) ? $consumerCategory->getParent()->getName($language) : '';
  136.             }
  137.             $apiConsumerCategory->name $localizedText;
  138.             $apiConsumerCategory->infoText $localizedInfoText;
  139.             $apiConsumerCategory->ageFrom intval($consumerCategory->getYearFrom());
  140.             $apiConsumerCategory->ageTo intval($consumerCategory->getYearTo());
  141.             $apiConsumerCategory->groupId intval($consumerCategory->getParent() instanceof TicketConsumerCategory $consumerCategory->getParent()->getId() : 0);
  142.             $apiConsumerCategory->groupName $localizedGroupName;
  143.             $apiConsumerCategories[] = $apiConsumerCategory;
  144.         }
  145.         return $apiConsumerCategories;
  146.     }
  147.     /**
  148.      * @param CartItemTicket $cartItemTicket
  149.      *
  150.      * @return bool
  151.      */
  152.     protected function keyCardNumberShortToLongCheck(CartItemTicket $cartItemTicket): bool
  153.     {
  154.         if($cartItemTicket->getKeycardShortnumber() && empty($cartItemTicket->getKeycardNumber())) {
  155.             //requires mapping keycard short number to keycard number
  156.             $keycardNumberObj KeycardNumber::getByShortNumber($cartItemTicket->getKeycardShortnumber(), 1);
  157.             if($keycardNumberObj && $keycardNumberObj->getNumber()) {
  158.                 $cartItemTicket->setKeycardNumber($keycardNumberObj->getNumber());
  159.             } else {
  160.                 return false;
  161.             }
  162.         } elseif ($cartItemTicket->getKeycardShortnumber() && $cartItemTicket->getKeycardNumber()) {
  163.             //keycard number and short number given - are they known as identical keycard?
  164.             $keycardNumberObj KeycardNumber::getByShortNumber($cartItemTicket->getKeycardShortnumber(), 1);
  165.             if(!$keycardNumberObj || $keycardNumberObj->getNumber() != $cartItemTicket->getKeycardNumber()) {
  166.                 return false;
  167.             }
  168.         }
  169.         return true;
  170.     }
  171. }