<?php

class ActividadesControlador extends Controladores {
    
    /**
     * Vista que se encarga de mostrar todos los detalles/datos asociados a 
     * los registros de Actividades.
     * @return HTML Datos e información de Actividades.
     */
    function verDetalles() {
        $Actividad = PlanesActividades::datosCompletos($this->actividadID);
        Vistas::mostrar('planeador', 'actividades/form-ver-detalles', array('Actividad' => $Actividad));
    }
    
    /**
     * Vista que se encarga de organizar la forma de presentar 
     * los registros de Actividades al usuario.
     * @return HTML Listado de Actividades.
     */
    function mostrarActividades() {
        Vistas::mostrar('planeador', 'actividades/lst-todos');
    }
    
    /**
     * Permite mostrar en forma de tabla los registros de Actividades.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function tablaListado() {
         $Actividades = PlanesActividades::todas();
        Vistas::mostrar('planeador', 'actividades/tbl-todos', 
            array( 'Actividades' => $Actividades)
        );
    }
    
    /**
     * Responde con el formulario de Actividades vacio, solo datos necesarios.
     * LLama a la función que devuleve el formulario pero 
     * sin enviarle los datos de Actividades.  
     * Esta función se crea para poder gestionar el permiso de NUEVO Actividades
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function mostrarFormularioNuevo() {
        if(empty($this->ActividadPredefinidasID)){
            $this->mostrarSeleccionarTipoActividad();
        }else{
            $this->mostrarFormulario(null, $this->ActividadPredefinidasID);
        }
        
    }
    /**
     * Entrega la vista desde donde se puede seleccionar un tipo de actividad
     * y de esta precargar operaciones para la nueva actividad.
     * @return HTML Formulario con los datos de los Tipos de Actividades a seleccionar.
     */
    private function mostrarSeleccionarTipoActividad() {
        Vistas::mostrar('planeador', 'actividades/form-antes-actividades',
            array("TiposActividades" =>  PlanesTiposActividades::todos())
        );
    }
    
    /**
     * Función que toma los datos enviados y crea un nuevo registro
     * @return RespuestasSistema 
     */
    private function guardarNuevo() {
        $codigoActividad = Consecutivos::usar('ACTIVIDADES', TRUE);
        $actividadID = PlanesActividades::guardar($this->accionID,$this->planID, $this->tipoActividadID, $codigoActividad, $this->actividadTITULO, $this->actividadDESCRIPCION, $this->actividadJUSTIFICACION, $this->actividadLOGROESPERADO, $this->actividadLUGAR, $this->actividadFCHINICIO, $this->actividadFCHFINAL, $this->actividadINGRESO, $this->cargoID, $this->metaID);
        if ($actividadID):
            if($this->agregarSolicitud($actividadID) and $this->agregarOperacion($actividadID)){
                echo RespuestasSistema::exito("Se Guardo la actividad con EXITO", PlanesActividades::datos($actividadID));
            }else{
                echo RespuestasSistema::error('Hubo un error al procesar alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        else:
            echo RespuestasSistema::fallo("No se pudo CREAR la nueva ACTIVIDAD. Si vuelve a suceder, contacte con el Centro TICS.");
        endif;
    }
    
    private function crearConsecutivoOperacion($tipoOperacionID){
        switch ($tipoOperacionID) {
            case '1':
                return Consecutivos::usar('TAREAS', 'TAR');
            break;
            case '2':
                return Consecutivos::usar('ADQUISICION', 'COM');
            break;
        }
    }
    
    private function agregarSolicitud($actividadID){
        $actividad = PlanesActividades::datos($actividadID);
        if(!empty($this->personalSolicitado)):
            $n = 0;
            if(count($this->personalSolicitado)):
                foreach($this->personalSolicitado as $solicitud):
                    $codigoSolicitud = Consecutivos::usar('SOLICITUDPERSONAL', 'SOLPER');
                    $solicitudID = SolicitudPersonal::guardar($actividadID,  $codigoSolicitud, $this->solicitudDESCRIPCION[$solicitud], $this->solicitudOBSERVACIONES[$solicitud], $this->solicitudNUMSOLICITUD[$solicitud], $this->solicitudTIEMPOESTIMADO[$solicitud]);
                    if($solicitudID>0 and !empty($solicitudID)):
                        Notificaciones::paraColaborador(Parametros::valor('JEFETH')->colaboradorID, Notificaciones::INFORMACION , 'SOLICITUD DE PERSONAL', "SE REALIZO UNA SOLICITUD DE PERSONAL PARA LA ACTIVIDAD # ".  $actividad->actividadCODIGO  . " CON LA FINALIDAD QUE CUMPLA LAS SIGUIENTES FUNCIONES: " . $this->solicitudDESCRIPCION[$solicitud], "mostrarSolicitudPersonal" );
                        $n++;   
                    endif;
                endforeach;
            endif;
            if(count($this->personalSolicitado)==$n):
                return true;
            else:
                return false;
            endif;
        endif;
        return true;
    }
    
    private function agregarOperacion($actividadID){
        if(!empty($this->operacionID) and count($this->operacionID)):
            $n = 0;
            foreach($this->operacionID as $operacion):
                $operacionPredefinida = PlanesOperacionesPredefinidas::datos($this->planOperacionPredefinidaID[$operacion]);
                $colaborador = Colaboradores::porCargo($operacionPredefinida->claseOperacionCARGOREVISION);
                if(empty($this->planOperacionID[$operacion])):
                    $codigoOperacion = $this->crearConsecutivoOperacion($this->tipoOperacionID[$operacion]);
                    $operacionID = PlanesOperaciones::guardar($actividadID, $this->tipoOperacionID[$operacion], $this->planOperacionPredefinidaID[$operacion], $codigoOperacion, $this->planOperacionDESCRIPCION[$operacion], $this->planOperacionFCHINICIO[$operacion], $this->planOperacionFCHFINAL[$operacion],  $this->planOperacionCOSTO[$operacion], $operacionPredefinida->rubroID, $operacionPredefinida->centroCostosID, $operacionPredefinida->claseOperacionID);
                    if($this->tipoOperacionID[$operacion] == 2 and $operacionID >0):
                        Notificaciones::paraColaborador($colaborador->colaboradorID, Notificaciones::OPERACION , 'SOLICITUD DE COMPRA', "SE REALIZO UNA SOLICITUD DE COMPRA PARA LA OPERACIÓN ".  $codigoOperacion . " CON LA SIGUIENTE DESCRIPCIÓN: " . $this->planOperacionDESCRIPCION[$operacion], "pendientesDelColaboradorRevisionTecnicaOperacionesPlaneador" );
                        Notificaciones::paraColaborador(Parametros::valor('JEFEFINANCIERA')->colaboradorID, Notificaciones::INFORMACION , 'SOLICITUD DE COMPRA', "SE REALIZO UNA SOLICITUD DE COMPRA PARA LA OPERACIÓN ".  $codigoOperacion . " CON LA SIGUIENTE DESCRIPCIÓN: " . $this->planOperacionDESCRIPCION[$operacion], "pendientesDelColaboradorRevisionFinancieraOperacionesPlaneador" );
                    endif;
                else:
                    $operacionActual = PlanesOperaciones::datos($this->planOperacionID[$operacion]);
                    $operacionID = PlanesOperaciones::actualizar($this->planOperacionDESCRIPCION[$operacion], $this->planOperacionFCHINICIO[$operacion], $this->planOperacionFCHFINAL[$operacion],  $this->planOperacionCOSTO[$operacion], $this->planOperacionID[$operacion]);
                    if($this->tipoOperacionID[$operacion] == 2 and $operacionID >0):
                        Notificaciones::paraColaborador($colaborador->colaboradorID, Notificaciones::OPERACION , 'SOLICITUD DE COMPRA', "SE EDITO LA SOLICITUD DE COMPRA PARA LA OPERACIÓN ".  $operacionActual->planOperacionCODIGO . " CON LA SIGUIENTE DESCRIPCIÓN: " . $this->planOperacionDESCRIPCION[$operacion], "pendientesDelColaboradorRevisionTecnicaOperacionesPlaneador" );
                        Notificaciones::paraColaborador(Parametros::valor('JEFEFINANCIERA')->colaboradorID, Notificaciones::INFORMACION , 'SOLICITUD DE COMPRA', "SE EDITO LA SOLICITUD DE COMPRA PARA LA OPERACIÓN ".  $operacionActual->planOperacionCODIGO . " CON LA SIGUIENTE DESCRIPCIÓN: " . $this->planOperacionDESCRIPCION[$operacion], "pendientesDelColaboradorRevisionFinancieraOperacionesPlaneador" );
                    endif;
                endif;
                if($operacionID >0 and !empty($operacion)):
                    $n++;   
                endif;
            endforeach;
            if(count($this->operacionID)==$n):
                return true;
            else:
                return false;
            endif;
        endif;
        return true;
    }
    
    private function eliminarSolicitud($solicitud,$actividad){
        SolicitudPersonal::eliminar($solicitud);
        Notificaciones::paraColaborador(Parametros::valor('JEFETH')->colaboradorID, Notificaciones::INFORMACION , 'SOLICITUD DE PERSONAL', "SE ELIMINO LA SOLICITUD DE PERSONAL PARA LA ACTIVIDAD ".  $actividad->actividadCODIGO , "mostrarSolicitudPersonal" );
    }
    
    private function eliminarOperacion($operacion){
        $operacionPredefinida = PlanesOperacionesPredefinidas::datos($operacion->operacionPredefinidaID);
        $colaborador = Colaboradores::porCargo($operacionPredefinida->claseOperacionCARGOREVISION);
        PlanesOperaciones::eliminar($operacion->planOperacionID);
        if($operacion->tipoOperacionID == 2):
            Notificaciones::paraColaborador($colaborador->colaboradorID, Notificaciones::OPERACION , 'SOLICITUD DE COMPRA', "SE ELIMINO LA SOLICITUD DE COMPRA DE LA OPERACIÓN ".  $operacion->planOperacionCODIGO . " CON LA SIGUIENTE DESCRIPCIÓN: " . $operacion->planOperacionDESCRIPCION , "pendientesDelColaboradorRevisionTecnicaOperacionesPlaneador" );
            Notificaciones::paraColaborador(Parametros::valor('JEFEFINANCIERA')->colaboradorID, Notificaciones::INFORMACION , 'SOLICITUD DE COMPRA', "SE ELIMINO LA SOLICITUD DE COMPRA DE LA OPERACIÓN ".  $operacion->planOperacionCODIGO . " CON LA SIGUIENTE DESCRIPCIÓN: " . $operacion->planOperacionDESCRIPCION , "pendientesDelColaboradorRevisionFinancieraOperacionesPlaneador" );
        endif;
    }
    
    /**
     * Recibe el ID del Actividades y obtiene sus datos para ser enviados 
     * al formulario, y asi cargar los datos en los inputs.
     * Esta función se crea para poder gestionar el permiso de EDITAR Actividades
     * @return HTML Formulario con los datos del Actividades a editar.
     */
    function mostrarFormularioEditar() {
        $Actividad = PlanesActividades::datos($this->actividadID);
        $this->mostrarFormulario($Actividad, $Actividad->tipoActividadID);
    }
   
    /**
     * Función que toma los datos enviados y actualiza el registro
     * @return RespuestasSistema 
     */
    private function guardarCambios() {
        $actividadID = PlanesActividades::actualizar($this->accionID,$this->planID, $this->actividadTITULO, $this->actividadDESCRIPCION, $this->actividadJUSTIFICACION, $this->actividadLOGROESPERADO, $this->actividadLUGAR, $this->actividadFCHINICIO, $this->actividadFCHFINAL, $this->actividadINGRESO, $this->cargoID, $this->metaID, $this->actividadID);
        if ($actividadID>0):
            $actividad = PlanesActividades::datosCompletos($this->actividadID);
            PlanesActividades::registrarCambio($this->actividadID, json_encode($actividad));
            foreach($actividad->solicitudesPersonal as $solicitudesActuales):
                if(!in_array($solicitudesActuales->solicitudPersonalID, $this->personalSolicitadoID)):
                    $this->eliminarSolicitud($solicitudesActuales->solicitudPersonalID,$actividad);
                endif;
            endforeach;
            foreach($actividad->operaciones as $operacionActuales):
                if(!in_array($operacionActuales->planOperacionID, $this->planOperacionID)):
                    $this->eliminarOperacion($operacionActuales);
                endif;
            endforeach;
            
            if($this->agregarSolicitud($this->actividadID) and $this->agregarOperacion($this->actividadID)){
                
                echo RespuestasSistema::exito("Se Actualizo la actividad con EXITO", PlanesActividades::datos($this->actividadID));
            }else{
                echo RespuestasSistema::error('Hubo un error al procesar alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        else:
            echo RespuestasSistema::fallo("No se pudo Actualizar la  ACTIVIDAD. Si vuelve a suceder, contacte con el Centro TICS.");
        endif;
    }
   
    /**
     * Muestra el Formulario procesado para ser mostrado al usuario.
     * Se le envian unos datos inciales para la carga de la vista, y
     * se envia los datos del PlanesOperaciones cuando se esta editando.
     * @return HTML Vista del Formulario de PlanesOperaciones
     */
    private function mostrarFormulario($Actividad = null, $ActividadPredefinidasID=null) {
        Vistas::mostrar('planeador', 'actividades/form-actividades',array(
            "planes" => Planes::todos(Planes::PLANEACION),
            'acciones' => Acciones::todas(ProgramasEstados::PLANEACION),
            'actividadPredefinidasID' => $ActividadPredefinidasID,
            'Actividad' => $Actividad)
        );
    }
    
    /**
     * Muestra el Formulario que se va a usar en el formulario de actividad
     * para cargar/agregar operaciones predefinidas.
     * se envia los datos del PlanesOperaciones de la Actividad cuando se esta editando.
     * @return HTML Vista del Formulario de PlanesOperaciones
     */
    function mostrarFormularioOperaciones(){
        $tipoActividades =  array();
        if(isset($this->actividadPredefinidasID)):
            if($this->actividadPredefinidasID!='null'):
                $tipoActividades = PlanesTiposActividades::datosCompletos($this->actividadPredefinidasID);
            endif;
        endif;
        $actividadID='';
        if(isset($this->actividadID)){
           $actividadID = $this->actividadID; 
        }
        Vistas::mostrar('planeador', 'actividades/form-operaciones-actividad',
            array(
                "actividadPredefinida" => $tipoActividades,
                "operacionesPredefinidas" =>  PlanesOperacionesPredefinidas::paraListas(),
                "actividadID" => $actividadID,
                "hash_form"=> $this->hash_form
            )
        );
    }
    
    /**
     * Guardar Datos Recibidos, bien sea como un registro nuevo, o como una actualización.
     * Despues imprime las Respuesta del Sistema a la ejecución de la operacion
     */
    function guardarDatos() {
        if (empty($this->actividadID)) {
           $this->guardarNuevo();
        } else {
           $this->guardarCambios();
        }
    }
    
    /**
     * Eliminar un registro de la base de datos.
     * Esta operación es irreversible.
     * Si se tiene la referencia integral activada, la base de datos no va 
     * dejar eliminar si tiene otros registros asociados.
     * @return RespuestasSistema Resultado de la Operacion que se envia al cliente
     */
    function eliminar() {
        $ActividadesParaEliminar = $this->checkb;
        if (count($ActividadesParaEliminar)) {
            $n = 0;
            foreach ($ActividadesParaEliminar as $actividadELIMINAR):
                $actividad = PlanesActividades::datosCompletos($actividadELIMINAR);
                foreach($actividad->solicitudesPersonal as $solicitudesActuales):
                    $this->eliminarSolicitud($solicitudesActuales->solicitudPersonalID,$actividad);
                endforeach;
                foreach($actividad->operaciones as $operacionActuales):
                    $this->eliminarOperacion($operacionActuales);
                endforeach;
                if (PlanesActividades::eliminar($actividadELIMINAR)>0) {
                    $n++;
                }
            endforeach;
            if ($n == 0) {
                echo RespuestasSistema::error('No fue posible ELIMINAR. Contacte al centro TICS.');
            } else if ($n == count($ActividadesParaEliminar)) {
                echo RespuestasSistema::exito('Se realizó la OPERACION [ELIMINAR] exitosamente!');
            } else {
                echo RespuestasSistema::error('Hubo un error al  [ELIMINAR] alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        } else {
            echo RespuestasSistema::error('No llegarón los datos para  [ELIMINAR]. Contacta al centro TICS');
        }
    }
    
    /**
     * Cambiar el estado de un registro de la base de datos.
     * Esta operacion cambia a estado ACTIVO el registro.     
     * @return RespuestasSistema Resultado de la Operacion
     */
    function reactivar() {
       $PlanesOperacionesParaActivar  = $this->planOperacionSELECCIONADOS;
        if (count($PlanesOperacionesParaActivar)) {
            $n = 0;
            foreach ($PlanesOperacionesParaActivar as $planOperacionACTIVAR):
                if (PlanesOperaciones::activar($planOperacionACTIVAR)) {
                    $n++;
                }
            endforeach;
            if ($n == 0) {
                echo RespuestasSistema::error('No fue posible REACTIVAR. Contacte al centro TICS.');
            } else if ($n == count($PlanesOperacionesParaActivar)) {
                echo RespuestasSistema::exito('Se realizó la OPERACION [REACTIVAR] exitosamente!');
            } else {
                echo RespuestasSistema::error('Hubo un error al  [REACTIVAR] alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        } else {
            echo RespuestasSistema::error('No llegarón los datos para  [REACTIVAR]. Contacta al centro TICS');
        }
    }
    
    /**
     * Cambiar el estado de un registro de la base de datos.
     * Esta operacion cambia a estado DESACTIVO / SUSPENDIDO / CANCELADO el registro.     
     * @return RespuestasSistema Resultado de la Operacion
     */
    function desactivar() {
        $PlanesOperacionesParaDesactivar = $this->planOperacionSELECCIONADOS;
        if (count($PlanesOperacionesParaDesactivar)) {
            $n = 0;
            foreach ($PlanesOperacionesParaDesactivar as $planOperacionDESACTIVAR):
                if (PlanesOperaciones::desactivar($planOperacionDESACTIVAR)) {
                    $n++;
                }
            endforeach;
            if ($n == 0) {
                echo RespuestasSistema::error('No fue posible DESACTIVAR. Contacte al centro TICS.');
            } else if ($n == count($PlanesOperacionesParaDesactivar)) {
                echo RespuestasSistema::exito('Se realizó la OPERACION [DESACTIVAR] exitosamente!');
            } else {
                echo RespuestasSistema::error('Hubo un error al  [DESACTIVAR] alguno de los registros. Verifica los datos, o contacta al centro TICS.');
            }
        } else {
            echo RespuestasSistema::error('No llegarón los datos para  [DESACTIVAR]. Contacta al centro TICS');
        }
    }
    
    /**
     * Permite mostrar en forma de tabla los registros de Actividades.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function tablaListadoSolicitud() {
        $solicitudes = PlanesActividades::solicitudPersonal($this->actividadID);
        Vistas::mostrar('planeador', 'actividades/tbl-solicitud', 
            array( 'solicitudes' => $solicitudes, 'hash_form'=> $this->hash_form)
        );
    }
    
    /**
     * Permite mostrar los detalles de la Actividad.  
     * @return HTML Formulario solo con datos inciales o necesarios.
     */
    function detallesActividad() {
        if(@$this->tipoPlanID){
            $Actividad = PlanesActividades::datosCompletos($this->actividadID, $this->tipoPlanID);
            Vistas::mostrar('planeador', 'actividades/ver-detalles', array('Actividad' => $Actividad, 'TipoPlanID' => $this->tipoPlanID, 'hash_padre'=>$this->hash_padre));
        }else{
            $Actividad = PlanesActividades::datosCompletos($this->actividadID);
            Vistas::mostrar('planeador', 'actividades/ver-detalles', array('Actividad' => $Actividad, 'hash_padre'=>$this->hash_padre));
        }
    }
    
    function mostrarTablaCompletaPorAccion(){
        if(empty($this->tipoPlanID)){
            $Actividades = PlanesActividades::delaAccion($this->accionID);
            foreach($Actividades as $actividad):
                $actividad->Total = PlanesOperaciones::presupuestoTotalPorActividad($actividad->actividadID);
                $actividad->TotalGastado = PlanesOperacionesAvances::GastadoTotalPorActividad($actividad->actividadID);
                $actividad->FechaInicio = PlanesOperaciones::fechaTempranaPorActividad($actividad->actividadID);
                $actividad->FechaFinal = PlanesOperaciones::fechaTardiaPorActividad($actividad->actividadID);
            endforeach;
             Vistas::mostrar("planeador", "actividades/tbl-completa", array("Actividades"=>$Actividades, 'hash_padre'=>$this->hash_padre));
        }else{
            $Actividades = PlanesActividades::delaAccion($this->accionID, $this->tipoPlanID);
            foreach($Actividades as $actividad):
                $actividad->Total = PlanesOperaciones::presupuestoTotalPorActividadyTipoPlan($actividad->actividadID, $this->tipoPlanID);
                $actividad->TotalGastado = PlanesOperacionesAvances::GastadoTotalPorActividad($actividad->actividadID, $this->tipoPlanID);
                $actividad->FechaInicio = PlanesOperaciones::fechaTempranaPorActividad($actividad->actividadID, $this->tipoPlanID);
                $actividad->FechaFinal = PlanesOperaciones::fechaTardiaPorActividad($actividad->actividadID, $this->tipoPlanID);
            endforeach;
             Vistas::mostrar("planeador", "actividades/tbl-completa", array("Actividades"=>$Actividades,'TipoPlanID' => $this->tipoPlanID, 'hash_padre'=>$this->hash_padre));
        }
       
    }
    
    
}
