<?php
namespace TheatreCore\Repository;
use TheatreCore\Entity\Bigregions;
use TheatreCore\Traits\TheatreTrait;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* BigregionsRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class BigregionsRepository extends ServiceEntityRepository
{
use TheatreTrait;
private $em;
public $__table;
public $__table_object;
public $__idtable;
private $returnAnd = false;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Bigregions::class);
$this->__table = $this->getClassMetadata()->getTableName();
$this->__table_object = $this->getClassMetadata()->name;
$this->__idtable = $this->getClassMetadata()->getSingleIdentifierFieldName();
// $this->__table = 'persons';
// $this->__table_object = '\\App\\Entity\\Persons';
}
// cache pour la liste obtenue dans getBigregionsList()
static protected $bigregionslist = null;
// {{{ getBigregionsList()
/** Retourne une liste des grandes régions et de leurs départements
*
*
* @param mixed $select_def intitulé optionnel pour la tête de liste (select boxes)
* @access protected
* @return array tableau au format array(array('id'=>idbigregioninsee, 'nom'=>bigregion, 'codes'=>'67,68', 'codes_array'=>array(67,68)),...)
*/
protected function getBigregionsList($select_def = null)
{
if (is_null(self::$bigregionslist)) { // en cache ?
// on fait la requête
$sql = 'SELECT *,`bigregions`.idbigregion as idbigregion
FROM `bigregions`
JOIN `regions` ON `regions`.`idbigregion`=`bigregions`.`idbigregion`
JOIN `departements` ON `regions`.`idregion`=`departements`.`idregion`
ORDER BY `bigregions`.`bigregion` ASC, `departements`.`departement` ASC';
$res = $this->queryAll($sql);
// réorganisation des données
$bigregions = array();
foreach ($res as $val) {
if (!isset($bigregions[$val['idbigregion']])) {
$bigregions[$val['idbigregion']] = array(
'id' => $val['idbigregion'],
'nom' => $val['bigregion'],
'codes_array' => array(
$val['departement']
)
);
} else {
$bigregions[$val['idbigregion']]['codes_array'][] = $val['departement'];
}
}
// liste des départements pour chaque région (séparés par des virgules)
foreach ($bigregions as $key => $val) {
$bigregions[$key]['codes'] = implode(',', $bigregions[$key]['codes_array']);
}
self::$bigregionslist = $bigregions;
}
// on ajoute la mention pour la boite de sélection (si demandé)
if (!empty($select_def)) {
// $list[0] = array(
// 'id' => 0,
// 'nom' => $select_def,
// 'codes' => '',
// 'codes_array' => array()
// );
$list = self::$bigregionslist;
return $list;
}
// on retourne la liste
return self::$bigregionslist;
}
// }}}
// {{{ getZipCode()
/** contruit une partie de requête pour la recherche de codes postaux associés à une région
*
*
* @param int $area code insee région
* @param string $table table (defaut: c)
* @param string $field champ (defaut: zip)
* @param mixed $inverse si non vide, inverse la requête: code postal n'étant pas dans la région
* @param string $countryfield champ pays (defaut: country)
* @param string $country code pays (defaut: FR)
* @access public
* @return string la partie de requête
*/
public function getZipCode($area = 0, $table = 'contacts', $field = 'zip', $inverse = null, $countryfield = 'country', $country = 'FR')
{
if (!$this->my_is_int($area) && strlen($area) == 2) {
return $this->getCountryCode($area, $table, $countryfield);
}
//tableau des bigregions
$bigregions = $this->getBigregionsList();
if (!isset($bigregions[$area])) return false;
// trouver en fonction de l'id
$listezip = $bigregions[$area]['codes'];
$nom = $bigregions[$area]['nom'];
// listes des départements, par longueur de préfixe (2 en général, 3 pour les dom)
$listes = array();
foreach ($bigregions[$area]['codes_array'] as $dept) {
$len = strlen($dept);
if (!isset($listes[$len])) {
$listes[$len] = '';
} else {
$listes[$len] .= ',';
}
$listes[$len] .= '\'' . $dept . '\'';
}
// construction clause pour chaque longueur de préfixe
$sql = '';
foreach ($listes as $len => $val) {
if ($sql) {
if (empty($inverse)) {
$sql .= ' OR';
$inverse = '';
} else {
$sql .= ' AND'; // requête inverse, donc ET logique
$inverse = 'NOT';
}
}
$sql .= ' SUBSTRING(' . $table . '.' . $field . ',1,' . $len . ') ' . $inverse . ' IN (' . $val . ')';
}
$sql = ' ' . $table . '.' . $countryfield . '=\'' . $country . '\' AND (' . $sql . ')';
//retourner la requete
return $sql;
}
// }}}
// {{{ getBigbigregionName()
/** Retourne le nom de la région ayant pour code insee $area
*
*
* @param int $area code région insee
* @access public
* @return string|boolean le nom de la région, ou false si non trouvé
*/
public function getBigbigregionName($area)
{
if (!$this->my_is_int($area)) {
return $this->getCountries($area);
}
//tableau des bigregions
$bigregions = $this->getBigregionsList();
// trouver en fonction de l'id
if (isset($bigregions[$area])) {
// retourner le nom
return $bigregions[$area]['nom'];
}
// pas trouvé
return false;
}
// }}}
// {{{ getRegionName()
/** Retourne le nom de la région ayant pour code insee $area
*
*
* @param int $area code région insee
* @access public
* @return string|boolean le nom de la région, ou false si non trouvé
*/
public function getRegionName($area)
{
return $this->getBigbigregionName($area);
}
// }}}
// {{{ getArea()
/** tableau des régions pour l'affichage (boîtes de sélection)
*
*
* @param mixed $select_def intitulé de la tête de liste
* @access public
* @return array tableau (format array(idbigregioninsee=>nom))
*/
public function getArea($select_def = true, $rand = false, $exclude_dom = true, $add_country = false)
{
//tableau des bigregions
$bigregions = $this->getBigregionsList($select_def);
//tableau de sortie
$area = array();
foreach ($bigregions as $key => $value) {
if ($exclude_dom) {
if (in_array($value['id'], array(14, 15, 16, 17, 18 /* code région insee */))) continue; // on exclut les dom-tom
}
$area[$value['id']] = $value['nom'];
}
// ajouter suisse et belgique
if ($add_country) {
$area['BE'] = 'Belgique';
$area['CH'] = 'Suisse';
$area['FR'] = 'Luxembourg';
}
if (!empty($rand)) {
return array_rand($area);
}
//retourner le tableau
return $area;
}
// }}}
// {{{ getIdbigregionByZip()
/** Trouver l'idbigregion à partir du code postal
*
*
* @param int $zip le code postal
* @access public
* @return int Identifiant de la région
*/
public function getIdbigregionByZip($zip): ?int
{
$doms = [
974 => 18,
973 => 15,
972 => 16,
971 => 14
];
// si le code postal n'est pas null
if ($zip !== null) {
//on vérifie si Dom-Tom
$zip_dom = substr($zip, 0, 3);
// si code Dom-Tom, on renvoie l'id big region directement
if (!empty($doms[$zip_dom])) {
$idBigRegion = $doms[$zip_dom];
} else {
// sinon on récupère le département pour chercher l'id big region en base
$department = substr($zip, 0, 2);
$tableId = '`bigregions`.`idbigregion`';
$sql = 'SELECT ' . $tableId . '
FROM `departements`
JOIN `regions` ON `regions`.`idregion`=`departements`.`idregion`
JOIN `bigregions` ON `bigregions`.`idbigregion`=`regions`.`idbigregion`
WHERE `departements`.`departement`=' . (int)$department . ' ';
$idBigRegion = $this->queryOne($sql);
}
} else {
// si le code postal est null, l'id big region est null
$idBigRegion = null;
}
// on retourne l'id de la big region
return $idBigRegion;
}
// }}}
// {{{ getIdDepartementByZip()
/** Trouver l'id du departement à partir du code postal
*
*
* @param int $zip le code postal
* @access public
* @return int Identifiant de la région
*/
public function getIdDepartementByZip($zip)
{
return $this->getIdbigregionByZip($zip, true);
}
// }}}
// {{{ getCountryCode()
/** contruit une partie de requête pour la recherche de pays
*
*
* @param int $area code insee région
* @param string $table table (defaut: c)
* @param string $field champ (defaut: zip)
* @param mixed $inverse si non vide, inverse la requête: code postal n'étant pas dans la région
* @param string $countryfield champ pays (defaut: country)
* @param string $country code pays (defaut: FR)
* @access public
* @return string la partie de requête
*/
public function getCountryCode($country = 'FR', $table = 'contacts', $countryfield = 'country')
{
$sql = ' ' . $table . '.' . $countryfield . '=\'' . $this->escape($country) . '\' ';
return $sql;
}
// }}}
// {{{ getXmlClassement()
/** Comment classer dans le XML du SWF
*
* @access public
* @return array
*/
public function getXMLClassement()
{
foreach (self::$bigregionslist as $k => $v) {
$bigregions[$k] = $k;
}
return $bigregions;
}
// }}}
// {{{ getCountries()
/** Les pays
*
* @access public
* @return array
*/
public function getCountries($area = null)
{
return array(
'FR' => array(
'pays' => 'France',
'prefixe' => 'fr'
),
'BE' => array(
'pays' => 'Belgique',
'prefixe' => 'be'
),
'LU' => array(
'pays' => 'Luxembourg',
'prefixe' => 'lu'
),
'CH' => array(
'pays' => 'Suisse',
'prefixe' => 'ch'
),
);
}
// }}}
// {{{ getRegionsCountries()
/** Retourne une liste des grandes régions et de leurs départements
*
*
* @access public
* @return array tableau
*/
public function getRegionsCountries()
{
// on fait la requête
$sql = 'SELECT *,`bigregions`.idbigregion as idbigregion
FROM `bigregions`
JOIN `regions` ON `regions`.`idbigregion`=`bigregions`.`idbigregion`
JOIN `departements` ON `regions`.`idregion`=`departements`.`idregion`
ORDER BY `bigregions`.`bigregion` ASC, `departements`.`departement` ASC';
$res = $this->queryAll($sql);
foreach ($res as $k => $v) {
$results['@' . $v['idbigregion']] = array(
'name' => $v['bigregion'],
'code' => $v['idbigregion'],
'type' => 'region',
);
}
foreach ($this->getCountries() as $k => $v) {
$results['@' . $k] = array(
'name' => $v['pays'],
'code' => $k,
'type' => 'country',
);
}
// les pays
return $results;
}
// }}}
}