<?php

/**
 * decla_men_rete actions.
 *
 * @package    nomina
 * @subpackage decla_men_rete
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class decla_men_reteActions extends sfActions {

    /**
     * Executes list action
     *
     * @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 = 1000;
        }

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


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

            /*
             * 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 = ' ';
            }

            //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 cambia consulta para que tome el valor de ajuste y reintegro del concepto de retencion - 20141210
             * Validacion para division por 0 - 20160912
             * Se toma la base calculada si tiene - 20190305
             */
            $sql = <<<EOD
select count(*) as count from (

    select 
    tab0.codigo_tipper,
    tab0.ID_TIPO_DOC,
    tab0.NUM_DOC,
    tab0.ID_PERIODO,
    tab0.NOMBRE_APELLIDO,
    tab0.NOMBRE_COMPLETO,
    sum(tab0.VALOR_LIQUIDADO) as VALOR_LIQUIDADO,
    
    case 
    when sum(tab0.VALOR_BASE) > 0 then round(sum(tab0.VALOR_BASE),-3) 
    when max(tab1.id_tipo_proced_rete) != 1
    then round(sum(tab0.valor_liquidado) * 100 / case when max(tab0.porcentaje) != 0 then max(tab0.porcentaje) else 100 end ,-3) 
    else round(sum(tab0.VALOR_BASE),-3) end as valor_base_liq,
                    
    tab0.descripcion_tipper || ' ' || tab0.id_meses || ' - ' || tab0.id_anhos as periodo
            
    from(                     
    
            select 
            liq.ID_LIQUIDA_NOMINA,
            liq.ID_TIPO_DOC,
            liq.NUM_DOC,
            liq.ID_CONCEP_NOMINA,
            liq.ID_PERIODO,
            
            case when (select id_concep_rein as concep from no_concep_nomina where id_concep_nomina = (select no_param_concep.id_concep_rete from no_param_concep)) = liq.ID_CONCEP_NOMINA
            then liq.VALOR_LIQUIDADO *(-1)
            else liq.VALOR_LIQUIDADO end as VALOR_LIQUIDADO,
            
            
            liq.FECHA_DESDE,
            liq.FECHA_HASTA,
            liq.NUM_DIAS,
            liq.VALOR_BASE,
            liq.PORCENTAJE,
            liq.NUM_DIAS_BASE,
            liq.NOMBRE_APELLIDO,
            liq.NOMBRE_COMPLETO,
            liq.CODIGO,
            liq.DESCRIPCION,
            liq.ESTADO,
            liq.ABREVIATURA,
            liq.OPERADOR,
            liq.ID_TIPO_CONCEPTO,
            liq.CODIGO_TIPCON,
            liq.DESCRIPCION_TIPCON,
            liq.ORDEN,
            liq.ID_ANHOS,
            liq.ID_MESES,
            liq.FECHA_INI,
            liq.FECHA_FIN,
            liq.ESTADO_PER,
            liq.ACTIVO_PER,
            liq.ID_TIPO_PERIODO,
            liq.CODIGO_TIPPER,
            liq.DESCRIPCION_TIPPER
            
            from no_liquida_nomina_v liq
            
            where
            liq.id_concep_nomina in (
                select id_concep_ajuste as concep from no_concep_nomina where id_concep_nomina = (select no_param_concep.id_concep_rete from no_param_concep)
                union
                select id_concep_rein as concep from no_concep_nomina where id_concep_nomina = (select no_param_concep.id_concep_rete from no_param_concep)
                union
                (select no_param_concep.id_concep_rete as concep from no_param_concep)
            )
    
    )tab0
    
    left join (
         select 
          aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.id_novedad_proced_rete desc, estado desc
           ) AS rn
          from no_novedad_proced_rete aut
    )tab1
    on tab1.num_doc = tab0.num_doc
    and tab1.rn = 1
    
    where 
    tab0.id_anhos = $id_anhos
    and tab0.id_meses = $id_meses
    $whereFuncionarioNumDoc
    $whereFuncionarioTipoDoc
    
    group by
    tab0.ID_TIPO_DOC,
    tab0.NUM_DOC,
    tab0.ID_PERIODO,
    tab0.NOMBRE_APELLIDO,
    tab0.NOMBRE_COMPLETO,
    tab0.descripcion_tipper,
    tab0.id_meses,
    tab0.id_anhos,tab0.codigo_tipper
    
)
EOD;


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


            //obtener el listado de recaudos
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

    select 
    tab0.codigo_tipper,
    tab0.ID_TIPO_DOC,
    tab0.NUM_DOC,
    tab0.ID_PERIODO,
    tab0.NOMBRE_APELLIDO,
    tab0.NOMBRE_COMPLETO,
    sum(tab0.VALOR_LIQUIDADO) as VALOR_LIQUIDADO,
    
    case 
    when sum(tab0.VALOR_BASE) > 0 then round(sum(tab0.VALOR_BASE),-3) 
    when max(tab1.id_tipo_proced_rete) != 1
    then round(sum(tab0.valor_liquidado) * 100 / case when max(tab0.porcentaje) != 0 then max(tab0.porcentaje) else 100 end ,-3) 
    else round(sum(tab0.VALOR_BASE),-3) end as valor_base_liq,
                    
    tab0.descripcion_tipper || ' ' || tab0.id_meses || ' - ' || tab0.id_anhos as periodo
            
    from(                     
    
            select 
            liq.ID_LIQUIDA_NOMINA,
            liq.ID_TIPO_DOC,
            liq.NUM_DOC,
            liq.ID_CONCEP_NOMINA,
            liq.ID_PERIODO,
            
            case when (select id_concep_rein as concep from no_concep_nomina where id_concep_nomina = (select no_param_concep.id_concep_rete from no_param_concep)) = liq.ID_CONCEP_NOMINA
            then liq.VALOR_LIQUIDADO *(-1)
            else liq.VALOR_LIQUIDADO end as VALOR_LIQUIDADO,
            
            
            liq.FECHA_DESDE,
            liq.FECHA_HASTA,
            liq.NUM_DIAS,
            liq.VALOR_BASE,
            liq.PORCENTAJE,
            liq.NUM_DIAS_BASE,
            liq.NOMBRE_APELLIDO,
            liq.NOMBRE_COMPLETO,
            liq.CODIGO,
            liq.DESCRIPCION,
            liq.ESTADO,
            liq.ABREVIATURA,
            liq.OPERADOR,
            liq.ID_TIPO_CONCEPTO,
            liq.CODIGO_TIPCON,
            liq.DESCRIPCION_TIPCON,
            liq.ORDEN,
            liq.ID_ANHOS,
            liq.ID_MESES,
            liq.FECHA_INI,
            liq.FECHA_FIN,
            liq.ESTADO_PER,
            liq.ACTIVO_PER,
            liq.ID_TIPO_PERIODO,
            liq.CODIGO_TIPPER,
            liq.DESCRIPCION_TIPPER
            
            from no_liquida_nomina_v liq
            
            where
            liq.id_concep_nomina in (
                select id_concep_ajuste as concep from no_concep_nomina where id_concep_nomina = (select no_param_concep.id_concep_rete from no_param_concep)
                union
                select id_concep_rein as concep from no_concep_nomina where id_concep_nomina = (select no_param_concep.id_concep_rete from no_param_concep)
                union
                (select no_param_concep.id_concep_rete as concep from no_param_concep)
            )
    
    )tab0
    
    left join (
         select 
          aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.id_novedad_proced_rete desc, estado desc
           ) AS rn
          from no_novedad_proced_rete aut
    )tab1
    on tab1.num_doc = tab0.num_doc
    and tab1.rn = 1
    
    where 
    tab0.id_anhos = $id_anhos
    and tab0.id_meses = $id_meses
    $whereFuncionarioNumDoc
    $whereFuncionarioTipoDoc
    
    group by
    tab0.ID_TIPO_DOC,
    tab0.NUM_DOC,
    tab0.ID_PERIODO,
    tab0.NOMBRE_APELLIDO,
    tab0.NOMBRE_COMPLETO,
    tab0.descripcion_tipper,
    tab0.id_meses,
    tab0.id_anhos,tab0.codigo_tipper

    $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("[decla_men_rete] 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());
        }
    }

}
