src/Service/TessituraBundle/PackageService.php line 121

Open in your IDE?
  1. <?php
  2. namespace App\Service\TessituraBundle;
  3. use App\Service\TessituraBundle\Item\PackageItemPackage;
  4. use App\Service\TessituraSDK\Entity\Remote\Package;
  5. use App\Service\TessituraSDK\Entity\Remote\PackagePriceType;
  6. use App\Service\TessituraSDK\Entity\Remote\Performance;
  7. use App\Service\TessituraSDK\Entity\Remote\PriceType;
  8. use App\Service\TessituraSDK\Entity\Remote\Zone;
  9. use App\Service\TessituraSDK\Entity\User;
  10. use App\Service\TessituraSDK\Resource\TXN\Packages;
  11. use App\Service\TessituraSDK\Resource\TXN\Performances;
  12. use App\Service\TessituraSDK\Resource\TXN\PriceTypes;
  13. use App\Service\TessituraSDK\TessituraClient;
  14. use Doctrine\ORM\EntityManager;
  15. use Psr\Cache\CacheItemPoolInterface;
  16. use Psr\Log\LoggerInterface;
  17. use Doctrine\Persistence\ManagerRegistry;
  18. use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
  19. use Symfony\Component\DependencyInjection\ContainerInterface;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  22. use Symfony\Component\Serializer\Serializer;
  23. use Symfony\Component\Serializer\SerializerInterface;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. class PackageService
  26. {
  27.     public const CACHE_PACKAGE_TTL 24 60 60;
  28.     public const CACHE_PACKAGE_KEY 'package';
  29.     /**
  30.      * @var LoggerInterface
  31.      */
  32.     protected $logger;
  33.     /**
  34.      * @var TessituraClient
  35.      */
  36.     protected $client;
  37.     /**
  38.      * @var EntityManager
  39.      */
  40.     protected $em;
  41.     /**
  42.      * @var ContainerInterface
  43.      */
  44.     protected $container;
  45.     /**
  46.      * @var TranslatorInterface
  47.      */
  48.     protected $translator;
  49.     /**
  50.      * @var UrlGeneratorInterface
  51.      */
  52.     protected $router;
  53.     /**
  54.      * @var Serializer
  55.      */
  56.     protected $serializer;
  57.     /**
  58.      * @var \Symfony\Component\HttpFoundation\Request
  59.      */
  60.     protected $request;
  61.     /**
  62.      * @var AccountService
  63.      */
  64.     protected $account;
  65.     /**
  66.      * @var CacheItemPoolInterface|TagAwareAdapterInterface
  67.      */
  68.     protected $cache;
  69.     /**
  70.      * @var ConstituentService
  71.      */
  72.     protected $constituent;
  73.     private $webContentsCache = [];
  74.     /**
  75.      * CartService constructor.
  76.      *
  77.      * @param TessituraClient $client
  78.      * @param ContainerInterface $container
  79.      * @param ManagerRegistry $doctrine
  80.      * @param TranslatorInterface $translator
  81.      * @param UrlGeneratorInterface $router
  82.      * @param SerializerInterface $serializer
  83.      * @param LoggerInterface $logger
  84.      * @param RequestStack $requestStack
  85.      * @param AccountService $account
  86.      * @param ConstituentService $constituent
  87.      */
  88.     public function __construct(
  89.         TessituraClient $client,
  90.         ContainerInterface $container,
  91.         ManagerRegistry $doctrine,
  92.         TranslatorInterface $translator,
  93.         UrlGeneratorInterface $router,
  94.         SerializerInterface $serializer,
  95.         LoggerInterface $logger,
  96.         RequestStack $requestStack,
  97.         ConstituentService $constituent
  98.     ) {
  99.         $this->client      $client;
  100.         $this->container   $container;
  101.         $this->translator  $translator;
  102.         $this->router      $router;
  103.         $this->serializer  $serializer;
  104.         $this->logger      $logger;
  105.         $this->em          $doctrine->getManager();
  106.         $this->request     $requestStack->getCurrentRequest();
  107.         $this->cache       $container->get('cache.app');
  108.         $this->constituent $constituent;
  109.     }
  110.     /**
  111.      * @param int $seasonId
  112.      *
  113.      * @return PackageItemPackage[]
  114.      */
  115.     public function getAll($seasonIds)
  116.     {
  117.         /** @var Item\PackageItemPackage[] $items */
  118.         $items     = [];
  119.         $startDate = new \DateTime('now');
  120.         $startDate->setTime(000);
  121.         if (is_array($seasonIds)) {
  122.             $seasonIds implode(','$seasonIds);
  123.         }
  124.         /** @var Package[] $packages */
  125.         $packages $this->client->request(Packages::getAll([
  126.             'seasonIds' => $seasonIds,
  127.         ]))->denormalize(Package::class . '[]');
  128.         if (!count($packages)) {
  129.             return $items;
  130.         }
  131.         $pricesRequests = [];
  132.         foreach ($packages as $package) {
  133.             $pricesRequests['price-' $package->getId()] = Packages::getPrices($package->getId(), [
  134.                 'asOfDateTime' => $startDate
  135.                 ->format('Y-m-d\TH:i:s\Z'),
  136.                 'modeOfSaleId' => $this->getUser()->getModeOfSaleId()
  137.             ]);
  138.             $pricesRequests['type-' $package->getId()]  = PriceTypes::getValidPriceTypes([
  139.                 'packageId'    => $package->getId(),
  140.                 'modeOfSaleId' => $this->getUser()->getModeOfSaleId()
  141.             ]);
  142.         }
  143.         $pricesResponses $this->client->requestAsync($pricesRequests);
  144.         $packagePerformances = [];
  145.         $packageZones        = [];
  146.         $packagePrices       = [];
  147.         $perfomanceIds       = [];
  148.         foreach ($pricesResponses as $key => $response) {
  149.             list($type$packageId) = explode('-'$key);
  150.             /** @var PackagePriceType[] $priceType */
  151.             /** @var Zone[] $zones */
  152.             if ($type === 'type') {
  153.                 $priceTypes $response->denormalize(PriceType::class . '[]');
  154.                 /** @var PriceType $priceType */
  155.                 foreach ($priceTypes as $priceType) {
  156.                     $packageZones[$packageId] = $priceType->getZones();
  157.                 }
  158.             } elseif ($type === 'price') {
  159.                 $priceTypes $response->denormalize(PackagePriceType::class . '[]');
  160.                 /** @var PackagePriceType $priceType */
  161.                 foreach ($priceTypes as $priceType) {
  162.                     $packagePerformances[$packageId][$priceType->getPerformanceId()] = true;
  163.                     $packagePrices[$packageId][]                                     = $priceType;
  164.                     $perfomanceIds[$priceType->getPerformanceId()]                   = true;
  165.                 }
  166.             }
  167.         }
  168.         $perfomanceIds array_keys($perfomanceIds);
  169.         if (empty($perfomanceIds)) {
  170.             return $items;
  171.         }
  172.         /** @var Performance[] $performances */
  173.         $performances $this->client->request(Performances::getAll([
  174.             'performanceIds' => implode(','$perfomanceIds)
  175.         ]))->denormalize(Performance::class . '[]');
  176.         $requests = [];
  177.         foreach ($packages as $package) {
  178.             /** @var  Package $package */
  179.             if (!$package->getFixedSeatIndicator()) {
  180.                 continue;
  181.             }
  182.             if (empty($packagePerformances[$package->getId()])) {
  183.                 continue;
  184.             }
  185.             if (empty($packageZones[$package->getId()])) {
  186.                 continue;
  187.             }
  188.             if (empty($packagePrices[$package->getId()])) {
  189.                 continue;
  190.             }
  191.             $performanceItems = [];
  192.             foreach ($packagePerformances[$package->getId()] as $performanceId => $exists) {
  193.                 /** @var Performance $foundPerformance */
  194.                 $foundPerformance array_reduce(
  195.                     $performances,
  196.                     function ($carry$performance) use ($performanceId) {
  197.                         /** @var Performance $performance */
  198.                         if ($performance->getId() === $performanceId) {
  199.                             $carry $performance;
  200.                         }
  201.                         return $carry;
  202.                     },
  203.                     null
  204.                 );
  205.                 if ($foundPerformance->getProductionSeason()->getId() === 0) {
  206.                     continue;
  207.                 }
  208.                 $performance = new Item\CartItemPerformance($this->container$this->em);
  209.                 $performance->setCartPerformance($foundPerformance->asCartPerformance());
  210.                 $performanceItems[] = $performance;
  211.             }
  212.             usort($performanceItems, function ($a$b) {
  213.                 /** @var Item\CartItemPerformance $a */
  214.                 /** @var Item\CartItemPerformance $b */
  215.                 return $a->getCartPerformance()->getPerformanceDateTime() <=> $b->getCartPerformance()->getPerformanceDateTime();
  216.             });
  217.             $item = new PackageItemPackage($this->container$this->em);
  218.             $item->setCartPackage($package->asCartPackage());
  219.             $item->setZones($packageZones[$package->getId()]);
  220.             $item->setPackagePriceTypes($packagePrices[$package->getId()]);
  221.             $item->setPerformances($performanceItems);
  222.             $items[] = $item;
  223.         }
  224.         return $items;
  225.     }
  226.     /**
  227.      * @return User
  228.      */
  229.     public function getUser()
  230.     {
  231.         /** @var User $user */
  232.         $user $this->container->get('security.token_storage')->getToken()->getUser();
  233.         return $user;
  234.     }
  235. }