Index: 0.3-modules/proyectos_operativos_seguimiento/accion_especifica_de_proyecto_seguimiento.module~
===================================================================
--- 0.3-modules/proyectos_operativos_seguimiento/accion_especifica_de_proyecto_seguimiento.module~	(revision 669d26ec4ea2faf2077deb28897b323fa402d1e9)
+++ 0.3-modules/proyectos_operativos_seguimiento/accion_especifica_de_proyecto_seguimiento.module~	(revision 669d26ec4ea2faf2077deb28897b323fa402d1e9)
@@ -0,0 +1,468 @@
+<?php
+  /**
+  * Sistema Automatizado para la PlanificaciÃ³n EstratÃÂ©gico-Situacional en la AdministraciÃ³n PÃÂºblica Venezolana
+  * @file accion_especifica_de_proyecto_seguimiento.module
+  * Drupal part Module to code proyectos operativos module
+  * Copyright 2012 Sistema Automatizado para la PlanificaciÃ³n EstratÃÂ©gico-Situacional en la AdministraciÃ³n PÃÂºblica Venezolana (CENDITEL)
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+  * the Free Software Foundation; either version 2 of the License, or
+  * (at your option) any later version.
+  * 
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  * 
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+  *
+  * @author CENDITEL Merida - Ing. Diego Uzcategui
+  * @date 2013-02-07 // (anno-mes-dia)
+  * @version 0.1
+  *
+  */
+
+/*
+ * Implementation of hook_help()
+ */
+function accion_especifica_de_proyecto_seguimiento_help($path, $arg) {
+    switch ($path) {
+        case "admin/help/aeproyectoseguimiento":
+        $output = '<p>'.  t("Este modulo se encarga de la gestiÃ³n del seguimiento de las acciones especÃ­ficas de un proyecto operativo") .'</p>';
+            break;
+    }
+    return $output;
+} // function accion_especifica_de_proyecto_seguimiento_help
+
+/*
+ * Implementation of hook_menu()
+ */
+function accion_especifica_de_proyecto_seguimiento_menu() {
+  $items = array();
+  $items['proyectosop/%proyectosop/seguimiento/ae'] = array(
+    'title' => 'AE',
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => '_fasedeseguimiento_proyecto_y_ae_access',
+    'access arguments' => array(1),
+    'file' => 'includes/fase_de_seguimiento_proyecto_y_aes.pages.inc',
+    'page callback' => 'fase_de_seguimiento_proyecto_y_aes_page',
+    'page arguments' => array(1),
+    'weight' => 3,
+  );
+
+  $items['proyectosop/%proyectosop/seguimiento/ae/view'] = array(
+    'title' => 'Seguimiento',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10
+  );
+  
+  //----------------------------------------------------------------------------Seguimiento de acciones especificas de proyectos operativos
+
+  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/view'] = array(
+    'title' => 'AE',
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => '_proyectooperativo_esta_aprobado',
+    'access arguments' => array(1),
+    'file' => 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto.pages.inc',
+    'page callback' => 'seguimiento_accion_especifica_deproyecto_page',
+    'page arguments' => array(1, 4),
+    'weight' => 2,
+  );
+//'proyectosop/3076/seguimiento/ae/3213/view
+//'proyectosop/3076/seguimiento/ae/3213/partidas/1/view'
+  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/view'] = array(
+    'title' => 'Seguimiento AE',
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => '_accion_especifica_de_proyecto_seguimiento_consultar_mes_access',
+    'access arguments' => array(4, 5),
+    'file' => 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto_partidaspormes.pages.inc',
+    'page callback' => 'seguimiento_accion_especifica_deproyecto_partidaspormes_page',
+    'page arguments' => array(1, 4, 5),
+    'weight' => 2,
+  );
+/*
+  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/partidas/%messeg_load/view'] = array(
+    'title' => 'Seguimiento AE',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10
+  );
+  */
+  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/edit'] = array(
+    'title' => 'Seguimiento AE editar',
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => '_ae_seguimiento_modificar_mes_access',
+    'access arguments' => array(1, 4, 5),
+    'file' => 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto_partidaspormes_modificar.forms.inc',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('seguimiento_accion_especifica_deproyecto_partidaspormes_modificar_form', 1, 4, 5),
+    'weight' => 2,
+  );
+  //----------------------------------------------------------------------------Administracion Seguimiento de acciones especificas de proyectos operativos
+  $items['admin/settings/ente_planificador/proyectos_operativos/seguimiento'] = array(
+    'title' => t('Seguimiento Proyectos'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('accion_especifica_de_proyecto_seguimiento_admin_settings'),
+    'access arguments' => array('admin planificador'),
+    'weight' => -6,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'includes/accion_especifica_de_proyecto_seguimiento.admin.inc',
+  );
+  //----------------------------------------------------------------------------workflow
+
+  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/workflow/%seg_proy_aes_wk'] = array(
+    'title' => 'Seguimiento AE cambiar flujo',
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => '_accion_especifica_de_proyecto_seguimiento_mes_mover_estado_access',
+    'access arguments' => array(4, 5, 7),
+    'file' => 'includes/ae_proyecto/cambiodeestado_seg_ae_proyecto_paginaconfirmacion.forms.inc',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('cambiodeestado_seg_ae_proyecto_paginaconfirmacion_form', 1, 4, 5, 7),
+    'weight' => 2,
+  );
+  
+  $items['proyectosop/%proyectosop/seguimiento/ae/%accion_especifical/%messeg/workflow/historial'] = array(
+    'title' => 'Seguimiento AE Historial Seguimiento',
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => '_accion_especifica_de_proyecto_seguimiento_access',
+    'access arguments' => array(4),
+    'file' => 'includes/ae_proyecto/historial_cambiodeestado_seg_aeproyecto.pages.inc',
+    'page callback' => 'historial_cambiodeestado_seg_aeproyecto_page',
+    'page arguments' => array(4, 5),
+    'weight' => 2,
+  );
+  
+    return $items;
+}
+
+//**************************************************************************************************************************************************
+//permisos de acceso a las paginas
+
+/**
+ * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
+ */
+function _accion_especifica_de_proyecto_seguimiento_access($node) {
+  return (_es_tipo_accionespecifica($node));
+} // function _accion_especifica_de_proyecto_seguimiento_access
+
+/**
+ * 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
+ */
+function _accion_especifica_de_proyecto_seguimiento_consultar_mes_access($node, $mes=0) {
+  return (_mes_dentro_de_duracion_ae_proyecto($node, $mes));
+} // function _accion_especifica_de_proyecto_seguimiento_consultar_mes_access
+
+
+function _ae_seguimiento_modificar_mes_access($proyecto, $ae, $mes){
+  return _mes_dentro_de_duracion_ae_proyecto($ae, $mes) && _proyecto_operativo_seguimiento_modificar_mes_access($proyecto, $mes);
+}
+
+/**
+ * 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
+ */
+function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access($node, $mes=0) {
+  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));
+} // function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access
+
+/**
+ * acceso a workflow
+ */
+function _accion_especifica_de_proyecto_seguimiento_mes_mover_estado_access($node, $mes=0, $estadonuevo=0) {
+  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));
+} // function _accion_especifica_de_proyecto_seguimiento_modificar_mes_access
+
+//**************************************************************************************************************************************************
+/*
+ * Implementation of hook_ente_procesos_alter()
+ */
+function accion_especifica_de_proyecto_seguimiento_ente_procesos_alter(&$procesos, $type) {
+  if ($type != 'status') {
+    $procesos['proyecto_y_accionesespecificas_seguimiento'] = array(
+      'title' => t('Seguimiento Proyectos Operativos y sus Acciones Especificas'),
+      'description' => t('Permite el seguimiento de los Proyectos Operativos y de sus Acciones Especificas'),
+      'message' => 'Se podrÃ¡ registrar y/o modificar el seguimiento del Proyecto Opeativo y de sus Acciones Especificas desde %fecha hasta la fecha %fecha1',
+      '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)',
+      'weight' => 3,
+      'proceso' => 'proyectos_operativos',
+    );
+  }
+}
+
+/**
+ * Implementation of messeg_load().
+ * Menu loader callback. Load a mes.
+ */
+function messeg_load($mes = 0) {
+  settype($mes, "integer");
+  if ($mes >= 0 && $mes < 12) {
+    return $mes;
+  }
+  return FALSE;
+}
+
+/**
+ * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
+ */
+function _es_tipo_accionespecifica($node) {
+  return ($node->type == 'accion_especifica');
+} // function _accion_especifica_de_proyecto_seguimiento_access
+
+/**
+ * verificar que el nodo que desea se evaluado sea de tipo 'accion_especifica'
+ */
+function _mes_habilitado_para_seguimiento($mes=0) {
+  $mes_seguimiento = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0);
+  $mes_a = date('n');
+  $mes_inical = $mes_seguimiento;
+  $mes_final = variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 0) + 1;
+  if ($mes_inical<=$mes && $mes< ($mes_final + $mes_inical) && $mes>=0) {
+    return TRUE;
+  }
+  return FALSE;
+} // function _accion_especifica_de_proyecto_seguimiento_access
+
+/**
+ * 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
+ */
+function _mes_dentro_de_duracion_ae_proyecto($node, $mes=0) {
+  
+  $mesI = $mes+1;//colocando parametro entre 1 y 12
+  $resp = FALSE;
+  $mes_seguimiento = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0);
+  $mes_inical = $mes_seguimiento;
+  $mes_final = variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 0);
+
+
+  //Accion Especifica de Proyecto
+  if ($node->type == 'accion_especifica') {
+    $fechayhora_inicio = $node->field_accion_esp_fechai[0]['value'];
+    list($fecha_inicio, $hora_inicio) = split('[ ]', $fechayhora_inicio);
+    list($anno_inicio, $mes_inicio, $dia_inicio) = split('[/.-]', $fecha_inicio);
+    $m_inicio = intval($mes_inicio);
+    
+    $fechayhora_fin = $node->field_accion_esp_fechaf[0]['value'];
+    list($fecha_fin, $hora_fin) = split('[ ]', $fechayhora_fin);
+    list($anno_fin, $mes_fin, $dia_fin) = split('[/.-]', $fecha_fin);
+    $m_fin = intval($mes_fin);
+    if ($mes <= ($mes_final + $mes_inical) && ($m_inicio<=$mesI)&&($m_fin>=$mesI)) {
+      return TRUE;
+    }
+    else {
+      $resp = FALSE;
+    }
+  }
+  
+  return $resp;
+}
+
+/**
+ * verificar si por la fecha actual, esta activo el perio de ingreso de seguimiento
+ */
+function _periodo_de_seguimiento_proyecto_y_aes_esta_activo($proyecto) {
+  global $user;
+  $ente_planificador = ente_planificador_leer_ente_planificadores($proyecto->field_proyecto_ente[0]['nid']);
+  if (!$ente_planificador || !$ente_planificador->nid) {
+    return FALSE;
+  }
+  $ente = usuario_tiene_ente($user->uid);
+  if ($ente_planificador->nid != $ente->nid && !user_access('admin planificador')) {
+    return FALSE;
+  }
+
+  $current_time = time();
+  $tipo_plan = 'proyecto_y_accionesespecificas_seguimiento';
+  $mi_fecha = ente_planificador_user_acceso_proceso($tipo_plan, $ente_planificador);
+  $fecha = FALSE;
+
+  if ($mi_fecha[1]  + 86399 > $current_time && $mi_fecha[0] < $current_time) {
+    $fecha = TRUE;
+  }
+  return $fecha;
+}
+
+function _es_usuario_autenticado(){
+  global $user;
+  if($user->uid > 0){
+    return TRUE;
+  }
+  return FALSE;
+}
+
+function _permiso_para_realizar_transicion_estado($node, $mes = 0, $estadonuevo=0){
+  
+  $consultaseguimientoactual = _seguimiento_mesactual_partida_ae_deproyecto_load($node, $mes);
+  $estado = (isset($consultaseguimientoactual['segmes']['estado'])) ? $consultaseguimientoactual['segmes']['estado'] : -1;
+  
+  if($estado == $estadonuevo){
+    return FALSE;
+  }
+  
+  $states = _obtener_estados_seguimiento_mes();
+  
+  $estado_aprobado = variable_get('acciones_centralizadas_state_aprobado', NULL);
+  $estado_naprobado = variable_get('acciones_centralizadas_state_naprobado', NULL);
+
+  global $user;
+  $ente = usuario_tiene_ente($user->uid);
+    
+  $roles = array_keys($user->roles);
+  if ($user->uid == 1) {
+    // Superuser is special.
+    $roles_transition = 'ALL';
+  }else {
+    $roles_transition = $roles;
+    if ($user->uid == $consultaseguimientoactual['segmes']['uid']&& $consultaseguimientoactual['segmes']['uid'] > 0) {//verificar si es el autor del seguimiento
+      $roles_transition += array('author' => 'author');
+    }
+  }
+  
+  $transitions = array();
+  if ($states['wid']) {
+    $transitions = workflow_allowable_transitions($estado, 'to', $roles_transition);
+  }
+
+  if (isset($transitions[$estadonuevo])) {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/*
+ * verificar nivel de usuario para modificar
+ */
+
+function _estado_seg_en_nivel_de_usuario($node, $mes=0){
+  
+  //calcular el estado
+  $transiciones_dispo = _obtener_transiciones_disponibles($node, $mes);
+  $nivel_usuario = _obtener_nivel_usuario_segun_estado($transiciones_dispo['nombre_estado_actual']);
+
+  $rol_ente_usuario = _obtener_rol_y_ente_de_usuario();
+  
+  if(($transiciones_dispo['estado_actual'] < 0)&&($rol_ente_usuario['rol']=='enlace'||$rol_ente_usuario['rol']=='administrador')){
+    return true;  
+  }
+  if(($nivel_usuario == $rol_ente_usuario['rol'])||$rol_ente_usuario['rol']=='administrador'){//nivel de usuario == rol actor
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/*
+ * verificar que sea el mismo ente, tanto para el proyecto como para el usuario (si es enlace o supervisor)
+ */
+
+function _es_elmismo_ente_proyecto_y_usuario($node){
+  
+  $rol_ente_usuario = _obtener_rol_y_ente_de_usuario();
+
+  if($rol_ente_usuario['rol']=='enlace'||$rol_ente_usuario['rol']=='supervisor'){//enlace o supervisor
+    $nodo_proyecto = node_load($node->field_accion_esp_proyecto[0]['nid']);
+    if($rol_ente_usuario['id_ente'] == $nodo_proyecto->field_proyecto_ente[0]['nid']){//deben ser del mismo ente que el proyecto
+      return TRUE;
+    }else{
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+/*
+ * verificar que sea el mismo ente, tanto para el proyecto como para el usuario (si es enlace o supervisor)
+ */
+
+function _seg_esta_aprobado($node, $mes=0){
+  
+  $transiciones_dispo = _obtener_transiciones_disponibles($node, $mes);
+  $estado = $transiciones_dispo['estado_actual'];
+  
+  $estado_aprobado = variable_get('acciones_centralizadas_state_aprobado', NULL);
+
+  if ($estado == $estado_aprobado) {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/*
+ * verificar anno habilitado
+ */
+function _anno_habilitado_para_seg($node){
+  
+  $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0);
+  $idnodo_proyecto = 0;
+  
+  if ($node->type == 'proyectos_operativos'){
+    $idnodo_proyecto = $node->nid;
+  }elseif($node->type == 'accion_especifica'){
+    $nodo_proyecto = node_load($node->field_accion_esp_proyecto[0]['nid']);
+    $idnodo_proyecto = $nodo_proyecto->nid;
+  }
+  
+  if($idnodo_proyecto){
+    $query = "SELECT * from {proyectos_operativos} where nid=%d";
+    $queryResult =  db_query ( $query, $idnodo_proyecto);
+    $datosproyecto = db_fetch_object ( $queryResult ) ;
+    
+    if ($datosproyecto->year == $anno) {
+      return TRUE;
+    }
+  }
+    
+  return FALSE;
+}
+
+//**************************************************************************************************************************************************
+//pagina de formulario
+
+module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/ae_proyecto/seguimiento_accion_especifica_deproyecto_partidaspormes_modificar.forms');
+
+
+//**************************************************************************************************************************************************
+
+//funciones auxiliares
+
+module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/00_generales/funciones_auxiliares.pages');
+
+//**************************************************************************************************************************************************
+//funciones para consultas a base de datos
+//carga de datos comprometido, causado, pagado, asignado
+module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/ae_proyecto/funciones_consulta_bd.pages');
+
+//**************************************************************************************************************************************************
+//workflow
+// codificada lunes 18 03 13, por Diego UzcÃ¡tegui
+
+/*
+ * Implementation of seg_proy_aes_wk_load()
+ */
+function seg_proy_aes_wk_load($state = 0) {
+  $states = _obtener_estados_seguimiento_mes();
+  //echo print_r($states).'<br>';
+  if (isset($states['states'][$state])) {
+    return $state;
+  }
+  return FALSE;
+}
+
+//cargar funciones para flujo de trabajo
+module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/00_generales/funciones_flujo_trabajo.pages');
+
+//cargar funciones de consulta de valores de reformulaciones
+module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento' , 'includes/funciones_consulta_valores_reformulaciones.pages');
+
+/**
+ * Implementation of hook_node_load
+ */
+function accion_especifica_de_proyecto_seguimiento_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
+  switch ($op) {
+    case 'load':
+      if ($node->type == 'accion_especifica') {
+        $additions = db_fetch_object(db_query('SELECT acumulativa  FROM {seguimiento_aeproyecto} WHERE nid = %d', $node->nid));
+        $node->es_acumulativo = $additions->acumulativa;
+      }
+    break;
+  }
+}
