src/Repository/ProductVariantRepository.php line 83

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Gos\Country;
  4. use App\Entity\Gos\Product;
  5. use App\Entity\Gos\ProductAssociation;
  6. use App\Entity\Gos\ProductVariant;
  7. use App\Entity\Gos\ProductVariantPack;
  8. use App\Entity\Gos\Uniqskills\Course;
  9. use App\Enum\Product\ProductSourceSystem;
  10. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  11. use Doctrine\Common\Collections\Collection;
  12. use Doctrine\DBAL\Connection;
  13. use Doctrine\ORM\EntityRepository;
  14. use Doctrine\ORM\Query;
  15. use Doctrine\ORM\QueryBuilder;
  16. use Doctrine\Persistence\ManagerRegistry;
  17. /**
  18.  * ProductVariantRepository
  19.  *
  20.  * This class was generated by the Doctrine ORM. Add your own custom
  21.  * repository methods below.
  22.  */
  23. class ProductVariantRepository extends ServiceEntityRepository
  24. {
  25.     public function __construct(ManagerRegistry $registry)
  26.     {
  27.         parent::__construct($registryProductVariant::class);
  28.     }
  29.     private const WIDGETS_CACHE_RESULT_LIFETIME 300//5 minutes
  30.     public function findAllByCourseAndCountryCode($courseSlug$myCountryCode)
  31.     {
  32.         return $this
  33.             ->createQueryBuilder('pv')
  34.             ->leftJoin('pv.courses''course')
  35.             ->leftJoin('pv.country''country')
  36.             ->where('course.slug = :courseSlug')
  37.             ->setParameter('courseSlug'$courseSlug)
  38.             ->andWhere('country.alpha2 = :countryCode')
  39.             ->setParameter('countryCode'$myCountryCode)
  40.             ->getQuery()
  41.             ->getResult();
  42.     }
  43.     public function findProductVariantToAdd($arrayProductVariantNo)
  44.     {
  45.         return $this
  46.             ->createQueryBuilder('pv')
  47.             ->leftJoin('pv.physicalVariant''mpv')
  48.             ->where('pv.productVariantNoComplete IN (:pvnc)')
  49.             ->orWhere('mpv.productVariantNoComplete IN (:pvnc) AND pv.isAddition =:isAddition')
  50.             ->setParameter('pvnc'$arrayProductVariantNo)
  51.             ->setParameter('isAddition'true)
  52.             ->getQuery()
  53.             ->getResult();
  54.     }
  55.     public function findOneByIdAndProductVariantNoComplete($productVariantId$productVariantNoComplete)
  56.     {
  57.         return $this
  58.             ->createQueryBuilder('pv')
  59.             ->leftJoin('pv.physicalVariant''physicalVariant')
  60.             ->where('pv.id = :id')
  61.             ->setParameter('id'$productVariantId)
  62.             ->andWhere('physicalVariant.productVariantNoComplete = :physicalVariant')
  63.             ->setParameter('physicalVariant'$productVariantNoComplete)
  64.             ->getQuery()->setMaxResults(1)->getOneOrNullResult();
  65.     }
  66.     public function findTaxFreeForBudgetUnitIsTrue($productCart)
  67.     {
  68.         return $this
  69.             ->createQueryBuilder('pv')
  70.             ->leftJoin('pv.productCart''pc')
  71.             ->where('pc.id IN (:id)')
  72.             ->setParameter('id'$productCart)
  73.             ->andWhere('pv.taxFreeForBudgetUnit = true')
  74.             ->getQuery()->getResult();
  75.     }
  76.     public function findAllFiltered(QueryBuilder $qb$psId 0$number null$isEvent null$course null$country null$sourceSystem): QueryBuilder
  77.     {
  78.         $qb
  79.             ->distinct()
  80.             ->select('pv')
  81.             ->from(ProductVariant::class, 'pv');
  82.         if ($psId)
  83.         {
  84.             $qb
  85.                 ->leftJoin('pv.portalSettings''ps')
  86.                 ->where('ps.id = :portalSettingsId')
  87.                 ->setParameter('portalSettingsId'$psId);
  88.         }
  89.         if (!empty($number))
  90.         {
  91.             $qb
  92.                 ->andWhere('pv.productVariantNoComplete = :no')
  93.                 ->setParameter('no'$number);
  94.         }
  95.         if (!is_null($isEvent))
  96.         {
  97.             $qb
  98.                 ->leftJoin('pv.masterProduct''master_product')
  99.                 ->leftJoin('master_product.productGosType''product_gos_type');
  100.             if ($isEvent)
  101.             {
  102.                 $qb->where('product_gos_type.name = :productGosType')
  103.                     ->setParameter('productGosType''event');
  104.             }
  105.             else
  106.             {
  107.                 $qb->where('product_gos_type.name != :productGosType')
  108.                     ->setParameter('productGosType''event');
  109.             }
  110.         }
  111.         if ($course)
  112.         {
  113.             $qb
  114.                 ->leftJoin('pv.courses''c')
  115.                 ->andWhere('c.id = (:cid)')
  116.                 ->setParameter('cid'$course);
  117.         }
  118.         if ($country)
  119.         {
  120.             $qb
  121.                 ->leftJoin('pv.country''country')
  122.                 ->andWhere('country.id = (:countryid)')
  123.                 ->setParameter('countryid'$country);
  124.         }
  125.         if (!empty($sourceSystem))
  126.         {
  127.             $sourceSystem ProductSourceSystem::from($sourceSystem);
  128.             $qb
  129.                 ->innerJoin('pv.masterProduct''masterProduct')
  130.                 ->andWhere('masterProduct.sourceSystem = :sourceSystem')
  131.                 ->setParameter('sourceSystem'$sourceSystem);
  132.         }
  133.         return $qb;
  134.     }
  135.     public function findOnlyEvents($notAssignedToEventsEntity false$maximum null)
  136.     {
  137.         $qb $this->createQueryBuilder('e')
  138.                 ->leftJoin('e.masterProduct''mp')
  139.                 ->leftJoin('mp.productGosType''product_gos_type')
  140.                 ->where('product_gos_type.name = :productGosType')
  141.                 ->setParameter('productGosType''event');
  142.         if ($notAssignedToEventsEntity === true)
  143.         {
  144.             $qb
  145.                ->andWhere('e.events is null');
  146.         }
  147.         if (!is_null($maximum))
  148.         {
  149.             $qb->setMaxResults($maximum);
  150.         }
  151.         return $qb->getQuery()->getResult();
  152.     }
  153.     public function findForAjaxFilter($productVariantNoComplete, array $findIn null)
  154.     {
  155.         $form $this
  156.             ->createQueryBuilder('pv')
  157.             ->select("pv.id, COALESCE(pv.productVariantNoComplete, CONCAT(pv.id, ' ', pv.workingTitle)) as text");
  158.         if (!empty($productVariantNoComplete))
  159.         {
  160.             $form
  161.                 ->andWhere("COALESCE(pv.productVariantNoComplete, CONCAT(pv.id, ' ', pv.workingTitle)) LIKE :productVariantNoComplete")
  162.                 ->setParameter('productVariantNoComplete'$productVariantNoComplete '%');
  163.         }
  164.         if (is_iterable($findIn))
  165.         {
  166.             $form
  167.                 ->andWhere('pv.id IN (:findIn)')
  168.                 ->setParameter('findIn'$findIn)
  169.             ;
  170.         }
  171.         return $form->getQuery();
  172.     }
  173.     public function findByProductsVariantsNo($productsVariantsNumbers$isAddition$getPhysicalVariant true)
  174.     {
  175.         $query $this
  176.             ->createQueryBuilder('pv')
  177.             ->where('pv.productVariantNoComplete IN (:pvnc)');
  178.         if ($getPhysicalVariant)
  179.         {
  180.             $query
  181.                 ->leftJoin('pv.physicalVariant''mpv')
  182.                 ->orWhere('mpv.productVariantNoComplete IN (:pvnc) AND pv.isAddition =:isAddition')
  183.                 ->setParameter('isAddition'$isAddition);
  184.         }
  185.         return $query->setParameter('pvnc'$productsVariantsNumbers)->getQuery()->getResult();
  186.     }
  187.     public function findOneByProductVariantsNo($productsVariantsNumber$isAddition)
  188.     {
  189.         return $this
  190.             ->createQueryBuilder('pv')
  191.             ->leftJoin('pv.physicalVariant''mpv')
  192.             ->where('pv.productVariantNoComplete = :pvnc')
  193.             ->orWhere('mpv.productVariantNoComplete = :pvnc AND pv.isAddition =:isAddition')
  194.             ->setParameter('pvnc'$productsVariantsNumber)
  195.             ->setParameter('isAddition'$isAddition)
  196.             ->getQuery()
  197.             ->disableResultCache()
  198.             ->setMaxResults(1)->getOneOrNullResult();
  199.     }
  200.     // This method is used to find a product variant by its number with caching for widgets (e.g. show-price).
  201.     public function findOneByProductVariantsNoCacheable($productsVariantsNumber$isAddition)
  202.     {
  203.         return $this
  204.             ->createQueryBuilder('pv')
  205.             ->leftJoin('pv.physicalVariant''mpv')
  206.             ->where('pv.productVariantNoComplete = :pvnc')
  207.             ->orWhere('mpv.productVariantNoComplete = :pvnc AND pv.isAddition =:isAddition')
  208.             ->setParameter('pvnc'$productsVariantsNumber)
  209.             ->setParameter('isAddition'$isAddition)
  210.             ->getQuery()
  211.             ->enableResultCache(self::WIDGETS_CACHE_RESULT_LIFETIME'PV_' $productsVariantsNumber '_' . (int)$isAddition)
  212.             ->setMaxResults(1)->getOneOrNullResult();
  213.     }
  214.     // This method is used to find a product variant by its id with caching for widgets (e.g. show-price).
  215.     public function findOneCacheable($id)
  216.     {
  217.         return $this
  218.             ->createQueryBuilder('pv')
  219.             ->where('pv.id = :id')
  220.             ->setParameter('id'$id)
  221.             ->getQuery()
  222.             ->enableResultCache(self::WIDGETS_CACHE_RESULT_LIFETIME'PV_byId_' $id)
  223.             ->setMaxResults(1)
  224.             ->getOneOrNullResult();
  225.     }
  226.     // This method is used to find a product variant by its number with caching for widgets (e.g. show-price-omnibus, check-exclusive-pv-info).
  227.     public function findOneByProductVariantNoCompleteCacheable($productsVariantsNumber)
  228.     {
  229.         return $this
  230.             ->createQueryBuilder('pv')
  231.             ->where('pv.productVariantNoComplete = :pvnc')
  232.             ->setParameter('pvnc'$productsVariantsNumber)
  233.             ->getQuery()
  234.             ->enableResultCache(self::WIDGETS_CACHE_RESULT_LIFETIME'PV_byNoComplete_' $productsVariantsNumber)
  235.             ->setMaxResults(1)
  236.             ->getOneOrNullResult();
  237.     }
  238.     public function findMaxProductVariantId()
  239.     {
  240.         return $this->createQueryBuilder('pv')
  241.             ->select('MAX(pv.productVariantId) AS newId')
  242.             ->setMaxResults(1)
  243.             ->getQuery()
  244.             ->getOneOrNullResult();
  245.     }
  246.     public function findLastProductVariantNoComplete($masterProductId)
  247.     {
  248.         $sql 'SELECT pv.product_variant_no
  249.                 FROM product_variant pv 
  250.                 WHERE pv.master_product_id='.$masterProductId.
  251.                 ORDER BY CAST(pv.product_variant_no AS unsigned) DESC LIMIT 1';
  252.         return $this->getEntityManager()
  253.             ->getConnection()
  254.             ->prepare($sql)
  255.             ->executeQuery()
  256.             ->fetchAllAssociative();
  257.     }
  258.     public function findAllByCourseAndCountry($slugCourse$country)
  259.     {
  260.         return $this
  261.             ->createQueryBuilder('pv')
  262.             ->leftJoin("pv.country""country")
  263.             ->leftJoin("pv.courses"'course')
  264.             ->where('course.slug = :slugCourse')
  265.             ->setParameter('slugCourse'$slugCourse)
  266.             ->andWhere('country.name = :country')
  267.             ->setParameter('country'$country)
  268.             ->getQuery()
  269.             ->getResult();
  270.     }
  271.     public function findByVariantStateActiveOrTest()
  272.     {
  273.         return $this
  274.             ->createQueryBuilder('pv')
  275.             ->where('pv.variantState = :active')
  276.             ->setParameter('active''active')
  277.             ->orWhere('pv.variantState = :test')
  278.             ->setParameter('test''Product test')
  279.             ->getQuery()
  280.             ->getResult();
  281.     }
  282.     public function findOneEcoVariantFromProductAssociation(ProductAssociation $productAssociation): ?ProductVariant
  283.     {
  284.         return $this
  285.             ->createQueryBuilder('pv')
  286.             ->leftJoin('pv.productAssociation''pa')
  287.             ->where('pa.id = :paId')
  288.             ->setParameter('paId'$productAssociation->getId())
  289.             ->andWhere('pv.productVariantNoComplete NOT LIKE :premium or pv.productVariantNoComplete LIKE :startNumberWith68')
  290.             ->setParameter('startNumberWith68''68%')
  291.             ->setParameter('premium''6%')
  292.             ->andWhere('pv.productVariantNoComplete NOT LIKE :online')
  293.             ->setParameter('online''8%')
  294.             ->andWhere('pv.productVariantNoComplete NOT LIKE :event')
  295.             ->setParameter('event''7%')
  296.             ->addOrderBy('pv.priceGross''ASC')
  297.             ->setMaxResults(1)
  298.             ->getQuery()
  299.             ->getOneOrNullResult();
  300.     }
  301.     public function findAllEligibleToMakeGiftable($countries = [])
  302.     {
  303.         return $this
  304.             ->createQueryBuilder('pv')
  305.             ->leftJoin('pv.country''country')
  306.             ->leftJoin('pv.courses''course')
  307.             ->where('pv.isGiftable = false OR pv.isGiftable IS NULL')
  308.             ->andWhere('(country.slug IN (:countries)) OR (country.slug = :poland AND pv.productVariantNo = 1)')
  309.             ->setParameter('countries'$countries)
  310.             ->setParameter('poland''poland')
  311.             ->andWhere('course.id IS NOT NULL')
  312.             ->getQuery()
  313.             ->getResult();
  314.     }
  315.     public function findAllFromProductVariantPack(ProductVariantPack $productVariantPack)
  316.     {
  317.         $qb $this
  318.             ->createQueryBuilder('pv')
  319.             ->leftJoin('pv.productVariantPacks''pvp');
  320.         if (!$productVariantPack->getProductVariants()->isEmpty())
  321.         {
  322.             $variantsIds $productVariantPack->getProductVariants()->map(function($item) {return $item->getId();});
  323.             $qb
  324.                 ->where('pv.id IN (:variantsFromPack)')
  325.                 ->setParameter('variantsFromPack'$variantsIds);
  326.         }
  327.         if (!$productVariantPack->getCountries()->isEmpty())
  328.         {
  329.             $countriesIds $productVariantPack->getCountries()->map(function($item) {return $item->getId();});
  330.             $qb
  331.                 ->leftJoin('pv.country''country')
  332.                 ->andWhere('country.id IN (:countries)')
  333.                 ->setParameter('countries'$countriesIds);
  334.         }
  335.         if (!$productVariantPack->getPortalSettings()->isEmpty())
  336.         {
  337.             $portalSettingsIds $productVariantPack->getPortalSettings()->map(function($item) {return $item->getId();});
  338.             $qb
  339.                 ->leftJoin('pv.portalSettings''portalSettings')
  340.                 ->andWhere('portalSettings.id IN (:portalSettings)')
  341.                 ->setParameter('portalSettings'$portalSettingsIds);
  342.         }
  343.         if (!$productVariantPack->getClientTypes()->isEmpty())
  344.         {
  345.             $clientTypesIds $productVariantPack->getClientTypes()->map(function($item) {return $item->getId();});
  346.             $qb
  347.                 ->leftJoin('pv.clientType''clientType')
  348.                 ->andWhere('clientType.id IN (:clientTypes)')
  349.                 ->setParameter('clientTypes'$clientTypesIds);
  350.         }
  351.         return $qb->getQuery()->getResult();
  352.     }
  353.     public function findAllFromProductVariantPacks(Collection $productVariantPacks)
  354.     {
  355.         if ($productVariantPacks->isEmpty()) {
  356.             return [];
  357.         }
  358.         $productVariantPackIds $productVariantPacks->map(function (ProductVariantPack $productVariantPack) {
  359.             return $productVariantPack->getId();
  360.         })->toArray();
  361.         $sql '
  362.             SELECT
  363.                 pvp.id AS product_variant_pack_id,
  364.                 group_concat(DISTINCT pspv.portal_settings_id) AS product_variant_portal_settings_id, 
  365.                 group_concat(DISTINCT pvct.client_type_id) AS product_variant_client_type_id, 
  366.                 pv.*
  367.             FROM
  368.                 product_variant_pack pvp
  369.             JOIN product_variant_in_pack pvip ON
  370.                 pvip.product_variant_pack_id = pvp.id
  371.             JOIN product_variant pv ON
  372.                 pv.id = pvip.product_variant_id
  373.             LEFT JOIN portal_settings_product_variant pspv ON
  374.                 pspv.product_variant_id = pv.id
  375.             LEFT JOIN product_variant_client_type pvct ON
  376.                 pvct.product_variant_id = pv.id
  377.             WHERE
  378.                 pvp.id IN ( ' implode(", "array_fill(0count($productVariantPackIds), "?")) . ')
  379.             GROUP BY 
  380.                 pvp.id,
  381.                 pv.id
  382.         ';
  383.         $productVariants $this->getEntityManager()->getConnection()->executeQuery($sql$productVariantPackIds)->fetchAllAssociative();
  384.         $productVariantsByPack = [];
  385.         foreach ($productVariants as &$productVariantArray) {
  386.             $productVariantArray['product_variant_portal_settings_id'] = explode(','$productVariantArray['product_variant_portal_settings_id']);
  387.             $productVariantArray['product_variant_client_type_id'] = explode(','$productVariantArray['product_variant_client_type_id']);
  388.             if (!array_key_exists($productVariantArray['product_variant_pack_id'], $productVariantsByPack)) {
  389.                 $productVariantsByPack[$productVariantArray['product_variant_pack_id']] = [];
  390.             }
  391.             $productVariantsByPack[$productVariantArray['product_variant_pack_id']][] = $productVariantArray;
  392.         }
  393.         /** @var ProductVariantPack $productVariantPack */
  394.         foreach ($productVariantPacks as $productVariantPack)
  395.         {
  396.             if (!$productVariantPack->getCountries()->isEmpty() ||
  397.                 !$productVariantPack->getPortalSettings()->isEmpty() ||
  398.                 !$productVariantPack->getClientTypes()->isEmpty())
  399.             {
  400.                 if (!$productVariantPack->getCountries()->isEmpty())
  401.                 {
  402.                     $countriesIds $productVariantPack->getCountries()->map(function($item) { return $item->getId(); });
  403.                     array_filter($productVariantsByPack[$productVariantPack->getId()], function ($productVariant) use ($countriesIds) {
  404.                         return in_array($productVariant['country_id'], $countriesIds->toArray());
  405.                     });
  406.                 }
  407.                 if (!$productVariantPack->getPortalSettings()->isEmpty())
  408.                 {
  409.                     $portalSettingsIds $productVariantPack->getPortalSettings()->map(function($item) { return $item->getId(); });
  410.                     array_filter($productVariantsByPack[$productVariantPack->getId()], function ($productVariant) use ($portalSettingsIds) {
  411.                         return array_intersect($productVariant['product_variant_portal_settings_id'], $portalSettingsIds->toArray());
  412.                     });
  413.                 }
  414.                 if (!$productVariantPack->getClientTypes()->isEmpty())
  415.                 {
  416.                     $clientTypesIds $productVariantPack->getClientTypes()->map(function($item) { return $item->getId(); });
  417.                     array_filter($productVariantsByPack[$productVariantPack->getId()], function ($productVariant) use ($clientTypesIds) {
  418.                         return array_intersect($productVariant['product_variant_client_type_id'], $clientTypesIds->toArray());
  419.                     });
  420.                 }
  421.             }
  422.         }
  423.         return array_merge(...$productVariantsByPack);
  424.     }
  425.     public function findMainForCourse(Course $course$country null): ?ProductVariant
  426.     {
  427.         $qb $this
  428.             ->createQueryBuilder('pv')
  429.             ->leftJoin('pv.courses''course')
  430.             ->where('course.id = :courseId')
  431.             ->setParameter('courseId'$course->getId());
  432.         if (!is_null($country))
  433.         {
  434.             $qb
  435.                 ->andWhere('pv.country = :country')
  436.                 ->setParameter('country'$country);
  437.         }
  438.         return $qb->setMaxResults(1)->getQuery()->getOneOrNullResult();
  439.     }
  440.     public function findProlongation(ProductVariant $productVariantint $days): ?ProductVariant
  441.     {
  442.         $qb $this
  443.             ->createQueryBuilder('pv')
  444.             ->andWhere('pv.productVariantNoComplete LIKE :variantNumber');
  445.         if ($days === 30)
  446.         {
  447.             $qb->setParameter('variantNumber''2' $productVariant->getMasterProduct()->getProductNo() . '/1');
  448.         }
  449.         elseif ($days === 270)
  450.         {
  451.             $qb->setParameter('variantNumber''2' $productVariant->getMasterProduct()->getProductNo() . '/2');
  452.         }
  453.         else
  454.         {
  455.             return null;
  456.         }
  457.         return $qb->setMaxResults(1)->getQuery()->getOneOrNullResult();
  458.     }
  459.     public function findFullAccessForCourseAndCountry(Course $course, ?Country $country)
  460.     {
  461.         $qb $this->createQueryBuilder('pv')
  462.             ->leftJoin('pv.courses''course')
  463.             ->leftJoin('pv.country''country')
  464.             ->leftJoin('pv.packages''package')
  465.             ->where('course.id = :courseId')
  466.             ->andWhere('package.id IS NULL')
  467.             ->andWhere('pv.installmentAmount < 2 OR pv.installmentAmount IS NULL')
  468.             ->setParameter('courseId'$course->getId())
  469.             ->andWhere('course.isActive = true');
  470.         if ($country !== null)
  471.         {
  472.             $qb->andWhere('country.slug = :countrySlug')
  473.                 ->setParameter('countrySlug'$country->getSlug());
  474.         }
  475.         return $qb->setMaxResults(1)
  476.             ->getQuery()
  477.             ->getOneOrNullResult();
  478.     }
  479.     public function addToProductVariantPack($productPackId$countries)
  480.     {
  481.         $sql "INSERT INTO product_variant_in_pack
  482.         (
  483.             product_variant_pack_id,
  484.             product_variant_id
  485.         )
  486.         SELECT DISTINCT
  487.             ".$productPackId.",
  488.             pv.id
  489.         FROM
  490.             product_variant pv
  491.         LEFT JOIN 
  492.             payment_type pt ON pv.payment_type_id = pt.id
  493.         LEFT JOIN
  494.             relations_product_variant rpv ON rpv.physical_variant_id = pv.id
  495.         LEFT JOIN
  496.             product_variant vpv ON vpv.id = rpv.virtual_variant_id
  497.         LEFT JOIN
  498.             product_variant_course pvc ON pvc.product_variant_id = pv.id
  499.         INNER JOIN
  500.             product_variant_payment_method pvpm ON pvpm.product_variant_id = pv.id
  501.         WHERE
  502.         (pt.slug IS NULL OR pt.slug != 'partial-payment')
  503.         AND pvpm.product_variant_id IS NOT NULL
  504.             AND pv.state_is_availible = TRUE
  505.             AND (pv.quantity IS NULL OR pv.quantity = 0 OR pv.quantity > pv.order_quantity)
  506.         AND (vpv.state_is_availible = TRUE OR vpv.id IS NULL)
  507.         AND (vpv.quantity IS NULL OR vpv.quantity = 0 OR vpv.quantity > vpv.order_quantity)
  508.         AND NOT EXISTS (
  509.                 SELECT *
  510.                 FROM product_variant_in_pack pvip 
  511.                 WHERE pvip.product_variant_pack_id = ".$productPackId."
  512.                 AND pvip.product_variant_id = pv.id
  513.         )
  514.         AND pvc.product_variant_id IS NOT NULL
  515.         AND pv.country_id IN (".$countries.")";
  516.         $this->getEntityManager()
  517.             ->getConnection()
  518.             ->prepare($sql)
  519.             ->executeStatement();
  520.     }
  521.     public function getForProcessingFOResponse(?array $productVariantNoComplete)
  522.     {
  523.         return $this->createQueryBuilder('pv')
  524.             ->select("CASE WHEN (pgt.name = 'event') THEN true ELSE false END as isEvent, 
  525.                        pgt.name as gosType, pst.name as subscriptionType, pv.productVariantNoComplete")
  526.             ->innerJoin('pv.masterProduct''p')
  527.             ->leftJoin('p.productGosType''pgt')
  528.             ->leftJoin('pv.productSubscriptionType''pst')
  529.             ->andWhere('pv.productVariantNoComplete in (:productVariantNoComplete)')
  530.             ->setParameter('productVariantNoComplete'$productVariantNoComplete)
  531.             ->getQuery()
  532.             ->getResult();
  533.     }
  534.     public function getDataForBenefits(?array $productVariantNoComplete)
  535.     {
  536.         $conn $this->getEntityManager()->getConnection();
  537.         $sql  'SELECT 
  538.                     pst.slug as productSubscriptionType, 
  539.                     pgt.name as productGosType,
  540.                     p.product_No as productNumber, 
  541.                     pv.product_variant_no_complete AS productVariantNumber,
  542.                     group_concat(pa_products.id) as productAssociationsProduct, 
  543.                     group_concat(pa_product_variants.id) as productAssociationsProductVariant
  544.                  FROM
  545.                     product_variant pv
  546.                         INNER JOIN
  547.                     product p ON pv.master_product_id = p.id
  548.                         LEFT JOIN
  549.                     product_subscription_type pst ON pv.product_subscription_type_id = pst.id
  550.                         LEFT JOIN
  551.                     product_gos_type pgt ON p.product_gos_type_id = pgt.id
  552.                         LEFT JOIN
  553.                     product_association_product pap ON p.id = pap.product_id
  554.                         LEFT JOIN
  555.                     product_association pa_products ON pap.product_association_id = pa_products.id
  556.                         LEFT JOIN
  557.                     product_association_product_variant papv ON pv.id = papv.product_variant_id
  558.                         LEFT JOIN
  559.                     product_association pa_product_variants ON papv.product_association_id = pa_product_variants.id
  560.                     where pv.product_variant_no_complete in (:productVariantNoComplete)
  561.                  GROUP BY pv.product_variant_no_complete';
  562.         $stmt $conn->executeQuery($sql,
  563.                     ['productVariantNoComplete' => $productVariantNoComplete],
  564.                     ['productVariantNoComplete' => Connection::PARAM_STR_ARRAY]
  565.         );
  566.         return $stmt->fetchAll();
  567.     }
  568.     public function findAllForCalendarEvents(): ?array
  569.     {
  570.         return $this->createQueryBuilder('pv')
  571.             ->join('pv.calendarEvents''ce')
  572.             ->getQuery()
  573.             ->getResult();
  574.     }
  575.     public function findAllForPaymentReminder(): ?array
  576.     {
  577.         $conn $this->getEntityManager()->getConnection();
  578.         $sql  'SELECT prpv.product_variant_id FROM payment_reminders_product_variant prpv GROUP BY 1';
  579.         $stmt $conn->executeQuery($sql);
  580.         $all $stmt->fetchAll();
  581.         $result = [];
  582.         foreach ($all as $id$result[] = $id['product_variant_id'];
  583.         return $result;
  584.     }
  585.     public function selectProductVariantNoCompleteForAll($noVirtual false)
  586.     {
  587.         $qb $this->createQueryBuilder('pv')
  588.             ->select('pv.id, pv.productVariantNoComplete');
  589.         if ($noVirtual === true)
  590.         {
  591.             $qb->andWhere('pv.priceNet > 0');
  592.         }
  593.         return $qb->getQuery()->getResult();
  594.     }
  595.     public function findAllForOmnibus(QueryBuilder $qb)
  596.     {
  597.         $qb
  598.             ->distinct()
  599.             ->select('pv')
  600.             ->from(ProductVariant::class, 'pv')
  601.             ->leftJoin('pv.omnibus''o')
  602.             ->andWhere('pv.priceNet > 0')
  603.             ->andWhere('o.id IS NOT NULL');
  604.         return  $qb;
  605.     }
  606.     public function findOriginalProductsVariantWithDuplicate($productVariantNoComplete)
  607.     {
  608.         $qb $this->createQueryBuilder('pv');
  609.         if (!is_null($productVariantNoComplete))
  610.         {
  611.             $qb
  612.                 ->andWhere('pv.productVariantNoComplete IN (:productVariantNoComplete)')
  613.                 ->setParameter('productVariantNoComplete'$productVariantNoComplete);
  614.         }
  615.         $qb
  616.             ->groupBy('pv.productVariantNoComplete')
  617.             ->having('COUNT(pv.productVariantNoComplete) > 1');
  618.         return $qb->getQuery()->getResult();
  619.     }
  620.     public function findAllDuplicateByOriginal(ProductVariant $originalProductVariant)
  621.     {
  622.         return $this
  623.             ->createQueryBuilder('pv')
  624.             ->where('pv.productVariantNoComplete = :productVariantNoComplete')
  625.             ->andWhere('pv.id != :originalId' )
  626.             ->setParameter('productVariantNoComplete'$originalProductVariant->getProductVariantNoComplete())
  627.             ->setParameter('originalId'$originalProductVariant->getId())
  628.             ->getQuery()->getResult();
  629.     }
  630.     public function findLastForProduct(Product $product)
  631.     {
  632.         return $this
  633.             ->createQueryBuilder('pv')
  634.             ->leftJoin('pv.product''p')
  635.             ->where('p = :product')
  636.             ->setParameter('product'$product)
  637.             ->setMaxResults(1)
  638.             ->orderBy('pv.id''DESC')
  639.             ->getQuery()
  640.             ->getOneOrNullResult();
  641.     }
  642.     public function findOneByNoCompleteAndTaxNoComplete(string $noComplete)
  643.     {
  644.         return $this
  645.             ->createQueryBuilder('pv')
  646.             ->where('pv.productVariantNoComplete = :noComplete')
  647.             ->orWhere('pv.productNumberPartTax = :noComplete')
  648.             ->orWhere('pv.productNumberNoTax = :noComplete')
  649.             ->setParameter('noComplete'$noComplete)
  650.             ->setMaxResults(1)
  651.             ->getQuery()
  652.             ->getOneOrNullResult();
  653.     }
  654.     public function findWithoutNewClientType(?int $limit)
  655.     {
  656.         $qb $this->createQueryBuilder('pv')
  657.             ->leftJoin('pv.additionalOptionsByClientTypes''aobct')
  658.             ->leftJoin('pv.paymentMethod''pm')
  659.             ->leftJoin('pv.clientType''ct')
  660.             ->where('aobct.id IS NULL')
  661.             ->andWhere('pm.id IS NOT NULL')
  662.             ->andWhere('ct.id IS NOT NULL');
  663.         if (!is_null($limit))
  664.         {
  665.             $qb->setMaxResults($limit);
  666.         }
  667.         $qb->groupBy('pv.id');
  668.         return  $qb->getQuery()->getResult();
  669.     }
  670.     public function getProductVariantPriceGross(string $productVariantNoComplete): ?float
  671.     {
  672.         try
  673.         {
  674.             return $this->createQueryBuilder('pv')
  675.                 ->select('pv.priceGross')
  676.                 ->where('pv.productVariantNoComplete = :noComplete')
  677.                 ->setParameter('noComplete'$productVariantNoComplete)
  678.                 ->setMaxResults(1)
  679.                 ->getQuery()
  680.                 ->getSingleScalarResult();
  681.         }
  682.         catch (\Exception $e)
  683.         {
  684.             return null;
  685.         }
  686.     }
  687.     public function findByUserAccessForAjaxFilter($query, array $accessProductVariants = []): Query
  688.     {
  689.         $qb $this->createQueryBuilder('pv')
  690.             ->select("distinct pv.id, CONCAT(pv.tradeName, ' ', pv.productVariantNoComplete) as text")
  691.             ->leftJoin('pv.physicalVariant''physicalVariant')
  692.             ->andWhere('pv.productVariantNoComplete in (:accessProductVariants)')
  693.             ->andWhere('physicalVariant.id IS NULL')
  694.             ->setParameter('accessProductVariants'$accessProductVariants);
  695.         if (!empty($query)) {
  696.             $qb->andWhere('pv.tradeName like :enteredProductName')
  697.                 ->setParameter('enteredProductName''%'.$query.'%');
  698.         }
  699.         return $qb->getQuery();
  700.     }
  701. }