<?php
/**
* Created by Elements.at New Media Solutions GmbH
*
*/
namespace App\Controller;
use App\Model\Shop\Order;
use App\Model\Type\TenantType;
use App\Service\Shop\ShopService;
use App\Web2Print\HeadlessChrome;
use Elements\Bundle\SkidataTicketingSwebBundle\Model\Constant\AcquisitionType;
use Elements\Bundle\TicketShopFrameworkBundle\Model\DataObject\OnlineShopOrderItem;
use Elements\Bundle\TicketShopFrameworkBundle\Service\VoucherCodeService;
use Pimcore\Model\DataObject\OnlineShopOrder;
use Pimcore\Model\DataObject\TicketShopVoucherCode;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class PdfController extends AbstractController
{
#[Route('/{_locale}/pdf/event-voucher', name: 'event_pdf_voucher')]
public function voucherAction(Request $request, VoucherCodeService $voucherCodeService): Response
{
//TODO - compatibility-mode for old links
$params = [
'document' => $this->document,
'editmode' => $this->editmode,
];
if ($voucherCode = $request->get('code')) {
$voucherCode = TicketShopVoucherCode::getByCode($voucherCode, 1);
if ($voucherCode) {
$params['qrCodeData'] = $voucherCodeService->getVoucherQrCode($voucherCode->getCode(), 114);
$params['voucherCode'] = $voucherCode;
$orderItems = $voucherCode->getReferences();
if (count($orderItems)) {
/** @var OnlineShopOrderItem $first */
$first = $orderItems[0];
$order = $first->getOrder();
$params['order'] = $order;
}
}
}
if ($voucherId = $request->get('voucherId')) {
if ($voucherCode = TicketShopVoucherCode::getById(intval($voucherId))) {
if ($voucherCode->getCode() === $request->get('voucherCode')) {
$params['qrCodeData'] = $voucherCodeService->getVoucherQrCode($voucherCode->getCode(), 114);
$params['voucherCode'] = $voucherCode;
$params['order'] = Order::getById($request->get('order'));
}
}
}
if (\Pimcore::inDebugMode() && ($request->get('html') == 1 || $this->editmode)) {
return $this->render('pdf/voucher.html.twig', $params);
}
$html = $this->renderView('pdf/voucher.html.twig', $params);
$header = $this->renderView('includes/pdf-voucher/header.html.twig', $params);
$footer = $this->renderView('includes/pdf-voucher/footer.html.twig', $params);
$processor = new HeadlessChrome();
$params = [
'displayHeaderFooter' => true,
'headerTemplate' => $header,
'footerTemplate' => $footer,
'landscape' => false,
'printBackground' => true,
'format' => 'A4',
'margin' => [
'top' => '260px',
'bottom' => '30mm',
'right' => '34px',
'left' => '34px',
],
];
return new \Symfony\Component\HttpFoundation\Response(
$processor->getPdfFromString($html, $params),
200,
[
'Content-Type' => 'application/pdf',
'X-Robots-Tag' => 'noindex, nofollow',
]
);
}
//B2B Invoice PDF
public function invoiceAction(Request $request): Response
{
$params = [
'document' => $this->document,
'editmode' => $this->editmode,
];
if ($id = base64_decode($request->get('id'))) {
/** @var Order $order */
$order = Order::getById((int)$id);
$params['order'] = $order;
}
if ((\Pimcore::inDebugMode() && $request->get('html') == 1) || $this->editmode) {
return $this->render('pdf/invoice.html.twig', $params);
}
$html = $this->renderView('pdf/invoice.html.twig', $params);
$header = $this->renderView('includes/pdf-invoice/header.html.twig', $params);
$footer = $this->renderView('includes/pdf-invoice/footer.html.twig', $params);
$processor = new HeadlessChrome();
$params = [
'displayHeaderFooter' => true,
'headerTemplate' => $header,
'footerTemplate' => $footer,
'landscape' => false,
'printBackground' => true,
'format' => 'A4',
'margin' => [
'top' => '120px',
'bottom' => '30mm',
'right' => '34px',
'left' => '34px',
],
];
return new \Symfony\Component\HttpFoundation\Response(
$processor->getPdfFromString($html, $params),
200,
[
'Content-Type' => 'application/pdf',
'X-Robots-Tag' => 'noindex, nofollow',
]
);
}
public function qrCodeAction(Request $request, ShopService $shopService): Response
{
if (\Pimcore::inDebugMode() && ($request->get('html') == 1 || $this->editmode)) {
return $this->render('pdf/qr-code.html.twig');
}
$qrCodeText = '';
$orderNumber = null;
$errorLevel = null;
if ($id = base64_decode($request->get('id'))) {
$orderItem = OnlineShopOrderItem::getById((int)$id);
if (!$orderItem) {
throw $this->createNotFoundException('Order item not found');
}
$order = $orderItem->getOrder();
if ($order instanceof OnlineShopOrder) {
$orderNumber = $order->getTenant() == TenantType::TOUR_OPERATOR ? $order->getOrdernumber() : null;
}
$acquisitionType = $orderItem->getCheckoutDataBrick()->getAcquisitionType();
if ($acquisitionType == AcquisitionType::BARCODE) {
$qrCodeText = $orderItem->getSkidataBrick()->getSkidataBarcodeData();
$serialNumber = $orderItem->getSkidataBrick()->getSkidataBarcodeSerialNumber();
} elseif ($acquisitionType == AcquisitionType::TICKETPICKUP) {
$qrCodeText = $orderItem->getSkidataBrick()->getSkidataConfirmationNumber();
} elseif ($acquisitionType == AcquisitionType::ETICKET) {
$qrCodeText = $orderItem->getSkidataBrick()->getSkidataEticketWeblink();
$serialNumber = $orderItem->getSkidataBrick()->getSkidataEticketSerialNumber();
$errorLevel = 2; // Low error correction level for e-tickets
} else {
throw $this->createNotFoundException('Acquisition ' . $acquisitionType . ' type not supported');
}
} elseif (\Pimcore::inDebugMode()) {
$qrCodeText = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
}
$params = [
'qrCodeData' => $shopService->createQrCode($qrCodeText, 400, null, $errorLevel),
'orderItem' => $orderItem ?? null,
'orderNumber' => $orderNumber,
'qrCodeText' => $qrCodeText,
'acquisitionType' => $acquisitionType ?? null,
'serialNumber' => $serialNumber ?? null,
];
$html = $this->renderView('pdf/qr-code.html.twig', $params);
$header = $this->renderView('includes/pdf-qr-code/header.html.twig', $params);
$footer = $this->renderView('includes/pdf-qr-code/footer.html.twig', $params);
$processor = new HeadlessChrome();
$config = [
'displayHeaderFooter' => true,
'headerTemplate' => $header,
'footerTemplate' => $footer,
'landscape' => false,
'printBackground' => true,
'format' => 'A4',
'margin' => [
'top' => '90px',
'bottom' => '30mm',
'right' => '38px',
'left' => '34px',
],
];
return new \Symfony\Component\HttpFoundation\Response(
$processor->getPdfFromString($html, $config),
200,
[
'Content-Type' => 'application/pdf',
'X-Robots-Tag' => 'noindex, nofollow',
]
);
}
/**
* @Route("/qrcodepreviewer/preview/{acquisitionType}", name="qrcode_previewer")
*
* @param Request $request
* @param ShopService $shopService
*
* @return Response
*/
public function previewAction(Request $request, ShopService $shopService, string $acquisitionType): Response
{
error_reporting(E_ALL ^ E_DEPRECATED);
$context = json_decode($request->get('context'), true);
$objectId = $context['objectId'];
$object = OnlineShopOrderItem::getById($objectId);
$response = new Response('no data');
if (($qrCodeTicket = $object->getSkidataBrick()->getSkidataBarcodeData()) && $acquisitionType == AcquisitionType::BARCODE) {
$content = '<img src="' . $shopService->createQrCode($qrCodeTicket)->getDataUri() . '" width="280" height="280" alt="">';
$response->setContent($content);
} elseif (($webLink = $object->getSkidataBrick()->getSkidataEticketWeblink()) && $acquisitionType == AcquisitionType::ETICKET) {
$content = '<img src="' . $shopService->createQrCode($webLink)->getDataUri() . '" width="280" height="280" alt="">';
$response->setContent($content);
}
return $response;
}
}