<?php

/**
 * inf_compara_prenomina actions.
 *
 * @package    nomina
 * @subpackage inf_compara_prenomina
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class inf_compara_prenominaActions 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_dif, id_con';
        }


        /*
         * Manejo de errores
         */
        try {
            /*
             * Variables obligatorias
             */
            $periodo = $request['id_periodo'];
            $periodo_ini = $request['id_periodo_ini'];
            $periodo_fin = $request['id_periodo_fin'];

            /*
             * 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 = ' ';
            }
            //Tipo Concepto
            if (isset($request['id_tipo_concepto'])) {
                $whereTipoConcepto = " AND tab0.id_tipo_concepto = " . $request['id_tipo_concepto'];
            } else {
                $whereTipoConcepto = ' ';
            }
            //Concepto
            if (isset($request['id_concep_nomina'])) {
                $whereConcepto = " AND tab0.id_concep_nomina = " . $request['id_concep_nomina'];
            } else {
                $whereConcepto = ' ';
            }
            
                        
     

            //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
             */
            $sql = <<<EOD
select count(*) as count from (

select
nvl(liq.num_doc ,liqcom.num_doc ) as num_doc_dif,
nvl(liq.id_concep_nomina ,liqcom.id_concep_nomina ) as id_con,
liq.id_tipo_doc,
liq.num_doc,
nvl(liq.nombre_completo, liqcom.nombre_completo) as nombre_completo,
nvl(liq.nombre_apellido, liqcom.nombre_apellido) as nombre_apellido,
nvl(liq.componente, liqcom.componente) as componente,
nvl(liq.area, liqcom.area) as area,
nvl(liq.asignacion_basica, liqcom.asignacion_basica) as asignacion_basica,
nvl(liq.banco, liqcom.banco) as banco,
nvl(liq.cuenta, liqcom.cuenta) as cuenta,
nvl(liq.id_cen_op, liqcom.id_cen_op) as id_cen_op,
nvl(liq.centro, liqcom.centro) as centro,
nvl(liq.codigo, liqcom.codigo) as codigo,
nvl(liq.descripcion, liqcom.descripcion) as descripcion,
nvl(liq.tipcon_cod, liqcom.tipcon_cod) as tipcon_cod,
nvl(liq.tipcon_desc, liqcom.tipcon_desc) as tipcon_desc,

liq.id_concep_nomina,
liq.id_periodo,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_ini) as periodo,
liq.num_dias,
liq.valor_liquidado,

liqcom.id_concep_nomina  as con,
liqcom.id_periodo as per,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_fin) as periodo_comp,
liqcom.num_dias as num,
liqcom.valor_liquidado as val,

nvl(liq.retefuente, liqcom.retefuente) as retefuente,

liq.num_dias - liqcom.num_dias as num_dias_dif,
liq.valor_liquidado - liqcom.valor_liquidado as  valor_liquidado_dif,

case when liq.id_periodo is not null and liqcom.id_periodo is not null then 'Ambos periodos'
     when liq.id_periodo is not null and liqcom.id_periodo is null then (select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_ini)
     else (select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_fin) end as marca

from (

    select tab0.* from (

        select
        tab0.id_tipo_doc,
        tab0.num_doc,
        datos.nombre_completo,
        datos.nombre_apellido,
        cargo.componente,
        cargo.area,
        cargo.asignacion_basica,
        banco.descripcion as banco,
        pago.num_cuenta as cuenta,
        cargo.id_cen_op as id_cen_op,
        cargo.centro as centro,
        liq.id_concep_nomina,
        con.codigo,
        con.descripcion,
        con.id_tipo_concepto,
        tipcon.codigo as tipcon_cod,
        tipcon.descripcion as tipcon_desc,
        liq.id_periodo,
        liq.num_dias,
        liq.valor_liquidado,
        (
        select distinct concep.porcentaje
        from no_concepto_periodo concep
        join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
        where concep.num_doc = tab0.num_doc and concep.periodo = $periodo_ini
        ) as retefuente

        from no_estado_func tab0

        left join no_dp_v cargo on cargo.id_dp = tab0.id_dp
        left join no_datos_funcionario_v datos on datos.num_doc = tab0.num_doc and datos.id_tipo_doc = tab0.id_tipo_doc
        left join no_pago_func pago on pago.id_tipo_doc = tab0.id_tipo_doc and pago.num_doc = tab0.num_doc AND pago.estado = 1
        left join ts_bn banco on banco.id_bn = pago.id_bn
        left join no_nombramiento_v nombra
        on nombra.id_tipo_doc = tab0.id_tipo_doc
        and nombra.num_doc = tab0.num_doc
        and nombra.rn = 1

        join(

        select
        liquida.id_tipo_doc,
        liquida.num_doc,
        liquida.id_concep_nomina,
        liquida.id_periodo,
        sum(liquida.num_dias) as num_dias,
        sum(liquida.valor_liquidado) as valor_liquidado
        from no_liquida_nomina liquida
        where liquida.id_periodo = $periodo_ini
        group by liquida.id_tipo_doc,liquida.num_doc,
        liquida.id_concep_nomina,liquida.id_periodo

        ) liq on liq.id_tipo_doc = tab0.id_tipo_doc
        and liq.num_doc = tab0.num_doc
        and liq.id_periodo = tab0.periodo

        join no_concep_nomina con
        on liq.id_concep_nomina = con.id_concep_nomina

        join no_tipo_concepto tipcon
        on tipcon.id_tipo_concepto = con.id_tipo_concepto

        where tab0.periodo = $periodo_ini                 
        $whereFuncionarioNumDoc
        $whereFuncionarioTipoDoc
        and (tab0.actual = 1 or
          ( tab0.actual = 0 and nombra.fecha_retiro
          between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $periodo_ini) ,'dd/mm/yyyy')
           and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $periodo) ,'dd/mm/yyyy') )) + 1
          )
        )

    )tab0

    where
    1 = 1
    $whereTipoConcepto $whereConcepto


)liq

full join(

    select tab0.* from (

        select
        tab0.id_tipo_doc,
        tab0.num_doc,
        datos.nombre_completo,
        datos.nombre_apellido,
        cargo.componente,
        cargo.area,
        cargo.asignacion_basica,
        banco.descripcion as banco,
        pago.num_cuenta as cuenta,
        cargo.id_cen_op as id_cen_op,
        cargo.centro as centro,
        liq.id_concep_nomina,
        con.codigo,
        con.descripcion,
        con.id_tipo_concepto,
        tipcon.codigo as tipcon_cod,
        tipcon.descripcion as tipcon_desc,
        liq.id_periodo,
        liq.num_dias,
        liq.valor_liquidado,
        (
        select distinct concep.porcentaje
        from no_concepto_periodo concep
        join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
        where concep.num_doc = tab0.num_doc and concep.periodo = $periodo_fin
        ) as retefuente

        from no_estado_func tab0

        left join no_dp_v cargo on cargo.id_dp = tab0.id_dp
        left join no_datos_funcionario_v datos on datos.num_doc = tab0.num_doc and datos.id_tipo_doc = tab0.id_tipo_doc
        left join no_pago_func pago on pago.id_tipo_doc = tab0.id_tipo_doc and pago.num_doc = tab0.num_doc AND pago.estado = 1
        left join ts_bn banco on banco.id_bn = pago.id_bn
        left join no_nombramiento_v nombra
        on nombra.id_tipo_doc = tab0.id_tipo_doc
        and nombra.num_doc = tab0.num_doc
        and nombra.rn = 1

        join(

        select
        liquida.id_tipo_doc,
        liquida.num_doc,
        liquida.id_concep_nomina,
        liquida.id_periodo,
        sum(liquida.num_dias) as num_dias,
        sum(liquida.valor_liquidado) as valor_liquidado
        from no_liquida_nomina liquida
        where liquida.id_periodo = $periodo_fin
        group by liquida.id_tipo_doc,liquida.num_doc,
        liquida.id_concep_nomina,liquida.id_periodo

        ) liq on liq.id_tipo_doc = tab0.id_tipo_doc
        and liq.num_doc = tab0.num_doc
        and liq.id_periodo = tab0.periodo

        join no_concep_nomina con
        on liq.id_concep_nomina = con.id_concep_nomina

        join no_tipo_concepto tipcon
        on tipcon.id_tipo_concepto = con.id_tipo_concepto


        where tab0.periodo = $periodo_fin              
        $whereFuncionarioNumDoc
        $whereFuncionarioTipoDoc
        and (tab0.actual = 1 or
          ( tab0.actual = 0 and nombra.fecha_retiro
          between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $periodo_fin) ,'dd/mm/yyyy')
           and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $periodo) ,'dd/mm/yyyy') )) + 1
          )
        )

    )tab0

    where
    1 = 1
    $whereTipoConcepto $whereConcepto

)liqcom
on liqcom.id_tipo_doc = liq.id_tipo_doc
and liqcom.num_doc = liq.num_doc
and liqcom.id_concep_nomina = liq.id_concep_nomina
    
)
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
nvl(liq.num_doc ,liqcom.num_doc ) as num_doc_dif,
nvl(liq.id_concep_nomina ,liqcom.id_concep_nomina ) as id_con,
liq.id_tipo_doc,
liq.num_doc,
nvl(liq.nombre_completo, liqcom.nombre_completo) as nombre_completo,
nvl(liq.nombre_apellido, liqcom.nombre_apellido) as nombre_apellido,
nvl(liq.componente, liqcom.componente) as componente,
nvl(liq.area, liqcom.area) as area,
nvl(liq.asignacion_basica, liqcom.asignacion_basica) as asignacion_basica,
nvl(liq.banco, liqcom.banco) as banco,
nvl(liq.cuenta, liqcom.cuenta) as cuenta,
nvl(liq.id_cen_op, liqcom.id_cen_op) as id_cen_op,
nvl(liq.centro, liqcom.centro) as centro,
nvl(liq.codigo, liqcom.codigo) as codigo,
nvl(liq.descripcion, liqcom.descripcion) as descripcion,
nvl(liq.tipcon_cod, liqcom.tipcon_cod) as tipcon_cod,
nvl(liq.tipcon_desc, liqcom.tipcon_desc) as tipcon_desc,

liq.id_concep_nomina,
liq.id_periodo,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_ini) as periodo,
liq.num_dias,
liq.valor_liquidado,

liqcom.id_concep_nomina  as con,
liqcom.id_periodo as per,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_fin) as periodo_comp,
liqcom.num_dias as num,
liqcom.valor_liquidado as val,

nvl(liq.retefuente, liqcom.retefuente) as retefuente,

liq.num_dias - liqcom.num_dias as num_dias_dif,
liq.valor_liquidado - liqcom.valor_liquidado as  valor_liquidado_dif,

case when liq.id_periodo is not null and liqcom.id_periodo is not null then 'Ambos periodos'
     when liq.id_periodo is not null and liqcom.id_periodo is null then (select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_ini)
     else (select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_fin) end as marca

from (

    select tab0.* from (

        select
        tab0.id_tipo_doc,
        tab0.num_doc,
        datos.nombre_completo,
        datos.nombre_apellido,
        cargo.componente,
        cargo.area,
        cargo.asignacion_basica,
        banco.descripcion as banco,
        pago.num_cuenta as cuenta,
        cargo.id_cen_op as id_cen_op,
        cargo.centro as centro,
        liq.id_concep_nomina,
        con.codigo,
        con.descripcion,
        con.id_tipo_concepto,
        tipcon.codigo as tipcon_cod,
        tipcon.descripcion as tipcon_desc,
        liq.id_periodo,
        liq.num_dias,
        liq.valor_liquidado,
        (
        select distinct concep.porcentaje
        from no_concepto_periodo concep
        join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
        where concep.num_doc = tab0.num_doc and concep.periodo = $periodo_ini
        ) as retefuente

        from no_estado_func tab0

        left join no_dp_v cargo on cargo.id_dp = tab0.id_dp
        left join no_datos_funcionario_v datos on datos.num_doc = tab0.num_doc and datos.id_tipo_doc = tab0.id_tipo_doc
        left join no_pago_func pago on pago.id_tipo_doc = tab0.id_tipo_doc and pago.num_doc = tab0.num_doc AND pago.estado = 1
        left join ts_bn banco on banco.id_bn = pago.id_bn
        left join no_nombramiento_v nombra
        on nombra.id_tipo_doc = tab0.id_tipo_doc
        and nombra.num_doc = tab0.num_doc
        and nombra.rn = 1

        join(

        select
        liquida.id_tipo_doc,
        liquida.num_doc,
        liquida.id_concep_nomina,
        liquida.id_periodo,
        sum(liquida.num_dias) as num_dias,
        sum(liquida.valor_liquidado) as valor_liquidado
        from no_liquida_nomina liquida
        where liquida.id_periodo = $periodo_ini
        group by liquida.id_tipo_doc,liquida.num_doc,
        liquida.id_concep_nomina,liquida.id_periodo

        ) liq on liq.id_tipo_doc = tab0.id_tipo_doc
        and liq.num_doc = tab0.num_doc
        and liq.id_periodo = tab0.periodo

        join no_concep_nomina con
        on liq.id_concep_nomina = con.id_concep_nomina

        join no_tipo_concepto tipcon
        on tipcon.id_tipo_concepto = con.id_tipo_concepto

        where tab0.periodo = $periodo_ini                 
        $whereFuncionarioNumDoc
        $whereFuncionarioTipoDoc
        and (tab0.actual = 1 or
          ( tab0.actual = 0 and nombra.fecha_retiro
          between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $periodo_ini) ,'dd/mm/yyyy')
           and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $periodo) ,'dd/mm/yyyy') )) + 1
          )
        )

    )tab0

    where
    1 = 1
    $whereTipoConcepto $whereConcepto


)liq

full join(

    select tab0.* from (

        select
        tab0.id_tipo_doc,
        tab0.num_doc,
        datos.nombre_completo,
        datos.nombre_apellido,
        cargo.componente,
        cargo.area,
        cargo.asignacion_basica,
        banco.descripcion as banco,
        pago.num_cuenta as cuenta,
        cargo.id_cen_op as id_cen_op,
        cargo.centro as centro,
        liq.id_concep_nomina,
        con.codigo,
        con.descripcion,
        con.id_tipo_concepto,
        tipcon.codigo as tipcon_cod,
        tipcon.descripcion as tipcon_desc,
        liq.id_periodo,
        liq.num_dias,
        liq.valor_liquidado,
        (
        select distinct concep.porcentaje
        from no_concepto_periodo concep
        join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
        where concep.num_doc = tab0.num_doc and concep.periodo = $periodo_fin
        ) as retefuente

        from no_estado_func tab0

        left join no_dp_v cargo on cargo.id_dp = tab0.id_dp
        left join no_datos_funcionario_v datos on datos.num_doc = tab0.num_doc and datos.id_tipo_doc = tab0.id_tipo_doc
        left join no_pago_func pago on pago.id_tipo_doc = tab0.id_tipo_doc and pago.num_doc = tab0.num_doc AND pago.estado = 1
        left join ts_bn banco on banco.id_bn = pago.id_bn
        left join no_nombramiento_v nombra
        on nombra.id_tipo_doc = tab0.id_tipo_doc
        and nombra.num_doc = tab0.num_doc
        and nombra.rn = 1

        join(

        select
        liquida.id_tipo_doc,
        liquida.num_doc,
        liquida.id_concep_nomina,
        liquida.id_periodo,
        sum(liquida.num_dias) as num_dias,
        sum(liquida.valor_liquidado) as valor_liquidado
        from no_liquida_nomina liquida
        where liquida.id_periodo = $periodo_fin
        group by liquida.id_tipo_doc,liquida.num_doc,
        liquida.id_concep_nomina,liquida.id_periodo

        ) liq on liq.id_tipo_doc = tab0.id_tipo_doc
        and liq.num_doc = tab0.num_doc
        and liq.id_periodo = tab0.periodo

        join no_concep_nomina con
        on liq.id_concep_nomina = con.id_concep_nomina

        join no_tipo_concepto tipcon
        on tipcon.id_tipo_concepto = con.id_tipo_concepto


        where tab0.periodo = $periodo_fin              
        $whereFuncionarioNumDoc
        $whereFuncionarioTipoDoc
        and (tab0.actual = 1 or
          ( tab0.actual = 0 and nombra.fecha_retiro
          between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $periodo_fin) ,'dd/mm/yyyy')
           and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $periodo) ,'dd/mm/yyyy') )) + 1
          )
        )

    )tab0

    where
    1 = 1
    $whereTipoConcepto $whereConcepto

)liqcom
on liqcom.id_tipo_doc = liq.id_tipo_doc
and liqcom.num_doc = liq.num_doc
and liqcom.id_concep_nomina = liq.id_concep_nomina

$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_compara_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());
        }
    }

}
