<?php
namespace App\Repository;
use App\Entity\Gos\Country;
use App\Entity\Gos\Product;
use App\Entity\Gos\ProductAssociation;
use App\Entity\Gos\ProductVariant;
use App\Entity\Gos\ProductVariantPack;
use App\Entity\Gos\Uniqskills\Course;
use App\Enum\Product\ProductSourceSystem;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
/**
* ProductVariantRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class ProductVariantRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, ProductVariant::class);
}
private const WIDGETS_CACHE_RESULT_LIFETIME = 300; //5 minutes
public function findAllByCourseAndCountryCode($courseSlug, $myCountryCode)
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.courses', 'course')
->leftJoin('pv.country', 'country')
->where('course.slug = :courseSlug')
->setParameter('courseSlug', $courseSlug)
->andWhere('country.alpha2 = :countryCode')
->setParameter('countryCode', $myCountryCode)
->getQuery()
->getResult();
}
public function findProductVariantToAdd($arrayProductVariantNo)
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.physicalVariant', 'mpv')
->where('pv.productVariantNoComplete IN (:pvnc)')
->orWhere('mpv.productVariantNoComplete IN (:pvnc) AND pv.isAddition =:isAddition')
->setParameter('pvnc', $arrayProductVariantNo)
->setParameter('isAddition', true)
->getQuery()
->getResult();
}
public function findOneByIdAndProductVariantNoComplete($productVariantId, $productVariantNoComplete)
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.physicalVariant', 'physicalVariant')
->where('pv.id = :id')
->setParameter('id', $productVariantId)
->andWhere('physicalVariant.productVariantNoComplete = :physicalVariant')
->setParameter('physicalVariant', $productVariantNoComplete)
->getQuery()->setMaxResults(1)->getOneOrNullResult();
}
public function findTaxFreeForBudgetUnitIsTrue($productCart)
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.productCart', 'pc')
->where('pc.id IN (:id)')
->setParameter('id', $productCart)
->andWhere('pv.taxFreeForBudgetUnit = true')
->getQuery()->getResult();
}
public function findAllFiltered(QueryBuilder $qb, $psId = 0, $number = null, $isEvent = null, $course = null, $country = null, $sourceSystem): QueryBuilder
{
$qb
->distinct()
->select('pv')
->from(ProductVariant::class, 'pv');
if ($psId)
{
$qb
->leftJoin('pv.portalSettings', 'ps')
->where('ps.id = :portalSettingsId')
->setParameter('portalSettingsId', $psId);
}
if (!empty($number))
{
$qb
->andWhere('pv.productVariantNoComplete = :no')
->setParameter('no', $number);
}
if (!is_null($isEvent))
{
$qb
->leftJoin('pv.masterProduct', 'master_product')
->leftJoin('master_product.productGosType', 'product_gos_type');
if ($isEvent)
{
$qb->where('product_gos_type.name = :productGosType')
->setParameter('productGosType', 'event');
}
else
{
$qb->where('product_gos_type.name != :productGosType')
->setParameter('productGosType', 'event');
}
}
if ($course)
{
$qb
->leftJoin('pv.courses', 'c')
->andWhere('c.id = (:cid)')
->setParameter('cid', $course);
}
if ($country)
{
$qb
->leftJoin('pv.country', 'country')
->andWhere('country.id = (:countryid)')
->setParameter('countryid', $country);
}
if (!empty($sourceSystem))
{
$sourceSystem = ProductSourceSystem::from($sourceSystem);
$qb
->innerJoin('pv.masterProduct', 'masterProduct')
->andWhere('masterProduct.sourceSystem = :sourceSystem')
->setParameter('sourceSystem', $sourceSystem);
}
return $qb;
}
public function findOnlyEvents($notAssignedToEventsEntity = false, $maximum = null)
{
$qb = $this->createQueryBuilder('e')
->leftJoin('e.masterProduct', 'mp')
->leftJoin('mp.productGosType', 'product_gos_type')
->where('product_gos_type.name = :productGosType')
->setParameter('productGosType', 'event');
if ($notAssignedToEventsEntity === true)
{
$qb
->andWhere('e.events is null');
}
if (!is_null($maximum))
{
$qb->setMaxResults($maximum);
}
return $qb->getQuery()->getResult();
}
public function findForAjaxFilter($productVariantNoComplete, array $findIn = null)
{
$form = $this
->createQueryBuilder('pv')
->select("pv.id, COALESCE(pv.productVariantNoComplete, CONCAT(pv.id, ' ', pv.workingTitle)) as text");
if (!empty($productVariantNoComplete))
{
$form
->andWhere("COALESCE(pv.productVariantNoComplete, CONCAT(pv.id, ' ', pv.workingTitle)) LIKE :productVariantNoComplete")
->setParameter('productVariantNoComplete', $productVariantNoComplete . '%');
}
if (is_iterable($findIn))
{
$form
->andWhere('pv.id IN (:findIn)')
->setParameter('findIn', $findIn)
;
}
return $form->getQuery();
}
public function findByProductsVariantsNo($productsVariantsNumbers, $isAddition, $getPhysicalVariant = true)
{
$query = $this
->createQueryBuilder('pv')
->where('pv.productVariantNoComplete IN (:pvnc)');
if ($getPhysicalVariant)
{
$query
->leftJoin('pv.physicalVariant', 'mpv')
->orWhere('mpv.productVariantNoComplete IN (:pvnc) AND pv.isAddition =:isAddition')
->setParameter('isAddition', $isAddition);
}
return $query->setParameter('pvnc', $productsVariantsNumbers)->getQuery()->getResult();
}
public function findOneByProductVariantsNo($productsVariantsNumber, $isAddition)
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.physicalVariant', 'mpv')
->where('pv.productVariantNoComplete = :pvnc')
->orWhere('mpv.productVariantNoComplete = :pvnc AND pv.isAddition =:isAddition')
->setParameter('pvnc', $productsVariantsNumber)
->setParameter('isAddition', $isAddition)
->getQuery()
->disableResultCache()
->setMaxResults(1)->getOneOrNullResult();
}
// This method is used to find a product variant by its number with caching for widgets (e.g. show-price).
public function findOneByProductVariantsNoCacheable($productsVariantsNumber, $isAddition)
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.physicalVariant', 'mpv')
->where('pv.productVariantNoComplete = :pvnc')
->orWhere('mpv.productVariantNoComplete = :pvnc AND pv.isAddition =:isAddition')
->setParameter('pvnc', $productsVariantsNumber)
->setParameter('isAddition', $isAddition)
->getQuery()
->enableResultCache(self::WIDGETS_CACHE_RESULT_LIFETIME, 'PV_' . $productsVariantsNumber . '_' . (int)$isAddition)
->setMaxResults(1)->getOneOrNullResult();
}
// This method is used to find a product variant by its id with caching for widgets (e.g. show-price).
public function findOneCacheable($id)
{
return $this
->createQueryBuilder('pv')
->where('pv.id = :id')
->setParameter('id', $id)
->getQuery()
->enableResultCache(self::WIDGETS_CACHE_RESULT_LIFETIME, 'PV_byId_' . $id)
->setMaxResults(1)
->getOneOrNullResult();
}
// 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).
public function findOneByProductVariantNoCompleteCacheable($productsVariantsNumber)
{
return $this
->createQueryBuilder('pv')
->where('pv.productVariantNoComplete = :pvnc')
->setParameter('pvnc', $productsVariantsNumber)
->getQuery()
->enableResultCache(self::WIDGETS_CACHE_RESULT_LIFETIME, 'PV_byNoComplete_' . $productsVariantsNumber)
->setMaxResults(1)
->getOneOrNullResult();
}
public function findMaxProductVariantId()
{
return $this->createQueryBuilder('pv')
->select('MAX(pv.productVariantId) AS newId')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
public function findLastProductVariantNoComplete($masterProductId)
{
$sql = 'SELECT pv.product_variant_no
FROM product_variant pv
WHERE pv.master_product_id='.$masterProductId.'
ORDER BY CAST(pv.product_variant_no AS unsigned) DESC LIMIT 1';
return $this->getEntityManager()
->getConnection()
->prepare($sql)
->executeQuery()
->fetchAllAssociative();
}
public function findAllByCourseAndCountry($slugCourse, $country)
{
return $this
->createQueryBuilder('pv')
->leftJoin("pv.country", "country")
->leftJoin("pv.courses", 'course')
->where('course.slug = :slugCourse')
->setParameter('slugCourse', $slugCourse)
->andWhere('country.name = :country')
->setParameter('country', $country)
->getQuery()
->getResult();
}
public function findByVariantStateActiveOrTest()
{
return $this
->createQueryBuilder('pv')
->where('pv.variantState = :active')
->setParameter('active', 'active')
->orWhere('pv.variantState = :test')
->setParameter('test', 'Product test')
->getQuery()
->getResult();
}
public function findOneEcoVariantFromProductAssociation(ProductAssociation $productAssociation): ?ProductVariant
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.productAssociation', 'pa')
->where('pa.id = :paId')
->setParameter('paId', $productAssociation->getId())
->andWhere('pv.productVariantNoComplete NOT LIKE :premium or pv.productVariantNoComplete LIKE :startNumberWith68')
->setParameter('startNumberWith68', '68%')
->setParameter('premium', '6%')
->andWhere('pv.productVariantNoComplete NOT LIKE :online')
->setParameter('online', '8%')
->andWhere('pv.productVariantNoComplete NOT LIKE :event')
->setParameter('event', '7%')
->addOrderBy('pv.priceGross', 'ASC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
public function findAllEligibleToMakeGiftable($countries = [])
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.country', 'country')
->leftJoin('pv.courses', 'course')
->where('pv.isGiftable = false OR pv.isGiftable IS NULL')
->andWhere('(country.slug IN (:countries)) OR (country.slug = :poland AND pv.productVariantNo = 1)')
->setParameter('countries', $countries)
->setParameter('poland', 'poland')
->andWhere('course.id IS NOT NULL')
->getQuery()
->getResult();
}
public function findAllFromProductVariantPack(ProductVariantPack $productVariantPack)
{
$qb = $this
->createQueryBuilder('pv')
->leftJoin('pv.productVariantPacks', 'pvp');
if (!$productVariantPack->getProductVariants()->isEmpty())
{
$variantsIds = $productVariantPack->getProductVariants()->map(function($item) {return $item->getId();});
$qb
->where('pv.id IN (:variantsFromPack)')
->setParameter('variantsFromPack', $variantsIds);
}
if (!$productVariantPack->getCountries()->isEmpty())
{
$countriesIds = $productVariantPack->getCountries()->map(function($item) {return $item->getId();});
$qb
->leftJoin('pv.country', 'country')
->andWhere('country.id IN (:countries)')
->setParameter('countries', $countriesIds);
}
if (!$productVariantPack->getPortalSettings()->isEmpty())
{
$portalSettingsIds = $productVariantPack->getPortalSettings()->map(function($item) {return $item->getId();});
$qb
->leftJoin('pv.portalSettings', 'portalSettings')
->andWhere('portalSettings.id IN (:portalSettings)')
->setParameter('portalSettings', $portalSettingsIds);
}
if (!$productVariantPack->getClientTypes()->isEmpty())
{
$clientTypesIds = $productVariantPack->getClientTypes()->map(function($item) {return $item->getId();});
$qb
->leftJoin('pv.clientType', 'clientType')
->andWhere('clientType.id IN (:clientTypes)')
->setParameter('clientTypes', $clientTypesIds);
}
return $qb->getQuery()->getResult();
}
public function findAllFromProductVariantPacks(Collection $productVariantPacks)
{
if ($productVariantPacks->isEmpty()) {
return [];
}
$productVariantPackIds = $productVariantPacks->map(function (ProductVariantPack $productVariantPack) {
return $productVariantPack->getId();
})->toArray();
$sql = '
SELECT
pvp.id AS product_variant_pack_id,
group_concat(DISTINCT pspv.portal_settings_id) AS product_variant_portal_settings_id,
group_concat(DISTINCT pvct.client_type_id) AS product_variant_client_type_id,
pv.*
FROM
product_variant_pack pvp
JOIN product_variant_in_pack pvip ON
pvip.product_variant_pack_id = pvp.id
JOIN product_variant pv ON
pv.id = pvip.product_variant_id
LEFT JOIN portal_settings_product_variant pspv ON
pspv.product_variant_id = pv.id
LEFT JOIN product_variant_client_type pvct ON
pvct.product_variant_id = pv.id
WHERE
pvp.id IN ( ' . implode(", ", array_fill(0, count($productVariantPackIds), "?")) . ')
GROUP BY
pvp.id,
pv.id
';
$productVariants = $this->getEntityManager()->getConnection()->executeQuery($sql, $productVariantPackIds)->fetchAllAssociative();
$productVariantsByPack = [];
foreach ($productVariants as &$productVariantArray) {
$productVariantArray['product_variant_portal_settings_id'] = explode(',', $productVariantArray['product_variant_portal_settings_id']);
$productVariantArray['product_variant_client_type_id'] = explode(',', $productVariantArray['product_variant_client_type_id']);
if (!array_key_exists($productVariantArray['product_variant_pack_id'], $productVariantsByPack)) {
$productVariantsByPack[$productVariantArray['product_variant_pack_id']] = [];
}
$productVariantsByPack[$productVariantArray['product_variant_pack_id']][] = $productVariantArray;
}
/** @var ProductVariantPack $productVariantPack */
foreach ($productVariantPacks as $productVariantPack)
{
if (!$productVariantPack->getCountries()->isEmpty() ||
!$productVariantPack->getPortalSettings()->isEmpty() ||
!$productVariantPack->getClientTypes()->isEmpty())
{
if (!$productVariantPack->getCountries()->isEmpty())
{
$countriesIds = $productVariantPack->getCountries()->map(function($item) { return $item->getId(); });
array_filter($productVariantsByPack[$productVariantPack->getId()], function ($productVariant) use ($countriesIds) {
return in_array($productVariant['country_id'], $countriesIds->toArray());
});
}
if (!$productVariantPack->getPortalSettings()->isEmpty())
{
$portalSettingsIds = $productVariantPack->getPortalSettings()->map(function($item) { return $item->getId(); });
array_filter($productVariantsByPack[$productVariantPack->getId()], function ($productVariant) use ($portalSettingsIds) {
return array_intersect($productVariant['product_variant_portal_settings_id'], $portalSettingsIds->toArray());
});
}
if (!$productVariantPack->getClientTypes()->isEmpty())
{
$clientTypesIds = $productVariantPack->getClientTypes()->map(function($item) { return $item->getId(); });
array_filter($productVariantsByPack[$productVariantPack->getId()], function ($productVariant) use ($clientTypesIds) {
return array_intersect($productVariant['product_variant_client_type_id'], $clientTypesIds->toArray());
});
}
}
}
return array_merge(...$productVariantsByPack);
}
public function findMainForCourse(Course $course, $country = null): ?ProductVariant
{
$qb = $this
->createQueryBuilder('pv')
->leftJoin('pv.courses', 'course')
->where('course.id = :courseId')
->setParameter('courseId', $course->getId());
if (!is_null($country))
{
$qb
->andWhere('pv.country = :country')
->setParameter('country', $country);
}
return $qb->setMaxResults(1)->getQuery()->getOneOrNullResult();
}
public function findProlongation(ProductVariant $productVariant, int $days): ?ProductVariant
{
$qb = $this
->createQueryBuilder('pv')
->andWhere('pv.productVariantNoComplete LIKE :variantNumber');
if ($days === 30)
{
$qb->setParameter('variantNumber', '2' . $productVariant->getMasterProduct()->getProductNo() . '/1');
}
elseif ($days === 270)
{
$qb->setParameter('variantNumber', '2' . $productVariant->getMasterProduct()->getProductNo() . '/2');
}
else
{
return null;
}
return $qb->setMaxResults(1)->getQuery()->getOneOrNullResult();
}
public function findFullAccessForCourseAndCountry(Course $course, ?Country $country)
{
$qb = $this->createQueryBuilder('pv')
->leftJoin('pv.courses', 'course')
->leftJoin('pv.country', 'country')
->leftJoin('pv.packages', 'package')
->where('course.id = :courseId')
->andWhere('package.id IS NULL')
->andWhere('pv.installmentAmount < 2 OR pv.installmentAmount IS NULL')
->setParameter('courseId', $course->getId())
->andWhere('course.isActive = true');
if ($country !== null)
{
$qb->andWhere('country.slug = :countrySlug')
->setParameter('countrySlug', $country->getSlug());
}
return $qb->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
public function addToProductVariantPack($productPackId, $countries)
{
$sql = "INSERT INTO product_variant_in_pack
(
product_variant_pack_id,
product_variant_id
)
SELECT DISTINCT
".$productPackId.",
pv.id
FROM
product_variant pv
LEFT JOIN
payment_type pt ON pv.payment_type_id = pt.id
LEFT JOIN
relations_product_variant rpv ON rpv.physical_variant_id = pv.id
LEFT JOIN
product_variant vpv ON vpv.id = rpv.virtual_variant_id
LEFT JOIN
product_variant_course pvc ON pvc.product_variant_id = pv.id
INNER JOIN
product_variant_payment_method pvpm ON pvpm.product_variant_id = pv.id
WHERE
(pt.slug IS NULL OR pt.slug != 'partial-payment')
AND pvpm.product_variant_id IS NOT NULL
AND pv.state_is_availible = TRUE
AND (pv.quantity IS NULL OR pv.quantity = 0 OR pv.quantity > pv.order_quantity)
AND (vpv.state_is_availible = TRUE OR vpv.id IS NULL)
AND (vpv.quantity IS NULL OR vpv.quantity = 0 OR vpv.quantity > vpv.order_quantity)
AND NOT EXISTS (
SELECT *
FROM product_variant_in_pack pvip
WHERE pvip.product_variant_pack_id = ".$productPackId."
AND pvip.product_variant_id = pv.id
)
AND pvc.product_variant_id IS NOT NULL
AND pv.country_id IN (".$countries.")";
$this->getEntityManager()
->getConnection()
->prepare($sql)
->executeStatement();
}
public function getForProcessingFOResponse(?array $productVariantNoComplete)
{
return $this->createQueryBuilder('pv')
->select("CASE WHEN (pgt.name = 'event') THEN true ELSE false END as isEvent,
pgt.name as gosType, pst.name as subscriptionType, pv.productVariantNoComplete")
->innerJoin('pv.masterProduct', 'p')
->leftJoin('p.productGosType', 'pgt')
->leftJoin('pv.productSubscriptionType', 'pst')
->andWhere('pv.productVariantNoComplete in (:productVariantNoComplete)')
->setParameter('productVariantNoComplete', $productVariantNoComplete)
->getQuery()
->getResult();
}
public function getDataForBenefits(?array $productVariantNoComplete)
{
$conn = $this->getEntityManager()->getConnection();
$sql = 'SELECT
pst.slug as productSubscriptionType,
pgt.name as productGosType,
p.product_No as productNumber,
pv.product_variant_no_complete AS productVariantNumber,
group_concat(pa_products.id) as productAssociationsProduct,
group_concat(pa_product_variants.id) as productAssociationsProductVariant
FROM
product_variant pv
INNER JOIN
product p ON pv.master_product_id = p.id
LEFT JOIN
product_subscription_type pst ON pv.product_subscription_type_id = pst.id
LEFT JOIN
product_gos_type pgt ON p.product_gos_type_id = pgt.id
LEFT JOIN
product_association_product pap ON p.id = pap.product_id
LEFT JOIN
product_association pa_products ON pap.product_association_id = pa_products.id
LEFT JOIN
product_association_product_variant papv ON pv.id = papv.product_variant_id
LEFT JOIN
product_association pa_product_variants ON papv.product_association_id = pa_product_variants.id
where pv.product_variant_no_complete in (:productVariantNoComplete)
GROUP BY pv.product_variant_no_complete';
$stmt = $conn->executeQuery($sql,
['productVariantNoComplete' => $productVariantNoComplete],
['productVariantNoComplete' => Connection::PARAM_STR_ARRAY]
);
return $stmt->fetchAll();
}
public function findAllForCalendarEvents(): ?array
{
return $this->createQueryBuilder('pv')
->join('pv.calendarEvents', 'ce')
->getQuery()
->getResult();
}
public function findAllForPaymentReminder(): ?array
{
$conn = $this->getEntityManager()->getConnection();
$sql = 'SELECT prpv.product_variant_id FROM payment_reminders_product_variant prpv GROUP BY 1';
$stmt = $conn->executeQuery($sql);
$all = $stmt->fetchAll();
$result = [];
foreach ($all as $id) $result[] = $id['product_variant_id'];
return $result;
}
public function selectProductVariantNoCompleteForAll($noVirtual = false)
{
$qb = $this->createQueryBuilder('pv')
->select('pv.id, pv.productVariantNoComplete');
if ($noVirtual === true)
{
$qb->andWhere('pv.priceNet > 0');
}
return $qb->getQuery()->getResult();
}
public function findAllForOmnibus(QueryBuilder $qb)
{
$qb
->distinct()
->select('pv')
->from(ProductVariant::class, 'pv')
->leftJoin('pv.omnibus', 'o')
->andWhere('pv.priceNet > 0')
->andWhere('o.id IS NOT NULL');
return $qb;
}
public function findOriginalProductsVariantWithDuplicate($productVariantNoComplete)
{
$qb = $this->createQueryBuilder('pv');
if (!is_null($productVariantNoComplete))
{
$qb
->andWhere('pv.productVariantNoComplete IN (:productVariantNoComplete)')
->setParameter('productVariantNoComplete', $productVariantNoComplete);
}
$qb
->groupBy('pv.productVariantNoComplete')
->having('COUNT(pv.productVariantNoComplete) > 1');
return $qb->getQuery()->getResult();
}
public function findAllDuplicateByOriginal(ProductVariant $originalProductVariant)
{
return $this
->createQueryBuilder('pv')
->where('pv.productVariantNoComplete = :productVariantNoComplete')
->andWhere('pv.id != :originalId' )
->setParameter('productVariantNoComplete', $originalProductVariant->getProductVariantNoComplete())
->setParameter('originalId', $originalProductVariant->getId())
->getQuery()->getResult();
}
public function findLastForProduct(Product $product)
{
return $this
->createQueryBuilder('pv')
->leftJoin('pv.product', 'p')
->where('p = :product')
->setParameter('product', $product)
->setMaxResults(1)
->orderBy('pv.id', 'DESC')
->getQuery()
->getOneOrNullResult();
}
public function findOneByNoCompleteAndTaxNoComplete(string $noComplete)
{
return $this
->createQueryBuilder('pv')
->where('pv.productVariantNoComplete = :noComplete')
->orWhere('pv.productNumberPartTax = :noComplete')
->orWhere('pv.productNumberNoTax = :noComplete')
->setParameter('noComplete', $noComplete)
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
public function findWithoutNewClientType(?int $limit)
{
$qb = $this->createQueryBuilder('pv')
->leftJoin('pv.additionalOptionsByClientTypes', 'aobct')
->leftJoin('pv.paymentMethod', 'pm')
->leftJoin('pv.clientType', 'ct')
->where('aobct.id IS NULL')
->andWhere('pm.id IS NOT NULL')
->andWhere('ct.id IS NOT NULL');
if (!is_null($limit))
{
$qb->setMaxResults($limit);
}
$qb->groupBy('pv.id');
return $qb->getQuery()->getResult();
}
public function getProductVariantPriceGross(string $productVariantNoComplete): ?float
{
try
{
return $this->createQueryBuilder('pv')
->select('pv.priceGross')
->where('pv.productVariantNoComplete = :noComplete')
->setParameter('noComplete', $productVariantNoComplete)
->setMaxResults(1)
->getQuery()
->getSingleScalarResult();
}
catch (\Exception $e)
{
return null;
}
}
public function findByUserAccessForAjaxFilter($query, array $accessProductVariants = []): Query
{
$qb = $this->createQueryBuilder('pv')
->select("distinct pv.id, CONCAT(pv.tradeName, ' ', pv.productVariantNoComplete) as text")
->leftJoin('pv.physicalVariant', 'physicalVariant')
->andWhere('pv.productVariantNoComplete in (:accessProductVariants)')
->andWhere('physicalVariant.id IS NULL')
->setParameter('accessProductVariants', $accessProductVariants);
if (!empty($query)) {
$qb->andWhere('pv.tradeName like :enteredProductName')
->setParameter('enteredProductName', '%'.$query.'%');
}
return $qb->getQuery();
}
}