source: sipes/0.3-modules/proyectos_operativos_seguimiento/accion_especifica_de_proyecto_seguimiento.module~ @ beba07f

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

se realizaron las correciones relacionadas al contador de fechas

  • Propiedad mode establecida a 100755
File size: 18.6 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 * 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
164 */
165function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access($node, $mes=0) {
166  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));
167} // function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access
168
169/**
170 * acceso a workflow
171 */
172function _accion_especifica_de_proyecto_seguimiento_mes_mover_estado_access($node, $mes=0, $estadonuevo=0) {
173  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));
174} // function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access
175
176//**************************************************************************************************************************************************
177/*
178 * Implementation of hook_ente_procesos_alter()
179 */
180function accion_especifica_de_proyecto_seguimiento_ente_procesos_alter(&$procesos, $type) {
181  if ($type != 'status') {
182    $procesos['proyecto_y_accionesespecificas_seguimiento'] = array(
183      'title' => t('Seguimiento Proyectos Operativos y sus Acciones Especificas'),
184      'description' => t('Permite el seguimiento de los Proyectos Operativos y de sus Acciones Especificas'),
185      'message' => 'Se podrá registrar y/o modificar el seguimiento del Proyecto Opeativo y de sus Acciones Especificas desde %fecha hasta la fecha %fecha1',
186      '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)',
187      'weight' => 3,
188      'proceso' => 'proyectos_operativos',
189    );
190  }
191}
192
193/**
194 * Implementation of messeg_load().
195 * Menu loader callback. Load a mes.
196 */
197function messeg_load($mes = 0) {
198  settype($mes, "integer");
199  if ($mes >= 0 && $mes < 12) {
200    return $mes;
201  }
202  return FALSE;
203}
204
205/**
206 * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
207 */
208function _es_tipo_accionespecifica($node) {
209  return ($node->type == 'accion_especifica');
210} // function _accion_especifica_de_proyecto_seguimiento_access
211
212/**
213 * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
214 */
215function _mes_habilitado_para_seguimiento($mes=0) {
216  $mes_seguimiento = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0);
217  $mes_a = date('n');
218  $mes_inical = $mes_seguimiento;
219  $mes_final = variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 0) + 1;
220  if ($mes_inical<=$mes && $mes< ($mes_final + $mes_inical) && $mes>=0) {
221    return TRUE;
222  }
223  return FALSE;
224} // function _accion_especifica_de_proyecto_seguimiento_access
225
226/**
227 * 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
228 */
229function _mes_dentro_de_duracion_ae_proyecto($node, $mes=0) {
230 
231  $mesI = $mes+1;//colocando parametro entre 1 y 12
232  $resp = FALSE;
233  $mes_seguimiento = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0);
234  $mes_inical = $mes_seguimiento;
235  $mes_final = variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 0);
236
237
238  //Accion Especifica de Proyecto
239  if ($node->type == 'accion_especifica') {
240    $fechayhora_inicio = $node->field_accion_esp_fechai[0]['value'];
241    list($fecha_inicio, $hora_inicio) = split('[ ]', $fechayhora_inicio);
242    list($anno_inicio, $mes_inicio, $dia_inicio) = split('[/.-]', $fecha_inicio);
243    $m_inicio = intval($mes_inicio);
244   
245    $fechayhora_fin = $node->field_accion_esp_fechaf[0]['value'];
246    list($fecha_fin, $hora_fin) = split('[ ]', $fechayhora_fin);
247    list($anno_fin, $mes_fin, $dia_fin) = split('[/.-]', $fecha_fin);
248    $m_fin = intval($mes_fin);
249    if ($mes <= ($mes_final + $mes_inical) && ($m_inicio<=$mesI)&&($m_fin>=$mesI)) {
250      return TRUE;
251    }
252    else {
253      $resp = FALSE;
254    }
255  }
256 
257  return $resp;
258}
259
260/**
261 * verificar si por la fecha actual, esta activo el perio de ingreso de seguimiento
262 */
263function _periodo_de_seguimiento_proyecto_y_aes_esta_activo($proyecto) {
264  global $user;
265  $ente_planificador = ente_planificador_leer_ente_planificadores($proyecto->field_proyecto_ente[0]['nid']);
266  if (!$ente_planificador || !$ente_planificador->nid) {
267    return FALSE;
268  }
269  $ente = usuario_tiene_ente($user->uid);
270  if ($ente_planificador->nid != $ente->nid && !user_access('admin planificador')) {
271    return FALSE;
272  }
273
274  $current_time = time();
275  $tipo_plan = 'proyecto_y_accionesespecificas_seguimiento';
276  $mi_fecha = ente_planificador_user_acceso_proceso($tipo_plan, $ente_planificador);
277  $fecha = FALSE;
278
279  if ($mi_fecha[1]  + 86399 > $current_time && $mi_fecha[0] < $current_time) {
280    $fecha = TRUE;
281  }
282  return $fecha;
283}
284
285function _es_usuario_autenticado(){
286  global $user;
287  if($user->uid > 0){
288    return TRUE;
289  }
290  return FALSE;
291}
292
293function _permiso_para_realizar_transicion_estado($node, $mes = 0, $estadonuevo=0){
294 
295  $consultaseguimientoactual = _seguimiento_mesactual_partida_ae_deproyecto_load($node, $mes);
296  $estado = (isset($consultaseguimientoactual['segmes']['estado'])) ? $consultaseguimientoactual['segmes']['estado'] : -1;
297 
298  if($estado == $estadonuevo){
299    return FALSE;
300  }
301 
302  $states = _obtener_estados_seguimiento_mes();
303 
304  $estado_aprobado = variable_get('acciones_centralizadas_state_aprobado', NULL);
305  $estado_naprobado = variable_get('acciones_centralizadas_state_naprobado', NULL);
306
307  global $user;
308  $ente = usuario_tiene_ente($user->uid);
309   
310  $roles = array_keys($user->roles);
311  if ($user->uid == 1) {
312    // Superuser is special.
313    $roles_transition = 'ALL';
314  }else {
315    $roles_transition = $roles;
316    if ($user->uid == $consultaseguimientoactual['segmes']['uid']&& $consultaseguimientoactual['segmes']['uid'] > 0) {//verificar si es el autor del seguimiento
317      $roles_transition += array('author' => 'author');
318    }
319  }
320 
321  $transitions = array();
322  if ($states['wid']) {
323    $transitions = workflow_allowable_transitions($estado, 'to', $roles_transition);
324  }
325
326  if (isset($transitions[$estadonuevo])) {
327    return TRUE;
328  }
329  return FALSE;
330}
331
332/*
333 * verificar nivel de usuario para modificar
334 */
335
336function _estado_seg_en_nivel_de_usuario($node, $mes=0){
337 
338  //calcular el estado
339  $transiciones_dispo = _obtener_transiciones_disponibles($node, $mes);
340  $nivel_usuario = _obtener_nivel_usuario_segun_estado($transiciones_dispo['nombre_estado_actual']);
341
342  $rol_ente_usuario = _obtener_rol_y_ente_de_usuario();
343 
344  if(($transiciones_dispo['estado_actual'] < 0)&&($rol_ente_usuario['rol']=='enlace'||$rol_ente_usuario['rol']=='administrador')){
345    return true; 
346  }
347  if(($nivel_usuario == $rol_ente_usuario['rol'])||$rol_ente_usuario['rol']=='administrador'){//nivel de usuario == rol actor
348    return TRUE;
349  }
350  return FALSE;
351}
352
353/*
354 * verificar que sea el mismo ente, tanto para el proyecto como para el usuario (si es enlace o supervisor)
355 */
356
357function _es_elmismo_ente_proyecto_y_usuario($node){
358 
359  $rol_ente_usuario = _obtener_rol_y_ente_de_usuario();
360
361  if($rol_ente_usuario['rol']=='enlace'||$rol_ente_usuario['rol']=='supervisor'){//enlace o supervisor
362    $nodo_proyecto = node_load($node->field_accion_esp_proyecto[0]['nid']);
363    if($rol_ente_usuario['id_ente'] == $nodo_proyecto->field_proyecto_ente[0]['nid']){//deben ser del mismo ente que el proyecto
364      return TRUE;
365    }else{
366      return FALSE;
367    }
368  }
369  return TRUE;
370}
371
372/*
373 * verificar que sea el mismo ente, tanto para el proyecto como para el usuario (si es enlace o supervisor)
374 */
375
376function _seg_esta_aprobado($node, $mes=0){
377 
378  $transiciones_dispo = _obtener_transiciones_disponibles($node, $mes);
379  $estado = $transiciones_dispo['estado_actual'];
380 
381  $estado_aprobado = variable_get('acciones_centralizadas_state_aprobado', NULL);
382
383  if ($estado == $estado_aprobado) {
384    return TRUE;
385  }
386  return FALSE;
387}
388
389/*
390 * verificar anno habilitado
391 */
392function _anno_habilitado_para_seg($node){
393 
394  $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0);
395  $idnodo_proyecto = 0;
396 
397  if ($node->type == 'proyectos_operativos'){
398    $idnodo_proyecto = $node->nid;
399  }elseif($node->type == 'accion_especifica'){
400    $nodo_proyecto = node_load($node->field_accion_esp_proyecto[0]['nid']);
401    $idnodo_proyecto = $nodo_proyecto->nid;
402  }
403 
404  if($idnodo_proyecto){
405    $query = "SELECT * from {proyectos_operativos} where nid=%d";
406    $queryResult =  db_query ( $query, $idnodo_proyecto);
407    $datosproyecto = db_fetch_object ( $queryResult ) ;
408   
409    if ($datosproyecto->year == $anno) {
410      return TRUE;
411    }
412  }
413   
414  return FALSE;
415}
416
417//**************************************************************************************************************************************************
418//pagina de formulario
419
420module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto_partidaspormes_modificar.forms');
421
422
423//**************************************************************************************************************************************************
424
425//funciones auxiliares
426
427module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/00_generales/funciones_auxiliares.pages');
428
429//**************************************************************************************************************************************************
430//funciones para consultas a base de datos
431//carga de datos comprometido, causado, pagado, asignado
432module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/ae_proyecto/funciones_consulta_bd.pages');
433
434//**************************************************************************************************************************************************
435//workflow
436// codificada lunes 18 03 13, por Diego Uzcátegui
437
438/*
439 * Implementation of seg_proy_aes_wk_load()
440 */
441function seg_proy_aes_wk_load($state = 0) {
442  $states = _obtener_estados_seguimiento_mes();
443  //echo print_r($states).'<br>';
444  if (isset($states['states'][$state])) {
445    return $state;
446  }
447  return FALSE;
448}
449
450//cargar funciones para flujo de trabajo
451module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/00_generales/funciones_flujo_trabajo.pages');
452
453//cargar funciones de consulta de valores de reformulaciones
454module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/funciones_consulta_valores_reformulaciones.pages');
455
456/**
457 * Implementation of hook_node_load
458 */
459function accion_especifica_de_proyecto_seguimiento_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
460  switch ($op) {
461    case 'load':
462      if ($node->type == 'accion_especifica') {
463        $additions = db_fetch_object(db_query('SELECT acumulativa  FROM {seguimiento_aeproyecto} WHERE nid = %d', $node->nid));
464        $node->es_acumulativo = $additions->acumulativa;
465      }
466    break;
467  }
468}
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.