<?php

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


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

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

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

            $tag_error = false;

            //Consulta para determinar Neto negativo o 0 - 20160218
            $sql = <<<EOD

select
tab0.id_tipo_doc,
tab0.num_doc,
tab0.nombre_completo,
tab0.nombre_apellido,
tab0.componente as cargo,
tab0.area as dependencia,
nvl( tab0.valor_sal , tab0.asignacion_basica ) as asignacion_basica,
tab0.asignacion_basica as ab,
tab0.valor_sal as valor_sal,
nvl(tab0.devengados,0) as devengados,
nvl(tab0.deducidos,0) as deducidos,
nvl(tab0.devengados,0)-nvl(tab0.deducidos,0) as neto/*,
tab0.id_periodo,
tab0.banco,
tab0.cuenta,
tab0.id_cen_op,
nvl(tab0.centro,'Sin Especificar') as centro,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = 258) as periodo,
(
select distinct max(concep.porcentaje) as 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_filtro
) as retefuente*/

from(
    
    select
    sal.valor as valor_sal,
    func.id_tipo_doc,
    func.num_doc,
    datos.nombre_completo,
    datos.nombre_apellido,
    cargo.componente,
    cargo.area,
    cargo.asignacion_basica,
    deven.valor as devengados,
    deduc.valor as deducidos,
    deven.id_periodo as id_periodo,
    banco.descripcion as banco,
    pago.num_cuenta as cuenta,
    cargo.id_cen_op as id_cen_op,
    cargo.centro as centro
    
    from no_estado_func_v func
    
    left join no_dp_v cargo on cargo.id_dp = func.id_dp
    left join no_datos_funcionario_v datos on datos.num_doc = func.num_doc and datos.id_tipo_doc = func.id_tipo_doc
    left join(
    
    select liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo,sum(liquida.valor_liquidado) as valor
    from no_liquida_nomina liquida
    left join no_concep_nomina concep on concep.id_concep_nomina = liquida.id_concep_nomina
                        
    where concep.id_tipo_concepto = 1 and liquida.id_periodo = $periodo_filtro
    and concep.pago_func = 1
                        
    group by liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo
    
    ) deven on deven.id_tipo_doc = func.id_tipo_doc and deven.num_doc = func.num_doc and deven.id_periodo = func.periodo
    left join(
    
    select liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo,sum(liquida.valor_liquidado) as valor
    from no_liquida_nomina liquida
    left join no_concep_nomina concep on concep.id_concep_nomina = liquida.id_concep_nomina
    where concep.id_tipo_concepto  !=1 and liquida.id_periodo = $periodo_filtro
    group by liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo
    
    ) deduc on deduc.id_tipo_doc = func.id_tipo_doc and deduc.num_doc = func.num_doc and deduc.id_periodo = func.periodo
    left join no_pago_func pago on pago.id_tipo_doc = func.id_tipo_doc and pago.num_doc = func.num_doc AND pago.estado = 1
    left join ts_bn banco on banco.id_bn = pago.id_bn
    
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.estado ASC
       ) AS rn
      from no_nombramiento aut
    )nombra
    on nombra.id_tipo_doc = func.id_tipo_doc 
    and nombra.num_doc = func.num_doc
    and nombra.rn = 1
    
    /* Se cambia salario por registro de concepto_periodo, para tener el que se pago en el periodo - 20150609*/
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.fecha_hasta desc, aut.id_concepto_periodo desc
       ) AS rn
      from no_concepto_periodo aut
      where 
      aut.periodo = $periodo_filtro 
      and aut.id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1)
    )sal
    on sal.id_tipo_doc = func.id_tipo_doc 
    and sal.num_doc = func.num_doc
    and sal.rn = 1
    
    where func.periodo = $periodo_filtro 
    /*                    
    and (func.actual = 1 or 
      ( func.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_filtro) ,'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
and tab0.id_periodo is not null
and nvl(tab0.devengados,0)- nvl(tab0.deducidos,0) < 0
$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc  
    
$sortBy 
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);

            if (count($resultado) > 0) {
                $mensajeError .= "Existen pagos negativos o con valor (0), favor verificar liquidación.<br> Para los Funcionarios ::<br>  ";
                foreach ($resultado as $value) {
                    $mensajeError .= "<br>" . $value['nombre_completo'] . ", neto a pagar : " . $value['neto'];
                }

                $tag_error = true;
            }



            //Consulta para determinar funcionarios con Doble descuento de salud o pension - 20160218
            $sql = <<<EOD
select 

count(tab0.id_liquida_nomina) as cant,
tab0.num_doc,
tab0.id_tipo_doc,
--tab0.id_concep_nomina,
--tab0.id_mae_fondos,
tab0.id_descuento_ss,
tab0.nombre_completo,
tab0.descripcion 

from(
   
    select 
    liq.*,
    foncon.id_mae_fondos,
    foncon.id_descuento_ss,
    dat.nombre_completo,
    des.descripcion
    from no_liquida_nomina liq
    join no_fondo_concepto foncon
    on liq.id_concep_nomina = foncon.id_concep_nomina
    left join no_descuento_ss des
    on foncon.id_descuento_ss = des.id_descuento_ss
    left join no_datos_funcionario_v dat 
    on liq.id_tipo_doc = dat.id_tipo_doc
    and liq.num_doc = dat.num_doc

    where
    liq.id_periodo = $periodo_filtro 

)tab0    

where 1 = 1

$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc

having
count(tab0.id_liquida_nomina) > 1

group by
tab0.num_doc,
tab0.id_tipo_doc,
--tab0.id_concep_nomina,
--tab0.id_mae_fondos,
tab0.id_descuento_ss,
tab0.nombre_completo,
tab0.descripcion 

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

            if (count($resultado) > 0) {

                $mensajeError .= "<br><br>Existen funcionarios con doble descuento de aporte, favor verificar liquidación.<br> Para los Funcionarios ::<br>  ";
                foreach ($resultado as $value) {
                    $mensajeError .= "<br>" . $value['nombre_completo'] . ", tipo aporte : " . $value['descripcion'];
                }

                $tag_error = true;
            }
            
            
            
            //Consulta para determinar funcionarios con valor diferente de salud o pension - 20191010
            $sql = <<<EOD
select 

tab0.num_doc,
tab0.id_tipo_doc,
--tab0.id_concep_nomina,
--tab0.id_mae_fondos,
--tab0.id_descuento_ss,
tab0.nombre_completo,
--tab0.descripcion
nvl(sum(tab0.valor_pen),0) as valor_pen,
nvl(sum(tab0.valor_sal),0) as valor_sal

from(
   
    select 
    
    case when foncon.id_descuento_ss in (1) then liq.valor_liquidado else 0 end as valor_pen,
    case when foncon.id_descuento_ss in (3) then liq.valor_liquidado else 0 end as valor_sal,
    
    liq.*,
    foncon.id_mae_fondos,
    foncon.id_descuento_ss,
    dat.nombre_completo,
    des.descripcion
    from no_liquida_nomina liq
    join no_fondo_concepto foncon
    on liq.id_concep_nomina = foncon.id_concep_nomina
    left join no_descuento_ss des
    on foncon.id_descuento_ss = des.id_descuento_ss
    left join no_datos_funcionario_v dat 
    on liq.id_tipo_doc = dat.id_tipo_doc
    and liq.num_doc = dat.num_doc

    where
    liq.id_periodo = $periodo_filtro 

)tab0    

where 1 = 1

$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc

and tab0.num_doc not in (
    SELECT
    num_doc
    FROM no_pension_func where no_pension_func.estado = 1
)                     
                    
having
count(tab0.id_liquida_nomina) > 1
and nvl(sum(tab0.valor_pen),0) != nvl(sum(tab0.valor_sal),0)

group by
tab0.num_doc,
tab0.id_tipo_doc,
--tab0.id_concep_nomina,
--tab0.id_mae_fondos,
--tab0.id_descuento_ss,
tab0.nombre_completo--,
--tab0.descripcion   

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

            if (count($resultado) > 0) {

                $mensajeError .= "<br><br>Existen funcionarios con valores diferentes en los fondos, favor verificar liquidación.<br> Para los Funcionarios ::<br>  ";
                foreach ($resultado as $value) {
                    $mensajeError .= "<br>" . $value['nombre_completo'] . ", valor de PENSIÓN y SALUD diferente";
                }

                $tag_error = true;
            }


            if ($tag_error) {
                $mensajeError .= "<br>";
                $this->status = 3;
                $this->list_data = array();
                $this->mensajeError = $mensajeError;
                $this->logMessage("[validar_liquidacion] " . $mensajeError);
            } else {
                $this->status = 0;
                $this->totalRows = 0;
                $this->startRow = 0;
                $this->endRow = 0;
                $this->list_data = array();
                $this->logMessage("[validar_liquidacion] Validación 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());
        }
    }

}
