]> git.llucax.com Git - mecon/yatta.git/blob - lib/YATTA/Controlador.php
Saco las constantes del svn.
[mecon/yatta.git] / lib / YATTA / Controlador.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     YATTA!
5 -------------------------------------------------------------------------------
6 This file is part of YATTA!.
7
8 YATTA! is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
11 any later version.
12
13 YATTA! is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16  
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA  02111-1307  USA
20 -------------------------------------------------------------------------------
21 Creado: vie ene  9 16:28:04 ART 2004
22 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'YATTA/Proceso.php';
28 require_once 'YATTA/ProcesoDB.php';
29 require_once 'YATTA/Servidor.php';
30
31 define ('PATH_TACHO', '/var/www/sistemas/yatta/tacho/');
32
33 /**
34  * Clase para el manejo centralizado de toda la informacion de YATTA.
35  *
36  * @access public
37  */
38 class YATTA_Controlador {
39
40     /**
41      * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
42      *
43      * @param DB $db Conexion a la base de datos.
44      *
45      * @return mixed
46      * @access private
47      */
48     function _obtenerServidor($db) {
49         $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
50             FROM yatta.servidores AS s 
51             ORDER BY ponderacion ASC, s.escala DESC');
52         // Si hay error lo devuelve.
53         if (DB::isError($res)) {
54             return $res;
55         }
56         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
57         return  $res['id'];
58     }
59  
60     /**
61      * Agrega un proceso a la base de datos
62      * Recibe un array asociativo con:
63      *  Obligatorios
64      *   script     : Path completo para el require_once.
65      *   id_sistema : Identificador del sistema al que pertenece. (Es el id que
66      *                asigna SAMURAI)
67      *   descripcion: Es lo que permite al usuario identificar al proceso.
68      *   owner      : Login@Organismo de la persona responsable del proceso.
69      *
70      *  Opcionales
71      *   destinos   : Login@Organismo separado por comas de aquellos usuarios
72      *                que deben poder ver los resultados del proceso.
73      *   prioridad  : Indica la prioridad del proceso.
74      *   notificar  : Indica si hay que notificar al owner y a los destinos
75      *                cuando finalize el proceso.
76      *   resultado  : En caso que el proceso genere archivos resultado, se debe
77      *                indicar aqui el nombre del archivo que deben visualizar
78      *                los usuarios.
79      *
80      * @param  DB $db Conexion a la base de datos.
81      * @param  mixed $datos Datos necesarios del proceso.
82      *
83      * @return mixed
84      * @access public
85      * @static
86      */
87     function agregarProceso($db, $datos) {
88         //XXX Dentro de los datos puede estar el tiempo estimado de ejecucion
89         //del proceso. Esta informacion podria ser utilizada en futuras
90         //versiones para asignar servidores.
91
92         //Si no es un array
93         if (is_object($datos) && is_a ($datos, 'YATTA_ProcesoDB')) {
94             $datos = $datos->obtenerDatos();
95         }
96         elseif (!is_array($datos)) {
97             return new PEAR_Error ("Error con los datos pasados. El segundo".
98                     " parametro debe ser un array asociativo o una instancia".
99                     " del objeto YATTA_ProcesoDB.");
100         }
101         $res = $this->_obtenerServidor($db);
102
103         if (DB::isError($res)) {
104             return $res;
105         }
106         $datos['server'] = $res;
107         $datos['fecha'] = date('Y-m-d');
108         $res = $db->autoExecute('yatta.procesos', $datos, DB_AUTOQUERY_INSERT);
109         if (DB::isError($res)) {
110             return $res;
111         }
112         $SERVER =& new YATTA_Servidor;
113         return $SERVER->agregarProceso($db, $datos['server']);
114     }
115
116     /**
117      * Obtiene los procesos de un usuario.
118      *
119      * @param DB $db Conexion a la base de datos.
120      * @param string $owner Usuario duenio de los procesos.
121      * @param int $id Identificador del proceso a buscar
122      *
123      * @return mixed
124      * @access public
125      */
126     function obtenerProcesosUsuario($db, $owner, $id = null) {
127         $proceso =& new YATTA_ProcesoDB;
128         $proceso->owner = $owner;
129         if (@$id) {
130             $proceso->id = $id;
131             $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
132             $res = $proceso->cargar($res);
133             return $proceso;
134         }
135         else {
136             return $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
137         }
138     }
139
140     /**
141      * Actualiza los datos de un proceso al terminar.
142      *
143      * @param DB $db Conexion a la base de datos.
144      * @param int $id_proceso Identificador del proceso.
145      * @param int $id_server Identificador del Servidor.
146      * @param int $status Identificador del estado de finalizacion.
147      * @param string $nota Nota de error o similar.
148      * @param string $archivo Nombre del archivo temporal que esta en el fs.
149      * @param int $notificar Indica si hay que notificar al owner.
150      *
151      * @return mixed
152      * @access public
153      */
154     function terminarProceso($db, $id_proceso, $id_server, $status, $nota =
155             null, $archivo = null, $notificar = 0) {
156
157         //Actualizo la base procesos
158         $sql = 'UPDATE yatta.procesos SET status = '. $status;
159         if (@$nota) {
160             $sql.= ', nota = '. $nota;
161         }
162         if (@$archivo) {
163             $sql.= ', archivo = '. $archivo;
164         }
165         if (@$notificar) {
166             $sql.= ', notificar = '. $notificar;
167         }
168         $sql.= ' WHERE id = '. $id_proceso;
169         $res = $db->query($sql);
170         if (DB::isError($res)) {
171             return $res;
172         }
173
174         //NOTIFICO
175         if (@$notificar) {
176             $this->_emailUsuario ($db, $id_proceso, $status, $nota, $archivo);
177         }
178
179         //COPIO EL ARCHIVO
180         if (@$archivo) {
181             $arch = basename ($archivo);
182             rename ($archivo, PATH_TACHO.$arch);
183         }
184         
185         //Actualizo los servidores
186         $SERVER =& new YATTA_Servidor;
187         return $SERVER->quitarProceso($db, $id_server);
188     }
189
190     /**
191      * Busca un proceso en cola para el servidor
192      *
193      * @param DB $db Conexion a la base de datos.
194      * @param int $id Identificador del servidor.
195      *
196      * @return mixed
197      * @access public
198      */
199     function obtenerNuevoProceso($db, $id) {
200         $res = $db->query('SELECT p.id AS id, p.script AS script
201                 FROM yatta.procesos AS p
202                 WHERE p.server = '.$id.' AND status = 0 
203                 ORDER BY p.prioridad, p.id');
204         // Si hay error lo devuelve.
205         if (DB::isError($res)) {
206             return $res;
207         }
208         return $res->fetchRow(DB_FETCHMODE_ASSOC);
209     }
210
211     /**
212      * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion.
213      *
214      * @param DB $db Conexion a la base de datos.
215      * @param int $id Identificador del proceso.
216      *
217      * @return mixed
218      * @access public
219      */
220     function abortar($db, $id) {
221         $res = $db->query('SELECT count(*) AS cuenta 
222                 FROM yatta.procesos
223                 WHERE id = '.$id.' AND status = 5');
224         // Si hay error lo devuelve.
225         if (DB::isError($res)) {
226             return $res;
227         }
228         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
229         return  $res['cuenta'];
230     }
231
232     /**
233      * Envia el email al usuario informandole la finalizacion de uno de sus
234      * procesos.
235      *
236      * @param DB $db Conexion a la base de datos.
237      * @param int $id_proceso Identificador del proceso.
238      * @param int $status Identificador del estado de finalizacion.
239      * @param string $nota Nota de error o similar.
240      * @param string $archivo Nombre del archivo temporal que esta en el fs.
241      *
242      * @return void
243      * @access private
244      */
245     function _emailUsuario($db, $id_proceso, $status, $nota = null, $archivo = null) {
246         $res = $db->query(
247                 "SELECT p.descripcion AS descripcion, p.owner AS owner, ".
248                 "p.destinos AS destinos, p.resultado AS resultado, ".
249                 "p.estado AS estado, p.nota AS nota ".
250                 "FROM yatta.procesos AS p".
251                 "WHERE p.id = ". $id_proceso);
252         if (DB::isError($res)) {
253             return $res;
254         }
255         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
256
257 //@FIXME El email se lo envio al owner y a los destinos, o al owner solamente?
258         
259         $dest = split (',', @$res['destinos']);
260         $to = $owner.'.gov.ar';
261         foreach ($dest as $d) {
262             $to = $to . ", $d.gov.ar";
263         }
264         $headers = "From: Intranet - YATTA <intranet2@mecon.gov.ar>\r\n";
265         $subject = "INTRANET - YATTA - Proceso Finalizado";
266
267         $body = "El proceso {$res['descripcion']} ha finalizado ";
268
269         switch ($status) {
270             case 2:
271                 $body .= "con éxito.\n";
272                 break;
273             case 3:
274                 $body .= "con errores.\n";
275                 if ($nota) {
276                     $body .= "Motivo:\n$nota\n";
277                 }
278                 break;
279             case 4:
280                 $body .= "porque se abortó su ejecución.\n";
281                 if ($nota) {
282                     $body .= "Motivo:\n$nota\n";
283                 }
284                 break;
285         }
286
287         if ($archivo) {
288             $body .= "Usted puede obtener el archivo resultado del proceso\n".
289                 "en la seccion Archivos del sistema YATTA.\n".
290                 "Recuerde que este archivo puede ser borrado sin previo aviso\n".
291                 "por tres motivos:\n".
292                 "\t1- El archivo supera la antigüedad máxima establecida.\n".
293                 "\t2- Se supero la capacidad máxima de información permitida\n".
294                 "\t   por usuario.\n".
295                 "\t3- Decisión administrativa por mantenimiento de los servidores.\n";
296         }
297         
298             
299         
300         $body .="\n\n\n".
301             "************************************************************\n".
302             "Este es un mensaje generado automaticamente por MECON_YATTA.\n".
303             "Por favor no responder a esta direccion de e-mail.\n".
304             "************************************************************\n";
305         
306         mail($to, $subject, $body, $headers);
307     }
308
309     /**
310      * Verifica si un usuario tiene alguna informacion en la base de yatta para
311      * mostrarle el icono en la lista de sistemas de la intranet.
312      *
313      * @param DB $db Conexion a la base de datos.
314      * @param string $login Usuario que se esta verificando
315      *
316      * @return bool
317      * @access public
318      * @static
319      */
320     function visible($DB, $login) {
321         $res = $db->query('SELECT count (p.id) AS id FROM yatta.procesos AS p'.
322             ' WHERE (p.owner LIKE \'%'. $login .'%\') OR'.
323             ' (p.destinos LIKE \'%'. $login .'%\')');
324                 
325         if (DB::isError($res)) {
326             return $res;
327         }
328         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
329
330         return $res['id'];
331     }
332
333     /**
334      * Busca los usuarios que tienen al menos una entrada en el mysql como
335      * owners.
336      *
337      * @param DB $db Conexion a la base de datos.
338      *
339      * @return mixed
340      * @access public
341      */
342     function obtenerListaOwners($db) {
343         return $db->query('SELECT DISTINCT p.owner AS owner
344                 FROM yatta.procesos As p');
345     }
346
347     /**
348      * Obtiene las cuotas especiales de los usuarios.
349      *
350      * @param DB $db Conexion a la base de datos.
351      *
352      * @return mixed
353      * @access public
354      */
355     function obtenerListaCuotas($db) {
356         return $db->query('SELECT login, cuota
357                 FROM yatta.cuotas');
358     }
359 }
360 ?>