/[openfoncier]/trunk/services/metier/maintenancemanager.php
ViewVC logotype

Diff of /trunk/services/metier/maintenancemanager.php

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 559 by mlimic, Tue Oct 30 17:05:34 2012 UTC revision 820 by fmichon, Fri Nov 23 12:04:07 2012 UTC
# Line 1  Line 1 
1  <?php  <?php
2    /**
3  /*   * Ce fichier permet de déclarer la classe MaintenanceManager, qui effectue les
4   * Processes requests received via services which are meant to initiate a   * traitements pour la ressource 'maintenance'.
  * synchronization.  
  *  
  * @author Mirna Limic <[email protected]>  
  * Date: 18/10/2012  
5   *   *
6   * Follow-up:   * @package openfoncier
7   * Bugs:   * @version SVN : $Id$
8   */   */
9    
10  require_once ("./metier/metiermanager.php");  // Inclusion de la classe de base MetierManager
11  //require_once('./REST/amqp_publisher.php');  require_once("./metier/metiermanager.php");
12    
13    /**
14     * Cette classe hérite de la classe MetierManager. Elle permet d'effectuer des
15     * traitements pour la ressource 'maintenance' qui ont vocation à être
16     * déclenché de manière automatique ou par une application externe. Par
17     * exemple, un cron permet chaque soir d'exécuter la synchronisation des
18     * utilisateurs de l'application avec l'annuaire LDAP.
19     */
20  class MaintenanceManager extends MetierManager {  class MaintenanceManager extends MetierManager {
       
     /*  
      * @var mixed Array containing function pointers (i.e. function names)  
      * that are (dereferenced and) called to perform the synchronization tasks.  
      */  
     var $fptrs = array('user' => 'synchronizeUsers',  
                        'consultation' => 'updateConsultationsStates'); // 'UserManager'  
       
       
     /*  
      * Constructor.  
      *  
      * Calls its parent's constructor.  
      */  
     public function __construct() {  
         parent::__construct();  
     }  
21    
22            /**
23      /*       * @var mixed Ce tableau permet d'associer un module a une méthode,
24       * Destructor.       * le module (key) est celui reçu dans la requête REST, la méthode (value)
25       *       * est la méthode de cette classe qui va exécuter le traitement
26       * Calls its parent's destructor.       */
27       */          var $fptrs = array(
28      public function __destruct() {          'user' => 'synchronizeUsers',
29          parent::__destruct();          'consultation' => 'updateConsultationsStates',
30      }      );
31        
32            /**
33      /*       * Cette méthode permet de gérer l'appel aux différentes méthodes
34       * Starts a synchronization process by calling       * correspondantes au module appelé.
      * one of the functions in the fptrs array.  
35       *       *
36       * @param string $module The key to be used in order to retreive the name       * @param string $module Le module à exécuter reçu dans la requête
37       * of the function that should be called.       * @param mixed $data Les données reçues dans la requête
38       * @param mixed $data The data that was received as a part of the request.       * @return string Le résultat du traitement
      * @return string The result of processing.  
39       */       */
40      public function performMaintenance($module, $data) {      public function performMaintenance($module, $data) {
41            
42          // check that the known module is called          // Si le module n'existe pas dans la liste des modules disponibles
43            // alors on ajoute un message d'informations et on retourne un
44            // un résultat d'erreur
45          if (!in_array($module, array_keys($this->fptrs))) {          if (!in_array($module, array_keys($this->fptrs))) {
46              return 'Unknown module in request.';              $this->setMessage("Le module demandé n'existe pas");
47                return $this->BAD_DATA;
48          }          }
49            
50          $ret = call_user_func(array($this, $this->fptrs[$module]), $data);          // Si le module existe dans la liste des modules disponibles
51          return $ret;          // alors on appelle la méthode en question et on retourne son résultat
52            return call_user_func(array($this, $this->fptrs[$module]), $data);
53    
54      }      }
55        
56            /**
57      /*       * Cette méthode permet d'effectuer la synchronisation des utilisateurs
58       * Synchronizes the users data in a DB with the user's data from the       * de l'application avec l'annuaire LDAP paramétré dans l'application.
      * directory services that communicate via LDAP.  
59       *       *
60       * @param mixed $data The data that was received as a part of the request.       * @param mixed $data Les données reçues dans la requête
61       * @return string The result of processing.       * @return string Le résultat du traitement
62         *
63         * @todo XXX Faire une getsion des erreurs dans om_application pour
64         * permettre d'avoir un retour sur le nombre d'utilisateurs synchronisés
65       */           */    
66      public function synchronizeUsers($data) {      public function synchronizeUsers($data) {
67          // depending on what is in the data do the treatement  
68          // currently only user synchronization with ldap is supported          // Initialisation de la synchronisation des utilisateurs LDAP
69          $keys = array_keys($data);          $results = $this->f->initSynchronization();
70          if (in_array('userToAdd', $keys)  
71              || in_array('userToDelete', $keys)          // Si l'initialisation ne se déroule pas correctement alors on retourne
72              || in_array('userToUpdate', $keys)) {          // un résultat d'erreur
73              //$this->f->synchronizeUsers($data);          if (is_null($results) || $results == false) {
74                $this->setMessage("Erreur interne");
75                return $this->KO;
76          }          }
77          return $this->OK;          
78            // Application du traitement de synchronisation
79            $ret = $this->f->synchronizeUsers($results);
80    
81            // Si l'a synchronisation ne se déroule pas correctement alors on
82            // retourne un résultat d'erreur
83            if ($ret == false) {
84                $this->setMessage("Erreur interne");
85                return $this->KO;
86            }
87    
88            // Si l'a synchronisation ne se déroule correctement alors on
89            // retourne un résultat OK
90            $this->setMessage("Synchronisation terminée.");
91            return $this->OK;
92    
93      }      }
94        
95            /**
96      /*       * Cette méthode permet d'effectuer le traitement de gestion des avis
97       * Sets to favorable the avis (evaluation) of consultations whose limit       * tacites sur les consultations qui ont atteint leur date limite de
98       * date has passed without there being a return (from an external service).       * retour.
99       * @param mixed $data The data passed in with the REST call       *
100       * @return OK on success or not applicable, KO on DB error       * @param mixed $data Les données reçues dans la requête
101         * @return string Le résultat du traitement
102         *
103         * @todo Vérifier si il est possible de déplacer la méthode dans
104         * l'application
105       */       */
106      public function updateConsultationsStates($data) {      public function updateConsultationsStates($data) {
107    
108            // Nom de la table
109          $table_name = 'consultation';          $table_name = 'consultation';
         $sql = "SELECT consultation FROM $table_name WHERE ".  
             " date_limite < DATE '". date('Y-m-d', time()) .  
             "' AND date_retour IS NULL AND avis_consultation IS NULL";  
110    
111            // Récupération de la référence vers un avis_consultation correspondant
112            // au libellé 'Tacite'
113            $sql = "SELECT avis_consultation FROM ".DB_PREFIXE."avis_consultation ";
114            $sql .= " WHERE libelle = 'Tacite' ";
115            $sql .= " AND ((avis_consultation.om_validite_debut IS NULL ";
116            $sql .= " AND (avis_consultation.om_validite_fin IS NULL ";
117            $sql .= " OR avis_consultation.om_validite_fin > CURRENT_DATE)) ";
118            $sql .= " OR (avis_consultation.om_validite_debut <= CURRENT_DATE ";
119            $sql .= " AND (avis_consultation.om_validite_fin IS NULL ";
120            $sql .= " OR avis_consultation.om_validite_fin > CURRENT_DATE))) ";
121          $res = $this->db->query($sql);          $res = $this->db->query($sql);
122          // In case of error          // Logger
123          if ($this->checkDBError($res, 'Erreur lors de mise à jour')) {          $this->addToLog("updateConsultationsStates(): db->query(\"".$sql."\"", VERBOSE_MODE);
124            // Si une erreur de base de données se produit sur cette requête
125            // alors on retourne un résultat d'erreur
126            if ($this->f->isDatabaseError($res, true)) {
127                $this->setMessage("Erreur de base de données.");
128              return $this->KO;              return $this->KO;
129          }          }
130            
131          $ids = array();          // Récupération de la référence vers un avis_consultation correspondant
132          while ($row =& $res->fetchRow(DB_FETCHMODE_ORDERED)) {          // au libellé 'Tacite'
133              $ids[] = $row[0];          $tacite = NULL;
134            while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
135                $tacite = $row["avis_consultation"];
136          }          }
137          $res->free();          $res->free();
138    
139          // if there are no consultations that need to have          // Si la décision n'existe pas dans la base de données alors on ajoute
140          // their state set to Favorable, return OK          // un message d'informations et on retourne un résultat d'erreur
141          if (count($ids) == 0) {          if (is_null($tacite)) {
142              $this->setMessage("Aucune mise à jour");              $this->setMessage("L'avis n'existe pas.");
143              return $this->NA;              return $this->KO;
144          }          }
145            
146          // get the idenfier of the evaluation: 'Favorable'          // Récupération de la liste des consultations correspondantes aux
147          $sql = "SELECT avis_consultation FROM avis_consultation WHERE ".          // critères du traitement
148              "libelle = 'Tacite'";          $sql = "SELECT consultation FROM ".DB_PREFIXE."$table_name ";
149            $sql .= " WHERE date_limite < CURRENT_DATE" ;
150            $sql .= " AND date_retour IS NULL AND avis_consultation IS NULL ";
151          $res = $this->db->query($sql);          $res = $this->db->query($sql);
152          if ($this->checkDBError($res, 'Erreur lors de mise à jour')) {          // Logger
153            $this->addToLog("updateConsultationsStates(): db->query(\"".$sql."\"", VERBOSE_MODE);
154            // Si une erreur de base de données se produit sur cette requête
155            // alors on retourne un résultat d'erreur
156            if ($this->f->isDatabaseError($res, true)) {
157                $this->setMessage("Erreur de base de données.");
158              return $this->KO;              return $this->KO;
159          }          }
160    
161          $favorable = -1;          // Récupération de la liste des consultations correspondantes aux
162          while ($row =& $res->fetchRow(DB_FETCHMODE_ORDERED)) {          // critères du traitement
163              $favorable = $row[0];          $ids = array();
164            while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
165                $ids[] = $row["consultation"];
166          }          }
167          $res->free();          $res->free();
168    
169          // if we did not find the evaluation 'Favorable', return error          // Si aucune consultation n'est concernée par le traitement alors on
170          if ($favorable < 0) {          // ajoute un message d'informations et on retourne un résultat 'OK'
171              $this->setMessage("'Favorable' n'est pas présent ".          if (count($ids) == 0) {
172                           "dans la columne : avis_consultation.libelle");              $this->setMessage("Aucune mise à jour.");
173              return $this->KO;              return $this->OK;
174          }          }
175    
176          // update the consultation table to set the 'Favorable' evaluation for          // Exécution du traitement
177          // the pertinent consultations          // On met à jour toutes les consultation avec le retour d'avis
178          $fields = array('avis_consultation' => $favorable);          $fields = array(
179          $res = $this->db->autoExecute($table_name, $fields, DB_AUTOQUERY_UPDATE,              'avis_consultation' => $tacite,
180                                  'consultation IN ('.implode(',', $ids).')');          );
181          if ($this->checkDBError($res, 'Erreur lors de mise à jour')) {          $res = $this->db->autoExecute(DB_PREFIXE.$table_name,
182                                          $fields,
183                                          DB_AUTOQUERY_UPDATE,
184                                          'consultation IN ('.implode(',', $ids).')');
185            // Logger
186            $this->addToLog("updateConsultationsStates(): db->autoExecute(\"".DB_PREFIXE.$table_name."\", ".print_r($fields, true).", DB_AUTOQUERY_UPDATE, \"consultation IN (\"".implode(',', $ids)."\")", VERBOSE_MODE);
187            // Si une erreur de base de données se produit sur cette requête
188            // alors on retourne un résultat d'erreur
189            if ($this->f->isDatabaseError($res, true)) {
190                $this->setMessage("Erreur de base de données.");
191              return $this->KO;              return $this->KO;
192          }          }
193    
194          // $res->getDebugInfo(), $res->getMessage()          // Tout s'est déroulé correctement alors on ajoute un message
195          $this->setMessage('Il y a eu '.count($ids).' demandes de consultations dont '.          // d'informations et on retourne le résultat 'OK'
196                            'l\'avis été passé à Tacite');          $this->setMessage(count($ids)." consultations mise(s) à jour.");
197          return $this->OK;          return $this->OK;
198    
199      }      }
200    
201  }  }
202    
   
   
203  ?>  ?>

Legend:
Removed from v.559  
changed lines
  Added in v.820

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26