<?php
namespace CoreBundle\Repository\Vehicles;
use DateTime;
use CoreBundle\Entity\Brand;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Model;
use CoreBundle\Entity\Vehicles\Characteristic;
use CoreBundle\Model\DealerModel;
use CoreBundle\Model\Vehicles\VehicleType;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;
class VehicleRepository extends EntityRepository
{
public const IS_OFFICIAL = [8, 15, 33, 32];
public function getVehiclesQueryByCharacteristic(Dealer $dealer, Characteristic $characteristic, $charValue)
{
return $this->createQueryBuilder('v')
->select('v')
->join('v.vehicle_items', 'vi', Join::WITH, 'vi.state = 1')
->join('vi.variation', 'variation')
->join('variation.characteristics', 'vc', Join::WITH, 'vc.characteristic = :characteristic AND vc.characteristic_value = :value')
->setParameter('characteristic', $characteristic)
->setParameter('value', $charValue)
->where('v.state = 1')
->andWhere('v.dealer = :dealer')
->andWhere('v.is_used = 0')
->setParameter('dealer', $dealer);
}
public function getVehiclesByCharacteristic(Dealer $dealer, Characteristic $characteristic, $charValue)
{
return $this->getVehiclesQueryByCharacteristic($dealer, $characteristic, $charValue)->getQuery()->getResult();
}
public function getVehiclesByModel(Dealer $dealer, $model)
{
return $this->createQueryBuilder('v')
->join('v.model', 'm')
->where('m.title = :title')
->andWhere('v.state = 1')
->andWhere('v.dealer = :dealer')
->setParameter('title', $model)
->setParameter('dealer', $dealer)
->getQuery()->getResult();
}
public function getNewByDealer(Dealer $dealer = null, $vehicleTypes = [], $sortByPosition = null)
{
$query = $this->createQueryBuilder('v')
->select('v,i,vi,m,e')
->join('v.preview', 'i')
->join('v.vehicle_items', 'vi')
->join('v.model', 'm')
->join('v.equipments', 'e')
->where('v.state = 1')
->andWhere('v.is_used = 0')
->andWhere('v.is_delete IN (:isDel)')
->setParameter('isDel', [0,null]);
if (count($vehicleTypes)) {
$query->andWhere('v.vehicle_type IN (:types)')
->setParameter('types', $vehicleTypes);
}
if($dealer) {
$query->andWhere('v.dealer = :dealer')->setParameter('dealer',$dealer );
}
if($sortByPosition) {
$query->orderBy('v.position', 'ASC');
}
return $query->getQuery()->getResult();
}
public function getOneLatestByDealer(Dealer $dealer)
{
$query = $this->createQueryBuilder('v')
->select('v,i,vi,e')
->join('v.preview', 'i')
->join('v.vehicle_items', 'vi')
->join('v.equipments', 'e')
->where('v.state = 1')
->andWhere('v.is_used = 0')
->andWhere('v.is_delete = 0')
->andWhere('v.dealer = :dealer')->setParameter('dealer',$dealer )
->orderBy('v.date_create', 'DESC')
->setFirstResult(0)->setMaxResults(1);
return $query->getQuery()->getSingleResult();
}
public function searchCar($string)
{
return $this->createQueryBuilder('v')
->join('v.vehicle_items', 'vi', Join::WITH, 'vi.state = 1')
->join('v.model', 'm')
->join('m.brand', 'b')
->join('vi.variation', 'variation')
->join('variation.characteristics', 'vc')
->join('vc.characteristic_value', 'cv')
->where('v.state = 1')
->andWhere('b.name like :string OR m.title like :string OR cv.value_ru like :string OR cv.value_ua like :string')
->setParameter('string', '%' . $string . '%')
->getQuery()->getResult();
}
public function getUsedVehicle(Dealer $dealer, Brand $brand, $url, $vehicleType = false)
{
$query = $this->createQueryBuilder('v')
->join('v.dealer', 'd')
->join('v.vehicle_items', 'vi', Join::WITH, 'vi.sold = 0')
->where('v.is_used = 1')
->andWhere('v.state = 1')
->andWhere('v.is_not_filled = 0')
->andWhere('v.is_delete != 1')
->andWhere('v.url = :url')->setParameter('url', $url);
$query->leftJoin('v.model', 'm')
->andWhere('v.dealer = :dealer OR m.brand = :brand')
->setParameter('brand', $brand)
->setParameter('dealer', $dealer);
if (in_array($dealer->getId(), self::IS_OFFICIAL)) {
$query->andWhere('vi.official_car > 0');
}
if ($vehicleType) {
$query->andWhere('v.vehicle_type = :type')
->setParameter('type', $vehicleType);
}
return $query->getQuery()->getOneOrNullResult();
}
public function getUsedVehicles(Dealer $dealer, $byBrand = [], $vehicleType = false, DateTime $date = null)
{
$query = $this->createQueryBuilder('v')
->join('v.dealer', 'd')
->join('v.vehicle_items', 'vi', Join::WITH, 'vi.sold = 0')
->where('v.is_used = 1')
->andWhere('v.state = 1')
->andWhere('v.is_not_filled = 0')
->andWhere('v.is_delete != 1');
$query->leftJoin('v.model', 'm')
->andWhere('v.dealer = :dealer OR m.brand IN (:brand)')
->setParameter('brand', $byBrand)
->setParameter('dealer', $dealer);
if (in_array($dealer->getId(), self::IS_OFFICIAL)) {
$query->andWhere('vi.official_car > 0');
}
if ($date){
$query->andWhere('v.date_create BETWEEN :date AND :now')
->setParameter('date', $date, 'datetime')
->setParameter('now', new DateTime('now'), 'datetime');
}
if ($vehicleType) {
$query->andWhere('v.vehicle_type = :type')
->setParameter('type', $vehicleType);
}
return $query->getQuery()->getResult();
}
public function getUsedVehicleByModel(Model $model, $limit)
{
$query = $this->createQueryBuilder('v')
->join('v.vehicle_items', 'vi', Join::WITH, 'vi.sold = 0')
->where('v.is_used = 1')
->andWhere('v.state = 1')
->andWhere('v.is_not_filled = 0')
->andWhere('v.is_delete != 1')
->andWhere('v.model = :model')->setParameter('model', $model);
if ($limit) {
$query->setFirstResult(0)->setMaxResults($limit);
}
return $query->getQuery()->getResult();
}
public function getUsedVehicleByBrand(Brand $brand, $vehicleTypeId, $limit)
{
$query = $this->createQueryBuilder('v')
->innerJoin('v.vehicle_items', 'vi', Join::WITH, 'vi.sold = 0')
->innerJoin('v.model','m',Join::WITH,'m.brand = :brand')->setParameter('brand', $brand)
->where('v.is_used = 1')
->andWhere('v.state = 1')
->andWhere('v.is_not_filled = 0')
->andWhere('v.is_delete != 1')
->andWhere('v.vehicle_type = :vehicleType')->setParameter('vehicleType', $vehicleTypeId);
if ($limit) {
$query->setFirstResult(0)->setMaxResults($limit);
}
return $query->getQuery()->getResult();
}
public function getUsedVehicleByDealerModel(Dealer $dealer, Model $model, $limit)
{
$query = $this->createQueryBuilder('v')
->join('v.vehicle_items', 'vi', Join::WITH, 'vi.sold = 0')
->where('v.is_used = 1')
->andWhere('v.state = 1')
->andWhere('v.is_not_filled = 0')
->andWhere('v.is_delete != 1')
->andWhere('v.dealer = :dealer')->setParameter('dealer', $dealer)
->andWhere('v.model = :model')->setParameter('model', $model);
if ($limit) {
$query->setFirstResult(0)->setMaxResults($limit);
}
return $query->getQuery()->getResult();
}
public function getUsedByModel(Dealer $dealer, $model)
{
return $this->findOneBy([
'dealer' => $dealer,
'model' => $model,
'state' => 1,
'is_used' => 1,
]);
}
public function findDeletedWithMedia()
{
return $this->createQueryBuilder('c')
->where('c.preview is not null')
->andWhere('c.gallery is not null')
->andWhere('c.is_delete = 1')
->getQuery()
->getResult();
}
public function findVariationByParams($vehicleType = null, $isUsed = false, $brandId = null, $modelId = null, $characteristicId = [], $characteristicUnique = [], $locale = 'ua')
{
$query = $this->createQueryBuilder('v')
->select('b.id as brandId, b.name as brand, m.id as modelId, m.title as model, cv.id as characteristicId, cc.model_unique as characteristicUnique');
if ($locale == 'ua') {
$query->addSelect('cv.value_ua as characteristic_value');
}
if ($locale == 'ru') {
$query->addSelect('cv.value_ru as characteristic_value');
}
$query->innerJoin('v.vehicle_items', 'vi', Join::WITH, 'vi.state = 1')
->innerJoin('vi.variation', 'vr', Join::WITH, 'vr.state = 1')
->innerJoin('vr.characteristics', 'vc')
->innerJoin('vc.characteristic_value', 'cv')
->innerJoin('vc.characteristic', 'cc')
->innerJoin('v.model', 'm')
->innerJoin('m.brand', 'b')
->where('v.state = 1');
if ($brandId) {
$query->andWhere('b.id = :brandId')->setParameter('brandId', $brandId);
}
if ($modelId) {
$query->andWhere('m.id = :modelId')->setParameter('modelId', $modelId);
}
if ($vehicleType) {
$query->andWhere('v.vehicle_type = :vehicleType')->setParameter('vehicleType', $vehicleType);
}
$query->andWhere('v.is_used = :isUsed')->setParameter('isUsed', $isUsed);
// dump($characteristicId);exit;
// if (!empty($characteristicId)) {
// foreach ($characteristicId as $item) {
// $query->andWhere(' = :characteristicId')->setParameter('characteristicId', $item);
// }
// }
// if(isset($characteristicId['bodyType']) && isset($characteristicId['fuelType'])){
// $query->andWhere('vc.characteristic_value = :bodyType OR vc.characteristic_value = :fuelType')
// ->setParameter('bodyType', $characteristicId['bodyType'])
// ->setParameter('fuelType', $characteristicId['fuelType']);
// }elseif (!empty($characteristicId)) {
// foreach ($characteristicId as $item) {
// $query->andWhere('vc.characteristic_value = :characteristicId')->setParameter('characteristicId', $item);
// }
// }
if (!empty($characteristicUnique)) {
$query->andWhere('cc.model_unique in (:model_unique)')->setParameter('model_unique', $characteristicUnique);
}
$query->orderBy('brand');
$query->addOrderBy('model');
$query->addOrderBy('characteristic_value');
$query->groupBy('modelId, characteristicId, characteristicUnique');
return $query->getQuery()->getResult();
}
public function getVehicleByCharacteristicId($characteristicId, $vehicleType = null, $isUsed = false, $limit = null)
{
$query = $this->createQueryBuilder('v')
->innerJoin('v.vehicle_items', 'vi', Join::WITH, 'vi.state = 1')
->innerJoin('vi.variation', 'vr', Join::WITH, 'vr.state = 1')
->innerJoin('vr.characteristics', 'vc')
->where('v.state = 1')
->andWhere('vc.characteristic_value = :characteristicId')
->andWhere('vi.sold != 1')
->setParameter('characteristicId', $characteristicId)
->groupBy('v.id');
if ($vehicleType) {
$query->andWhere('v.vehicle_type = :vehicleType')->setParameter('vehicleType', $vehicleType);
}
$query->andWhere('v.is_used = :isUsed')->setParameter('isUsed', $isUsed);
if ($limit) {
$query->setFirstResult(0)->setMaxResults($limit);
}
return $query->getQuery()->getResult();
}
public function getVehicleByRecommendGroupUrl($url)
{
return $this->createQueryBuilder('ve')
->select('ve')
->join('ve.recommend_group', 'rg')
->where('ve.state = :state')->setParameter('state', true)
->andWhere('ve.is_used = :isUsed')->setParameter('isUsed', false)
->andWhere('rg.url = :url')->setParameter('url', $url)
->getQuery()
->getResult();
}
public function getVehicleByUrlCategory(Dealer $dealer = null, $url = null, $vehicleTypes = [])
{
$query = $this->createQueryBuilder('v')
->select('v,i,vi,m,e')
->join('v.preview', 'i')
->join('v.vehicle_items', 'vi')
->join('v.categories','cat')
->join('v.model', 'm')
->join('v.equipments', 'e')
->where('v.state = 1')
->andWhere('v.is_used = 0')
->andWhere('v.is_delete IN (:isDel)')
->setParameter('isDel', [0,null]);
if ($url) {
$query->andWhere('cat.url = :url')
->setParameter('url', $url);
}
if (count($vehicleTypes)) {
$query->andWhere('v.vehicle_type IN (:types)')
->setParameter('types', $vehicleTypes);
}
if($dealer) {
$query->andWhere('v.dealer = :dealer')->setParameter('dealer',$dealer );
}
$query->orderBy('v.position');
return $query->getQuery()->getResult();
}
public function getVehicleWithVehicleItems($isUsed = false, $dealer = null)
{
$query = $this->createQueryBuilder('ve')
->select('ve')
->innerJoin('ve.vehicle_items', 'vi', Join::WITH, 'vi.state = 1')
->innerJoin('vi.variation', 'vr', Join::WITH, 'vr.state = 1')
->addSelect(['vi', 'vr'])
->where('ve.state = :state')->setParameter('state', true)
->andWhere('ve.is_used = :isUsed')->setParameter('isUsed', $isUsed)
->andWhere('ve.vehicle_type = :vehicleType')->setParameter('vehicleType', VehicleType::PASSENGER_TYPE);
if ($dealer && $dealer->getId() == DealerModel::TOYOTA_BORISPIL_DEALER) {
$query->andWhere('ve.dealer = :dealer')->setParameter('dealer', $dealer);
} elseif (isset($dealer) && $dealer->getId() !== DealerModel::SECOND_HAND_DEALER) {
$query->innerJoin('ve.model', 'm')
->innerJoin('m.brand', 'b')
->andWhere('b.id = :brand')
->setParameter('brand', $dealer->getBrand()->getId());
}
if ($isUsed) {
$query->andWhere('vi.is_reserved = 0');
$query->andWhere('vi.deposit = 0');
$query->andWhere('vi.sold = 0');
}
return $query->getQuery()->getResult();
}
public function getVehicleByUrl(string $url)
{
return $this->createQueryBuilder('v')
->select('v')
->join('v.vehicle_items', 'vi')
->join('v.model', 'm')
->join('v.equipments', 'e')
->join('vi.variation', 'vv')
->join('vv.characteristics', 'ch')
->join('v.gallery', 'g')
->join('g.galleryHasMedias', 'ghm')
->join('ghm.media', 'media')
->addSelect('vi,m,e,g,ghm,media,vv,ch')
->where('v.url = :url')
->setParameter('url', $url)
->getQuery()
->getOneOrNullResult();
}
}