]> git.llucax.com Git - mecon/yatta.git/blobdiff - lib/YATTA/Controlador.php
BugFixes.
[mecon/yatta.git] / lib / YATTA / Controlador.php
index a1ba0dbc6bf6e12dbaae9037e4f287fcad226e74..fbf5474f4f64f238efc38934accded260b968b02 100644 (file)
@@ -28,6 +28,8 @@ require_once 'YATTA/Proceso.php';
 require_once 'YATTA/ProcesoDB.php';
 require_once 'YATTA/Servidor.php';
 
+define ('PATH_TACHO', '/var/www/sistemas/yatta/tacho/');
+
 /**
  * Clase para el manejo centralizado de toda la informacion de YATTA.
  *
@@ -44,10 +46,6 @@ class YATTA_Controlador {
      * @access private
      */
     function _obtenerServidor($db) {
-        
-        //@FIXME La ponderacion esta mal. No tengo que buscar el que tenga mas
-        //alta o mas baja OJO!!! Volver a pensar el calculo.
-        
         $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
             FROM yatta.servidores AS s 
             ORDER BY ponderacion ASC, s.escala DESC');
@@ -61,8 +59,24 @@ class YATTA_Controlador {
  
     /**
      * Agrega un proceso a la base de datos
-     * Los datos obligatorios a pasar son: script, id_sistema, descripcion,
-     * owner, destinos, prioridad, scheduling y notificar.
+     * Recibe un array asociativo con:
+     *  Obligatorios
+     *   script     : Path completo para el require_once.
+     *   id_sistema : Identificador del sistema al que pertenece. (Es el id que
+     *                asigna SAMURAI)
+     *   descripcion: Es lo que permite al usuario identificar al proceso.
+     *   owner      : Login@Organismo de la persona responsable del proceso.
+     *
+     *  Opcionales
+     *   destinos   : Login@Organismo separado por comas de aquellos usuarios
+     *                que deben poder ver los resultados del proceso.
+     *   prioridad  : Indica la prioridad del proceso.
+     *   notificar  : Indica si hay que notificar al owner y a los destinos
+     *                cuando finalize el proceso.
+     *   resultado  : En caso que el proceso genere archivos resultado, se debe
+     *                indicar aqui el nombre del archivo que deben visualizar
+     *                los usuarios.
+     *   parametros : Parametros que hay que pasarle al metodo run del script.
      *
      * @param  DB $db Conexion a la base de datos.
      * @param  mixed $datos Datos necesarios del proceso.
@@ -82,10 +96,15 @@ class YATTA_Controlador {
         elseif (!is_array($datos)) {
             return new PEAR_Error ("Error con los datos pasados. El segundo".
                     " parametro debe ser un array asociativo o una instancia".
-                    " del objeto YATTA_Proceso.");
+                    " del objeto YATTA_ProcesoDB.");
         }
         $res = $this->_obtenerServidor($db);
 
+        //Serializo los parametros
+        if (@$datos['parametros']) {
+            $datos['parametros'] = serialize($datos['parametros']);
+        }
+
         if (DB::isError($res)) {
             return $res;
         }
@@ -140,59 +159,37 @@ class YATTA_Controlador {
     function terminarProceso($db, $id_proceso, $id_server, $status, $nota =
             null, $archivo = null, $notificar = 0) {
 
-        //Actualizo la base procesos
-        $sql = 'UPDATE yatta.procesos SET status = '. $status;
+        //NOTIFICO
+        if (@$notificar) {
+            $this->_emailUsuario ($db, $id_proceso, $status, $nota, $archivo);
+        }
+
+        //COPIO EL ARCHIVO
+        if (@$archivo) {
+            $arch = basename ($archivo);
+            rename ($archivo, PATH_TACHO.$arch);
+        }
+
+        //ACTUALIZO LA BASE PROCESOS
+        $sql = 'UPDATE yatta.procesos SET status = '. 
+            $db->quoteSmart($status);
         if (@$nota) {
-            $sql.= ', nota = '. $nota;
+            $sql.= ', nota = '. $db->quoteSmart($nota);
         }
         if (@$archivo) {
-            $sql.= ', archivo = '. $archivo;
+            $sql.= ', archivo = '. $db->quoteSmart(PATH_TACHO.$arch);
         }
         if (@$notificar) {
-            $sql.= ', notificar = '. $notificar;
+            $sql.= ', notificar = '. $db->quoteSmart($notificar);
         }
-        $sql.= ' WHERE id = '. $id_proceso;
+        $sql.= ' WHERE id = '. $db->quoteSmart($id_proceso);
+        
         $res = $db->query($sql);
         if (DB::isError($res)) {
             return $res;
         }
 
-        //NOTIFICO
-        if (@$notificar) {
-            $res = $db->query(
-                    "SELECT p.descripcion AS descripcion, p.owner AS owner, ".
-                    "p.destinos AS destinos ".
-                    "FROM yatta.procesos AS p"/
-                    "WHERE p.id = ". $id_proceso);
-            if (DB::isError($res)) {
-                return $res;
-            }
-            $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
-            $dest = split (',', @$res['destinos']);
-            $to = $owner.'.gov.ar';
-            foreach ($dest as $d) {
-                $to = $to . ", $d.gov.ar";
-            }
-            $headers = "From: Intranet - YATTA <intranet@mecon.gov.ar>\r\n";
-            $subject = "Proceso finalizado";
-            $body = "El proceso:\n".
-                $res['descripcion'] .
-                "\nha finalizado. Puede verificar el estado de finalizacion\n".
-                "en el sistema YATTA dentro de la intranet.\n".
-                "\n\n\n".
-                "************************************************************\n".
-                "Este es un mensaje generado automaticamente por MECON_YATTA.\n".
-                "Por favor no responder a esta direccion de e-mail.\n".
-                "************************************************************\n";
-            mail($to, $subject, $body, $headers);
-        }
 
-        //COPIO EL ARCHIVO
-        if (@$archivo) {
-            $arch = basename ($archivo);
-            rename ($archivo, '/var/www/yatta_tacho/'.$arch);
-        }
-        
         //Actualizo los servidores
         $SERVER =& new YATTA_Servidor;
         return $SERVER->quitarProceso($db, $id_server);
@@ -208,7 +205,8 @@ class YATTA_Controlador {
      * @access public
      */
     function obtenerNuevoProceso($db, $id) {
-        $res = $db->query('SELECT p.id AS id, p.script AS script
+        $res = $db->query('SELECT p.id AS id, p.script AS script, p.parametros
+                AS parametros
                 FROM yatta.procesos AS p
                 WHERE p.server = '.$id.' AND status = 0 
                 ORDER BY p.prioridad, p.id');
@@ -239,5 +237,133 @@ class YATTA_Controlador {
         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
         return  $res['cuenta'];
     }
+
+    /**
+     * Envia el email al usuario informandole la finalizacion de uno de sus
+     * procesos.
+     *
+     * @param DB $db Conexion a la base de datos.
+     * @param int $id_proceso Identificador del proceso.
+     * @param int $status Identificador del estado de finalizacion.
+     * @param string $nota Nota de error o similar.
+     * @param string $archivo Nombre del archivo temporal que esta en el fs.
+     *
+     * @return void
+     * @access private
+     */
+    function _emailUsuario($db, $id_proceso, $status, $nota = null, $archivo = null) {
+        $res = $db->query(
+                "SELECT p.descripcion AS descripcion, p.owner AS owner, ".
+                "p.destinos AS destinos, p.resultado AS resultado, ".
+                "p.estado AS estado, p.nota AS nota ".
+                "FROM yatta.procesos AS p".
+                "WHERE p.id = ". $id_proceso);
+        if (DB::isError($res)) {
+            return $res;
+        }
+        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+
+//@FIXME El email se lo envio al owner y a los destinos, o al owner solamente?
+        
+        $dest = split (',', @$res['destinos']);
+        $to = $owner.'.gov.ar';
+        foreach ($dest as $d) {
+            $to = $to . ", $d.gov.ar";
+        }
+        $headers = "From: Intranet - YATTA <intranet2@mecon.gov.ar>\r\n";
+        $subject = "INTRANET - YATTA - Proceso Finalizado";
+
+        $body = "El proceso {$res['descripcion']} ha finalizado ";
+
+        switch ($status) {
+            case 2:
+                $body .= "con éxito.\n";
+                break;
+            case 3:
+                $body .= "con errores.\n";
+                if ($nota) {
+                    $body .= "Motivo:\n$nota\n";
+                }
+                break;
+            case 4:
+                $body .= "porque se abortó su ejecución.\n";
+                if ($nota) {
+                    $body .= "Motivo:\n$nota\n";
+                }
+                break;
+        }
+
+        if ($archivo) {
+            $body .= "Usted puede obtener el archivo resultado del proceso\n".
+                "en la seccion Archivos del sistema YATTA.\n".
+                "Recuerde que este archivo puede ser borrado sin previo aviso\n".
+                "por tres motivos:\n".
+                "\t1- El archivo supera la antigüedad máxima establecida.\n".
+                "\t2- Se supero la capacidad máxima de información permitida\n".
+                "\t   por usuario.\n".
+                "\t3- Decisión administrativa por mantenimiento de los servidores.\n";
+        }
+        
+            
+        
+        $body .="\n\n\n".
+            "************************************************************\n".
+            "Este es un mensaje generado automaticamente por MECON_YATTA.\n".
+            "Por favor no responder a esta direccion de e-mail.\n".
+            "************************************************************\n";
+        
+        mail($to, $subject, $body, $headers);
+    }
+
+    /**
+     * Verifica si un usuario tiene alguna informacion en la base de yatta para
+     * mostrarle el icono en la lista de sistemas de la intranet.
+     *
+     * @param DB $db Conexion a la base de datos.
+     * @param string $login Usuario que se esta verificando
+     *
+     * @return bool
+     * @access public
+     * @static
+     */
+    function visible($DB, $login) {
+        $res = $db->query('SELECT count (p.id) AS id FROM yatta.procesos AS p'.
+            ' WHERE (p.owner LIKE \'%'. $login .'%\') OR'.
+            ' (p.destinos LIKE \'%'. $login .'%\')');
+                
+        if (DB::isError($res)) {
+            return $res;
+        }
+        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+
+        return $res['id'];
+    }
+
+    /**
+     * Busca los usuarios que tienen al menos una entrada en el mysql como
+     * owners.
+     *
+     * @param DB $db Conexion a la base de datos.
+     *
+     * @return mixed
+     * @access public
+     */
+    function obtenerListaOwners($db) {
+        return $db->query('SELECT DISTINCT p.owner AS owner
+                FROM yatta.procesos As p');
+    }
+
+    /**
+     * Obtiene las cuotas especiales de los usuarios.
+     *
+     * @param DB $db Conexion a la base de datos.
+     *
+     * @return mixed
+     * @access public
+     */
+    function obtenerListaCuotas($db) {
+        return $db->query('SELECT login, cuota
+                FROM yatta.cuotas');
+    }
 }
 ?>
\ No newline at end of file