source: sipes/0.3-modules/proyectos_operativos_seguimiento/accion_especifica_de_proyecto_seguimiento.module @ 438bcea

stable
Last change on this file since 438bcea was c6f58d0, checked in by Sipes Apn <root@…>, 7 años ago

se agregaron las correciones del modulo para cumplir con su correcto funcionamiento

  • Propiedad mode establecida a 100755
File size: 18.9 KB
Línea 
1<?php
2  /**
3  * Sistema Automatizado para la Planificación Estratégico-Situacional en la Administración Pública Venezolana
4  * @file accion_especifica_de_proyecto_seguimiento.module
5  * Drupal part Module to code proyectos operativos module
6  * Copyright 2012 Sistema Automatizado para la Planificación Estratégico-Situacional en la Administración Pública Venezolana (CENDITEL)
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  * @author CENDITEL Merida - Ing. Diego Uzcategui
23  * @date 2013-02-07 // (anno-mes-dia)
24  * @version 0.1
25  *
26  */
27
28/*
29 * Implementation of hook_help()
30 */
31function accion_especifica_de_proyecto_seguimiento_help($path, $arg) {
32    switch ($path) {
33        case "admin/help/aeproyectoseguimiento":
34        $output = '<p>'.  t("Este modulo se encarga de la gestión del seguimiento de las acciones específicas de un proyecto operativo") .'</p>';
35            break;
36    }
37    return $output;
38} // function accion_especifica_de_proyecto_seguimiento_help
39
40/*
41 * Implementation of hook_menu()
42 */
43function accion_especifica_de_proyecto_seguimiento_menu() {
44  $items = array();
45  $items['proyectosop/%proyectosop/seguimiento/ae'] = array(
46    'title' => 'AE',
47    'type' => MENU_LOCAL_TASK,
48    'access callback' => '_fasedeseguimiento_proyecto_y_ae_access',
49    'access arguments' => array(1),
50    'file' => 'includes/fase_de_seguimiento_proyecto_y_aes.pages.inc',
51    'page callback' => 'fase_de_seguimiento_proyecto_y_aes_page',
52    'page arguments' => array(1),
53    'weight' => 3,
54  );
55
56  $items['proyectosop/%proyectosop/seguimiento/ae/view'] = array(
57    'title' => 'Seguimiento',
58    'type' => MENU_DEFAULT_LOCAL_TASK,
59    'weight' => -10
60  );
61 
62  //----------------------------------------------------------------------------Seguimiento de acciones especificas de proyectos operativos
63
64  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/view'] = array(
65    'title' => 'AE',
66    'type' => MENU_LOCAL_TASK,
67    'access callback' => '_proyectooperativo_esta_aprobado',
68    'access arguments' => array(1),
69    'file' => 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto.pages.inc',
70    'page callback' => 'seguimiento_accion_especifica_deproyecto_page',
71    'page arguments' => array(1, 4),
72    'weight' => 2,
73  );
74//'proyectosop/3076/seguimiento/ae/3213/view
75//'proyectosop/3076/seguimiento/ae/3213/partidas/1/view'
76  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/view'] = array(
77    'title' => 'Seguimiento AE',
78    'type' => MENU_LOCAL_TASK,
79    'access callback' => '_accion_especifica_de_proyecto_seguimiento_consultar_mes_access',
80    'access arguments' => array(4, 5),
81    'file' => 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto_partidaspormes.pages.inc',
82    'page callback' => 'seguimiento_accion_especifica_deproyecto_partidaspormes_page',
83    'page arguments' => array(1, 4, 5),
84    'weight' => 2,
85  );
86/*
87  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/partidas/%messeg_load/view'] = array(
88    'title' => 'Seguimiento AE',
89    'type' => MENU_DEFAULT_LOCAL_TASK,
90    'weight' => -10
91  );
92  */
93  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/edit'] = array(
94    'title' => 'Seguimiento AE editar',
95    'type' => MENU_LOCAL_TASK,
96    'access callback' => '_ae_seguimiento_modificar_mes_access',
97    'access arguments' => array(1, 4, 5),
98    'file' => 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto_partidaspormes_modificar.forms.inc',
99    'page callback' => 'drupal_get_form',
100    'page arguments' => array('seguimiento_accion_especifica_deproyecto_partidaspormes_modificar_form', 1, 4, 5),
101    'weight' => 2,
102  );
103  //----------------------------------------------------------------------------Administracion Seguimiento de acciones especificas de proyectos operativos
104  $items['admin/settings/ente_planificador/proyectos_operativos/seguimiento'] = array(
105    'title' => t('Seguimiento Proyectos'),
106    'page callback' => 'drupal_get_form',
107    'page arguments' => array('accion_especifica_de_proyecto_seguimiento_admin_settings'),
108    'access arguments' => array('admin planificador'),
109    'weight' => -6,
110    'type' => MENU_LOCAL_TASK,
111    'file' => 'includes/accion_especifica_de_proyecto_seguimiento.admin.inc',
112  );
113  //----------------------------------------------------------------------------workflow
114
115  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/workflow/%seg_proy_aes_wk'] = array(
116    'title' => 'Seguimiento AE cambiar flujo',
117    'type' => MENU_LOCAL_TASK,
118    'access callback' => '_accion_especifica_de_proyecto_seguimiento_mes_mover_estado_access',
119    'access arguments' => array(4, 5, 7),
120    'file' => 'includes/ae_proyecto/cambiodeestado_seg_ae_proyecto_paginaconfirmacion.forms.inc',
121    'page callback' => 'drupal_get_form',
122    'page arguments' => array('cambiodeestado_seg_ae_proyecto_paginaconfirmacion_form', 1, 4, 5, 7),
123    'weight' => 2,
124  );
125 
126  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/workflow/historial'] = array(
127    'title' => 'Seguimiento AE Historial Seguimiento',
128    'type' => MENU_LOCAL_TASK,
129    'access callback' => '_accion_especifica_de_proyecto_seguimiento_access',
130    'access arguments' => array(4),
131    'file' => 'includes/ae_proyecto/historial_cambiodeestado_seg_aeproyecto.pages.inc',
132    'page callback' => 'historial_cambiodeestado_seg_aeproyecto_page',
133    'page arguments' => array(4, 5),
134    'weight' => 2,
135  );
136 
137    return $items;
138}
139
140//**************************************************************************************************************************************************
141//permisos de acceso a las paginas
142
143/**
144 * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
145 */
146function _accion_especifica_de_proyecto_seguimiento_access($node) {
147  return (_es_tipo_accionespecifica($node));
148} // function _accion_especifica_de_proyecto_seguimiento_access
149
150/**
151 * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica', y que el mes ingresado este dentro del periodo de duracion de la ae
152 */
153function _accion_especifica_de_proyecto_seguimiento_consultar_mes_access($node, $mes=0) {
154  return (_mes_dentro_de_duracion_ae_proyecto($node, $mes));
155} // function _accion_especifica_de_proyecto_seguimiento_consultar_mes_access
156
157
158function _ae_seguimiento_modificar_mes_access($proyecto, $ae, $mes){
159  return _mes_dentro_de_duracion_ae_proyecto($ae, $mes) && _proyecto_operativo_seguimiento_modificar_mes_access($proyecto, $mes);
160}
161
162/**
163 * Mes habilitado para su modificación o agregar el seguimiento.
164 *
165function _accion_especifica_de_proyecto_seguimiento_modificar_ae_mes_access($proyecto, $accion, $mes=0) {
166  if (_mes_dentro_de_duracion_ae_proyecto($accion, $mes) && _proyecto_operativo_seguimiento_modificar_mes_access($proyecto, $mes)) {
167    return true;
168  }
169  return false;
170}
171*/
172
173/**
174 * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica', que el mes este dentro dentro del periodo de duracion, mes habilitado para seg, y periodo de seguimiento activo
175 */
176function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access($node, $mes=0) {
177  return ((_es_tipo_accionespecifica($node))&&(_mes_dentro_de_duracion_ae_proyecto($node, $mes))&&(_mes_habilitado_para_seguimiento($mes))&&(_anno_habilitado_para_seg($node))&&(_periodo_de_seguimiento_proyecto_y_aes_esta_activo($node))&&(_es_usuario_autenticado())&&(!_seg_esta_aprobado($node, $mes))&&(_estado_seg_en_nivel_de_usuario($node, $mes))&&(_es_elmismo_ente_proyecto_y_usuario($node)) &&_proyectooperativo_esta_aprobado($node));
178} // function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access
179
180/**
181 * acceso a workflow
182 */
183function _accion_especifica_de_proyecto_seguimiento_mes_mover_estado_access($node, $mes=0, $estadonuevo=0) {
184  return ((_es_tipo_accionespecifica($node))&&(_mes_dentro_de_duracion_ae_proyecto($node, $mes))&&(_mes_habilitado_para_seguimiento($mes))&&(_anno_habilitado_para_seg($node))&&(_periodo_de_seguimiento_proyecto_y_aes_esta_activo($node))&&(_es_usuario_autenticado())&&_permiso_para_realizar_transicion_estado($node, $mes, $estadonuevo) &&(_es_elmismo_ente_proyecto_y_usuario($node)) &&_proyectooperativo_esta_aprobado($node));
185} // function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access
186
187//**************************************************************************************************************************************************
188/*
189 * Implementation of hook_ente_procesos_alter()
190 */
191function accion_especifica_de_proyecto_seguimiento_ente_procesos_alter(&$procesos, $type) {
192  if ($type != 'status') {
193    $procesos['proyecto_y_accionesespecificas_seguimiento'] = array(
194      'title' => t('Seguimiento Proyectos Operativos y sus Acciones Especificas'),
195      'description' => t('Permite el seguimiento de los Proyectos Operativos y de sus Acciones Especificas'),
196      'message' => 'Se podrá registrar y/o modificar el seguimiento del Proyecto Opeativo y de sus Acciones Especificas desde %fecha hasta la fecha %fecha1',
197      'message_expire' => 'Registrar y/o modificar el seguimiento del Proyecto Operativo y sus Acciones Especificas no se encuentra disponible, se podra realizar desde %fecha hasta la fecha %fecha1)',
198      'weight' => 3,
199      'proceso' => 'proyectos_operativos',
200    );
201  }
202}
203
204/**
205 * Implementation of messeg_load().
206 * Menu loader callback. Load a mes.
207 */
208function messeg_load($mes = 0) {
209  settype($mes, "integer");
210  if ($mes >= 0 && $mes < 12) {
211    return $mes;
212  }
213  return FALSE;
214}
215
216/**
217 * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
218 */
219function _es_tipo_accionespecifica($node) {
220  return ($node->type == 'accion_especifica');
221} // function _accion_especifica_de_proyecto_seguimiento_access
222
223/**
224 * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
225 */
226function _mes_habilitado_para_seguimiento($mes=0) {
227  if (!$mes) {
228    $mes  = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0) ;
229  }
230  if (in_array($mes, variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 1))) {
231    return TRUE;
232  }
233  return FALSE;
234} // function _accion_especifica_de_proyecto_seguimiento_access
235
236/**
237 * verificar si un mes dado esta dentro del periodo de duracion de una accion especifica o de un proyecto operativo, dependiendo del tipo de nodo
238 */
239function _mes_dentro_de_duracion_ae_proyecto($node, $mes=0) {
240 
241  $mesI = $mes+1;//colocando parametro entre 1 y 12
242  $resp = FALSE;
243  $mes_seguimiento = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0);
244  $mes_inical = $mes_seguimiento;
245
246  $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0);
247  $fecha = explode('-', $nodo_proyecto->field_proyecto_fecha_i[0]['value']);
248  $mes_inicio = (int) $fecha[1];
249  $year_inicio = (int) $fecha[0];
250
251  //Accion Especifica de Proyecto
252  if ($node->type == 'accion_especifica') {
253    $fechayhora_inicio = $node->field_accion_esp_fechai[0]['value'];
254    $fechaA = explode('-', $node->field_accion_esp_fechai[0]['value']);
255    $year_inicio = (int) $fechaA[0];
256
257    list($fecha_inicio, $hora_inicio) = split('[ ]', $fechayhora_inicio);
258    list($anno_inicio, $mes_inicio, $dia_inicio) = split('[/.-]', $fecha_inicio);
259    $m_inicio = intval($mes_inicio);
260   
261    $fechayhora_fin = $node->field_accion_esp_fechaf[0]['value'];
262    list($fecha_fin, $hora_fin) = split('[ ]', $fechayhora_fin);
263    list($anno_fin, $mes_fin, $dia_fin) = split('[/.-]', $fecha_fin);
264    $m_fin = intval($mes_fin);
265
266    if (($year_inicio <= $anno) && $anno_fin >= $anno) {
267      return TRUE;
268    }
269    else {
270      $resp = FALSE;
271    }
272  }
273 
274  return $resp;
275}
276
277/**
278 * verificar si por la fecha actual, esta activo el perio de ingreso de seguimiento
279 */
280function _periodo_de_seguimiento_proyecto_y_aes_esta_activo($proyecto) {
281  global $user;
282  $ente_planificador = ente_planificador_leer_ente_planificadores($proyecto->field_proyecto_ente[0]['nid']);
283  if (!$ente_planificador || !$ente_planificador->nid) {
284    return FALSE;
285  }
286  $ente = usuario_tiene_ente($user->uid);
287  if ($ente_planificador->nid != $ente->nid && !user_access('admin planificador')) {
288    return FALSE;
289  }
290
291  $current_time = time();
292  $tipo_plan = 'proyecto_y_accionesespecificas_seguimiento';
293  $mi_fecha = ente_planificador_user_acceso_proceso($tipo_plan, $ente_planificador);
294  $fecha = FALSE;
295
296  if ($mi_fecha[1]  + 86399 > $current_time && $mi_fecha[0] < $current_time) {
297    $fecha = TRUE;
298  }
299  return $fecha;
300}
301
302function _es_usuario_autenticado(){
303  global $user;
304  if($user->uid > 0){
305    return TRUE;
306  }
307  return FALSE;
308}
309
310function _permiso_para_realizar_transicion_estado($node, $mes = 0, $estadonuevo=0){
311 
312  $consultaseguimientoactual = _seguimiento_mesactual_partida_ae_deproyecto_load($node, $mes);
313  $estado = (isset($consultaseguimientoactual['segmes']['estado'])) ? $consultaseguimientoactual['segmes']['estado'] : -1;
314 
315  if($estado == $estadonuevo){
316    return FALSE;
317  }
318 
319  $states = _obtener_estados_seguimiento_mes();
320 
321  $estado_aprobado = variable_get('acciones_centralizadas_state_aprobado', NULL);
322  $estado_naprobado = variable_get('acciones_centralizadas_state_naprobado', NULL);
323
324  global $user;
325  $ente = usuario_tiene_ente($user->uid);
326   
327  $roles = array_keys($user->roles);
328  if ($user->uid == 1) {
329    // Superuser is special.
330    $roles_transition = 'ALL';
331  }else {
332    $roles_transition = $roles;
333    if ($user->uid == $consultaseguimientoactual['segmes']['uid']&& $consultaseguimientoactual['segmes']['uid'] > 0) {//verificar si es el autor del seguimiento
334      $roles_transition += array('author' => 'author');
335    }
336  }
337 
338  $transitions = array();
339  if ($states['wid']) {
340    $transitions = workflow_allowable_transitions($estado, 'to', $roles_transition);
341  }
342
343  if (isset($transitions[$estadonuevo])) {
344    return TRUE;
345  }
346  return FALSE;
347}
348
349/*
350 * verificar nivel de usuario para modificar
351 */
352
353function _estado_seg_en_nivel_de_usuario($node, $mes=0){
354 
355  //calcular el estado
356  $transiciones_dispo = _obtener_transiciones_disponibles($node, $mes);
357  $nivel_usuario = _obtener_nivel_usuario_segun_estado($transiciones_dispo['nombre_estado_actual']);
358
359  $rol_ente_usuario = _obtener_rol_y_ente_de_usuario();
360 
361  if(($transiciones_dispo['estado_actual'] < 0)&&($rol_ente_usuario['rol']=='enlace'||$rol_ente_usuario['rol']=='administrador')){
362    return true; 
363  }
364  if(($nivel_usuario == $rol_ente_usuario['rol'])||$rol_ente_usuario['rol']=='administrador'){//nivel de usuario == rol actor
365    return TRUE;
366  }
367  return FALSE;
368}
369
370/*
371 * verificar que sea el mismo ente, tanto para el proyecto como para el usuario (si es enlace o supervisor)
372 */
373
374function _es_elmismo_ente_proyecto_y_usuario($node){
375 
376  $rol_ente_usuario = _obtener_rol_y_ente_de_usuario();
377
378  if($rol_ente_usuario['rol']=='enlace'||$rol_ente_usuario['rol']=='supervisor'){//enlace o supervisor
379    $nodo_proyecto = node_load($node->field_accion_esp_proyecto[0]['nid']);
380    if($rol_ente_usuario['id_ente'] == $nodo_proyecto->field_proyecto_ente[0]['nid']){//deben ser del mismo ente que el proyecto
381      return TRUE;
382    }else{
383      return FALSE;
384    }
385  }
386  return TRUE;
387}
388
389/*
390 * verificar que sea el mismo ente, tanto para el proyecto como para el usuario (si es enlace o supervisor)
391 */
392
393function _seg_esta_aprobado($node, $mes=0){
394 
395  $transiciones_dispo = _obtener_transiciones_disponibles($node, $mes);
396  $estado = $transiciones_dispo['estado_actual'];
397 
398  $estado_aprobado = variable_get('acciones_centralizadas_state_aprobado', NULL);
399
400  if ($estado == $estado_aprobado) {
401    return TRUE;
402  }
403  return FALSE;
404}
405
406/*
407 * verificar anno habilitado
408 */
409function _anno_habilitado_para_seg($node){
410 
411  $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0);
412  $idnodo_proyecto = 0;
413 
414  if ($node->type == 'proyectos_operativos'){
415    $idnodo_proyecto = $node->nid;
416  }elseif($node->type == 'accion_especifica'){
417    $nodo_proyecto = node_load($node->field_accion_esp_proyecto[0]['nid']);
418    $idnodo_proyecto = $nodo_proyecto->nid;
419  }
420 
421  if($idnodo_proyecto){
422    $query = "SELECT * from {proyectos_operativos} where nid=%d";
423    $queryResult =  db_query ( $query, $idnodo_proyecto);
424    $datosproyecto = db_fetch_object ( $queryResult ) ;
425   
426    if ($datosproyecto->year == $anno) {
427      return TRUE;
428    }
429  }
430   
431  return FALSE;
432}
433
434//**************************************************************************************************************************************************
435//pagina de formulario
436
437module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto_partidaspormes_modificar.forms');
438
439
440//**************************************************************************************************************************************************
441
442//funciones auxiliares
443
444module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/00_generales/funciones_auxiliares.pages');
445
446//**************************************************************************************************************************************************
447//funciones para consultas a base de datos
448//carga de datos comprometido, causado, pagado, asignado
449module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/ae_proyecto/funciones_consulta_bd.pages');
450
451/*
452 * Implementation of seg_proy_aes_wk_load()
453 */
454function seg_proy_aes_wk_load($state = 0) {
455  $states = _obtener_estados_seguimiento_mes();
456  //echo print_r($states).'<br>';
457  if (isset($states['states'][$state])) {
458    return $state;
459  }
460  return FALSE;
461}
462
463//cargar funciones para flujo de trabajo
464module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/00_generales/funciones_flujo_trabajo.pages');
465
466//cargar funciones de consulta de valores de reformulaciones
467module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/funciones_consulta_valores_reformulaciones.pages');
468
469/**
470 * Implementation of hook_node_load
471 */
472function accion_especifica_de_proyecto_seguimiento_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
473  switch ($op) {
474    case 'load':
475      if ($node->type == 'accion_especifica') {
476        $additions = db_fetch_object(db_query('SELECT acumulativa  FROM {seguimiento_aeproyecto} WHERE nid = %d', $node->nid));
477        $node->es_acumulativo = $additions->acumulativa;
478      }
479    break;
480  }
481}
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.