<?php
namespace Entrepreneurs\Bundle\AppBundle\Propel;
use Entrepreneurs\Bundle\AppBundle\Propel\Base\EtablissementQuery as BaseEtablissementQuery;
use Entrepreneurs\Bundle\AppBundle\Propel\Map\DemandeInterventionTableMap;
use Entrepreneurs\Bundle\AppBundle\Propel\Map\EtablissementTableMap;
use Entrepreneurs\Bundle\AppBundle\Util\StringHelper;
use Propel\Runtime\ActiveQuery\Criteria;
use Propel\Runtime\Collection\ObjectCollection;
use Propel\Runtime\Propel;
class EtablissementQuery extends BaseEtablissementQuery
{
public function searchByTerm(string $term): self
{
$text = '%'.$term.'%';
$tel = '%'.StringHelper::cleanTel($term).'%';
return $this->condition('cond1', EtablissementTableMap::COL_LABEL.' LIKE ?', $text)
->condition('cond2', 'REPLACE(REPLACE(REPLACE('.EtablissementTableMap::COL_TELEPHONE.", ' ', ''), '.', ''), '-', '') LIKE ?", $tel)
->condition('cond3', EtablissementTableMap::COL_EMAIL.' LIKE ?', $text)
->where(['cond1', 'cond2', 'cond3'], 'or')
;
}
public function orderByTypeEtablissementLabel($order = Criteria::ASC): self
{
return $this->useTypeEtablissementQuery()
->orderByLabel($order)
->endUse();
}
public function orderByAcademieLabel($order = Criteria::ASC): self
{
return $this->useAcademieQuery()
->orderByLabel($order)
->endUse();
}
public function orderByVilleCodePostal($order = Criteria::ASC): self
{
return $this->useVilleQuery()
->orderByCodePostal($order)
->endUse();
}
public function filterByTypePrive($droit): self
{
if (1 == $droit) {
return $this->filterByPrive(true);
} elseif (2 == $droit) {
return $this->filterByPrive(false)->_or()->filterByPrive(null);
}
return $this;
}
public function filterByTypeZep($bool): self
{
if (1 == $bool) {
return $this->filterByZep(true);
} elseif (2 == $bool) {
return $this->filterByZep(false)->_or()->filterByZep(null);
}
return $this;
}
public function filterByTypeZrr($bool): self
{
if (1 == $bool) {
return $this->filterByZrr(true);
} elseif (2 == $bool) {
return $this->filterByZrr(false)->_or()->filterByZrr(null);
}
return $this;
}
public function filterByDepartements($departements): self
{
return count($departements) ? $this->useVilleQuery()
->filterByDepartement($departements)
->endUse() : $this;
}
public function filterByRegion($region): self
{
return $this->useVilleQuery()
->useDepartementQuery()
->filterByRegion($region)
->endUse()
->endUse();
}
public function filterByVilleEtablissement(ObjectCollection $villes): self
{
return count($villes) ? $this->filterByVille($villes, Criteria::IN) : $this;
}
public function filterBySansAdresseOuCodePostal(): EtablissementQuery
{
return $this
->filterByAdresse1('', Criteria::EQUAL)
->_or()
->useVilleNotExistsQuery()
->endUse();
}
public function filterByRegionOrDepartment(Gestionnaire $user): self
{
return $this
->useVilleQuery()
->useDepartementQuery()
->filterByRegion($user->getRegions())
->endUse()
->_or()
->filterByDepartement($user->getDepartements())
->endUse();
}
public function filterByEtablissementDoublon(Gestionnaire $user, bool $isAllRecordsAccessUser): self
{
$specialCaracters = [' ', '-', '_', '~', '"', '#', '{', '(', '[', '|', '@', ')', ']', '=', '}', '%', '/', ':', '.', ',', "'"];
$startReplace = implode('', array_map(function ($car) {return 'REPLACE('; }, $specialCaracters));
$endReplace = implode('', array_map(function ($car) {return "'" === $car ? ',"\'", "")' : sprintf(",'%s', '')", $car); }, $specialCaracters));
$con = Propel::getConnection();
$sql =
'SELECT etb.id
FROM etablissement etb
JOIN (
SELECT
COUNT(*) as nb,
CONCAT('.$startReplace.'etablissement.label'.$endReplace.', etablissement.ville_id) as labelDoublon,
etablissement.id,
etablissement.label,
etablissement.ville_id,
etablissement.uai
FROM etablissement
GROUP BY labelDoublon
HAVING COUNT(labelDoublon) > 1
UNION
SELECT
COUNT(*) as nb,
\'labelDoublon\' as labelDoublon,
etablissement.id,
etablissement.label,
etablissement.ville_id,
etablissement.uai
FROM etablissement
WHERE etablissement.uai IS NOT NULL AND etablissement.uai != \'\' AND etablissement.uai != \'-\'
GROUP BY etablissement.uai
HAVING COUNT(etablissement.uai) > 1
) etablissementDoublon
ON (etablissementDoublon.labelDoublon = \'labelDoublon\' AND etb.uai = etablissementDoublon.uai) OR '.$startReplace.'etb.label'.$endReplace.' = '.$startReplace.'etablissementDoublon.label'.$endReplace.' AND etb.ville_id = etablissementDoublon.ville_id;';
$stmt = $con->prepare($sql);
$stmt->execute();
$etablissementsDoublon = $stmt->fetchAll();
return EtablissementQuery::create()
->_if(!$isAllRecordsAccessUser)
->filterByRegionOrDepartment($user)
->_endif()
->filterById(array_values(array_unique(array_map(function (array $etablissementDoublon) {return $etablissementDoublon['id']; }, $etablissementsDoublon))));
}
public function filterBySelectedIdsFirst(array $ids): self
{
return
$this->filterById($ids)
->_or()
->filterByLabel('A%', Criteria::LIKE)
;
}
public function filterByDateDemandeInterventionDebut(\DateTime $date = null, $comparaison = Criteria::GREATER_EQUAL): self
{
if ($date) {
return $this->useDemandeInterventionQuery()
->filterByDateAll($date, $comparaison)
->endUse();
}
return $this;
}
public function filterByDateDemandeInterventionFin(\DateTime $date = null, $comparaison = Criteria::LESS_EQUAL): self
{
if ($date) {
return $this->useDemandeInterventionQuery()
->filterByDateAll($date, $comparaison)
->endUse();
}
return $this;
}
public function filterByDateDemandeInterventionDerniereDebut(\DateTime $date = null, $comparaison = Criteria::GREATER_EQUAL): self
{
if ($date) {
return $this->useDemandeInterventionExistsQuery()
->filterByDate(null, Criteria::ISNULL)
->having('MAX('.DemandeInterventionTableMap::COL_CRENEAU_1_DEBUT.') '.$comparaison.' ?', $date->format('Y-m-d'))
->_or()
->filterByDate(null, Criteria::ISNOTNULL)
->having('MAX('.DemandeInterventionTableMap::COL_DATE.') '.$comparaison.' ?', $date->format('Y-m-d'))
->endUse();
}
return $this;
}
public function filterByDateDemandeInterventionDerniereFin(\DateTime $date = null, $comparaison = Criteria::LESS_EQUAL): self
{
if ($date) {
return $this->useDemandeInterventionExistsQuery()
->filterByDate(null, Criteria::ISNULL)
->having('MAX('.DemandeInterventionTableMap::COL_CRENEAU_1_DEBUT.') '.$comparaison.' ?', $date->format('Y-m-d'))
->_or()
->filterByDate(null, Criteria::ISNOTNULL)
->having('MAX('.DemandeInterventionTableMap::COL_DATE.') '.$comparaison.' ?', $date->format('Y-m-d'))
->endUse();
}
return $this;
}
public function filterByStatutIntervention(ObjectCollection $statuts, string $comparaison = Criteria::EQUAL): self
{
if (!$statuts->isEmpty()) {
return $this->useDemandeInterventionQuery()
->filterByStatutId($statuts->toKeyValue('PrimaryKey', 'Id'), Criteria::IN)
->groupByEtablissementId()
->endUse();
}
return $this;
}
}