src/Service/TableauService.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Doctrine\DBAL\Connection;
  5. use App\Repository\TableauRepository;
  6. use App\Repository\TableauFiltreRepository;
  7. use App\Repository\TableauColonneRepository;
  8. class TableauService
  9. {
  10.   private $repo_tablo;
  11.   private $repo_colonne;
  12.   private $repo_filtre;
  13.   private $entityManager;
  14.   private $conn;
  15.   public function __construct(Connection $connectionFormulaireService $service_formEntityManagerInterface $entityManagerTableauRepository $repo_tabloTableauFiltreRepository $repo_filtreTableauColonneRepository $repo_colonne) {
  16.     $this->conn $connection;
  17.     $this->entityManager $entityManager;
  18.     $this->repo_tablo $repo_tablo;
  19.     $this->repo_colonne $repo_colonne;
  20.     $this->repo_filtre $repo_filtre;
  21.     $this->service_form $service_form;
  22.   }
  23.   /**
  24.   * Retourne tous les tableaux créés ordonnés par libellé croissant
  25.   * @return App\Entity\Tableau[]
  26.   */
  27.   public function fetchAllAssociative() {
  28.     $tabAll $this->repo_tablo->findBy([], ["libelle" => "ASC"]);
  29.     return $tabAll;
  30.   }
  31.   /**
  32.   * Retourne en chaine de caractères le champ d'une colonne d'un tableau
  33.   * @param integer $colonne_id TableauColonne ID
  34.   * @return string
  35.   */
  36.   public function getColumnChamp($colonne_id) {
  37.     $colonne $this->repo_colonne->find($colonne_id);
  38.     if(!is_null($colonne->getTableau()->getEntite())) { // cas d'un tableau lié à une entité custom : on retourne le libellé du champ
  39.       return $colonne->getChamp()->getLibelle();
  40.     }
  41.     else { // cas d'un tableau requête SQL
  42.       return $colonne->getSqlColumn();
  43.     }
  44.   }
  45.   /**
  46.   * Savoir si un champ fait partie des colonnes
  47.   * @param integer $champ_id FormChamp ID
  48.   * @param App\Entity\Tableau $tableau
  49.   * @return boolean
  50.   */
  51.   public function isChampInTableau($champ_id$tableau) {
  52.     foreach ($tableau->getColonnes() as $key => $colonne) {
  53.       if(!is_null($colonne->getChamp()) && $colonne->getChamp()->getId() == $champ_id) {
  54.         return true;
  55.       }
  56.     }
  57.     return false;
  58.   }
  59.   /**
  60.   * Connaitre les colonnes possibles d'un tableau en fonction d'une requête SQL
  61.   * @param string $strProcedure Requête MySQL
  62.   * @return array
  63.   */
  64.   public function getProcedureColumns($strProcedure){
  65.     $res $this->conn->fetchAllAssociative($strProcedure);
  66.     if(count($res) > 0) {
  67.       return array_keys($res[0]);
  68.     }
  69.     else {
  70.       return false;
  71.     }
  72.   }
  73.   /**
  74.   * Retourne les lignes d'un tableau
  75.   * @param App\Entity\Tableau $tableau
  76.   * @return array
  77.   */
  78.   public function getContent($tableau){
  79.     // CAS D'UN TABLEAU "ENTITE"
  80.     if(!is_null($tableau->getEntite())) {
  81.       $className "App\\Entity\\".$tableau->getEntite()->getName();
  82.       if(class_exists($className)) {
  83.         $repo $this->entityManager->getRepository($className);
  84.         $filtres $this->repo_filtre->findBy(["parent" => null"tableau" => $tableau->getId()], ["champ" => "ASC"]);
  85.         // Construction de la requete SQL avec prise en compte des filtres (on a juste besoin des ids)
  86.         $sql 'SELECT id FROM `'.$tableau->getEntite()->getSqlTable().'` entite WHERE 1=1';
  87.         foreach ($filtres as $filtre) {
  88.           if(!is_null($filtre->getChamp()) && !is_null($filtre->getOperateur()) && !is_null($filtre->getValeur())) {
  89.             $field $this->getFieldForFiltre($filtre);
  90.             // Pour des filtres de champs à choix multiples
  91.             if($filtre->getOperateur()->getMultiple()) {
  92.               if(count($filtre->getEnfants()) > 0) {
  93.                 $sql .= ' AND COALESCE((
  94.                                 SELECT COUNT(*)
  95.                                 FROM form_valeur
  96.                                 WHERE entite_nom = "'.$tableau->getEntite()->getName().'"
  97.                                 AND entite_id = entite.id
  98.                                 AND champ_id = '.$filtre->getChamp()->getId().'
  99.                                 AND value_text IN ("'.$filtre->getValeur().'" , ';
  100.                 foreach ($filtre->getEnfants() as $child) {
  101.                   $sql .= '"'.$child->getValeur().'",';
  102.                 }
  103.                 $sql substr($sql0, -1);
  104.                 $sql .= ') ) , 0)';
  105.                 $sql .= ' '.$filtre->getOperateur()->getSqlQuery();
  106.               }
  107.               else {
  108.                 $sql .= ' AND COALESCE((SELECT COUNT(*) FROM form_valeur WHERE entite_nom = "'.$tableau->getEntite()->getName().'" AND entite_id = entite.id AND champ_id = '.$filtre->getChamp()->getId().' AND value_text = "'.$filtre->getValeur().'"), 0)';
  109.                 $sql .= ' '.$filtre->getOperateur()->getSqlQuery();
  110.               }
  111.             }
  112.             // Pour des filtres classiques
  113.             else {
  114.               if(count($filtre->getEnfants()) > 0) {
  115.                 $sql .= ' AND ( COALESCE((SELECT '.$field.' FROM form_valeur WHERE entite_nom = "'.$tableau->getEntite()->getName().'" AND entite_id = entite.id AND champ_id = '.$filtre->getChamp()->getId().'), "")';
  116.                 $sql .= ' '.str_replace("{value}"$filtre->getValeur(), $filtre->getOperateur()->getSqlQuery()).' ';
  117.                 foreach ($filtre->getEnfants() as $child) {
  118.                   $field2 $this->getFieldForFiltre($child);
  119.                   $sql .= ' OR COALESCE((SELECT '.$field2.' FROM form_valeur WHERE entite_nom = "'.$tableau->getEntite()->getName().'" AND entite_id = entite.id AND champ_id = '.$child->getChamp()->getId().'), "")';
  120.                   $sql .= ' '.str_replace("{value}"$child->getValeur(), $child->getOperateur()->getSqlQuery()).' ';
  121.                 }
  122.                 $sql .= ' ) ';
  123.               }
  124.               else {
  125.                 $sql .= ' AND COALESCE((SELECT '.$field.' FROM form_valeur WHERE entite_nom = "'.$tableau->getEntite()->getName().'" AND entite_id = entite.id AND champ_id = '.$filtre->getChamp()->getId().'), "")';
  126.                 $sql .= ' '.str_replace("{value}"$filtre->getValeur(), $filtre->getOperateur()->getSqlQuery());
  127.               }
  128.             }
  129.           }
  130.         }
  131.         $sql $this->replaceVariablesInQuery($sql);
  132.         // dump($sql);die();
  133.         // Résultats de la requête
  134.         $rows $this->conn->fetchAllAssociative($sql);
  135.         // Pour chaque ligne le FormulaireService va récupérer toutes les données en fonction des valeurs de formulaires
  136.         $allLignes = [];
  137.         foreach ($rows as $row) {
  138.           $allLignes[] = $this->service_form->getAllData($tableau->getEntite(), $row["id"]);
  139.         }
  140.       }
  141.       else {
  142.         throw new \Exception("Erreur lors du chargement du tableau.");
  143.       }
  144.     }
  145.     // CAS D'UN TABLEAU "SQL CLASSIQUE"
  146.     else {
  147.       $allLignes $this->conn->fetchAllAssociative($tableau->getSqlConfig());
  148.     }
  149.     // On retourne seulement les data à afficher dans le tableau
  150.     $lignes = [];
  151.     foreach ($allLignes as $data) {
  152.       $newLigneData = [];
  153.       foreach ($data as $code => $value) {
  154.         foreach ($tableau->getColonnes() as $colonne) {
  155.           if($colonne->getSqlColumn() == $code || (!is_null($colonne->getChamp()) && $colonne->getChamp()->getCode() == $code)) {
  156.             $newLigneData[$code] = $value;
  157.           }
  158.         }
  159.       }
  160.       $lignes[] = $newLigneData;
  161.     }
  162.     return $lignes;
  163.   }
  164.   /**
  165.   * Construction d'une requete avec filtres : remplacement des valeurs dynamiques (notamment pour les dates)
  166.   * @param string $sql
  167.   * @return string
  168.   */
  169.   public function replaceVariablesInQuery($sql){
  170.     // Maintenant
  171.     $sql str_replace("#NOW#"date("Y-m-d H:i:s"), $sql);
  172.     // Date du jour
  173.     $sql str_replace("#TODAY#"date("Y-m-d"), $sql);
  174.     // Premier jour du mois en cours
  175.     $sql str_replace("#M_1#"date("Y-m")."-01"$sql);
  176.     // Premier jour de l'année en cours
  177.     $sql str_replace("#Y_1#"date("Y")."-01-01"$sql);
  178.     return $sql;
  179.   }
  180.   /**
  181.   * Connaitre la colonne à vérifier en fonction du type de champ du filtre
  182.   * @param App\Entity\TableauFiltre $filtre
  183.   * @return string
  184.   */
  185.   public function getFieldForFiltre($filtre){
  186.     switch($filtre->getChamp()->getType()->getCode()) {
  187.       case "TXT":
  188.       case "TXTAREA":
  189.       case "TXTEMAIL":
  190.       case "LIST":
  191.       case "LISTSQL":
  192.       case "CHOICE":
  193.         $field "value_text";
  194.         break;
  195.       case "DATE":
  196.       case "DATETIME":
  197.         $field "value_date";
  198.         break;
  199.       case "INT":
  200.       case "BOOL":
  201.         $field "value_int";
  202.         break;
  203.       case "DEC":
  204.         $field "value_dec";
  205.         break;
  206.       default:
  207.         $field "value_text";
  208.         break;
  209.     }
  210.     return $field;
  211.   }
  212. }
  213. ?>