<?php
namespace App\Repository;
use App\Entity\Lot;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method Lot|null find($id, $lockMode = null, $lockVersion = null)
* @method Lot|null findOneBy(array $criteria, array $orderBy = null)
* @method Lot[] findAll()
* @method Lot[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class LotRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Lot::class);
}
public function processSearch($params, $entrepriseId = null, $user)
{
$qb = $this->createQueryBuilder('l');
if ($entrepriseId !== null) {
$qb->join('l.programmeParent', 'p')
->andWhere('p.entreprise = :entreprise_id')
->andWhere('p.demandeSuppression IS NULL')
->setParameter('entreprise_id', $entrepriseId);
if (in_array('ROLE_PARTENAIRE', $user->getRoles())) {
if (!$user->getallProgrammes()) {
$programmes = $user->getPrescripteurProgrammes();
if($programmes->count()) {
$qb->andWhere('p.id IN (' . implode(',', array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
} else {
$qb->andWhere('p.id IN (0)');
}
}
}
}
if (!empty($params['numero_lot'])) {
$qb->andWhere('l.reference IN (:numero_lot)')
->setParameter('numero_lot', $params['numero_lot']);
}
if (!empty($params['programme'])) {
$qb->andWhere('l.programme IN (:programmes)')
->setParameter('programmes', $params['programme']);
}
if (!empty($params['promoteur'])) {
$qb->andWhere('l.promoteur IN (:promoteurs)')
->setParameter('promoteurs', $params['promoteur']);
}
if(!empty($params['typologie'])) {
$qb->andWhere('l.typeMoteurRecherche IN (:types)')
->setParameter('types', $params['typologie']);
}
if(!empty($params['etage'])) {
$qb->andWhere('l.etageMoteurRecherche IN (:etages)')
->setParameter('etages', $params['etage']);
}
if(!empty($params['statut'])) {
$qb->andWhere('l.statut IN (:statuts)')
->setParameter('statuts', $params['statut']);
}
if(!empty($params['type-bien'])) {
$qb->andWhere('l.nature IN (:natures)')
->setParameter('natures', $params['type-bien']);
}
if(!empty($params['ville'])) {
$st = '(';
foreach($params['ville'] as $v) {
if(strpos($v, '||') !== false) {
list($nom, $nomComplet) = explode('||', $v);
} else {
$nom = $v;
}
$nom = str_replace('\'', '\'\'', $nom);
if($st != '(') {
$st .= ' OR l.ville LIKE \'%'.$nom.'%\'';
} else {
$st .= 'l.ville LIKE \'%'.$nom.'%\'';
}
}
$st .= ')';
$qb->andWhere($st);
}
if (!empty($params['code_postal'])) {
$qb->andWhere('l.codePostal IN (:code_postal)')
->setParameter('code_postal', $params['code_postal']);
}
if(!empty($params['superficie'])) {
list($minSuperficie, $maxSuperficie) = explode(',', $params['superficie']);
$qb->andWhere("(l.superficie IS NULL OR l.superficie >= $minSuperficie) AND (l.superficie IS NULL OR l.superficie <= $maxSuperficie)");
}
if(!empty($params['budget'])) {
list($minBudget, $maxBudget) = explode(',', $params['budget']);
$minBudget *= 1000;
$maxBudget *= 1000;
$qb->andWhere("COALESCE(l.prix, 0) BETWEEN $minBudget AND $maxBudget");
}
if(!empty($params['date']) && $params['date'] != 'toutes') {
if($params['date'] == 'immediate') {
$qb->andWhere("l.dateLivraison <= ".'\''.date('Y-m-d').'\'');
} else {
$qb->andWhere('l.dateLivraison <= \''.(int)$params['date'].'-12-31\'');
}
}
if (!empty($params['secteur'])) {
$qb->leftJoin('l.propositions', 'pr')
->leftJoin('pr.prospect', 'ps')
->leftJoin('ps.secteursGeographiques', 'sg')
->andWhere('sg.id IN (:secteurs)')
->setParameter('secteurs', (array) $params['secteur']);
$qb->distinct();
}
$sort = $params['sort'] ?? null;
$order = isset($params['order']) ? strtoupper($params['order']) : null;
$order = in_array($order, ['ASC','DESC'], true) ? $order : null;
$map = [
'reference' => 'l.reference',
'etat_preparation' => 'l.etatPreparation',
'statut' => 'l.statut',
'programme' => 'l.programme',
'ville' => 'l.ville',
'type' => 'l.type',
'etage' => 'l.etage',
'orientation' => 'l.orientation',
'superficie' => 'l.superficie',
'surface_exterieure' => '(COALESCE(l.jardin,0)+COALESCE(l.terrasse,0)+COALESCE(l.terrasse2,0))',
'livraison' => 'l.dateLivraison',
'prix' => 'l.prix',
];
if ($sort && isset($map[$sort]) && $order) {
$qb->resetDQLPart('orderBy');
$qb->addOrderBy($map[$sort], $order);
} else {
$qb->addOrderBy('CASE WHEN l.statut IS NULL OR l.statut = \'\' THEN 1 ELSE 0 END', 'ASC')
->addOrderBy('l.statut', 'ASC');
}
return $qb->getQuery()->getResult();
}
public function findOneByRefAndProg($ref, $prog)
{
return $this->createQueryBuilder('l')
->andWhere('l.reference like :ref')
->andWhere('l.programme = :prog')
->setParameter('ref', $ref)
->setParameter('prog', $prog->getId())
->getQuery()
->getOneOrNullResult()
;
}
/**
* @return Lot[] Returns an array of Lot objects
*/
public function findNbLots($limit)
{
return $this->createQueryBuilder('l')
->select('l') // Entity Lot
->setMaxResults($limit)
->orderBy('l.id', 'ASC')
->getQuery()
->getResult();
}
// /**
// * @return Lot[] Returns an array of Lot objects
// */
public function findByProgrammeRefTitreAndEntreprise($searchTerm, $entreprise, $user)
{
$qb = $this->createQueryBuilder('l')
->join('l.programmeParent', 'p')
->join('p.entreprise', 'e')
->where('e.id = :entrepriseId')
->andWhere('(
l.reference LIKE :searchTerm
OR l.titre LIKE :searchTerm
OR p.nom LIKE :searchTerm
OR l.type LIKE :searchTerm
OR l.ville LIKE :searchTerm
OR CONCAT(l.prix, \'\') LIKE :searchTerm
)')
->andWhere('p.demandeSuppression IS NULL')
->setParameter('searchTerm', '%' . $searchTerm . '%')
->setParameter('entrepriseId', $entreprise->getId());
if (in_array('ROLE_PARTENAIRE', $user->getRoles())) {
if (!$user->getallProgrammes()) {
$programmes = $user->getPrescripteurProgrammes();
if ($programmes->count()) {
$qb->andWhere('p.id IN (' . implode(',', array_map(function ($p) { return $p->getId(); }, $programmes->toArray())) . ')');
} else {
$qb->andWhere('p.id IN (0)');
}
}
}
return $qb->getQuery()->getResult();
}
public function findAllTypes($entrepriseId, $user)
{
$qb = $this->createQueryBuilder('l');
if ($entrepriseId !== null) {
$qb->join('l.programmeParent', 'p')
->andWhere('p.entreprise = :entreprise_id')
->setParameter('entreprise_id', $entrepriseId);
if (in_array('ROLE_PARTENAIRE', $user->getRoles())) {
if (!$user->getallProgrammes()) {
$programmes = $user->getPrescripteurProgrammes();
if($programmes->count()) {
$qb->andWhere('p.id IN (' . implode(',', array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
} else {
$qb->andWhere('p.id IN (0)');
}
}
}
}
return $qb->select('DISTINCT l.typeMoteurRecherche')
->orderBy('l.typeMoteurRecherche', 'ASC')
->getQuery()
->getResult();
}
public function findAllEtages($entrepriseId, $user)
{
$qb = $this->createQueryBuilder('l');
if ($entrepriseId !== null) {
$qb->join('l.programmeParent', 'p')
->andWhere('p.entreprise = :entreprise_id')
->setParameter('entreprise_id', $entrepriseId);
if (in_array('ROLE_PARTENAIRE', $user->getRoles())) {
if (!$user->getallProgrammes()) {
$programmes = $user->getPrescripteurProgrammes();
if($programmes->count()) {
$qb->andWhere('p.id IN (' . implode(',', array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
} else {
$qb->andWhere('p.id IN (0)');
}
}
}
}
return $qb->select('DISTINCT l.etageMoteurRecherche as etage')
->orderBy('l.etageMoteurRecherche', 'ASC')
->getQuery()
->getResult();
}
public function findAllPromoteurs($entrepriseId, $user)
{
$qb = $this->createQueryBuilder('l')
->select('DISTINCT l.promoteur as promoteur')
->join('l.programmeParent', 'p')
->andWhere('p.demandeSuppression IS NULL')
->andWhere('l.promoteur IS NOT NULL')
->orderBy('l.promoteur', 'ASC');
if ($entrepriseId !== null) {
$qb->andWhere('p.entreprise = :entreprise_id')
->setParameter('entreprise_id', $entrepriseId);
if (in_array('ROLE_PARTENAIRE', $user->getRoles())) {
if (!$user->getallProgrammes()) {
$programmes = $user->getPrescripteurProgrammes();
if ($programmes->count()) {
$programmeIds = array_map(function($p){ return $p->getId(); }, $programmes->toArray());
$qb->andWhere('p.id IN (:programmeIds)')
->setParameter('programmeIds', $programmeIds);
} else {
$qb->andWhere('p.id = 0');
}
}
}
}
return $qb->getQuery()->getResult();
}
public function findAllNumerosLot($entrepriseId, $user)
{
$qb = $this->createQueryBuilder('l');
if ($entrepriseId !== null) {
$qb->join('l.programmeParent', 'p')
->andWhere('p.entreprise = :entreprise_id')
->andWhere('p.demandeSuppression IS NULL')
->setParameter('entreprise_id', $entrepriseId);
if (in_array('ROLE_PARTENAIRE', $user->getRoles())) {
if (!$user->getallProgrammes()) {
$programmes = $user->getPrescripteurProgrammes();
if($programmes->count()) {
$qb->andWhere('p.id IN (' . implode(',', array_map(function($p){ return $p->getId(); }, $programmes->toArray())) . ')');
} else {
$qb->andWhere('p.id IN (0)');
}
}
}
}
return $qb->select('DISTINCT l.reference as numero_lot', 'l.ville', 'l.programme', 'l.type', 'l.prix')
->orderBy('l.reference', 'ASC')
->getQuery()
->getResult();
}
/*
public function findOneBySomeField($value): ?Lot
{
return $this->createQueryBuilder('l')
->andWhere('l.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}