aggregate_retults() pour détails) private $results; // Date de sortie des séjours à partir de laquelle on peut lancer les contrôles expert private $expert_date_debut; // Etat des dossiers ciblés 0:Tous, 1:Présents, 2:Non facturés, ... private $etat_cible; //******************************************************************************************** // // PUBLIC FUNCTIONS // //********************************************************************************************/ function __construct() { // Initialisation des paramètres $this->oid = -1; $this->controle_id = -1; $this->sqlcmd_where = ''; $this->sqlcmd_justificatif = ''; $this->numero = 0; $this->table_id = -1; $this->table = array(); $this->database = null; $this->error = ''; $this->results = array(); $this->expert_date_debut = ''; $this->etat_cible = array(); } public function __set($property, $value) { if (property_exists($this, $property)) { $this->$property = $value; } return $this; } public function __get($property) { if (property_exists($this, $property)) { return $this->$property; } } /** * Exécute la règle expert * * Deux tableaux seront générés pour chaque ligne (séjour) retournée : un pour les informations fixes et un pour les * justiicatigs de la règle. Ces tableaux sont ajoutés au tableau $results[sejour_id] */ public function run() { $succes = false; // Vérifie l'existance des justificatifs dans la table à interroger et ajoute les champs à sélectionner d'office $what = $this->what_to_select(); // Met en forme le where de la requete de sélection $where_conditions = $this->which_conditions($this->table['fictive']); if (strlen($what) > 0 || $this->table['fictive'] == true) { // Construit et exécute prprement dit la requête de la règle if ($this->table['fictive'] == true) { $request = $this->sqlcmd_where . $where_conditions . ";"; } else { $request = "SELECT " . $what . " FROM " . $this->table['from'] . $where_conditions . ";"; } // file_put_contents('yep.txt', $request . PHP_EOL , FILE_APPEND); $result = $this->database->exec($request); if ($result === false) { // N'écrase pas une erreur déjà explicitée par les sous-fonctions if (strlen($this->error) == 0) { $this->error = "Erreur pendant l'exécution de la règle n°" . $this->numero . " : requête erronée." . PHP_EOL; } } else { while ($row = pg_fetch_array($result)) { $i = pg_num_fields($result); // Tableau des justificatifs demandés $justificatifs = array(); // Tableau des infos fixes $infos = array(); for ($j = 0; $j < $i; $j++) { // Si le champ retourné fait partie des justificatifs, on le stocke daans le tableau $justificatifs // Si non dans le tablau des infos $field_name = pg_field_name($result, $j); if (stripos($this->sqlcmd_justificatif, $field_name) === false) { $infos[$field_name] = $row[$j]; } else { $justificatifs[$field_name] = $row[$j]; } } // Stocke les infos et les justificatifs dans les réultats du séjour $this->results[$row['sejour_id']]['infos'] = $infos; $this->results[$row['sejour_id']]['justificatifs'] = $justificatifs; } $succes = true; } } else { $this->error .= "Règle" . $this->numero . " ignorée, justificatif non traité." . PHP_EOL; } return $succes; } //******************************************************************************************** // // PRIVATE FUNCTIONS // //********************************************************************************************/ /** * $this->sqlcmd_justificatif représente une suite de champs à retourner comme justificatif du contrôle. * Ces champs peuvent être délimités par un espace (\s) ou les caractètres ,;:| * * On cherche l'existance de chacun de ces champs dans la table $table sur laquelle est exécutée la règle et * on les concatène dans une chaîne de caractère séparée par des virgules. * Cette fonction permet donc de valider l'existance des champs à retourner et les met en forme */ private function what_to_select() { $rets = array(); // Par défaut, on va toujours récupérer les chaps définis dans la variable $this->table['defaults'] foreach($this->table['defaults'] as $default) { $rets[] = $default; } // Les champs de la variable $this->sqlcmd_justificati peuvent être séparés par un espace, une virgule, un point-virgule, deux-points ou une barre verticale $fields = preg_split("/[\s,;:\|]+/", $this->sqlcmd_justificatif); foreach($fields as $field) { // Si le champ à retourner existe ben en base (= dans la propritété 'fields' de $this->table), on l'ajoute à la liste des champs à retourner if (in_array($field, $this->table['fields'])) { $rets[] = $this->table['name'] . '.' . $field; } } return implode(', ', $rets); } /** * Construit le filtre de la requête de sélection du contrôle expert * Notez que les règles ne s'éxécutent pas sur les séjours prévus */ private function which_conditions($sql_brut=false) { $partie_fixe = " AND date_sortie >= '" . $this->expert_date_debut . "'::date " . $this->etat_cible['where'] . " AND code_prevu <> '1' " . " AND type_sejour <> '9' "; if (strlen($this->sqlcmd_where) == 0) { return ''; } else if ($sql_brut == true) { return $partie_fixe; } else { return " WHERE 1=1 AND (" . $this->explicit_where($this->sqlcmd_where) . ") " . $partie_fixe; } } /** * Analyse le WHERE de la requête de sélection de la règle et tente de remplacer les éventuels TAGS * * [LI:xxxx] : remplace ce tag par la liste des oids pointés par la liste xxxx * * @param $where Chaîne de caractère à analyser */ private function explicit_where($where) { // Recherche toutes les occurences du pattern suivant [LI:xxxx] où xxxx est le code de la liste concernée // Les résultats sont stockés dans le tableau $listes. // $listes // [0] => // [0] => [LI:zzzz] // [1] => zzzz // [1] => // [0] => [LI:yyyy] // [1] => yyyy // quelques tags intéressants pour les regexp : http://fr2.php.net/manual/fr/function.preg-match.php#105924 $listes = array(); if (preg_match_all('/\[LI:([^\]]*)\]/', $where, $listes, PREG_SET_ORDER) > 0) { foreach($listes as $liste) { $oids = ' (' . $this->get_liste_oids(trim($liste[1])) . ') '; $where = str_replace($liste[0], $oids, $where); } } return $where; } /** * Cherche le contenu de la liste $liste et renvoie la liste des oids pointés par la liste de code $liste * * @param $liste Code de la liste dont il faut récupérer les oids * @return Chaîne de caractère des oids séparés par des virgules, exemple : 'oid1, oid2, oid3' */ private function get_liste_oids($liste) { $oids = array(); $request = "SELECT to_id FROM activite.t_listes JOIN activite.t_listes_contenu ON t_listes_contenu.liste_id = t_listes.oid WHERE t_listes.code = '" . $liste. "' ;"; $result = $this->database->exec($request); if ($result === false) { $this->error .= "Erreur pendant l'exécution de la règle n°" . $this->numero . " : Impossible de récupérer les données de la liste " . $liste . "." . PHP_EOL; } else { if (pg_num_rows($result) < 1) { $this->error .= "Erreur pendant l'exécution de la règle n°" . $this->numero . " : Liste '" . $liste . "' vide ou inexisante." . PHP_EOL; } while ($row = $this->database->nextRecord($result)) { $oids[] = $row[0]; } } return implode(', ', $oids); } } ?>