t('January'), 1 => t('February'), 2 => t('March'), 3 => t('April'), 4 => t('May'), 5 => t('June'), 6 => t('July'), 7 => t('August'), 8 => t('September'), 9 => t('Octuber'), 10 => t('November'), 11 => t('December'), ); define('MESES', json_encode($meses)); /* * Implementation of hook_help() */ function proyecto_operativo_seguimiento_help($path, $arg) { switch ($path) { case "admin/help/aeproyectoseguimiento": $output = '

'. t("Este modulo se encarga de la gestión del seguimiento de proyectos operativos") .'

'; break; } return $output; } // function proyecto_operativo_seguimiento_help /* * Implementation of hook_menu() */ function proyecto_operativo_seguimiento_menu() { $items = array(); $items['proyectosop/seguimiento/workflow_ahah/callback'] = array( 'page callback' => 'ahah_proyectosop_seguimiento_workflow_callback', 'access callback' => TRUE, 'type' => MENU_CALLBACK, 'file' => 'includes/proyecto/cambiodeestado_seg_proyecto_paginaconfirmacion.forms.inc', ); //----------------------------------------------------------------------------Seguimiento de acciones específicas de proyectos operativos $items['proyectosop/%proyectosop/seguimiento'] = array( 'title' => 'Seguimiento', 'type' => MENU_LOCAL_TASK, 'access callback' => '_proyectooperativo_esta_aprobado_acceso', 'access arguments' => array(1), 'file' => 'includes/proyecto/seguimiento_proyecto.pages.inc', 'page callback' => 'seguimiento_proyecto_y_aes_lista_page', 'page arguments' => array(1), 'weight' => 2, ); $items['proyectosop/%proyectosop/seguimiento/view'] = array( 'title' => 'Seguimiento', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10 ); $items['proyectosop/%proyectosop/seguimiento/workflow'] = array( 'title' => 'Enviar Seguimiento', 'type' => MENU_LOCAL_TASK, 'access callback' => '_proyecto_seguimiento_mes_mover_group_estado_access', 'access arguments' => array(1), 'page callback' => 'drupal_get_form', 'page arguments' => array('cambiodeestado_seg_proyecto_paginaconfirmacion_form', 1), 'file' => 'includes/proyecto/cambiodeestado_seg_proyecto_paginaconfirmacion.forms.inc', 'weight' => 2, ); /* $items['proyectosop/%proyectosop/seguimiento/proyecto_aes/%'] = array( 'title' => 'Proyecto y 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/proyecto'] = array( 'title' => 'Proyecto', 'type' => MENU_LOCAL_TASK, 'access callback' => '_proyectooperativo_esta_aprobado_acceso', 'access arguments' => array(1), 'file' => 'includes/proyecto/seguimiento_proyecto.pages.inc', 'page callback' => 'seguimiento_proyecto_page', 'page arguments' => array(1), 'weight' => 2, ); $items['proyectosop/%proyectosop/seguimiento/proyecto/%messeg/edit/%'] = array( 'title' => 'Seguimiento', 'type' => MENU_LOCAL_TASK, 'access callback' => '_proyecto_operativo_seguimiento_modificar_mes_access', 'access arguments' => array(1, 4), 'file' => 'includes/proyecto/seguimiento_proyecto_datospormes_modificar.forms.inc', 'page callback' => 'drupal_get_form', 'page arguments' => array('seguimiento_proyecto_datospormes_modificar_form', 1, 4,6), 'weight' => 2, ); /*----------------------------------------------------------------------------workflow $items['proyectosop/%proyectosop/seguimiento/proyecto/%messeg/workflow'] = array( 'title' => 'Seguimiento', 'type' => MENU_LOCAL_TASK, 'access callback' => '_proyecto_seguimiento_mes_mover_estado_access', 'access arguments' => array(1, 4), 'file' => 'includes/proyecto/cambiodeestado_seg_proyecto_paginaconfirmacion.forms.inc', 'page callback' => 'drupal_get_form', 'page arguments' => array('cambiodeestado_seg_proyecto_paginaconfirmacion_form', 1, 4), 'weight' => 2, ); */ $items['proyectosop/%proyectosop/seguimiento/workflowhis'] = array( 'title' => 'Historial Seguimiento', 'type' => MENU_LOCAL_TASK, 'access callback' => '_proyectooperativo_esta_aprobado_acceso', 'access arguments' => array(1), 'file' => 'includes/proyecto/historial_cambiodeestado_seg_proyecto.pages.inc', 'page callback' => 'historial_cambiodeestado_seg_proyecto_page', 'page arguments' => array(1), 'weight' => 2, ); // 'proyectosop/%proyectosop/seguimiento/proyecto/%year/%messegaepartida/workflow/historial' //----------------------------------------------------------------------------Fase de Seguimiento de proyectos operativos y sus acciones especificas /* $items['proyectosop/%proyectosop/fase_de_seguimiento_proyecto_y_aes'] = array( 'title' => 'Proyecto y 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' => 2, ); */ return $items; } //************************************************************************************************************************************************** //permisos de acceso a las paginas /** * verificar que el nodo que desea se evaluado sea de tipo 'proyectos_operativos' */ function _proyecto_operativo_seguimiento_access($proyecto = 0) { return _proyectooperativo_esta_aprobado($node); } // function _proyecto_operativo_seguimiento_access /** * verificar que el nodo que desea se evaluado sea de tipo 'proyectos_operativos', que el mes este dentro dentro del periodo de duracion, mes habilitado para seg, y periodo de seguimiento activo */ function _proyecto_operativo_seguimiento_modificar_mes_access($proyecto = 0, $mes = 0) { global $user; $mes_o = $mes; //esta fuera del mes de seguimiento actual if (!_mes_habilitado_para_seguimiento($mes)) { return FALSE; } $mes_final = variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 1); //esta fuera del anho de seguimiento actual if ($proyecto->anhoproyectos_operativos != variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0)) { return FALSE; } $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0); $fecha = explode('-', $proyecto->field_proyecto_fecha_i[0]['value']); $mes_inicio = (int) $fecha[1]; $year_inicio = (int) $fecha[0]; $fecha = explode('-', $proyecto->field_proyecto_fecha_f[0]['value']); $mes_fin = (int) $fecha[1]; $year_fin = (int) $fecha[0]; if (($anno == $year_inicio && $mes_inicio > $mes) || ($anno == $year_fin && $mes_fin < $mes) && $mes_final<=$m_fin) { //se establecio la condicion de años como falsa return FALSE; } //se valida el acceso al plan $current_time = time(); $tipo_plan = 'proyecto_y_accionesespecificas_seguimiento'; $fecha = FALSE; $ente = usuario_tiene_ente($user->uid); $ente_planificador = ente_planificador_leer_ente_planificadores($proyecto->field_proyecto_ente[0]['nid']); if ($ente_planificador->nid != $ente->nid && !user_access('admin planificador')) { return FALSE; } $mi_fecha = ente_planificador_user_acceso_proceso($tipo_plan, $ente_planificador); if ($mi_fecha[1] + 86399 > $current_time && $mi_fecha[0] < $current_time) { $fecha = TRUE; } if ($fecha) { if ($ente->nid == $ente_planificador->nid ) { $fecha = TRUE; } elseif (!user_access('admin planificador')) { $fecha = FALSE; } } //si no posee la transición del seguimiento no puede editar $transiciones = _obtener_transiciones_disponibles_proyecto($proyecto, $mes_o); if (!count($transiciones['transic']) && $transiciones['estado_actual']>0) { return FALSE; } $roles_perm = TRUE; if (module_exists('workflow') && $fecha && !user_access('admin planificador')) { $estado = 0; $wid = workflow_get_workflow_for_type('proyectos_operativos'); $states = workflow_get_states($wid); $roles_perm = FALSE; foreach ($states as $sid => $state) { $roles_allow = variable_get('proyectos_operativos_state_s_' . $sid, array()); $roles = array_keys($user->roles); if (count($roles)) { foreach ($roles as $rol) { if ($roles_allow[$rol]) { $roles_perm = TRUE; } elseif ($rol == -1 && $node->uid == $user->uid) { $roles_perm = TRUE; } } } } } return $fecha && $roles_perm; } /** * acceso a workflow accion_especifica_de_proyecto_seguimiento.module */ function _proyecto_seguimiento_mes_mover_group_estado_access($node) { $meses = json_decode(MESES); for ($i=1; $i<=count($meses); $i++) { if (in_array($i, variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 1))) { if (_proyecto_seguimiento_mes_mover_estado_access($node, $i)) { $mesesL[$i] = $meses[$i]; } } } return count($mesesL); } /** * acceso a workflow accion_especifica_de_proyecto_seguimiento.module */ function _proyecto_seguimiento_mes_mover_estado_access($node, $mes = 0, $message = false) { global $user; $mesI = $mes; $meses = json_decode(MESES); $seguimiento = _seguimiento_mesactual_proyecto_load($node, $mes); // si no estan separadas el seguimiento de las AE con los proyectos $acciones = array(); if (!variable_get('accion_especifica_de_proyecto_seguimiento_aesep', 0)) { //se verifica que se haya ingresado todo el seguimiento de las acciones especificas $cuenta = 0; $count = 0; $acciones_estado = array(); $count_proyect = 0; foreach($node->field_proyecto_accion_esp as $accion) { $accion_load = (object) $accion; //se busca manejar la cantidad total de acciones disponibles por mes, exluir las restantes $accion_load = node_load($accion['nid']); //obtener la cantidad total de las transiciones disponibles de todas las acciones para todos los meses $acciones_estado[$accion['nid']] = _seguimiento_mesactual_partida_ae_deproyecto_load($accion_load, $mes); if (is_numeric($acciones_estado[$accion['nid']]['segmes']['mes'])) { $mes_accion[$accion['nid']][$mes] = $acciones_estado[$accion['nid']]['segmes']['mes']; $accion_content[$mes][$accion['nid']] = $mes; } if ($transiciones_dispoP = _obtener_transiciones_disponibles_proyecto($node, $mes)) { if ((count($transiciones_dispoP['transic']) && !$transiciones_dispoP['estado_actual']) || (!count($transiciones_dispoP['transic']) && $transiciones_dispoP['estado_actual'])) { return false; } elseif (!($transiciones_dispoP['estado_actual']) || !$transiciones_dispoP['nombre_estado_actual']) { return false; } } $transiciones = _obtener_transiciones_disponibles($accion_load, $mes); if ((count($transiciones['transic']) && !$transiciones['estado_actual']) || (!count($transiciones['transic']) && $transiciones['estado_actual'])) { return FALSE; } elseif (!($transiciones['estado_actual']) || !$transiciones['nombre_estado_actual']) { return false; } } } //esta fuera del mes de seguimiento actual if (!_mes_habilitado_para_seguimiento($mes) && !(in_array($mes, variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 1) ))) { return FALSE; } //esta fuera del anho de seguimiento actual $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0); if ($node->anhoproyectos_operativos != $anno) { return FALSE; } $fecha = explode('-', $node->field_proyecto_fecha_i[0]['value']); $mes_inicio = (int) $fecha[1]; $anno_inicio = (int) $fecha[0]; $fecha = explode('-', $node->field_proyecto_fecha_f[0]['value']); $mes_fin = (int) $fecha[1]; $anno_fin = (int) $fecha[0]; //el mes esta fuera del rango del proyecto if (($anno == $anno_inicio && $mes_inicio > $mes) || ($anno == $anno_fin && $mes_fin < $mes)) { return FALSE; } $ente = usuario_tiene_ente($user->uid); $ente_planificador = ente_planificador_leer_ente_planificadores($node->field_proyecto_ente[0]['nid']); $current_time = time(); $tipo_plan = 'proyecto_y_accionesespecificas_seguimiento'; $fecha = FALSE; $mi_fecha = ente_planificador_user_acceso_proceso($tipo_plan, $ente_planificador); if ($mi_fecha[1] + 86399 > $current_time && $mi_fecha[0] < $current_time) { $fecha = TRUE; } if ($fecha) { if (user_access('admin planificador')) { $fecha = TRUE; } elseif ($ente->nid == $ente_planificador->nid && !user_access('admin planificador')) { $fecha = TRUE; } elseif (module_exists('ente_planificador_hierarchical')) { $fathers = _ente_planificador_hierarchical_get_descbyid($ente_planificador->nid, 1); $fecha = isset($fathers[$ente->nid]) ? TRUE : FALSE; } } return $fecha; } /** * verificar que el nodo que desea se evaluado sea de tipo 'proyectos_operativos' */ function _fasedeseguimiento_proyecto_y_ae_access($proyecto) { $mes = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0); $fecha = explode('-', $proyecto->field_proyecto_fecha_i[0]['value']); $mes_inicio = (int) $fecha[1]; $fecha = explode('-', $proyecto->field_proyecto_fecha_f[0]['value']); $mes_fin = (int) $fecha[1]; return (user_access('ver planificador') && (($mes_inicio <= $mes)||($mes_fin >= $mes)) && _proyectooperativo_esta_aprobado($proyecto)) && $proyecto->anhoproyectos_operativos == variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0); } // function _fasedeseguimiento_proyecto_y_ae_access //************************************************************************************************************************************************** /** * verificar que el nodo que desea se evaluado sea de tipo 'proyectos_operativos' */ function _es_tipo_proyectooperativo($node) { return ($node->type == 'proyectos_operativos'); } // function _proyecto_operativo_seguimiento_access /** * Return access */ function _proyectooperativo_esta_aprobado_acceso($node) { return user_access('ver planificador') && _proyectooperativo_esta_aprobado($node); } /** * verificar proyecto operativo este aprobado */ function _proyectooperativo_esta_aprobado($node) { $meses = json_decode(MESES); $mes_fase_seg = _obtener_mes_fase_seguimiento_proyecto($node); $mes_seguimiento_proyecto_y_aes = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0); $nodo_proyecto = node_load($node->nid); $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0); $fecha = explode('-', $nodo_proyecto->field_proyecto_fecha_i[0]['value']); $mes_inicio = (int) $fecha[1]; $year_inicio = (int) $fecha[0]; //exluir el link de la tabla de proyectos if (($year_inicio < $anno) || ($year_inicio == $anno) && in_array($mes_inicio, variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 1))) { $estado_aprobado = variable_get('proyectos_operativos_state_aprobado', NULL); if($node->type =='proyectos_operativos'){ return ($node->_workflow == $estado_aprobado); }elseif($node->type =='accion_especifica'){ $nodo_proyecto = node_load($node->field_accion_esp_proyecto[0]['nid']); return ($nodo_proyecto->_workflow == $estado_aprobado); } } return FALSE; } // function _proyecto_operativo_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_proyecto($node, $mes=0) { $mes = $mes+1;//colocando parametro entre 1 y 12 $resp = FALSE; //Proyecto if ($node->type == 'proyectos_operativos'){ $fechayhora_inicio = $node->field_proyecto_fecha_i[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_proyecto_fecha_f[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(($m_inicio<=$mes)&&($m_fin>=$mes)){ $resp = TRUE; }else{ $resp = FALSE; } } return $resp; } function _permiso_para_realizar_transicion_estado_proyecto($node, $mes = 0, $estadonuevo = 0){ $consultaseguimientoactual = _seguimiento_mesactual_proyecto_load($node, $mes); //estado $estado = ((isset($consultaseguimientoactual['segmes']['estado'])) && ($consultaseguimientoactual['segmes']['estado'] > 0) )? $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; } function _seg_esta_aprobado_proyecto($node, $mes=0){ $transiciones_dispo = _obtener_transiciones_disponibles_proyecto($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 nivel de usuario para modificar */ function _estado_seg_en_nivel_de_usuario_proyecto($node, $mes=0) { //calcular el estado $transiciones_dispo = _obtener_transiciones_disponibles_proyecto($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_proyecto($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'] == $node->field_proyecto_ente[0]['nid']){//deben ser del mismo ente que el proyecto return TRUE; }else{ return FALSE; } } return TRUE; } //************************************************************************************************************************************************** //pagina de formulario module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento', 'includes/proyecto/seguimiento_proyecto_datospormes_modificar.forms'); //************************************************************************************************************************************************** //funciones para consultas a base de datos module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento', 'includes/proyecto/funciones_consulta_bd_proyecto.pages'); //************************************************************************************************************************************************** //fase de seguimiento module_load_include('inc', 'accion_especifica_de_proyecto_seguimiento', 'includes/fase_de_seguimiento_proyecto_y_aes.pages'); //colcar el enlace haci la fase de seguimiento del proyecto y sus acciones /* * Implementation of hook_acciones_obtiene_links_alter() */ function proyecto_operativo_seguimiento_proyecto_obtiene_links_alter(&$links, $proyecto, $acceso = FALSE) { $meses = json_decode(MESES); $mes_fase_seg = _obtener_mes_fase_seguimiento_proyecto($proyecto); $mes_seguimiento_proyecto_y_aes = variable_get('accion_especifica_de_proyecto_seguimiento_mes_seguimiento', 0); $cnt = variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 1); $nodo_proyecto = node_load($proyecto->nid); $anno = variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0); $fecha = explode('-', $proyecto->field_proyecto_fecha_i[0]['value']); $mes_inicio = (int) $fecha[1]; $year_inicio = (int) $fecha[0]; //exluir el link de la tabla de proyectos if (($year_inicio < $anno) || ($year_inicio == $anno && in_array($mes_fase_seg, variable_get('seguimiento_proyectos_cantidad_meses_seguimiento', 1)))) { if($nodo_proyecto->anhoproyectos_operativos == variable_get('accion_especifica_de_proyecto_seguimiento_anho_seguimiento', 0) && _proyectooperativo_esta_aprobado($nodo_proyecto)){ $links[] = array( 'data' => l(t('Fase de Seguimiento'), 'proyectosop/' . $nodo_proyecto->nid . '/seguimiento'), 'class' => 'proyectos-operativos-faseseguimiento', ); } } } /** * Implementation of hook_node_load */ function proyecto_operativo_seguimiento_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { switch ($op) { case 'load': if ($node->type == 'proyectos_operativos') { $additions = db_fetch_object(db_query('SELECT acumulativo FROM {seguimiento_proyecto} WHERE nid = %d', $node->nid)); $node->es_acumulativo = $additions->acumulativo; } break; } } /** * Implementation of hook_views_api(). */ function proyecto_operativo_seguimiento_views_api() { return array( 'api' => '2.0', 'path' => drupal_get_path('module', 'proyecto_operativo_seguimiento') . '/views', ); }