<?php

/**
 * certif_labor actions.
 *
 * @package    nomina
 * @subpackage certif_labor
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:45Z Kris.Wallsmith $
 */
class certif_laborActions extends sfQuery {

    /**
     * Executes list action
     * Se cambia por execute list, para filtro de periodo de retirados - 20150305
     *
     * @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");


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

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

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = 'order by tab0.num_doc';
        }


        /*
         * Manejo de errores
         */
        try {
            /*
             * Variables obligatorias
             */
            //$periodo_filtro = $request['id_periodo_filtro'];
            $periodo = $request['id_periodo'];
            $tipo_certificacion = $request['tipo_certificacion'];
            $id_certificacion = $request['id_certificacion'];
            $fecha_corte = $request['fecha_corte'];


            /*
             * Variables opcionales
             */
            //funcionario
            if (isset($request['num_doc'])) {
                $whereFuncionarioNumDoc = " AND tab0.num_doc = " . $request['num_doc'];
            } else {
                $whereFuncionarioNumDoc = ' ';
            }
            //funcionario
            if (isset($request['id_tipo_doc'])) {
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            } else {
                $whereFuncionarioTipoDoc = ' ';
            }

            /*
             * 1 - Certificados Laborales , 2 - Resolucion de Vacaciones , 3 - Certificados Retirados
             */
            if ($tipo_certificacion == 3) {
                $wherePeriodo = <<<EOD
and tab1.fecha_termina is not null and tab1.fecha_termina <= to_date('$fecha_corte','YYYY-mm-dd')
AND tab0.id_periodo in (
    select distinct tab.periodo from(
            SELECT
             tab0.*,
             ROW_NUMBER() OVER (
              partition by tab0.num_doc
              ORDER BY tab0.num_doc, tab0.id_anhos desc, tab0.id_meses desc
             ) AS rn
            from no_estado_func tab0
            join no_periodo per on per.id_periodo = tab0.periodo
            where
            per.id_tipo_periodo = 1
            $whereFuncionarioNumDoc $whereFuncionarioTipoDoc 
      ) tab
      where  tab.rn = 1
      and tab0.num_doc = tab.num_doc
) 
EOD;
            } else {

                //SQL Traer periodo mensual, del periodo filtrado - 20150702
                $sql = <<<EOD
select id_periodo from (
    select 
    * from no_periodo
    where 
    id_tipo_periodo = 1
    --and id_periodo = $periodo
    and id_anhos = (select id_anhos from no_periodo where id_periodo = $periodo)
    and id_meses = (select id_meses from no_periodo where id_periodo = $periodo)
)  
EOD;


                $total_record = CN_TABLE::executeSQL($sql);

                //validar que hay periodo mensual, sino trae el ultimo mensual - 20150702
                if (count($total_record) > 0) {
                    $wherePeriodo = <<<EOD
and tab1.fecha_ingreso <= to_date('$fecha_corte','YYYY-mm-dd') 
AND tab0.id_periodo in (   
    select id_periodo from (
        select 
        * from no_periodo
        where 
        id_tipo_periodo = 1
        --and id_periodo = $periodo
        and id_anhos = (select id_anhos from no_periodo where id_periodo = $periodo)
        and id_meses = (select id_meses from no_periodo where id_periodo = $periodo)
    )      
)                         
EOD;
                } else {
                    $wherePeriodo = <<<EOD
and tab1.fecha_ingreso <= to_date('$fecha_corte','YYYY-mm-dd') 
AND tab0.id_periodo in (   
    select id_periodo from (
        select 
        per.*,
        ROW_NUMBER() OVER (
          partition by per.id_tipo_periodo
          ORDER BY per.fecha_fin desc
        ) AS rn
        from no_periodo per
        where 
        per.id_tipo_periodo = 1
        --and id_periodo = $periodo
        and per.id_anhos <= (select id_anhos from no_periodo where id_periodo = $periodo)
        and per.id_meses <= (select id_meses from no_periodo where id_periodo = $periodo)
    )
    where 
    rn = 1      
)                         
EOD;
                }
            }


            //sentencia sql
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
            //ejecuta y obtiene el resultado del sql
            CN_TABLE::executeSQL($sql);

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             * Se anexa NO_CONSULTA_SQL_F para valor de prima meritos de COL, para certif de funciones - 20151007
             */
            $sql = <<<EOD
select count(*) as count from (

    select 
    nvl(tab0.asignacion_basica,0) + nvl(tab0.valor_prim,0) as valor_sum_total,
    tab0.* 
    from (

        SELECT   

    nvl(NO_CONSULTA_SQL_F(0, 0, 0, 0, tab0.id_tipo_doc, tab0.num_doc, 44, 'C', tab0.id_periodo),0) as valor_prim,

            tab0.id_tipo_doc as id_tipo_doc, 
            tab0.num_doc as num_doc, 
            tab0.nombre_completo as nombre_completo, 
            tab0.nombre_apellido as nombre_apellido, 
            tab0.cargo as cargo, 
            tab0.codigo_comp as codigo_comp, 
            tab0.grado_comp as grado_comp, 
            tab0.denominacion_comp as denominacion_comp, 
            tab0.dependencia as dependencia, 
            case when $tipo_certificacion = 3 then nvl(tabper.valor,0) else tab0.asignacion_basica end as asignacion_basica, 
            tab0.devengados as devengados, 
            tab0.deducidos as deducidos, 
            tab0.neto as neto, 
            tab0.id_periodo as id_periodo, 
            tab0.banco as banco, 
            tab0.cuenta as cuenta, 
            tab0.tipper as tipper, 
            tab0.periodo as periodo, 
            tab0.tipper||'  '||tab0.periodo as periodo_completo, 
            tab0.email as email, tab0.id_dp as id_dp, 
            tab0.sexo as sexo, 
            to_char(tab1.fecha_ingreso, 'YYYY-MM-DD') as fecha_ingreso 

            FROM NO_LIQUIDA_V tab0

            left join(
                SELECT
                tab0.*,
                ROW_NUMBER() OVER (
                    partition by tab0.num_doc
                    ORDER BY tab0.num_doc, tab0.id_anhos desc, tab0.id_meses desc, tab0.fecha_hasta desc
                ) AS rn
                from no_concepto_periodo tab0
                join no_periodo per on per.id_periodo = tab0.periodo
                where
                tab0.id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1)
                $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
            )tabper
            ON tab0.id_tipo_doc = tabper.id_tipo_doc
            AND tab0.num_doc = tabper.num_doc
            and tabper.rn = 1  

            JOIN (

                select 
                nom.*,
                row_number() over (
                partition by nom.num_doc
                order by nom.num_doc, nom.id_nombramiento desc
                ) AS rn

                from no_nombramiento nom
                where
                nvl(nom.fecha_retiro,trunc(sysdate)+1) <= (to_date('$fecha_corte','YYYY-MM-DD') + 1)    

            )tab1 ON tab0.id_tipo_doc = tab1.id_tipo_doc
            AND tab0.num_doc = tab1.num_doc 
            and tab1.rn = 1 

            WHERE  tab0.id_periodo != '-1' 
            $wherePeriodo 
            $whereFuncionarioNumDoc $whereFuncionarioTipoDoc      

    )tab0    

) 
EOD;


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


            //obtener el listado de recaudos
            /*
             * Se anexa NO_CONSULTA_SQL_F para valor de prima meritos de COL, para certif de funciones - 20151007
             */
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

    select 
                    
    case when nvl((select count(cert.id_certificacion_func) from no_certificacion_func cert 
    where cert.id_certificacion = $id_certificacion and cert.id_tipo_doc = tab0.id_tipo_doc and cert.num_doc = tab0.num_doc),0) >= 1 then 1 else 0 end as estado,                       
                    
    nvl(tab0.asignacion_basica,0) + nvl(tab0.valor_prim,0) as valor_sum_total,
    tab0.* 
    from (

        SELECT   

    nvl(NO_CONSULTA_SQL_F(0, 0, 0, 0, tab0.id_tipo_doc, tab0.num_doc, 44, 'C', tab0.id_periodo),0) as valor_prim,

            tab0.id_tipo_doc as id_tipo_doc, 
            tab0.num_doc as num_doc, 
            tab0.nombre_completo as nombre_completo, 
            tab0.nombre_apellido as nombre_apellido, 
            tab0.cargo as cargo, 
            tab0.codigo_comp as codigo_comp, 
            tab0.grado_comp as grado_comp, 
            tab0.denominacion_comp as denominacion_comp, 
            tab0.dependencia as dependencia, 
            case when $tipo_certificacion = 3 then nvl(tabper.valor,0) else tab0.asignacion_basica end as asignacion_basica, 
            tab0.devengados as devengados, 
            tab0.deducidos as deducidos, 
            tab0.neto as neto, 
            tab0.id_periodo as id_periodo, 
            tab0.banco as banco, 
            tab0.cuenta as cuenta, 
            tab0.tipper as tipper, 
            tab0.periodo as periodo, 
            tab0.tipper||'  '||tab0.periodo as periodo_completo, 
            tab0.email as email, tab0.id_dp as id_dp, 
            tab0.sexo as sexo, 
            to_char(tab1.fecha_ingreso, 'YYYY-MM-DD') as fecha_ingreso 

            FROM NO_LIQUIDA_V tab0

            left join(
                SELECT
                tab0.*,
                ROW_NUMBER() OVER (
                    partition by tab0.num_doc
                    ORDER BY tab0.num_doc, tab0.id_anhos desc, tab0.id_meses desc, tab0.fecha_hasta desc
                ) AS rn
                from no_concepto_periodo tab0
                join no_periodo per on per.id_periodo = tab0.periodo
                where
                tab0.id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1)
                $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
            )tabper
            ON tab0.id_tipo_doc = tabper.id_tipo_doc
            AND tab0.num_doc = tabper.num_doc
            and tabper.rn = 1   

            JOIN (

                select 
                nom.*,
                row_number() over (
                partition by nom.num_doc
                order by nom.num_doc, nom.id_nombramiento desc
                ) AS rn

                from no_nombramiento nom
                where
                nvl(nom.fecha_retiro,trunc(sysdate)+1) <= (to_date('$fecha_corte','YYYY-MM-DD') + 1)    

            )tab1 ON tab0.id_tipo_doc = tab1.id_tipo_doc
            AND tab0.num_doc = tab1.num_doc 
            and tab1.rn = 1 

            WHERE  tab0.id_periodo != '-1' 
            $wherePeriodo 
            $whereFuncionarioNumDoc $whereFuncionarioTipoDoc      

    )tab0  
    
$sortBy
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);


            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($resultado);
            $this->list_data = $resultado;
            $this->logMessage("[inf_prenomina] Consulta exitosa.");
        } catch (Exception $e) {

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'NO_LIQUIDA_V',
        'NO_NOMBRAMIENTO_V'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'NO_NOMBRAMIENTO_V' =>
        array(
            'id_tipo_doc' => 'NO_LIQUIDA_V',
            'num_doc' => 'NO_LIQUIDA_V'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'NO_LIQUIDA_V' =>
        array(
            'id_tipo_doc' => 'id_tipo_doc',
            'num_doc' => 'num_doc',
            'nombre_completo' => 'nombre_completo',
            'nombre_apellido' => 'nombre_apellido',
            'cargo' => 'cargo',
            'codigo_comp' => 'codigo_comp',
            'grado_comp' => 'grado_comp',
            'denominacion_comp' => 'denominacion_comp',
            'dependencia' => 'dependencia',
            'asignacion_basica' => 'asignacion_basica',
            'devengados' => 'devengados',
            'deducidos' => 'deducidos',
            'neto' => 'neto',
            'id_periodo' => 'id_periodo',
            'banco' => 'banco',
            'cuenta' => 'cuenta',
            'tipper' => 'tipper',
            'periodo' => 'periodo',
            'tipper,||,  ,||,periodo' => 'periodo_completo',
            'email' => 'email',
            'id_dp' => 'id_dp',
            'sexo' => 'sexo'
        ),
        'NO_NOMBRAMIENTO_V' =>
        array(
            'fecha_ingreso' => 'fecha_ingreso'
        )
    ); //por cada tabla especificar los campos del select

    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'NO_LIQUIDA_V' => array(
            'id_periodo,a' => array('!=' => array(-1)),
            'id_periodo,b' => array('=' => array('id_periodo')),
            'id_tipo_doc' => array('=' => array('id_tipo_doc')),
            'num_doc' => array('=' => array('num_doc')),
            'id_dp' => array('=' => array('id_dp')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        ),
        'NO_NOMBRAMIENTO_V' => array(
//            'estado' => array('=' => array('estado_ret')),
            'fecha_ingreso' => array('<=' => array('fecha_corte'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(); // filtros de condicion or
//    protected $query_qualifier = 'DISTINCT'; //Variable para el sql para eliminar filas repetidas
    protected $fields_orderBy = array(
        'num_doc'
    ); //campos para el ordenamiento de la consulta
//    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = true;
    //si es servicio para filtro agregar campo
//    protected $filtro = 'Area';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;

    /**
     * Construccion de observacion perzonalizada
     * 
     * Toda variable para tomarla del request con el formato:
     * &request-variable&
     * 
     * false - observacion por defecto
     *
     * @var string 
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

    // 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;
    }

}
