<?php

/**
 * gen_archivos_siif_pago_bf actions.
 *
 * @package    nomina
 * @subpackage gen_archivos_siif_pago_bf
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class gen_archivos_siif_pago_bfActions 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 = 75;
//        }
        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = 'order by num_doc ';
        }



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

            /*
             * 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 = ' ';
            }
            //whereBanco
            if (isset($request['id_bn'])) {
                $whereBanco = " AND tab0.id_bn = " . $request['id_bn'];
            } else {
                $whereBanco = ' ';
            }
            //Tipo Cuenta
            if (isset($request['tipo_cuenta'])) {
                $whereTipoCuenta = " AND tab0.tipo_cuenta = " . $request['tipo_cuenta'];
            } else {
                $whereTipoCuenta = ' ';
            }
            //Filtro Clase planta - 20151119
            if (isset($request['id_clase_planta'])) {
                $whereClasePlanta = " AND tab0.id_clase_planta = " . $request['id_clase_planta'];
            } else {
                $whereClasePlanta = ' ';
            }


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

            /*
             * Tomar nomina mensulay adicional para el valor remunerado - 20210524
             * Se coloca periodo de DEF id-5 para omitir y traer los registros - 20220307::LAVILA
             */
            $sql_consulta = <<<EOD
Select
rownum as consecutivo,
tab.* from(


select
tab0.* ,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_filtro ) as periodo,

--Asignación Básica + Gastos de representación 
concep.valor as valor_remuneracion 


from(

    select
    id_clase_planta,
    id_periodo,
    case when estado = 0 then null else id_bn end as id_bn,
    case when estado = 0 then null else id end as tipo_cuenta,
    id_tipo_doc,
    replace(codigo_siif,'0','0') as codigo_siif,
    num_doc,
    nombre_apellido,
    case when estado = 0 then 'CH' else 'AC' end as medio_pago,
    case when estado = 0 then null else replace(tipo_iden,'0','0') end as tipo_iden,
    case when estado = 0 then null else nit_bn end as nit_bn,
    case when estado = 0 then null else banco end as banco,
    codigo_ach,
    descripcion,
    case when estado = 0 then null else nombre_corto end as nombre_corto,
    case when estado = 0 then null else num_cuenta end as num_cuenta,
    sum(nvl(valor_dev,0)) as valor_dev,
    sum(nvl(valor_ded,0)) as valor_ded,
    sum(nvl(valor,0)) as valor,
    11 as tipo_cuenta_pagar

    from(

        select
        tab7.id_clase_planta,
        rub.descripcion as descripcion_rub, rub.rubro as  codigo_rubro, rub.id_tipo_atributo_contab,
        tab5.operador,
        tab.valor as valorsum,

        tab1.num_doc,tab6.nombre_apellido,
        tab3.codigo||' - '||tab3.descripcion as banco, tab3.codigo_ach,
        tab2.num_cuenta,
        case when nvl(tab2.estado,0) = 0 and tab7.estado = 0 and tab2.fecha_terminacion <= tab7.fecha_termina then 1 else nvl(tab2.estado,0) end as estado,
        case when tab5.operador = 1 then tab1.valor_liquidado
             when tab5.operador = 0 and tab5.id_tipo_concepto_org = 1 then (tab1.valor_liquidado * -1) else (tab1.valor_liquidado * -1) end as valor,
        /*
        case when tab5.operador = 1 and tab5.id_rubro is not null then tab1.valor_liquidado
             when tab5.operador = 0 and tab5.id_rubro is not null and tab5.id_tipo_concepto_org = 1 then (tab1.valor_liquidado * -1) else 0 end as valor_dev,
        case when tab5.operador = 0 and tab5.id_tipo_concepto_org != 1 then tab1.valor_liquidado
             when tab5.operador = 1 and tab5.id_rubro is null and tab5.id_tipo_concepto_org != 1 then (tab1.valor_liquidado * -1) else 0 end as valor_ded,*/

        /*validar si es concepto es de reintegro, que no tenga concepto original se coloca en deducido - 20200819
        o es reintegro y no tiene rubro - 20200916
        */
        case
            when ( esrein.id_concep_nomina is not null and tab5.id_rubro is null ) then 0
            when ( esrein.id_concep_nomina is not null and conorig.id_concep_nomina is null ) then 0

            when tab5.operador = 1 and tab5.id_rubro is not null then tab1.valor_liquidado
            when tab5.operador = 0 and tab5.id_rubro is not null and tab5.id_tipo_concepto_org = 1 then (tab1.valor_liquidado * -1)
        else 0 end as valor_dev,
        case
            when ( esrein.id_concep_nomina is null or ( esrein.id_concep_nomina is not null and conorig.id_concep_nomina is null ) or  ( esrein.id_concep_nomina is not null and tab5.id_rubro is null ) )
                and tab5.operador = 0 and tab5.id_tipo_concepto_org = 1 then tab1.valor_liquidado
            when ( esrein.id_concep_nomina is null or ( esrein.id_concep_nomina is not null and conorig.id_concep_nomina is null ) or  ( esrein.id_concep_nomina is not null and tab5.id_rubro is null ) )
                and tab5.operador = 1 and tab5.id_rubro is null and tab5.id_tipo_concepto_org = 1 then (tab1.valor_liquidado * -1)
            when tab5.operador = 0 and tab5.id_tipo_concepto_org != 1 then tab1.valor_liquidado
            when tab5.operador = 1 and tab5.id_rubro is null and tab5.id_tipo_concepto_org != 1 then (tab1.valor_liquidado * -1)
        else 0 end as valor_ded,

        tab1.id_periodo,
        tab1.id_tipo_doc, tab3.id_bn, terbn.NUM_DOC as nit_bn, tipiden.codigo_siif as tipo_iden,
        tab4.id,
        tab4.descripcion,
        tab4.nombre_corto,
        tab8.codigo_siif
        from no_liquida_nomina tab1

        left join no_concep_nomina tab5 on tab5.id_concep_nomina = tab1.id_concep_nomina
        left join pr_rubro_presup_v rub on  rub.id_rubro = tab5.id_rubro
        left join no_datos_funcionario_v tab6  on tab6.id_tipo_doc = tab1.id_tipo_doc and tab6.num_doc = tab1.num_doc

        --join no_pago_func tab2 on tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.num_doc asc, aut.fecha_activacion desc, aut.id_pago_func desc
           ) AS rn
          from no_pago_func aut
        )tab2
        on tab1.id_tipo_doc = tab2.id_tipo_doc and tab1.num_doc = tab2.num_doc
        and tab2.rn = 1
        left join no_nombramiento_v tab7  ON tab7.id_tipo_doc = tab1.id_tipo_doc and tab7.num_doc = tab1.num_doc

        left join ts_bn tab3 on tab3.id_bn = tab2.id_bn
        left join interceros terbn
        on terbn.id_mae_ter = tab3.id_mae_ter
        left join tipo_identificacion tipiden
        on tipiden.id_tipo_identificacion = terbn.id_tipo_doc

        left join ts_tc tab4 on tab4.id = tab2.tipo_cuenta

        join tipo_documento tab8 on tab8.id_tipo_doc = tab1.id_tipo_doc

        left join(

            select

            tab.id_periodo,
            tab.id_tipo_doc,
            tab.num_doc,
            tab.nombre_apellido,
            tab.estado,

            sum(nvl(tab.valor,0)) as valor,
            sum(nvl(tab.valor_dev,0)) as valor_dev,
            sum(nvl(tab.valor_ded,0)) as valor_ded

            from(

                select
                rub.descripcion as descripcion_rub, rub.rubro as  codigo_rubro, rub.id_tipo_atributo_contab,
                tab5.operador,
                tab1.num_doc,tab6.nombre_apellido,

                case when nvl(tab2.estado,0) = 0 and tab7.estado = 0 and tab2.fecha_terminacion <= tab7.fecha_termina then 1 else nvl(tab2.estado,0) end as estado,
        case when tab5.operador = 1 then tab1.valor_liquidado
             when tab5.operador = 0 and tab5.id_tipo_concepto_org = 1 then (tab1.valor_liquidado * -1) else (tab1.valor_liquidado * -1) end as valor,
        case when tab5.operador = 1 then tab1.valor_liquidado
             when tab5.operador = 0 and tab5.id_tipo_concepto_org = 1 then (tab1.valor_liquidado * -1) else 0 end as valor_dev,
        case when tab5.operador = 0 and tab5.id_tipo_concepto_org != 1 then tab1.valor_liquidado else 0 end as valor_ded,
                tab1.id_periodo,
                tab1.id_tipo_doc

                from no_liquida_nomina tab1

                left join no_concep_nomina tab5 on tab5.id_concep_nomina = tab1.id_concep_nomina
                left join pr_rubro_presup_v rub on  rub.id_rubro = tab5.id_rubro
                left join no_datos_funcionario_v tab6  on tab6.id_tipo_doc = tab1.id_tipo_doc and tab6.num_doc = tab1.num_doc

                --join no_pago_func tab2 on tab2.id_tipo_doc = tab1.id_tipo_doc and tab2.num_doc = tab1.num_doc
                left join (
                  SELECT
                   aut.*,
                   ROW_NUMBER() OVER (
                    partition by aut.num_doc
                    ORDER BY aut.num_doc asc, aut.fecha_activacion desc, aut.id_pago_func desc
                   ) AS rn
                  from no_pago_func aut
                )tab2
                on tab1.id_tipo_doc = tab2.id_tipo_doc and tab1.num_doc = tab2.num_doc
                and tab2.rn = 1
                left join no_nombramiento_v tab7  ON tab7.id_tipo_doc = tab1.id_tipo_doc and tab7.num_doc = tab1.num_doc


                where
                tab1.id_periodo = $periodo_filtro
                and tab5.pago_func = 1

                and (case when tab5.operador = 0 then 1 else (case when nvl(rub.id_tipo_atributo_contab,1) = 1 then 1 else 0 end) end) = 1

            )tab

            group by
            tab.id_periodo,
            tab.id_tipo_doc,
            tab.num_doc,
            tab.nombre_apellido,
            tab.estado

        )tab
        on tab.id_periodo = tab1.id_periodo
        and tab.id_tipo_doc = tab1.id_tipo_doc
        and tab.num_doc = tab1.num_doc

        left join(

            select
              liq.id_tipo_doc,
              liq.num_doc,
              concep.id_concep_rein as id_concep_nomina,
              liq.id_periodo,
              sum(liq.valor_liquidado) as valor_liquidado

            from no_concep_nomina concep

            left join no_liquida_nomina liq
            on concep.id_concep_nomina = liq.id_concep_nomina

            where
            concep.id_concep_rein is not null
            and concep.id_tipo_concepto = 1
            AND concep.id_rubro is not null

              group by
              liq.id_tipo_doc,
              liq.num_doc,
              concep.id_concep_rein,
              liq.id_periodo
        )conorig
        on conorig.id_concep_nomina = tab5.id_concep_nomina
          and conorig.id_tipo_doc = tab1.id_tipo_doc
          and conorig.num_doc = tab1.num_doc
          and conorig.id_periodo = tab1.id_periodo

        left join(

            select
              concep.*
            from no_concep_nomina concep

            where
            concep.id_concep_nomina in (select no_concep_nomina.id_concep_rein from no_concep_nomina
                    where
                    id_concep_rein is not null
                    and id_tipo_concepto = 1
                    AND id_rubro is not null)
        )esrein
        on esrein.id_concep_nomina = tab5.id_concep_nomina

        where
        tab1.id_periodo = $periodo_filtro
        and tab5.pago_func = 1
        /*Filtra seegun atributo contable del rubro*/
        and (case when 0 = $id_tipo_atributo_contab then 1
                  when tab5.operador = 0
                  then (case when tab.valor >= 0 and 1 = $id_tipo_atributo_contab then 1
                             when tab.valor <  0 and 2 = $id_tipo_atributo_contab then 1
                             else 0 end)
                  else (case when nvl(rub.id_tipo_atributo_contab,1) = $id_tipo_atributo_contab
                             then 1
                             else 0 end) end
            ) = 1

    )
    group by
    id_clase_planta,
    codigo_siif,
    num_doc,nombre_apellido,
    tipo_iden,
    nit_bn,
    banco,codigo_ach,
    num_cuenta,descripcion,id_periodo,
    id_tipo_doc, id_bn, id, nombre_corto, estado

)tab0

left join(

    select

    concep.num_doc,
    concep.id_tipo_doc,
    sum(concep.valor) as valor
    
    from (
    
        SELECT
        concep.num_doc,
        concep.id_tipo_doc,
        concep.id_concep_nomina,
        concep.valor,
        concep.fecha_desde,
        concep.fecha_hasta,
           ROW_NUMBER() OVER (
            partition by concep.num_doc, concep.id_concep_nomina
            ORDER BY concep.num_doc, per.id_tipo_periodo, concep.fecha_desde desc, concep.fecha_hasta desc
           ) AS rn

        FROM no_concepto_periodo concep

        left join no_periodo per
        on per.id_periodo = concep.periodo

        where
        per.id_tipo_periodo in (1,2)
        and concep.id_anhos = ( select distinct periodo.id_anhos from no_periodo_v periodo where periodo.id_periodo = $periodo_filtro )
        and concep.id_meses = ( select distinct periodo.id_meses from no_periodo_v periodo where periodo.id_periodo = $periodo_filtro )
        and concep.id_concep_nomina in ( select no_param_concep.id_concep_basica from no_param_concep union select no_param_concep.id_concep_gasto_repre from no_param_concep)
        and concep.id_periodo_ajuste is null
    
    )concep
    
    where
    concep.rn = 1
    
    group by
    concep.num_doc,
    concep.id_tipo_doc

)concep
on concep.num_doc = tab0.num_doc
and concep.id_tipo_doc = tab0.id_tipo_doc

where
1 = 1
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
$whereClasePlanta

and (

    tab0.num_doc not in (
     select nom.num_doc from no_nombramiento_v nom
      where nom.fecha_retiro is not null
      and (select no_periodo.fecha_ini from no_periodo
            where id_periodo = $periodo_filtro) > trunc(last_day( nom.fecha_termina ))
    )

    or

    (select distinct periodo.id_tipo_periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_filtro) in (6,7,2,5)

)

order by
tab0.num_doc

)tab
EOD;

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
//            $sql = <<<EOD
//select count(*) as count from (
//
//$sql_consulta
//                    
//)
//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 (
//    
//$sql_consulta
//
//ORDER BY 
//tab0.denominacion_comp,
//tab0.grado_comp
//          
//) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
//EOD;
//            //ejecuta y obtiene el resultado del sql
//            $resultado = CN_TABLE::executeSQL($sql);
            //obtener el listado de recaudos
            $sql = <<<EOD
    
$sql_consulta

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


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

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

}
