<?php
/**
* Created by PhpStorm.
* User: serhii.patsai
* Date: 09.04.2019
* Time: 13:18
*/
namespace DcSiteBundle\Repository;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Model;
use DcSiteBundle\Entity\ServiceVariation;
use DcSiteBundle\Entity\ServiceWorkGroup;
use DcSiteBundle\Entity\ServiceWorkJob;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;
class ServiceWorkRepository extends EntityRepository
{
public function getAccessoryByDealer(Dealer $dealer, $limit = null)
{
$query = $this->createQueryBuilder('sw')
->where('sw.dealer =:dealer')->setParameter('dealer', $dealer)
->andWhere('sw.is_accessory = true');
return $query->getQuery()->getResult();
}
public function getPriceList(Dealer $dealer, $variationIds, $workId, $articul, $title)
{
$query = $this->createQueryBuilder('sw')
->andWhere('sw.dealer =:dealer')
->setParameter('dealer', $dealer);
if ($workId) {
$query->andWhere('sw.uid_1c = :workId')
->setParameter('workId', $workId);
}
if ($articul) {
$query->andWhere('sw.articul = :articul')
->setParameter('articul', $articul);
}
if ($title) {
$query->andWhere('sw.title_ua LIKE :name OR sw.title_ru LIKE :name')
->setParameter('name', '%'.$title.'%');
}
if ($variationIds) {
$query->leftJoin('sw.variations', 'wv');
$query->andWhere('wv.uid_1c IN (:variationIds)')
->setParameter('variationIds', $variationIds);
}
return $query->getQuery()->getResult();
}
public function findRegulationWorkByVariation(ServiceVariation $variation)
{
$query = $this->createQueryBuilder('w')
->leftJoin('w.variations', 'wv')
->andWhere('w.is_regulations = :isRegulations and wv.id = :variation')
->setParameter('isRegulations', true)
->setParameter('variation', $variation);
return $query->getQuery()->getResult();
}
public function findByVariation(ServiceVariation $Variation = null, $dealer)
{
$query = $this->createQueryBuilder('w')
->where('w.dealer = :dealer')
->setParameter('dealer', $dealer);
if ($Variation) {
$query->leftJoin('w.variations', 'wv');
$query->andWhere('(w.is_regulations = 0 and wv.id IS NULL) OR wv.id = :variation')
->setParameter('variation', $Variation);
} else {
$query->andWhere('w.variation IS NULL and w.is_regulations = 0');
}
return $query->getQuery()->getResult();
}
public function getByModel($modelId, $dealer)
{
return $this->createQueryBuilder('r')
->join('r.variation', 'v')
->where('r.dealer = :dealer')
->andWhere('v.model = :model')
->setParameter('dealer', $dealer)
->setParameter('model', $modelId)
->getQuery()
->getResult();
}
public function getAccessoryByCategory(Dealer $dealer, ServiceWorkGroup $serviceWorkGroup, $params = null)
{
$query = $this->createQueryBuilder('sw')
->leftJoin('sw.variations', 'v')
->where('sw.is_accessory = true');
if($serviceWorkGroup->getParent()) {
$query->innerJoin('sw.accessory_works', 'awg', Join::WITH, 'awg.group =:group')->setParameter('group', $serviceWorkGroup);
}
if (isset($params['brand'])) {
$query->innerJoin('sw.dealer', 'd', Join::WITH, 'd.brand in (:brands)')->setParameter('brands', $params['brand']);
}
if (isset($params['model'])) {
$query->andWhere('v.model in (:model) OR v.id IS NULL')->setParameter('model', $params['model']);
}
if (isset($params['dealer'])) {
$query->andWhere('sw.dealer in (:dealers)')->setParameter('dealers', $params['dealer']);
} else {
$query->andWhere('sw.dealer =:dealer')->setParameter('dealer', $dealer);
}
if (isset($params['fuel'])) {
$query->andWhere('v.fuelType in (:fuel_type) OR v.id IS NULL')->setParameter('fuel_type', $params['fuel']);
}
if (isset($params['year'])) {
foreach ($params['year'] as $year) {
$arrYear[] ='(v.year_from <=:year AND (v.year_to >= :year OR v.year_to = 0))';
}
$arrYear[] ='v.id IS NULL';
$query->andWhere(implode(' OR ',$arrYear))->setParameter('year', $year);
}
return $query->getQuery()->getResult();
}
public function getAccessoryBySearch(Dealer $dealer, $search)
{
$query = $this->createQueryBuilder('sw')
->leftJoin('sw.parts', 'swp')
->leftJoin('swp.part','p')
->where('sw.is_accessory = true')
->andWhere('(sw.articul =:search OR p.number =:search OR sw.title LIKE :searchLike)')->setParameter('search', $search)->setParameter('searchLike', '%'.$search.'%')
->andWhere('sw.dealer =:dealer')->setParameter('dealer', $dealer);
return $query->getQuery()->getResult();
}
public function getAccessoryByCreateFilter(Dealer $dealer, ServiceWorkGroup $serviceWorkGroup, $params = null)
{
$query = $this->createQueryBuilder('sw')
->innerJoin('sw.variations', 'v')
->where('sw.is_accessory = true');
if($serviceWorkGroup->getParent()) {
$query->innerJoin('sw.accessory_works', 'awg', Join::WITH, 'awg.group =:group')->setParameter('group', $serviceWorkGroup);
}
if (isset($params['brand'])) {
$query->innerJoin('sw.dealer', 'd', Join::WITH, 'd.brand in (:brands)')->setParameter('brands', $params['brand']);
}
if (isset($params['model'])) {
$query->innerJoin('v.model', 'm', Join::WITH, 'm.id in (:model)')->setParameter('model', $params['model']);
}
if (isset($params['dealer'])) {
$query->andWhere('sw.dealer in (:dealers)')->setParameter('dealers', $params['dealer']);
} else {
$query->andWhere('sw.dealer =:dealer')->setParameter('dealer', $dealer);
}
if (isset($params['fuel'])) {
$query->andWhere('v.fuelType in (:fuel_type)')->setParameter('fuel_type', $params['fuel']);
}
if (isset($params['year'])) {
foreach ($params['year'] as $year) {
$arrYear[] ='(v.year_from <=:year AND (v.year_to >= :year OR v.year_to = 0))';
}
$query->andWhere(implode(' OR ',$arrYear))->setParameter('year', $year);
}
return $query->getQuery()->getResult();
}
public function getVariationsByModel(Dealer $dealer, Model $model)
{
return $this->createQueryBuilder('sw')
->select('v.id')
->innerJoin('sw.variations', 'v')
->where('sw.dealer = :dealer')
->andWhere('sw.is_accessory = 1')
->andWhere('v.model = :model')
->setParameter('dealer',$dealer)
->setParameter('model',$model)
->groupBy('v.id')
->getQuery()->getScalarResult();
}
public function getAccessoryByModel(Dealer $dealer, Model $model, ServiceWorkGroup $serviceWorkGroup, $params = null)
{
$query = $this->createQueryBuilder('sw')
->leftJoin('sw.variations', 'v')
->innerJoin('sw.accessory_works', 'awg', Join::WITH, 'awg.group =:group')->setParameter('group', $serviceWorkGroup)
->where('sw.dealer = :dealer')
->andWhere('sw.is_accessory = true')
->andWhere('v.model = :model OR v.id IS NULL')
->setParameter('dealer', $dealer)
->setParameter('model', $model);
if (isset($params['brand'])) {
$query->innerJoin('sw.dealer', 'd', Join::WITH, 'd.brand in (:brands)')->setParameter('brands', $params['brand']);
}
if (isset($params['fuel'])) {
$query->andWhere('v.fuelType in (:fuel_type) OR v.id IS NULL')->setParameter('fuel_type', $params['fuel']);
}
if (isset($params['year'])) {
foreach ($params['year'] as $year) {
$arrYear[] ='(v.year_from <=:year AND (v.year_to >= :year OR v.year_to = 0))';
}
$arrYear[] ='v.id IS NULL';
$query->andWhere(implode(' OR ',$arrYear))->setParameter('year', $year);
}
return $query->getQuery()->getResult();
}
public function getAccessoryByModelAndVariation(Dealer $dealer, Model $model, ServiceWorkGroup $serviceWorkGroup, $params = null, $variationId)
{
$query = $this->createQueryBuilder('sw')
->leftJoin('sw.variations', 'v')
->innerJoin('sw.accessory_works', 'awg', Join::WITH, 'awg.group =:group')->setParameter('group', $serviceWorkGroup)
->where('sw.dealer = :dealer')
->andWhere('sw.is_accessory = true')
->andWhere('v.model = :model OR v.id IS NULL')
->setParameter('dealer', $dealer)
->setParameter('model', $model)
->andWhere('sw.variation = :variationId OR v.id = :variationId OR (sw.variation IS NULL AND v.id IS NULL)')
->setParameter('variationId', $variationId);
if (isset($params['brand'])) {
$query->innerJoin('sw.dealer', 'd', Join::WITH, 'd.brand in (:brands)')->setParameter('brands', $params['brand']);
}
if (isset($params['fuel'])) {
$query->andWhere('v.fuelType in (:fuel_type) OR v.id IS NULL')->setParameter('fuel_type', $params['fuel']);
}
if (isset($params['year'])) {
foreach ($params['year'] as $year) {
$arrYear[] ='(v.year_from <=:year AND (v.year_to >= :year OR v.year_to = 0))';
}
$arrYear[] ='v.id IS NULL';
$query->andWhere(implode(' OR ',$arrYear))->setParameter('year', $year);
}
return $query->getQuery()->getResult();
}
public function findAccessory(Dealer $dealer, $partId, $partNumber)
{
return $this->createQueryBuilder('sw')
->innerJoin('sw.parts', 'parts', Join::WITH, 'parts.id =:partId')
->innerJoin('parts.part', 'part', Join::WITH, 'part.number =:partNumber AND part.state =:state')
->where('sw.dealer =:dealer')->setParameter('dealer', $dealer)
->setParameter('partId', $partId)
->setParameter('partNumber', $partNumber)
->setParameter('state', true)
->getQuery()
->getOneOrNullResult();
}
public function findAccessoryVariation(Dealer $dealer, $partNumber)
{
return $this->createQueryBuilder('sw')
->innerJoin('sw.parts', 'parts')
->innerJoin('parts.part', 'part', Join::WITH, 'part.number =:partNumber AND part.state =:state')
->where('sw.dealer =:dealer')->setParameter('dealer', $dealer)
->setParameter('partNumber', $partNumber)
->setParameter('state', true)
->getQuery()
->getResult();
}
public function getByParams($dealer, $params)
{
$modelId = $params['model'];
$query = $this->createQueryBuilder('r')
->join('r.variation', 'v')
->where('r.dealer = :dealer')
->andWhere('v.model = :model')
->setParameter('dealer', $dealer)
->setParameter('model', $modelId);
foreach ($params as $key => $val) {
if (!$val) {
continue;
}
switch ($key) {
case 'fType':
$query->andWhere('v.fuelType = :fType')
->setParameter('fType', $val);
break;
case 'year':
$query->andWhere('v.year_from <= :year and (v.year_to is null OR v.year_to = 0 OR v.year_to >= :year)')
->setParameter('year', $val);
break;
case 'tType':
$query->andWhere('v.transmissionType = :transmission')
->setParameter('transmission', $val);
break;
case 'dUnit':
$query->andWhere('v.driveUnit = :dUnit')
->setParameter('dUnit', $val);
break;
case 'volume':
$query->andWhere('v.engine_volume = :volume')
->setParameter('volume', $val)
->orderBy('r.mileage', 'ASC');
break;
}
}
return $query->getQuery()->getResult();
}
public function getAccessories($variation, $dealer, $group)
{
$query = $this->createQueryBuilder('w')
->select('w')
->join('w.parts', 'p')
->join('p.part', 'dc_p')
->where('w.dealer = :dealer AND w.group = :group')
->setParameter('dealer', $dealer)
->setParameter('group', $group);
if ($variation) {
$query->andWhere('w.variation IS NULL OR w.variation = :variation')
->setParameter('variation', $variation);
}
return $query->groupBy('w.id')->getQuery()->getResult();
}
public function getAccessoriesWithoutVariation($dealer, $group)
{
$query = $this->createQueryBuilder('w')
->select('w')
->join('w.parts', 'p')
->join('p.part', 'dc_p')
->where('w.dealer = :dealer AND w.group = :group')
->andWhere('w.variation IS NULL')
->setParameter('dealer', $dealer)
->setParameter('group', $group);
return $query->groupBy('w.id')->getQuery()->getResult();
}
public function getAccessoriesWithoutCategory($dealer, $group)
{
$query = $this->createQueryBuilder('w')
->select('w')
->join('w.parts', 'p')
->join('p.part', 'dc_p')
->where('w.dealer = :dealer AND w.group = :group')
->andWhere('dc_p.categories is NULL')
->setParameter('dealer', $dealer)
->setParameter('group', $group);
return $query->groupBy('w.id')->getQuery()->getResult();
}
public function findByCategory($category)
{
$query = $this->createQueryBuilder('w');
$query->select('w')
->join('w.categories', 'wc')
->where($query->expr()->eq('wc.id', $category->getId()));
return $query->getQuery()->getResult();
}
public function getByJobIds($jobs, $dealer, $regulations = [0, 1])
{
$query = $this->createQueryBuilder('w');
$query->select('w')
->innerJoin('w.jobs', 'wj', Join::WITH, 'wj.job in (:jobs)')
->leftJoin('w.variation', 'v', Join::WITH, 'v.dealer = :dealer')
->leftJoin('v.model', 'm')
->where('w.dealer = :dealer AND w.is_regulations in (:is_regulations)')
->setParameter('jobs', $jobs)
->setParameter('dealer', $dealer)
->setParameter('is_regulations', $regulations);
return $query->orderBy('wj.job ')->addOrderBy('w.mileage')->addOrderBy('m.title')->addOrderBy('v.year_from')->addOrderBy('v.year_to')->addOrderBy('v.engine_volume')->getQuery()->getResult();
}
public function getByBrand($brand)
{
$query = $this->createQueryBuilder('w')
->select('w')
->innerJoin('w.variation', 'v')
->innerJoin('v.model', 'm')
->innerJoin('m.brand', 'b')
->where('b.url = :brand')
->setParameter('brand', $brand);
return $query->getQuery()->getResult();
}
public function getWorksByModelAndBrand($model = '', $brand)
{
$query = $this->createQueryBuilder('w')
->select('w as work, MIN(j.price) as min_price')
->innerJoin('w.variation', 'v')
->innerJoin('w.jobs', 'j')
->innerJoin('v.model', 'm')
->innerJoin('m.brand', 'b')
->where('b.url = :brand')
->innerJoin('w.group', 'gr')
->setParameter('brand', $brand);
if ($model) {
$query->andWhere('m.url = :model')
->setParameter('model', $model);
}
$query->groupBy('w.id, gr.id, j.id');
return $query->getQuery()->getResult();
}
public function getWorksByModelBrandAndGroup($model = '', $brand, $workGroup)
{
$query = $this->createQueryBuilder('w')
->select('w as work, MIN(j.price) as min_price')
->innerJoin('w.variation', 'v')
->innerJoin('w.jobs', 'j')
->innerJoin('v.model', 'm')
->innerJoin('m.brand', 'b')
->innerJoin('w.group', 'gr')
->where('b.url = :brand')
->setParameter('brand', $brand);
if ($model) {
$query->andWhere('m.url = :model')
->setParameter('model', $model);
}
if($workGroup) {
$query->andWhere('w.group = :workGroupId')
->setParameter('workGroupId', $workGroup);
}
$query->groupBy('w.id, gr.id, j.id');
return $query->getQuery()->getResult();
}
}