src/V4/Service/Pdf/PdfGenerator.php line 202

Open in your IDE?
  1. <?php
  2. namespace App\V4\Service\Pdf;
  3. use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
  4. use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
  5. use App\Model\CustomerFile\CustomerFile;
  6. use App\Model\Template\Template;
  7. use App\Service\ApiWebService;
  8. use App\Service\Cache\CacheManager;
  9. use App\Service\Provider\ApiGedProvider;
  10. use App\V4\Handler\Quote\QuoteGeneratorHandler;
  11. use App\V4\Model\Quote\Quote;
  12. use DateTime;
  13. use Lexik\Bundle\JWTAuthenticationBundle\TokenExtractor\TokenExtractorInterface;
  14. use Psr\Cache\InvalidArgumentException;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\RequestStack;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. use Symfony\Component\Routing\RouterInterface;
  21. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  22. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  23. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  24. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  25. use Twig\Environment;
  26. use Twig\Error\LoaderError;
  27. use Twig\Error\SyntaxError;
  28. class PdfGenerator
  29. {
  30.     public const OPTION_MODE 'mode';
  31.     public const MODE_ADD 'add';
  32.     public const MODE_REPLACE 'replace';
  33.     private const FILE_MIME_TYPE 'application/pdf';
  34.     /**
  35.      * @var ApiWebService
  36.      */
  37.     private $apiWebService;
  38.     /**
  39.      * @var ApiGedProvider
  40.      */
  41.     private $apiGedProvider;
  42.     /**
  43.      * @var RouterInterface
  44.      */
  45.     private $router;
  46.     /**
  47.      * @var RequestStack
  48.      */
  49.     private $requestStack;
  50.     /**
  51.      * @var TokenExtractorInterface
  52.      */
  53.     private $tokenExtractor;
  54.     /**
  55.      * @var Environment
  56.      */
  57.     private $environment;
  58.     /**
  59.      * @var QuoteGeneratorHandler
  60.      */
  61.     private $quoteGeneratorHandler;
  62.     /**
  63.      * @var ItemDataProviderInterface
  64.      */
  65.     private $itemDataProvider;
  66.     /**
  67.      * @var CacheManager
  68.      */
  69.     private $cacheManager;
  70.     public function __construct(
  71.         ApiWebService $apiWebService,
  72.         ApiGedProvider $apiGedProvider,
  73.         RouterInterface $router,
  74.         RequestStack $requestStack,
  75.         TokenExtractorInterface $tokenExtractor,
  76.         Environment $environment,
  77.         QuoteGeneratorHandler $quoteGeneratorHandler,
  78.         ItemDataProviderInterface $itemDataProvider,
  79.         CacheManager $cacheManager
  80.     ) {
  81.         $this->apiWebService $apiWebService;
  82.         $this->apiGedProvider $apiGedProvider;
  83.         $this->router $router;
  84.         $this->requestStack $requestStack;
  85.         $this->tokenExtractor $tokenExtractor;
  86.         $this->environment $environment;
  87.         $this->quoteGeneratorHandler $quoteGeneratorHandler;
  88.         $this->itemDataProvider $itemDataProvider;
  89.         $this->cacheManager $cacheManager;
  90.     }
  91.     /**
  92.      * @throws TransportExceptionInterface
  93.      */
  94.     public function generatePdfForQuote(Quote $quotestring $base64PdfFile): bool
  95.     {
  96.         $currentDate = new DateTime();
  97.         $gedResponse $this->apiWebService->send(
  98.             $this->apiGedProvider,
  99.             Request::METHOD_POST,
  100.             '/api/generate/pdf',
  101.             [
  102.                 'customerFile' => $base64PdfFile,
  103.                 'customerMimeType' => self::FILE_MIME_TYPE,
  104.                 'fileLabel' => ($quote->getName() ?? 'Devis').' '.$currentDate->format('Y-m-d_H-i').'.pdf',
  105.                 'customerRealFileName' => $quote->getProspectId().'_'.$quote->getId().'.pdf',
  106.                 'quoteId' => $quote->getId(),
  107.                 'quoteName' => $quote->getName(),
  108.                 'prospectId' => $quote->getProspectId(),
  109.                 'customerId' => $quote->getCustomerId(),
  110.                 'isQuotePdf' => true,
  111.             ]
  112.         );
  113.         return $gedResponse->getStatusCode() === Response::HTTP_OK;
  114.     }
  115.     /**
  116.      * @throws TransportExceptionInterface
  117.      * @throws ClientExceptionInterface
  118.      * @throws RedirectionExceptionInterface
  119.      * @throws ServerExceptionInterface
  120.      * @throws InvalidArgumentException
  121.      */
  122.     public function generatePdfWithTemplateForQuote(Quote $quotestring $base64Htmlstring $optionMode self::MODE_REPLACE, ?string $templateId null): array
  123.     {
  124.         $currentDate = new DateTime();
  125.         $gedResponse $this->apiWebService->send(
  126.             $this->apiGedProvider,
  127.             Request::METHOD_POST,
  128.             '/api/generate/pdf/template',
  129.             [
  130.                 'customerFile' => $base64Html,
  131.                 'customerMimeType' => self::FILE_MIME_TYPE,
  132.                 'fileLabel' => ($quote->getName() ?? 'Devis').' '.$currentDate->format('Y-m-d_H-i').'.pdf',
  133.                 'realFileName' => $quote->getProspectId().'_'.$quote->getId().'.pdf',
  134.                 'quoteId' => $quote->getId(),
  135.                 'quoteName' => $quote->getName(),
  136.                 'prospectId' => $quote->getProspectId(),
  137.                 'customerId' => $quote->getCustomerId(),
  138.                 'templateId' => $templateId,
  139.                 'isQuotePdf' => true,
  140.                 self::OPTION_MODE => $optionMode,
  141.             ]
  142.         );
  143.         // Then decode response and generate download link
  144.         $response json_decode($gedResponse->getContent(), true);
  145.         $token $this->tokenExtractor->extract($this->requestStack->getMasterRequest());
  146.         if ($token) {
  147.             $response['deleteLink'] = $this->router->generate(
  148.                 'customer_files_delete_route',
  149.                 ['id' => $response['id']],
  150.                 UrlGeneratorInterface::ABSOLUTE_URL
  151.             );
  152.             $response['downloadLink'] = $this->router->generate(
  153.                 'files_download_route',
  154.                 ['id' => $response['id']],
  155.                 UrlGeneratorInterface::ABSOLUTE_URL
  156.             );
  157.         }
  158.         $this->cacheManager->invalidateTag([CustomerFile::class]);
  159.         return $response;
  160.     }
  161.     /**
  162.      * @throws SyntaxError
  163.      * @throws LoaderError
  164.      * @throws ResourceClassNotSupportedException
  165.      */
  166.     public function generatePdfContentByTemplate(Quote $quote, ?string $templateId null, array $data = []): string
  167.     {
  168.         $template $this->itemDataProvider->getItem(Template::class, $templateId);
  169.         if (!$template instanceof Template) {
  170.             throw new NotFoundHttpException("template not found");
  171.         }
  172.         $generatedTwig $this->environment->createTemplate($template->getContent(), 'quote_pdf');
  173.         $quoteVars $this->quoteGeneratorHandler->getQuoteVariables($quote);
  174.         if (!isset($data['currentPdfVersion'])) {
  175.             $data['currentPdfVersion'] = $quote->getCurrentPdfVersion();
  176.         }
  177.         $currentDate = new DateTime();
  178.         if (!isset($data['currentPdfVersionDate'])) {
  179.             $data['currentPdfVersionDate'] = $currentDate->format('d/m/Y');
  180.         }
  181.         if (!isset($data['quoteLinesBySection'])) {
  182.             $data['quoteLinesBySection'] = $this->quoteGeneratorHandler->getQuoteLinesBySection($quoteVars);
  183.         }
  184.         return base64_encode($generatedTwig->render(array_merge($quoteVars$data)));
  185.     }
  186. }