<?php

/**
 * novedad_especifica actions.
 *
 * @package    canon
 * @subpackage novedad_especifica
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class novedad_especificaActions extends sfQuery {

    /**
     * Metodo list de accesos
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------*  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        /*
         * Manejo de errores
         */
        try {

            /*
             * Paginacion
             */
            if (isset($request['_startRow'])) {
                $rowStart = $request['_startRow'];
            } else {
                $rowStart = 0;
            }

            if (isset($request['_endRow'])) {
                $rowEnd = $request['_endRow'];
            } else {
                $rowEnd = 75;
            }

            /*
             * variables de filtro
             */

            $titulo = '';
            if (isset($request['id_titulo'])) {
                $titulo = "'" . $request['id_titulo'] . "' ";
            }
            $whereTipoNovedad = '';
            if (isset($request['id_tipo_novedad'])) {
                $whereTipoNovedad = "AND tab0.id_tipo_novedad='" . $request['id_tipo_novedad'] . "' ";
            }
            $whereAprobada = '';
            if (isset($request['aprobada'])) {
                if ($request['aprobada'] == 'true') {
                    $whereAprobada = "AND tab0.aprobada='" . 1 . "' ";
                }
            }
            $whereFecha = '';
            if (isset($request['fecha_ini']) && isset($request['fecha_fin'])) {
                $whereFecha = "AND to_char(tab0.fecha_registro, 'YYYY-MM-DD') BETWEEN '" . $request['fecha_ini'] . "' AND '" . $request['fecha_fin'] . "' ";
            }

            if ($titulo == '') {
                throw new Exception("Las variables obligatorias no vienen", null, null);
            }

            // Solo registra log la primera vez de consulta
            if ($rowStart == 0) {
                //Operaciones: 1-CONSULTAR, 2-ACTUALIZAR, 3-ADICIONAR, 4-ELIMINAR, 5-ANULAR
                $id_ope_bd = 1;
                //obtener id maestro tabla
                $id_mae_bd = CN_TABLE::consultarIdTablaBD('ca_novedad');
                //registro de consulta en tabla de log- la observacion puede o no enviarse ($request, $id_ope_bd, $id_mae_bd, $observacion)
                $sql = CN_TABLE::registrarLog($request, $id_ope_bd, $id_mae_bd);
            }

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
SELECT count(*) as count from(

    SELECT tab0.*, tab6.cod_titulo, tab7.nombre as nombre_tn,

        CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab8.nombre IS NOT NULL  THEN 'Etapa: '||tab8.nombre
        WHEN tab0.id_tipo_novedad = 1 AND tab2.area IS NOT NULL  THEN 'Area: '||tab2.area 
        WHEN tab0.id_tipo_novedad = 5 AND tab10.nombre IS NOT NULL  THEN 'Competencia: '||tab10.nombre
        WHEN tab0.id_tipo_novedad = 6 AND tab9.descripcion IS NOT NULL  THEN 'Norma: '||tab9.descripcion
        WHEN tab0.id_tipo_novedad = 3 AND tab11.nombre IS NOT NULL  THEN 'Modalidad: '||tab11.nombre
        WHEN tab0.id_tipo_novedad = 11 AND tab6.motivo_ter IS NOT NULL  THEN 'Motivo Terminación Contrato: '||tab6.motivo_ter
        ELSE 'Sin descripción'
        END as descripcion_detallada,
        
          CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab1.fecha_inicio IS NOT NULL  THEN tab1.fecha_inicio
        WHEN tab0.id_tipo_novedad = 1 AND tab2.fecha_asignacion IS NOT NULL  THEN tab2.fecha_asignacion 
        WHEN tab0.id_tipo_novedad = 5 AND tab3.fecha_asignacion IS NOT NULL  THEN tab3.fecha_asignacion
        WHEN tab0.id_tipo_novedad = 6 AND tab4.fecha_inscripcion IS NOT NULL  THEN tab4.fecha_inscripcion
        WHEN tab0.id_tipo_novedad = 3 AND tab5.fecha_inscripcion IS NOT NULL THEN tab5.fecha_inscripcion
        WHEN tab0.id_tipo_novedad = 11 AND tab6.fecha_ter IS NOT NULL  THEN tab6.fecha_ter
        ELSE null
        END as fecha_inicio,
        
          CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab1.fecha_fin IS NOT NULL  THEN tab1.fecha_fin
        WHEN tab0.id_tipo_novedad = 1 AND tab2.fecha_fin IS NOT NULL  THEN tab2.fecha_fin 
        WHEN tab0.id_tipo_novedad = 3 AND tab5.fecha_fin IS NOT NULL  THEN tab5.fecha_fin
        ELSE null
        END as fecha_fin, 
        
          CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab1.actual IS NOT NULL  THEN tab1.actual
        WHEN tab0.id_tipo_novedad = 1 AND tab2.actual IS NOT NULL  THEN tab2.actual 
        WHEN tab0.id_tipo_novedad = 5 AND tab3.actual IS NOT NULL  THEN tab3.actual
        WHEN tab0.id_tipo_novedad = 6 AND tab4.actual IS NOT NULL  THEN tab4.actual
        WHEN tab0.id_tipo_novedad = 3 AND tab5.actual IS NOT NULL  THEN tab5.actual
        WHEN tab0.id_tipo_novedad = 11 AND tab6.estado IS NOT NULL  THEN tab6.estado
        ELSE null
        END as actual
        
    
FROM ca_novedad tab0 
LEFT join ca_titulo_etapa tab1 on tab0.id_novedad=tab1.id_novedad
LEFT join in_titulo_area tab2 on tab0.id_novedad=tab2.id_novedad
LEFT join in_titulo_competencia tab3 on tab0.id_novedad=tab3.id_novedad
LEFT join ca_titulo_norma tab4 on tab0.id_novedad=tab4.id_novedad
LEFT join rmn_titulo_modalidad tab5 on tab0.id_novedad=tab5.id_novedad
LEFT join rmn_titulo tab6 on tab0.id_titulo=tab6.id_titulo
LEFT join ca_tipo_novedad tab7 on tab0.id_tipo_novedad=tab7.id_tipo_novedad
LEFT join ca_etapa tab8 on tab1.id_etapa=tab8.id_etapa
LEFT join ca_norma_canon tab9 on tab4.id_norma=tab9.id_norma
LEFT join rmn_competencia tab10 on tab3.id_competencia =tab10.id_competencia
LEFT join rmn_modalidad tab11 on tab5.id_modalidad=tab11.id_modalidad

WHERE tab0.id_titulo=$titulo $whereTipoNovedad $whereAprobada $whereFecha
           
 
)tabla
EOD;

            $total_record_count = CN_TABLE::executeSQL($sql);
            $total_record_count = $total_record_count[0]["count"];

            //validar si hay registros
            if ($total_record_count > 0) {


                $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
            
    SELECT tab0.*, tab6.cod_titulo, tab7.nombre as nombre_tn,

        CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab8.nombre IS NOT NULL  THEN 'Etapa: '||tab8.nombre
        WHEN tab0.id_tipo_novedad = 1 AND tab2.area IS NOT NULL  THEN 'Area: '||tab2.area 
        WHEN tab0.id_tipo_novedad = 5 AND tab10.nombre IS NOT NULL  THEN 'Competencia: '||tab10.nombre
        WHEN tab0.id_tipo_novedad = 6 AND tab9.descripcion IS NOT NULL  THEN 'Norma: '||tab9.descripcion
        WHEN tab0.id_tipo_novedad = 3 AND tab11.nombre IS NOT NULL  THEN 'Modalidad: '||tab11.nombre
        WHEN tab0.id_tipo_novedad = 11 AND tab6.motivo_ter IS NOT NULL  THEN 'Motivo Terminación Contrato: '||tab6.motivo_ter
        ELSE 'Sin descripción'
        END as descripcion_detallada,
        
          CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab1.fecha_inicio IS NOT NULL  THEN tab1.fecha_inicio
        WHEN tab0.id_tipo_novedad = 1 AND tab2.fecha_asignacion IS NOT NULL  THEN tab2.fecha_asignacion 
        WHEN tab0.id_tipo_novedad = 5 AND tab3.fecha_asignacion IS NOT NULL  THEN tab3.fecha_asignacion
        WHEN tab0.id_tipo_novedad = 6 AND tab4.fecha_inscripcion IS NOT NULL  THEN tab4.fecha_inscripcion
        WHEN tab0.id_tipo_novedad = 3 AND tab5.fecha_inscripcion IS NOT NULL THEN tab5.fecha_inscripcion
        WHEN tab0.id_tipo_novedad = 11 AND tab6.fecha_ter IS NOT NULL  THEN tab6.fecha_ter
        ELSE null
        END as fecha_inicio,
        
          CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab1.fecha_fin IS NOT NULL  THEN tab1.fecha_fin
        WHEN tab0.id_tipo_novedad = 1 AND tab2.fecha_fin IS NOT NULL  THEN tab2.fecha_fin 
        WHEN tab0.id_tipo_novedad = 3 AND tab5.fecha_fin IS NOT NULL  THEN tab5.fecha_fin
        ELSE null
        END as fecha_fin, 
        
          CASE
        WHEN (tab0.id_tipo_novedad = 2 OR tab0.id_tipo_novedad = 8 OR tab0.id_tipo_novedad = 9 OR tab0.id_tipo_novedad = 10)  AND tab1.actual IS NOT NULL  THEN tab1.actual
        WHEN tab0.id_tipo_novedad = 1 AND tab2.actual IS NOT NULL  THEN tab2.actual 
        WHEN tab0.id_tipo_novedad = 5 AND tab3.actual IS NOT NULL  THEN tab3.actual
        WHEN tab0.id_tipo_novedad = 6 AND tab4.actual IS NOT NULL  THEN tab4.actual
        WHEN tab0.id_tipo_novedad = 3 AND tab5.actual IS NOT NULL  THEN tab5.actual
        WHEN tab0.id_tipo_novedad = 11 AND tab6.estado IS NOT NULL  THEN tab6.estado
        ELSE null
        END as actual
        
    
FROM ca_novedad tab0 
LEFT join ca_titulo_etapa tab1 on tab0.id_novedad=tab1.id_novedad
LEFT join in_titulo_area tab2 on tab0.id_novedad=tab2.id_novedad
LEFT join in_titulo_competencia tab3 on tab0.id_novedad=tab3.id_novedad
LEFT join ca_titulo_norma tab4 on tab0.id_novedad=tab4.id_novedad
LEFT join rmn_titulo_modalidad tab5 on tab0.id_novedad=tab5.id_novedad
LEFT join rmn_titulo tab6 on tab0.id_titulo=tab6.id_titulo
LEFT join ca_tipo_novedad tab7 on tab0.id_tipo_novedad=tab7.id_tipo_novedad
LEFT join ca_etapa tab8 on tab1.id_etapa=tab8.id_etapa
LEFT join ca_norma_canon tab9 on tab4.id_norma=tab9.id_norma
LEFT join rmn_competencia tab10 on tab3.id_competencia =tab10.id_competencia
LEFT join rmn_modalidad tab11 on tab5.id_modalidad=tab11.id_modalidad

WHERE tab0.id_titulo=$titulo $whereTipoNovedad $whereAprobada $whereFecha
                
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;


                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql);


                /*
                 * Solo regsitra log la primera vez de consulta
                 */
                if ($rowStart == 0) {

                    /*
                     * variables por defecto para el registro de log
                     */
                    //id de tabla
                    $id_tabla = 'null';

                    //id de companhia
                    $id_cia = 'null';
                    if (isset($request['id_cia'])) {
                        $id_cia = $request['id_cia'];
                    }

                    //1 - indica operacion de consultar
                    //2 - indica operacion de actualizar
                    //3 - indica operacion de adicionar
                    //4 - indica operacion de eliminar
                    //5 - indica operacion de anular
                    $id_ope_bd = 1;

                    //obtener id maestro tabla
                    $id_mae_bd = CN_TABLE::consultarIdTablaBD('ca_acceso');

                    //id del usuario
                    $id_usuario = 'null';
                    if (isset($request['id_usuario_log'])) {
                        $id_usuario = $request['id_usuario_log'];
                    }
                    //id del tercero del usuario
                    $id_tercero = 'null';
                    if (isset($request['id_tercero_log'])) {
                        $id_tercero = $request['id_tercero_log'];
                    }
                    //comando de funcionalidad
                    $cod_func = 'sin comando';
                    if (isset($request['cod_func'])) {
                        $cod_func = $request['cod_func'];
                    }

                    //construir observacion
                    $observacion = "'Se consulto lista de accesos para un perfil desde la funcionalidad: $cod_func.'";

                    /*
                     * registro de consulta en tabla de log
                     */
                    // $sql = CN_TABLE::registroTableLog($id_tabla, $id_cia, $id_ope_bd, $id_mae_bd, $id_usuario, $id_tercero, $cod_func, $observacion);
                }

                $this->totalRows = $total_record_count;
                $this->startRow = $rowStart;
                $this->endRow = $rowStart + count($records);
                $this->status = 0;
                $this->list_data = $records;
                $this->logMessage("[NOVEDAD_ESPECIFICA] Consulta exitosa.");
            } else {

                $mensaje = "[NOVEDAD_ESPECIFICA] No hay registros de consulta.";
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "ERROR!!! " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage("Error: " . $e->getMessage());
        }
    }

    // Validate
    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

}
