<?php

// Ignorar los abortos hechos por el usuario y permitir que el script
// se ejecute para siempre
ignore_user_abort(true);
set_time_limit(0);

/**
 * generar_aportes actions.
 * El proceso para calcular de la liquidación de aportes de IBC 
 * es segun la agrupacion(tiene encuenta la letra) que posee la tabla de clase de fondo, 
 * además de sumar todos los valores según la agrupación el completa el valor 
 * con lo correspondiente a los días de vacaciones del periodo del proceso.
 *
 * @package    nomina
 * @subpackage generar_aportes
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class generar_aportesActions extends sfActions {

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

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();


        /*
         * Manejar Errores
         */
        try {


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

            /*
             * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
             */
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('entidad_cliente' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $entidadCliente = $value;
                        }
                    }
                }
                $int++;
            }


            /**
             * Consultar salario minimo
             */
            $salario_minimo = 550000;
            //Sql
            $sql = <<<EOD
(select nvl(valor_mensual, 0) as valor_mensual from no_smdlv where vigencia = extract(year from sysdate))  
EOD;
            //Ejecutar SQL
            $record_smlv = CN_TABLE::executeSQL($sql);

            if (count($record_smlv) > 0) {
                //No se debe redondear - 20130802
//                $salario_minimo = round($record_smlv[0]['valor_mensual'], -3);
                $salario_minimo = round($record_smlv[0]['valor_mensual']);
            }

            /*
             * Obtener consultas glodal
             */
            //Sql
            $sql = <<<EOD
select * from NO_CONSULTA 
EOD;
            //Ejecutar SQL
            $record_consul = CN_TABLE::executeSQL($sql);
            $record_consulta = array();

            if (count($record_consul) > 0) {
                foreach ($record_consul as $key => $value) {
                    $record_consulta[$value['caracter']] = $value;

//                    $this->logMessage("Caracter - " . $value['caracter']);
                }
            }
//            $this->logMessage("Consulta - " . $record_consulta['M']['consulta']);
//            die();


            /**
             * Consultar no_param_gen - 20200128
             */
            $aplica_ibc_ant_vac = 0;
            //Sql
            $sql = <<<EOD
select * from no_param_gen 
EOD;
            //Ejecutar SQL
            $record_gen = CN_TABLE::executeSQL($sql);
            if (count($record_gen) > 0) {
                $aplica_ibc_ant_vac = $record_gen[0]['aplica_ibc_ant_vac'];
            }

            /**
             * Operacion
             */
            if (isset($request['accion_filtro'])) {
                $accion_filtro = true;
            } else {
                $accion_filtro = false;
            }
//            $accion_filtro = true;


            /*
             * 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, id_clase_fondo, tipo_planilla ';
            }

            /*
             * Variables
             */
            $vigencia = date('Y');
            $mes = date('m');
            $id_periodo = $request['id_periodo_filtro'];
            $id_periodo_actual = $request['id_periodo'];
            $progress_key = $request['progress_key'] . $request['username'];

            //Funcionario num_doc
            $num_doc = null;
            $whereFuncionarioNumDoc = "";
            if (isset($request['num_doc'])) {
                $num_doc = $request['num_doc'];
                $whereFuncionarioNumDoc = " AND tab0.num_doc = " . $request['num_doc'];
            }
            //Funcionario id_tipo_doc 
            $id_tipo_doc = 1;
            $whereFuncionarioTipoDoc = "";
            if (isset($request['id_tipo_doc'])) {
                $id_tipo_doc = $request['id_tipo_doc'];
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            }
            //id_clase_fondo
            $whereClaseFondo = "";
            if (isset($request['id_clase_fondo'])) {
                $whereClaseFondo = " AND tab0.id_clase_fondo = " . $request['id_clase_fondo'];
            }
            //id_mae_fondos
            $whereMaestroFondos = "";
            if (isset($request['id_mae_fondos'])) {
                $whereMaestroFondos = " AND tab0.id_mae_fondos = " . $request['id_mae_fondos'];
            }
            //tipo_planilla
            $whereTipoPlanilla = "";
            $tipo_planilla = "";
            if (isset($request['tipo_planilla'])) {
                $tipo_planilla = $request['tipo_planilla'];
                $whereTipoPlanilla = " AND tab0.tipo_planilla = '" . $request['tipo_planilla'] . "'";
            }
            //id_clase_planta
            $whereClasePlanta = "";
            $id_clase_planta = "";
            if (isset($request['id_clase_planta'])) {
                $id_clase_planta = $request['id_clase_planta'];
                $whereClasePlanta = " AND tab0.id_clase_planta = '" . $request['id_clase_planta'] . "'";
            }

            //solo imprime log la primera vez de consulta
            if ($rowStart == 0) {

                $dias_trabajado = 0;
                $this->logMessage("Generar aportes.");

                if ($accion_filtro) {

                    //sentencia sql
                    $sql = <<<EOD
delete from NO_LIQUIDA_APORTE tab0 
where tab0.id_periodo = $id_periodo 
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc 
and tab0.tipo_planilla = 'A'                      
EOD;
                    //ejecuta y obtiene el resultado del sql
                    CN_TABLE::executeSQL($sql);

                    /*
                     * Verifique que el funcionario este afiliado a todos los fondos
                     * Validacion para solo activos en el periodo - 20130722
                     */
                    //Correcion de consulta filtro con los funcionarios activos(no_estado_func) - 20130826
                    //Validacion para que tome el registro de pension funcionario - 20131105
                    //Sql
                    $sql = <<<EOD
select tab0.num_doc, count(tab0.id_afilia_fondo) 
from no_afilia_fondo tab0
left join no_estado_func tab1
on tab1.id_tipo_doc = tab0.id_tipo_doc and tab1.num_doc = tab0.num_doc
where tab0.estado = 1
and tab1.periodo = $id_periodo
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc 
having count(tab0.id_afilia_fondo) + 
(select count(tab2.id_pension_func) 
from no_pension_func tab2
where
tab2.id_tipo_doc = tab0.id_tipo_doc
and tab2.num_doc = tab0.num_doc
and tab2.estado = 1 )
< (select count(*) from no_clase_fondo)
group by tab0.num_doc, tab0.id_tipo_doc 
EOD;
                    //Ejecutar SQL
                    $record_total = CN_TABLE::executeSQL($sql);
                    if (count($record_total) == 0) {

                        /*
                         * 20130726
                         * Como afectan los dias de vacaciones  el número de días de aporte en AUTOLIQUIDACION. 
                         * Para los casos de interrupcion de vacaciones;
                         * 
                         * 1. Suma días : Tomar los dias de novedade de vacaciones, cuyo tipo de novedad de vacaciones (NO_TIPO_NOV_VAC)
                         * Operador=1 - Tiempo_liqui=1
                         *
                         * 2. Resta días : Tomar los dias de novedade de vacaciones, cuyo tipo de novedad de vacaciones (NO_TIPO_NOV_VAC)
                         * Operador=0 - Tiempo_liqui=1
                         */
                        /*
                         * Cuando es clase fondo id 3-riesgo debe restar los dias de las nov kardex que no afecten antiguedad - 20130729
                         * Se cambia consulta con no_liquida_nomina por vista que toma de los periodo tipo 1 y 2 - 20130827
                         * Para el IBC de Riesgos no se tiene en cuenta la novedad de vacaciones, el valor base y los días deben ser sin contemplar estos días. - 20130917
                         * El número de días de ARP  o ARL  se deben disminuir con el número de días del concepto 4001 reintegro asignacion básica. SGC - Yobany Jimenez: 1 dia incap - 1 Reintegro ARP 
                         * - existe un tipo de novedad ka que afecta los dias de riesgo, se cambia para que tenga en cuenta los dias de patrono - 20140922
                         * Para los parafiscales no completa dias de vacaciones, como tambien en el IBC - 20141202
                         * NOM-135 <-> Solo toma de no_liquida_nomina los que son del periodo normal no del retoractivo - 20150604
                         * Se toma conceptos de ajuste y reintegro para aportes de salud y pension, and liqnom.id_concep_nomina in ( conceptos.id_concep_nomina  ) - 20170330
                         * Se colocan dias de comision otra entidad para liquidar aportes de retiro, nvl(novper.dias,0) - 20171011
                         * Se colocan dias de liq definitiva nvl(diasdef.dias,0) - 20190426
                         * Para salud y pension que sin importar se retire, si sume las novedades - 20210225
                         */
                        //sentencia sql
                        $sql = <<<EOD

INSERT INTO NO_LIQUIDA_APORTE (ID_CLASE_FONDO,ID_MAE_FONDOS,ID_CONCEP_NOMINA,ID_TIPO_DOC,NUM_DOC,VALOR_BASE,NUM_DIAS,
APORTE_FUNC,APORTE_PATRONO,ID_CEN_OP,ID_TIPO_APORTE,PORCENTAJE_FUNC,PORCENTAJE_PATRONO,TARIFA,ID_PERIODO, UPC_ADICIO, ID_TAE, ID_TAP)


select distinct
tab.ID_CLASE_FONDO,
tab.ID_MAE_FONDOS,
tab.ID_CONCEP_NOMINA,
tab.ID_TIPO_DOC,
tab.NUM_DOC,
tab.VALOR_BASE,

/*
Se pone validacion para no superar los 30 dias - 20130827
*/
case when tab.num_dias >= 30 then 30 else tab.num_dias end as num_dias,
                                
tab.APORTE_FUNC,
tab.APORTE_PATRONO,
tab.ID_CEN_OP,
tab.ID_TIPO_APORTE,
tab.PORCENTAJE_FUNC,
tab.PORCENTAJE_PATRONO,
tab.TARIFA,
tab.ID_PERIODO,
tab.UPC_ADICIO,
tab.id_tae,
tab.id_tap 
from(
                                
        select distinct
        afilia.id_clase_fondo AS ID_CLASE_FONDO,
        fondo.id_mae_fondos AS ID_MAE_FONDOS,
        conceptos.id_concep_nomina AS ID_CONCEP_NOMINA,
        tab0.id_tipo_doc AS ID_TIPO_DOC,
        tab0.num_doc AS NUM_DOC,
        0 AS VALOR_BASE,
        /*
        Dias de Pension y Salud
        */
        case when afilia.id_clase_fondo = 1 
               or afilia.id_clase_fondo = 2 
        then (
            case when 
                extract(month from tab5.fecha_ingreso) || extract(year from tab5.fecha_ingreso) = (select id_meses || id_anhos from no_periodo where id_periodo = $id_periodo )
              or extract(month from tab5.fecha_termina) || extract(year from tab5.fecha_termina) = (select id_meses || id_anhos  from no_periodo where id_periodo = $id_periodo )
            then (
              case when kardex1.cantidad > 0 then kardex1.dias + (
              select nvl(sum(num_dias),0) from no_liquida_nomina_adic 
              where id_periodo = tab0.periodo and id_tipo_doc = tab0.id_tipo_doc 
              and num_doc = tab0.num_doc and id_concep_nomina = (select id_concep_basica from no_param_concep)
              )
              else (
              select nvl(sum(num_dias),0) from no_liquida_nomina_adic 
              where id_periodo = tab0.periodo and id_tipo_doc = tab0.id_tipo_doc 
              and num_doc = tab0.num_doc and id_concep_nomina = (select id_concep_basica from no_param_concep)
              ) end
            )
            else (
              case when kardex1.cantidad > 0 then kardex1.dias + (
              select nvl(sum(num_dias),0) from no_liquida_nomina_adic 
              where id_periodo = tab0.periodo and id_tipo_doc = tab0.id_tipo_doc 
              and num_doc = tab0.num_doc and id_concep_nomina = (select id_concep_basica from no_param_concep)
              )
              else (
              select nvl(sum(num_dias),0) from no_liquida_nomina_adic 
              where id_periodo = tab0.periodo and id_tipo_doc = tab0.id_tipo_doc 
              and num_doc = tab0.num_doc and id_concep_nomina = (select id_concep_basica from no_param_concep)
              ) end
            )  end
        )
        /*
        Dias de riesgos profesionales
        No se tiene en cuenta los dias de vacaciones - 20130917  
        Se corrige los dias de vacaciones, para que la resta sea correcta - 20141022   
        SGC :: kardex5, para restar los dias de novedad kardex que causan liquidacion - 20150205                       
        */
        when afilia.id_clase_fondo = 3
        then(
        ( select case when ( nvl(sum(num_dias),0) - nvl(kardex5.cantidad,0) - nvl(kardex4.cantidad,0) /*- nvl(reint.dias,0)*/ -nvl(kardexlr.cantidad,0) ) < 0 
            then 0 else nvl(sum(num_dias),0) - nvl(kardex5.cantidad,0) - nvl(kardex4.cantidad,0) /*- nvl(reint.dias,0)*/ -nvl(kardexlr.cantidad,0) end  from no_liquida_nomina_adic 
        where id_periodo = tab0.periodo and id_tipo_doc = tab0.id_tipo_doc 
        and num_doc = tab0.num_doc and id_concep_nomina = (select id_concep_basica from no_param_concep) ) - nvl(vac.num_dias_vac,0)                               
        )
        /*
        COL :: Se quita la resta de dias de vacaciones para tener encuenta los dias de vacaciones - nvl(vac.num_dias_vac,0) - 20150123
        NOM-93::SGC Validacion de dias, se vuevle a colocar que no tenga encuenta los dias de vacaciones - nvl(vac.num_dias_vac,0)  - 20150330
        COL :: Se quita la resta de dias de vacaciones para tener encuenta los dias de vacaciones - nvl(vac.num_dias_vac,0) - 20150417
        COL Incidente #5411 :: Se colocan dias se ASIG BAS de otros periodos de nomina, definitiva y adicionales - 20170119
        Se desactiva datos de linea anterior, la vista no_liquida_nomina_adic debe traer dias completos - 20170313 
        Incidente #21553; Se coloca solo para parafiscales que reste dias de reintegro - 20210503
        */    
        else (
        ( select nvl(sum(num_dias),0) from no_liquida_nomina_adic 
        where id_periodo = tab0.periodo and id_tipo_doc = tab0.id_tipo_doc 
        and num_doc = tab0.num_doc and id_concep_nomina = (select id_concep_basica from no_param_concep) ) 
        ) - nvl(reint.dias,0) 
            end + nvl(vac.num_dias_vac,0) + nvl(novper.dias,0) /*+  
        nvl( (select nvl(sum(num_dias),0) from no_liquida_nomina
            where id_periodo in ( (select id_periodo from no_periodo where id_meses = ( select id_meses from no_periodo where id_periodo = tab0.periodo) and id_anhos = ( select id_anhos from no_periodo where id_periodo = tab0.periodo) and id_tipo_periodo != 1) ) 
            and id_tipo_doc = tab0.id_tipo_doc 
            and num_doc = tab0.num_doc and id_concep_nomina = (select id_concep_basica from no_param_concep)) ,0)*/
        + nvl(diasdef.dias,0) /*- nvl(reint.dias,0)*/ + nvl(diacomisret.dias,0) as num_dias,
        
        /*
        NOM-85 COL:: Se realiza el cambio para que tome todos los periodos de un mes, como tambien ajuste y reintegro  - 20150325
        */
        (            
            select 
            nvl(sum( liqnom.valor_liquidado * (case when (con.operador) != 1 then (1) else (-1) end) ),0) + nvl(sum(ext.aporte_func),0)  as valor
            from no_liquida_nomina liqnom 
            join no_periodo per on per.id_periodo = liqnom.id_periodo 
            left join no_liquida_extra ext
            on liqnom.id_tipo_doc = ext.id_tipo_doc and liqnom.num_doc = ext.num_doc
            and liqnom.id_concep_nomina = ext.id_concep_nomina and liqnom.id_periodo = ext.id_periodo
            
            left join no_concep_nomina con
            on liqnom.id_concep_nomina = con.id_concep_nomina
                                
            where    1 = 1 and per.id_meses = ( select id_meses from no_periodo where id_periodo = tab0.periodo) and per.id_anhos = ( select id_anhos from no_periodo where id_periodo = tab0.periodo)  
            and liqnom.num_doc = tab0.num_doc and liqnom.id_tipo_doc = tab0.id_tipo_doc  
            --and liqnom.id_concep_nomina in ( conceptos.id_concep_nomina  ) 
            and (
                liqnom.id_concep_nomina in ( conceptos.id_concep_nomina ) 
                or
                liqnom.id_concep_nomina in (select distinct id_concep_ajuste from no_concep_nomina where id_concep_nomina in (conceptos.id_concep_nomina) and id_concep_ajuste is not null)
                or
                liqnom.id_concep_nomina in (select distinct id_concep_rein from no_concep_nomina where id_concep_nomina in (conceptos.id_concep_nomina) and id_concep_rein is not null )
            )  
            and liqnom.id_periodo_ajuste is null                                
        ) AS APORTE_FUNC,

        0 AS APORTE_PATRONO,
        tab0.id_cen_op AS ID_CEN_OP,
        afilia.id_tipo_aporte AS ID_TIPO_APORTE,
        conceptos.porcentaje_func AS PORCENTAJE_FUNC,
        conceptos.porcentaje_patrono AS PORCENTAJE_PATRONO,
        conceptos.tarifa AS TARIFA,
        tab0.periodo AS ID_PERIODO,
        nvl(upcadic.valor_upc ,0) as UPC_ADICIO,
        afisal.id_mae_fondos as id_tae,
        afipen.id_mae_fondos as id_tap

        from no_estado_func_v tab0

        left join no_dp_v cargo ON cargo.id_dp = tab0.id_dp
        left join no_nombramiento_v tab5 on tab5.id_tipo_doc = tab0.id_tipo_doc and tab5.num_doc = tab0.num_doc

        join no_afilia_fondo afilia ON afilia.id_tipo_doc = tab0.id_tipo_doc and afilia.num_doc = tab0.num_doc 
        and  (select fecha_fin from no_periodo where id_periodo =  $id_periodo)
        between afilia.fecha_ingreso and nvl( afilia.fecha_retiro, trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) )
        --and afilia.estado = 1

        join no_mae_fondos fondo ON fondo.id_mae_fondos = afilia.id_mae_fondos
            
        /*Se activa resta de dias del concepto de reintegro asignacion basica 4001 - 20190903*/ 
        /*Incidente 14326, Se suspende reintegro de 4001 por conflicto con incapacidades - 20190926*/     
        left join 
        (                        
            select 
            liqnom.num_doc, liqnom.id_tipo_doc,
            --nvl(sum(liqnom.num_dias),0) as dias
            0 as dias  
            from no_liquida_nomina liqnom   
            join no_periodo per on per.id_periodo = liqnom.id_periodo 
            where  1 = 1 
            and per.id_meses = ( select id_meses from no_periodo where id_periodo = $id_periodo)  
            and per.id_anhos = ( select id_anhos from no_periodo where id_periodo = $id_periodo)  
            and liqnom.id_concep_nomina = (select id_concep_nomina from no_concep_nomina  where codigo = '4001')
            and liqnom.id_periodo_ajuste is null
            group by
            liqnom.num_doc, liqnom.id_tipo_doc
        )reint ON reint.id_tipo_doc = tab0.id_tipo_doc and reint.num_doc = tab0.num_doc 
                                
        left join 
        (
        select liquida.id_tipo_doc,liquida.num_doc, sum(liquida.valor_liquidado) VALOR
        from no_liquida_nomina_adic liquida
        where liquida.id_periodo = $id_periodo 
            and (liquida.id_concep_nomina = 1 or liquida.id_concep_nomina = 3 or liquida.id_concep_nomina = 11 or liquida.id_concep_nomina = 14 or liquida.id_concep_nomina = 42)
        group by liquida.id_tipo_doc,liquida.num_doc
        )liquida ON liquida.id_tipo_doc = tab0.id_tipo_doc and liquida.num_doc = tab0.num_doc 

        left join(

        select 
        deta.id_tipo_aporte, deta.porcentaje_func,deta.porcentaje_patrono,descto.id_clase_fondo,
        foncon.id_mae_fondos,foncon.id_concep_nomina, (deta.porcentaje_func+deta.porcentaje_patrono) as tarifa,
        deta.rango_desde, deta.rango_hasta,(select valor_mensual * deta.rango_hasta from no_smdlv where vigencia = extract(year from sysdate)) AS SALARIO, descto.id_descuento_ss
        from no_descto_detalle deta
        left join no_descuento_ss descto ON descto.id_descuento_ss = deta.id_descuento_ss
        left join no_fondo_concepto foncon ON foncon.id_descuento_ss = descto.id_descuento_ss

        ) conceptos ON conceptos.id_tipo_aporte = afilia.id_tipo_aporte 
        and conceptos.id_clase_fondo = afilia.id_clase_fondo and conceptos.id_mae_fondos = afilia.id_mae_fondos
        --and case when conceptos.id_descuento_ss = 2 then liquida.valor else conceptos.salario+1 end > conceptos.salario


        left join no_upc_adicional upcadic
        on upcadic.estado = 1
        and upcadic.id_tipo_doc = tab0.id_tipo_doc and upcadic.num_doc = tab0.num_doc
        and upcadic.id_mae_fondos = afilia.id_mae_fondos and upcadic.id_clase_fondo = afilia.id_clase_fondo

        /*
        Pone el id de salud id_tae en la tabla no_liquida_aporte si se va a trasladar de fondo para mostralo al generar la planilla 
        busca en no_afilia_fondo el ultimo fondo activo, que su fecha de ingreso sea mayor a la fecha inicial del periodo  - 20130826
        */
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.id_afilia_fondo DESC
           ) AS rn
          from no_afilia_fondo aut
          where aut.id_clase_fondo = 2
          and aut.fecha_ingreso >= (select fecha_ini from no_periodo where id_periodo =  $id_periodo)
          and aut.fecha_retiro is null
        )afisal
        on afisal.num_doc = tab0.num_doc 
        and afisal.id_clase_fondo = afilia.id_clase_fondo
        and afisal.rn = 1

        /*
        Pone el id de pension id_tap en la tabla no_liquida_aporte si se va a trasladar de fondo para mostralo al generar la planilla 
        busca en no_afilia_fondo el ultimo fondo activo, que su fecha de ingreso sea mayor a la fecha inicial del periodo  - 20130826
        */
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.id_afilia_fondo DESC
           ) AS rn
          from no_afilia_fondo aut
          where aut.id_clase_fondo = 1
          and aut.fecha_ingreso >= (select fecha_ini from no_periodo where id_periodo =  $id_periodo)
          and aut.fecha_retiro is null
        )afipen
        on afipen.num_doc = tab0.num_doc 
        and afipen.id_clase_fondo = afilia.id_clase_fondo
        and afipen.rn = 1

        /*
        Suma numero de dias de las Novedades de kardex que no afecten antiguedad y causen liquidacion
        las novedas como de 1 a 3 dias son solo informativas - 20130826
        Se ajusta que tome dias segun dias patrono como fue en kardex2 de la planilla - 20230321::LAVILA
        */
        left join
        (
            select tab0.num_doc, count(tab0.id_novedad_kardex) CANTIDAD, max(tab1.suspension) as max_marca,
            --nvl(sum( dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin, (select id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as dias
            nvl(sum( dias_rango_mes_sin_treintayuno(tab0.fecha_ini + (case when tab0.prorroga != 1 then tab1.dias_patrono else 0 end),tab0.fecha_fin, (select id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as dias
            from no_novedad_kardex tab0
            left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka
            where tab1.afecta_antigu = 0 and tab1.causa_liquidacion = 1 and tab0.estado = 1 
            and
            (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = tab0.id_periodo) <= (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = $id_periodo)
            and (
              to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') between tab0.fecha_ini and tab0.fecha_fin
              or
              trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) between tab0.fecha_ini and tab0.fecha_fin
              or 
              tab0.id_periodo = $id_periodo
            )
            group by tab0.num_doc
        )kardex1 ON kardex1.num_doc = tab0.num_doc

        /*
        Se deben restar dias de kardex solo del mes anterior donde id-4 Incapacidad Laboralx Accidente de trabajo/Enf. pro  - 20130827
        Se deben restar dias de kardex solo de dias anteriores al rango de fecha del periodo actual - 20130917
        Se cambia de id-4 por atributo en  la tabla no_tip_nov_ka de afecta_riesgo, para validar cuales afectan en los dias de ARP-ARL - 20130919
        Se cambia para que tome dias de meses anteriores y sin dia 31, kardek4 inc que afectan riesgo - 20190930
        */
        left join
        (
                                
            select 
            tab.num_doc,
            nvl(sum(tab.cant_dia_riesgo),0) as cantidad
            from(
                                
                    select 
                    
                    case when tab0.prorroga = 1 then nvl(sum( ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                        then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) 

                        else nvl(sum( ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                                then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) - tab1.dias_patrono 
                        end as cant_dia_riesgo_ant,
                        
                    nvl(sum( fecha_rango_sin_treintayuno(tab0.fecha_ini, ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                        then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) )  ),0)  - tab1.dias_patrono as cant_dia_riesgo,

                    tab1.dias_patrono,
                    tab0.prorroga,
                                
                    tab0.num_doc, 
                    sum(tab0.num_dias) CANTIDAD_1,
                    nvl(sum( dias_rango_mes(tab0.fecha_ini,tab0.fecha_fin, (select case when id_meses = 1 then 12 else id_meses - 1 end id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as CANTIDAD_2,

                    nvl(sum( ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                    then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) as CANTIDAD

                    from no_novedad_kardex tab0
                    left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka
                        where tab1.afecta_riesgo = 1 and tab0.estado = 1 

                    and ( 
                        tab0.fecha_inc between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                        and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
                        /*
                        Validacion para que tome el registro en el periodo de la novedad - 20130820
                        */
                        or tab0.id_periodo = $id_periodo
                    )

                    group by tab0.num_doc, tab0.prorroga, tab1.dias_patrono
            
            )tab
            group by
            tab.num_doc      
                                
        )kardex4 ON kardex4.num_doc = tab0.num_doc
                                
        left join
        (
                                
            select 
            tab.num_doc,
            nvl(sum(case when tab.cant_dia_riesgo > 0 then tab.cant_dia_riesgo else 0 end),0) as cantidad
            from(
                                
                    select 
                    
                      case when tab0.prorroga = 1 and tab0.fecha_ini < to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                           then nvl(sum( ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                                         then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) 

                      when tab0.prorroga = 0 and tab0.fecha_ini < to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                           then nvl(sum( ( case when  tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                                          then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) - tab1.dias_patrono 
                      else 0
                      end as cant_dia_riesgo,

                    tab1.dias_patrono,
                    tab0.prorroga,
                                
                    tab0.num_doc, 
                    sum(tab0.num_dias) CANTIDAD_1,
                    nvl(sum( dias_rango_mes(tab0.fecha_ini,tab0.fecha_fin, (select case when id_meses = 1 then 12 else id_meses - 1 end id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as CANTIDAD_2,

                    nvl(sum( ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                    then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) as CANTIDAD

                    from no_novedad_kardex tab0
                    left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka
                        where tab1.causa_liquidacion = 1 and tab0.estado = 1 and tab1.afecta_riesgo != 1

                    and ( 
                        tab0.fecha_inc between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                        and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
                        /*
                        Validacion para que tome el registro en el periodo de la novedad - 20130820
                        */
                        or tab0.id_periodo = $id_periodo
                    )

                    group by tab0.num_doc, tab0.prorroga, tab1.dias_patrono, tab0.fecha_ini, tab0.fecha_fin
            
            )tab
            group by
            tab.num_doc      
                                
        )kardex5 ON kardex5.num_doc = tab0.num_doc
                  
        /*Se coloca dias para licencia remunerada, resta en riesgo ARL - 20190214*/       
        /*Licencia remunerada descuenta todos los días de meses anteriores - 20190905*/                 
        left join
        (
                                
            select 
            tab.num_doc,
            nvl(sum(case when tab.cant_dia_riesgo > 0 then tab.cant_dia_riesgo else 0 end),0) as cantidad_ant,
            nvl(sum(case when tab.cant_dia_riesgo_completo > 0 then tab.cant_dia_riesgo_completo else 0 end),0) as cantidad
            from(
                                
                    select 
                    
                    nvl(sum( dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin, (select id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as cant_dia_riesgo,
                    nvl(sum( fecha_rango_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin ) ),0) as cant_dia_riesgo_completo,

                    tab1.dias_patrono,
                    tab0.prorroga,
                                
                    tab0.num_doc, 
                    sum(tab0.num_dias) CANTIDAD_1,
                    nvl(sum( dias_rango_mes(tab0.fecha_ini,tab0.fecha_fin, (select case when id_meses = 1 then 12 else id_meses - 1 end id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as CANTIDAD_2,

                    nvl(sum( ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                    then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) as CANTIDAD

                    from no_novedad_kardex tab0
                    left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka
                        
                    where tab1.id_tip_nov_ka in (select id_tip_nov_ka from no_tip_nov_ka where tiempo_remunerado = 1) and tab0.estado = 1 

                    and ( 
                        tab0.fecha_inc between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                        and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
                        /*
                        Validacion para que tome el registro en el periodo de la novedad - 20130820
                        */
                        or tab0.id_periodo = $id_periodo
                    )

                    group by tab0.num_doc, tab0.prorroga, tab1.dias_patrono, tab0.fecha_ini, tab0.fecha_fin
            
            )tab
            group by
            tab.num_doc      
                                
        )kardexlr ON kardexlr.num_doc = tab0.num_doc

        left join (

            select 

            id_tipo_doc,                  
            num_doc,
            /*
            dias,
            dias_vac,
            num_dias_vac,*/
            sum(dias_vaciones) as num_dias_vac_ant,
            sum(dias_vaciones) - sum(dias_feb) as num_dias_vac

            from(
               select 
                 novvac.id_tipo_doc,                  
                 novvac.num_doc,
                 nvl(sum(dias_rango_mes(novvac.fecha_ini,novvac.fecha_fin,(select id_meses 
                     from no_periodo where id_periodo =  $id_periodo))),0) as dias,
                 nvl(sum( novvac.fecha_fin - novvac.fecha_ini + 1),0) as dias_vac,

                 nvl(sum(dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) as num_dias_vac,
                 tipnov.operador,

                 case  when tipnov.operador  = 1 
                 then nvl(sum(dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) 
                 else nvl(sum(dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) * (-1)
                 end as dias_vaciones,
                                
                --Para el mes de febrero se restan dias 2 o 1 segun año, ya que estos dias se pagan como laborados - 20170314                 
                (case 
                   when (select id_meses from no_periodo where id_periodo = $id_periodo) = 2 and max(novvac.fecha_ini) < (select fecha_fin from no_periodo where id_periodo = $id_periodo) and max(novvac.fecha_fin) > (select fecha_fin from no_periodo where id_periodo = $id_periodo) 
                   then case when to_number((select to_char(fecha_fin,'dd') from no_periodo where id_periodo = $id_periodo)) = 28 then 2 else 1 end
                   else 0 end) * (case  when tipnov.operador  = 1 then 1 else (-1) end) as dias_feb

                 from no_novedad_vac novvac
                 left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
                 where tipnov.tiempo_liqui = 1 
                 --and novvac.id_periodo = $id_periodo
                and
                (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = novvac.id_periodo) <= (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = $id_periodo)
                and (
                  /*
                  to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') between novvac.fecha_ini and novvac.fecha_fin
                  or
                  trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
                  */
                  novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') 
                  and TRUNC(LAST_DAY( TO_DATE('01/'|| (select LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS from NO_PERIODO where ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') ))
                  or
                  novvac.fecha_fin between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') 
                  and TRUNC(LAST_DAY( TO_DATE('01/'|| (select LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS from NO_PERIODO where ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') ))
                      or 
                  novvac.id_periodo = $id_periodo
                )
             group by novvac.id_tipo_doc, novvac.num_doc,
             tipnov.operador
            ) 

            group by id_tipo_doc, num_doc


        )vac
        on vac.id_tipo_doc = tab0.id_tipo_doc and vac.num_doc = tab0.num_doc   
        
        left join(
            select
            tab0.id_tipo_doc,
            tab0.num_doc,
            nvl(sum( dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin, (select id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as dias
            from(
                select 
                
                nov.id_tipo_doc,
                nov.num_doc,
                nov.id_novedad,
                nov.fecha_inicial,
                nov.fecha_terminacion,
                nom.fecha_termina,
                
                case when nov.fecha_inicial > (select fecha_ini from no_periodo where id_periodo = $id_periodo) 
                then nov.fecha_inicial 
                else (select fecha_ini from no_periodo where id_periodo = $id_periodo) end as fecha_ini,
                nom.fecha_termina as fecha_fin
                
                from no_novedad_personal nov
                
                join no_nombramiento_v nom
                on nov.id_tipo_doc = nom.id_tipo_doc
                and nov.num_doc = nom.num_doc
                
                where 
                nov.estado = 1
                and nov.id_novedad = 8
                and (
                    (select fecha_ini from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
                    or    
                    (select fecha_fin from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
                )
                and (
                    nom.fecha_termina between (select fecha_ini from no_periodo where id_periodo = $id_periodo) and (select fecha_fin from no_periodo where id_periodo = $id_periodo)
                )
                
            )tab0  
            
            group by 
            tab0.id_tipo_doc,
            tab0.num_doc 
        )novper
        on novper.id_tipo_doc = tab0.id_tipo_doc and novper.num_doc = tab0.num_doc  
           
        /* Se agrega restar el concepto 4001 - 20210210::LAVILA*/
        left join 
        (                      
            select 
            liqnom.num_doc, liqnom.id_tipo_doc,
            nvl(sum(liqnom.dias),0) as dias 
            from(
                select 
                liqnom.num_doc, liqnom.id_tipo_doc,
                nvl(sum(liqnom.num_dias),0) as dias  
                from no_liquida_nomina liqnom   
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where  1 = 1 
                and per.id_meses = ( select id_meses from no_periodo where id_periodo = $id_periodo)  
                and per.id_anhos = ( select id_anhos from no_periodo where id_periodo = $id_periodo)  
                and liqnom.id_concep_nomina = (select id_concep_basica from no_param_concep)
                and liqnom.id_periodo_ajuste is null
                and per.id_tipo_periodo = 5 
                group by
                liqnom.num_doc, liqnom.id_tipo_doc
                
                union
                
                select 
                liqnom.num_doc, liqnom.id_tipo_doc,
                nvl(sum(liqnom.num_dias),0) * (-1) as dias  
                from no_liquida_nomina liqnom   
                join no_periodo per on per.id_periodo = liqnom.id_periodo             
                join no_concep_nomina concep on concep.id_concep_rein = liqnom.id_concep_nomina
                where  1 = 1 
                and per.id_meses = ( select id_meses from no_periodo where id_periodo = $id_periodo)  
                and per.id_anhos = ( select id_anhos from no_periodo where id_periodo = $id_periodo)  
                and concep.id_concep_nomina = (select id_concep_basica from no_param_concep)
                and liqnom.id_periodo_ajuste is null
                and per.id_tipo_periodo = 5 
                group by
                liqnom.num_doc, liqnom.id_tipo_doc
            )liqnom
            group by
            liqnom.num_doc, liqnom.id_tipo_doc
        )diasdef ON diasdef.id_tipo_doc = tab0.id_tipo_doc and diasdef.num_doc = tab0.num_doc  

        /* Incidente #36672, si se retira al terminar la comision en otra entidad, se toma 1 dia - 20231003::LAVILA */
        left join(
            
            select distinct
    
            1 as dias,      
                   
            nov.id_tipo_doc,
            nov.num_doc/*,
            nov.id_novedad,
            nov.fecha_inicial,
            nov.fecha_terminacion,
            nom.fecha_termina,
            
            case when nov.fecha_inicial > (select fecha_ini from no_periodo where id_periodo = $id_periodo) 
            then nov.fecha_inicial 
            else (select fecha_ini from no_periodo where id_periodo = $id_periodo) end as fecha_ini,
            nom.fecha_termina as fecha_fin*/
            
            from no_novedad_personal nov
            
            join no_nombramiento_v nom
            on nov.id_tipo_doc = nom.id_tipo_doc
            and nov.num_doc = nom.num_doc
            
            where 
            nov.estado = 0
            and nov.id_novedad = 8
            and (
                (select fecha_ini from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
                or    
                (select fecha_fin from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
            )
            and (
                nom.fecha_termina between (select fecha_ini from no_periodo where id_periodo = $id_periodo) and (select fecha_fin from no_periodo where id_periodo = $id_periodo)
            )
            
            and nom.fecha_termina = nov.fecha_terminacion
           
        )diacomisret ON diacomisret.id_tipo_doc = tab0.id_tipo_doc and diacomisret.num_doc = tab0.num_doc      

        where tab0.periodo= $id_periodo 
        and conceptos.id_concep_nomina is not null 
        $whereFuncionarioNumDoc $whereFuncionarioTipoDoc 
        and (
            /*
              Se cambia fecha de termina(ultimo dia de trabajo) por fecha de retiro, 
              para tener encuenta si trabajo en el periodo al menos 1 dia - 20170406                    
              */
            ( tab0.actual = 1 and 
                ( 
                    tab5.fecha_retiro is null 
                    or 
                    tab5.fecha_retiro != to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') 
                ) 
            )
            or
            ( tab0.actual = 0 
              /*
              Se cambia fecha de termina(ultimo dia de trabajo) por fecha de retiro, 
              para tener encuenta si trabajo en el periodo al menos 1 dia - 20130828                    
              */
              and tab5.fecha_retiro != to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
              and tab5.fecha_termina
            between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
            and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo_actual) ,'dd/mm/yyyy') ))
            )
        )
                                
)tab
EOD;

//and tab0.actual = 1 
//and afilia.estado = 1
                        //ejecuta y obtiene el resultado del sql
                        CN_TABLE::executeSQL($sql);



                        /**
                         * Personas con novedad e comision otra entidad id -> 8,
                         * en la liq del nuevo periodo desactiva valores y días de no_concepto_periodo, 
                         * borra registros de aportes de personas con la novedad - 20150313
                         */
                        $sql = <<<EOD
delete  from NO_LIQUIDA_APORTE
where 
ID_PERIODO = $id_periodo
and num_doc in (
    select 
    
    nov.num_doc 
    
    from no_novedad_personal nov
    
    where 
    nov.estado = 1
    and nov.id_novedad = 8
    and (
        (select fecha_ini from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
        or    
        (select fecha_fin from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
    )

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


                        /*
                         * Tag_retro para cuando es retroactivo, para retencion tiene encuenta todo el mes con lo del retroactivo - 20150610
                         * Se coloca el orden de clase_fondo, para que tome primero salud y pension antes de ARL, ya que para LR toma dias trabajados en base a estos fondos - 20210203::LAVILA
                         */
                        $sql = <<<EOD
SELECT 
$salario_minimo as salario_minimo,
1 as tag,    
0 as tg_retro,
tab0.num_dias as num_dias, 
nvl(vac.num_dias_vac,0) as wdiasv,
tab0.porcentaje_func,
tab0.porcentaje_patrono,
tab0.aporte_func,
tab0.aporte_patrono,
tab0.id_tipo_doc,
tab0.num_doc, 
tab0.id_clase_fondo, 
tab0.id_concep_nomina, 
tab1.id_agrup_concepto, 
tab2.id_meses, 
tab2.id_anhos,
tab0.tarifa, 
tab0.id_liquida_aporte, 
tab0.id_periodo as periodo,
nvl(kardexlr.cantidad,0) as cantidad_licrem                                
                                
FROM NO_LIQUIDA_APORTE tab0
LEFT JOIN NO_CLASE_FONDO tab1 ON tab1.id_clase_fondo = tab0.id_clase_fondo
LEFT JOIN NO_PERIODO tab2 ON tab2.id_periodo = tab0.id_periodo

left join (
    
        select 
        novvac.id_tipo_doc,                  
        novvac.num_doc,
        nvl(sum(dias_rango_mes(novvac.fecha_ini,novvac.fecha_fin,(select id_meses 
         from no_periodo where id_periodo =  $id_periodo))),0) as dias,
        nvl(sum( novvac.fecha_fin - novvac.fecha_ini + 1),0) as dias_vac,
        nvl(sum(DIAS_RANGO_MES_SIN_TREINTAYUNO(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) as num_dias_vac
        
        from no_novedad_vac novvac
        left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
        where tipnov.tiempo_liqui = 1 
         --and novvac.id_periodo = $id_periodo
        and
        (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = novvac.id_periodo) <= (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = $id_periodo)
        and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
          and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) 
          or
          novvac.fecha_fin between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
          and TRUNC(LAST_DAY( TO_DATE('01/'|| (select LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS from NO_PERIODO where ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
          or

          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') between novvac.fecha_ini and novvac.fecha_fin
          or
          trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
          or 
          novvac.id_periodo = $id_periodo
        )
        group by novvac.id_tipo_doc, novvac.num_doc
     
)vac
on vac.id_tipo_doc = tab0.id_tipo_doc and vac.num_doc = tab0.num_doc  
                  
/*Se coloca dias para licencia remunerada, resta en riesgo ARL - 20190214*/   
/*Licencia remunerada descuenta todos los días de meses anteriores - 20190905*/                     
left join
(

    select 
    tab.num_doc,
    nvl(sum(case when tab.cant_dia_riesgo > 0 then tab.cant_dia_riesgo else 0 end),0) as cantidad_ant,
    nvl(sum(case when tab.cant_dia_riesgo_completo > 0 then tab.cant_dia_riesgo_completo else 0 end),0) as cantidad
    from(

            select 

            nvl(sum( dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin, (select id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as cant_dia_riesgo,
            nvl(sum( fecha_rango_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin ) ),0) as cant_dia_riesgo_completo,

            tab1.dias_patrono,
            tab0.prorroga,

            tab0.num_doc, 
            sum(tab0.num_dias) CANTIDAD_1,
            nvl(sum( dias_rango_mes(tab0.fecha_ini,tab0.fecha_fin, (select case when id_meses = 1 then 12 else id_meses - 1 end id_meses from no_periodo where id_periodo = $id_periodo) ) ),0) as CANTIDAD_2,

            nvl(sum( ( case when tab0.fecha_fin >= to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
            then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') - 1 else tab0.fecha_fin end ) - tab0.fecha_ini + 1 ),0) as CANTIDAD

            from no_novedad_kardex tab0
            left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka

            where tab1.id_tip_nov_ka in (select id_tip_nov_ka from no_tip_nov_ka where tiempo_remunerado = 1) and tab0.estado = 1 

            and ( 
                tab0.fecha_inc between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
                and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
                /*
                Validacion para que tome el registro en el periodo de la novedad - 20130820
                */
                or tab0.id_periodo = $id_periodo
            )

            group by tab0.num_doc, tab0.prorroga, tab1.dias_patrono, tab0.fecha_ini, tab0.fecha_fin

    )tab
    group by
    tab.num_doc      

)kardexlr ON kardexlr.num_doc = tab0.num_doc
                                
WHERE tab0.ID_PERIODO = $id_periodo
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc 
and tab0.tipo_planilla = 'A'                    
                                
order by
tab0.num_doc,
tab0.id_clase_fondo    
EOD;


                        /**
                         * Recorre los registros de no_liquida_aporte
                         */
                        $records = CN_TABLE::executeSQL($sql);



                        $this->conn->commit();


                        $i = 1;
                        $nom_conceptos_a_procesar = count($records);

                        // Antes de inicar el proceso largo
                        $brecha = 1;
                        if ($nom_conceptos_a_procesar > 100)
                            $brecha = $nom_conceptos_a_procesar - (0.99 * $nom_conceptos_a_procesar);

                        $this->logMessage("[generar_aportes] nom_conceptos_a_procesar: " . $nom_conceptos_a_procesar);

                        /*
                         * Log liquidacion.log registros uno a uno - Funcionarios
                         */
                        $logPath = sfConfig::get('sf_log_dir') . '/liquidacion.log';
                        $custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));

                        foreach ($records as $record) {

                            /**
                             * Abrir nueva conexion con la Base de Datos
                             */
                            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
                            $this->conn->beginTransaction();

                            /*
                             * Variables del record
                             */
                            $id_liquida_aporte = $record['id_liquida_aporte'];
                            $id_tipo_doc = $record['id_tipo_doc'];
                            $num_doc = $record['num_doc'];
                            $id_clase_fondo = $record['id_clase_fondo'];
                            $id_concep_nomina = $record['id_concep_nomina'];
                            $id_agrup_concepto = $record['id_agrup_concepto'];
                            $id_meses = $record['id_meses'];
                            $id_anhos = $record['id_anhos'];
                            $tarifa = $record['tarifa'];
                            $aporte_func = $record['aporte_func'];
                            if ($id_clase_fondo == 1 || $id_clase_fondo == 2) {
                                $dias_trabajado = $record['num_dias']; //Se toman los dias que trabajo en el mes, segun salud y pension - 20190703
                            }
                            //toma dias trabajos basados en el calculo de parafiscales, para tomar dias trabajados reales - 20210816::LAVILA
                            if ($id_clase_fondo == 3) {

                                //Sql
                                $sql = <<<EOD
SELECT
* 
FROM no_liquida_aporte
where
id_periodo = $id_periodo
and num_doc = '$num_doc'
and id_clase_fondo = 4
and tipo_planilla = 'A'
EOD;
                                //Ejecutar SQL
                                $records_dias_trab = CN_TABLE::executeSQL($sql);
                                if (count($records_dias_trab) > 0) {
                                    $dias_trabajado = $records_dias_trab[0]['num_dias'];
                                }
                            }

                            // Termina procesamiento de concepto
                            $custom_logger->info("Procesado $i de $nom_conceptos_a_procesar conceptos. Documento: " . $num_doc . "\n");


                            $arrayParametros = array();

                            $valor_base_vac = 0;

                            /**
                             * Dias para vacaciones
                             * Se cambia a rango dias sin 31 - 20130705
                             * Se anexa para el operador la suma o resta - 20130726
                             * Se anexa filtro de rango de fechas para tomar solo vacaciones que afecten el periodo  - 20140122
                             * COL - Sandra guerra Julio Vac SegSocial - Dias de agosto + julio, le falta que tome los dias completos - 20140915
                             * Optener el periodo anterior segun fecha inicial de las vacaciones - 20191220          
                             * Para cev se quita que tome num_dias_vac y tag_dias_vac_ant para solo si tuvo dias anterioes de vac - 20210201::LAVILA     
                             * Se quita que tome dias dia_ant, de vacaciones antiguas - 20220826::LAVILA     
                             */
                            //Sql
                            $sql = <<<EOD
select 

tab.id_tipo_doc,                  
tab.num_doc,
/*
dias,
dias_vac,
num_dias_vac,*/
sum( nvl(tab.dias_vaciones,0) + nvl(tab.dia_ant,0)) as num_dias_vac_ant,

sum(nvl(tab.dia_ant,0)) as tag_dias_vac_ant,                                    
case when /*$entidadCliente in (8,9)*/ 1 = 1
    then sum( nvl(tab.dias_vaciones,0) - nvl(tab.dias_feb,0))
    else sum( nvl(tab.dias_vaciones,0) + nvl(tab.dia_ant,0) - nvl(tab.dias_feb,0)) end as num_dias_vac, 
                                    
min(tab.fecha_ini) as fecha_ini,
max((SELECT
    max(perd.id_periodo)
FROM no_periodo perd where perd.id_tipo_periodo = 1 and perd.fecha_fin < tab.fecha_ini)) as periodo_ant

from(

    select 
    min(novvac.fecha_ini) as fecha_ini,
    novvac.id_tipo_doc,                  
    novvac.num_doc,
    nvl(sum(dias_rango_mes(novvac.fecha_ini,novvac.fecha_fin,(select id_meses 
        from no_periodo where id_periodo =  $id_periodo))),0) as dias,
    nvl(sum( novvac.fecha_fin - novvac.fecha_ini + 1),0) as dias_vac,
    nvl(sum(DIAS_RANGO_MES_SIN_TREINTAYUNO(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) as num_dias_vac,
        tipnov.operador,

        case  when tipnov.operador  = 1 
        then nvl(sum(dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) 
        else nvl(sum(dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) * (-1)
        --else nvl(sum( novvac.fecha_fin - novvac.fecha_ini + 1),0) * (-1)
        end as dias_vaciones,
            
        case when novvac.id_periodo != $id_periodo then 0 else nvl(sum(dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,
        
          case when (select id_meses from no_periodo where id_periodo =  $id_periodo) != 1 then (select id_meses from no_periodo where id_periodo =  $id_periodo)-1 
              else 12 end  
          
        )),0) end as dia_ant,
                                
        --Para el mes de febrero se restan dias 2 o 1 segun año, ya que estos dias se pagan como laborados - 20170314                 
        (case 
           when (select id_meses from no_periodo where id_periodo = $id_periodo) = 2 and max(novvac.fecha_ini) < (select fecha_fin from no_periodo where id_periodo = $id_periodo) and max(novvac.fecha_fin) > (select fecha_fin from no_periodo where id_periodo = $id_periodo) 
           then case when to_number((select to_char(fecha_fin,'dd') from no_periodo where id_periodo = $id_periodo)) = 28 then 2 else 1 end
           else 0 end) * (case  when tipnov.operador  = 1 then 1 else (-1) end) as dias_feb
            
   
    from no_novedad_vac novvac
    left join NO_TIPO_NOV_VAC TIPNOV on TIPNOV.ID_TIPO_NOV_VAC = NOVVAC.ID_TIPO_NOV_VAC
    where TIPNOV.TIEMPO_LIQUI = 1 
    --and NOVVAC.ID_PERIODO = $id_periodo
    and (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = novvac.id_periodo) <= (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo)
    and novvac.num_doc = $num_doc
    and
    ( 
          novvac.fecha_ini  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
          and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
          or
          novvac.fecha_fin  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
          and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
        or
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') between novvac.fecha_ini and novvac.fecha_fin
          or
          trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
    )                                
    group by novvac.id_tipo_doc, novvac.num_doc,
    tipnov.operador, novvac.num_dias_vac, novvac.id_periodo
)tab 

group by tab.id_tipo_doc, tab.num_doc
EOD;

                            //Ejecutar SQL
                            $record_vac = CN_TABLE::executeSQL($sql);

                            /*
                             * Calcular IBC para vacaciones
                             */
                            // Se agrega al calculo la formula (({A39}/30)*$wdiasv)) - 20130517
                            // Toma los dias de vacaciones para el mes a liquidar
                            $wdiasv = 0;
                            $periodo_ant = null;
                            $record['tag_dias_vac_ant'] = 0;
                            if (count($record_vac) > 0) {
                                $wdiasv = $record_vac[0]['num_dias_vac'];
                                $periodo_ant = $record_vac[0]['periodo_ant'];
                                $record['tag_dias_vac_ant'] = $record_vac[0]['tag_dias_vac_ant'];
                            }
                            //Validar que hay dias
                            if ($wdiasv != 0) {
                                //Optener el periodo anterior segun fecha inicial de las vacaciones - 20191220  
                                if ($periodo_ant != null && $aplica_ibc_ant_vac == 1) {

                                    $sql = <<<EOD
SELECT
    *
FROM no_liquida_aporte
where
id_periodo = $periodo_ant
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc
and id_clase_fondo = 2
and tipo_planilla = 'A' 
EOD;

                                    //Ejecutar SQL
                                    $record_liqapo = CN_TABLE::executeSQL($sql);

                                    $valor_liqapo = $record_liqapo[0]['valor_base'];

                                    $formula = "(($valor_liqapo/30)*$wdiasv)";
                                } else {
                                    $formula = "(({A39}/30)*$wdiasv)";
                                }
                                $this->logMessage("[Liquidación Vac] Formula Inicial: " . $formula);

                                /*
                                 * Cambio en la formula de A por (C1+C2)
                                 */
                                $vars = array();

                                CN_TABLE::getVarsInFormula($vars, $formula);

//        var_dump($vars);

                                foreach ($vars as $var) {
                                    if (substr($var, 0, 1) == 'A') {
                                        /*
                                         * Cambio de A1 por relacion con los conceptos C1
                                         * Ejemplo: 'A1' => '0'
                                         */
                                        $agrup = $this->reemplazoAgrupacion(substr($var, 1));
                                        $this->logMessage("[Liquidación Vac] Agrupacion: " . $agrup);

                                        $formula = str_replace('{' . $var . '}', $agrup, $formula);
                                    }
                                }
                                $this->logMessage("[Liquidación Vac] Formula parametrosFormula y reemplazoAgrupacion: " . $formula);

                                $arrayParametros = $this->parametrosFormula($formula);
                                $arrayParametros = $this->resultadoParametros($arrayParametros, $record, $record_consulta);

                                $formula = $this->reemplazoParametros($formula, $arrayParametros);
                                /*
                                 * Ejecutar fórmula
                                 * Ejemplo: ( 0 == 0 ? {C1} * $porcentaje : false )
                                 * Retorna false  si no cumple con la condicion
                                 */
                                $formula = str_replace('{', ' ', $formula);
                                $formula = str_replace('}', ' ', $formula);
                                $result = CN_TABLE::aplicarEval($formula);

                                /*
                                 * No cumple con la condicion
                                 */
//                if ($result === false) {
                                if ($result == '-9999' || $result == -9999) {
                                    $this->logMessage("[Liquidación Vac] Formula No cumple con la condicion: " . $formula);
                                    $result = 0;
                                }
                                //Valor base de IBC vacaciones
                                //Se quita redondeo a la milesima - 20130827
                                $valor_base_vac = round($result, 0);
                            }

                            $this->logMessage("[Liquidación Vac] Valor base de IBC vacaciones: " . $valor_base_vac);
                            $this->logMessage("---------------------------------------------------------------------");


                            // Guardar un valor en el proceso largo
                            if ($i % $brecha == 0) {
                                MemcacheHandler::getInstance()->set($progress_key, round(($i / $nom_conceptos_a_procesar) * 100, 0));
                            }

                            $this->logMessage("[generar_aportes] Existen aportes.");

                            $arrayParametros = array();

                            // Se agrega al calculo la formula (({A39}/30)*$wdiasv)) - 20130517
                            // Toma los dias de vacaciones para el mes a liquidar
                            $wdiasv = $record['wdiasv'];
                            $num_dias = $record['num_dias'];
                            $cantidad_licrem = $record['cantidad_licrem'];

                            /*
                             * Solo para ARP id_clase_fondo 3 no se tiene encuenta el tiempo de vacaciones - 20130917
                             * Para el IBC de Riesgos no se tiene en cuenta la novedad de vacaciones, el valor base y los días deben ser sin contemplar estos días. - 20130917
                             * Para los parafiscales tampoco se tiene encuenta el valor base de vacaciones - 20131023
                             * Para los parafiscales no completa dias de vacaciones - 20141124
                             */
                            if ($id_clase_fondo == 3) {
                                /**
                                 * Segun dias de licrem si tiene novedad - 20190214
                                 */
                                if ($cantidad_licrem != 0) {
                                    /*
                                     * Se toman los dias que trabajo en el mes - 20190703
                                     * Se agrega para que si fue de vacaciones, tome $wdiasv a los dias de trabajo y no reste doble vez los dias - 20191030
                                     */
                                    //$formula = "( ({A$id_agrup_concepto}+(0)) / 30 * $num_dias)";
                                    $formula = "( ({A$id_agrup_concepto}+(0)) / ($dias_trabajado - $wdiasv) * $num_dias)";
                                } else {
                                    $formula = "({A$id_agrup_concepto}+(0))";
                                }
                            } elseif ($id_clase_fondo == 1 || $id_clase_fondo == 2) {
                                $formula = "({A$id_agrup_concepto}+($valor_base_vac))";
                            } else {
                                $formula = "({A$id_agrup_concepto}+(0))";
                            }
                            $this->logMessage("[Liquidación Agrupación] Formula Inicial: " . $formula);

                            /*
                             * Reemplaza en la consulta los filtros y valores del SQL, que vienen en el record
                             * Ejemplo: select raz_soc from id_cia where id_cia = $id_cia
                             * Reemplaza $id_cia por el valor en el record
                             */
                            $formula = CN_TABLE::reemplazoConsulta($formula, $record);
                            $this->logMessage("[Liquidación Agrupación] Formula consulta los filtros: " . $formula);

                            /*
                             * Cambio en la formula de A por (C1+C2)
                             */
                            $vars = array();

                            CN_TABLE::getVarsInFormula($vars, $formula);

//        var_dump($vars);

                            foreach ($vars as $var) {
                                if (substr($var, 0, 1) == 'A') {
                                    /*
                                     * Cambio de A1 por relacion con los conceptos C1
                                     * Ejemplo: 'A1' => '0'
                                     */
                                    $agrup = $this->reemplazoAgrupacion(substr($var, 1));
                                    $this->logMessage("[Liquidación Agrupación] Agrupacion: " . $agrup);

                                    $formula = str_replace('{' . $var . '}', $agrup, $formula);
                                }
                            }
                            $this->logMessage("[Liquidación Agrupación] Formula parametrosFormula y reemplazoAgrupacion: " . $formula);



                            /*
                             * Cambio de A1 por relacion con los conceptos C1
                             * Ejemplo: 'A1' => '0'
                             */
//                            $agrup = $this->reemplazoAgrupacion($id_agrup_concepto);
//                            $this->logMessage("[Liquidación Agrupación] Agrupacion: " . $agrup);


                            /*
                             * Parser de la formula para obtener parametros(variables)
                             * Ejemplo: 'A1' => '0',
                             * 'C1' => '0'
                             */
//                            $arrayParametros = $this->parametrosFormula($agrup);
                            $arrayParametros = $this->parametrosFormula($formula);


                            /*
                             * Obtener resultados de los parametros(variables)
                             * Ejemplo: $arrayParametros = array(
                             * 'C1' => '0',
                             * 'C2' => '0'
                             * );
                             */
                            $arrayParametros = $this->resultadoParametros($arrayParametros, $record, $record_consulta);


                            /*
                             * Reemplazo de parametros(variables) a la formula
                             * Ejemplo: $arrayParametros = array(
                             * 'C1' => '1100',
                             * 'C2' => '55'
                             * );
                             */
//                            $formula = $agrup;
                            $formula = $this->reemplazoParametros($formula, $arrayParametros);
                            /*
                             * Ejecutar fórmula
                             * Ejemplo: ( 0 == 0 ? {C1} * $porcentaje : false )
                             * Retorna false  si no cumple con la condicion
                             */
                            $formula = str_replace('{', ' ', $formula);
                            $formula = str_replace('}', ' ', $formula);
                            $result = CN_TABLE::aplicarEval($formula);

                            /*
                             * No cumple con la condicion
                             */
                            //if ($result === false) {
                            if ($result == '-9999' || $result == -9999) {
                                $this->logMessage("[Liquidación Agrupación] Formula No cumple con la condicion: " . $formula);
                                $result = 0;
                            }

                            //$valor_base = round($result, -3);
                            if ($id_clase_fondo == 1 || $id_clase_fondo == 2 || $id_clase_fondo == 3) {
                                //Ya no se redondea IBC al mil, sino hacia arriba el valor - 20170307
                                //$valor_base = CN_TABLE::ceiling($result, 1000);
                                $valor_base = CN_TABLE::ceiling($result, 1);
                            } else {
                                //Ya no se redondea IBC al mil, sino hacia arriba el valor - 20170307
                                $valor_base = CN_TABLE::ceiling($result, 1);
                            }

                            /*
                             * Base del valor smlv por los dias del funcionario - 20130625
                             * Valor sin redondeo - 20130923
                             * Se toma mejor dias trabajos segun pension y salud, y no los $num_dias de aportes - 20210203:LAVILA
                             */
//                            $valor_base_smlv = round(($salario_minimo / 30) * $num_dias, -3);
                            $valor_base_smlv_arl = ($salario_minimo / 30) * $num_dias;
                            $valor_base_smlv = ($salario_minimo / 30) * $dias_trabajado;
                            $valor_base_smlv_30 = ($salario_minimo / 30) * 30; //Se deja en base 30, ya que no esta claro cuando aplica y cuando no - 20210628::LAVILA

                            $tag_valor_base = true;

                            //Valor base no puede superar 25 salarios minimos
                            $this->logMessage("[Liquidación Agrupación] Valor base25: " . $valor_base . " - Valor_base_smlv25:" . $valor_base_smlv);
                            $tag_valor_base_tope = false;
                            if ($valor_base > ($valor_base_smlv_30 * 25)) {
                                $this->logMessage("[Liquidación Agrupación] Valor base no puede superar 25 salarios minimos. Valor_base_smlv:" . $valor_base_smlv_30);
                                /**
                                 * El IBC opara parafiscales (CCF, ICBF y SENA) no tiene límite.
                                 * Está limitando el IBC a 25 smlv, este tope sí es valido pára salud, pensión y ARL. - 20140814
                                 * Tope maximo mes o proporcianal a los dias trabajados
                                 * Redondeo al mil mas cercano - 20160519
                                 */
                                if ($id_clase_fondo == 1 || $id_clase_fondo == 2 || $id_clase_fondo == 3) {

                                    $valor_base = ($valor_base_smlv_30 * 25);

                                    /*
                                     * Validacion por particion de registros para el riesgo - 20220204::LAVILA
                                     * Incidente #31408, se deja que tome dias completos para ARL, mientras se denifi proceso de cuando aplica - 20220817::LAVILA
                                     */
                                    if ($id_clase_fondo == 3 && $num_dias < 30) {
                                        //$valor_base = ($valor_base_smlv_30 * 25) - CN_TABLE::ceiling(($valor_base * (30 - $num_dias) / 30), 1);
                                    }

                                    //Extraemos la parte entera - 20141027
                                    $valor_base_mod = fmod($valor_base, 1);
                                    $valor_base = $valor_base - $valor_base_mod;
                                    $tag_valor_base = false;

                                    //$valor_base = round(($valor_base_smlv * 25) - 1, -3);
                                    /**
                                     * Maximo tope permitido por ley - 20160519
                                     * Se activa Maximo tope permitido por ley sin redondeo/ceil - 20170718
                                     */
                                    //$salario_minimo_tope = round(($salario_minimo * 25), -3);
                                    //$salario_minimo_tope = CN_TABLE::ceiling(($salario_minimo * 25), 1000);
                                    $salario_minimo_tope = CN_TABLE::ceiling(($salario_minimo * 25), 1);
                                    if ($valor_base > $salario_minimo_tope) {
                                        $valor_base = $salario_minimo_tope;
                                        $tag_valor_base_tope = true;
                                    } else {
                                        //Redondeo al mil mas cercano - 20160519
                                        //Sin redondeo - 20171018
                                        //$valor_base = round($valor_base, -3);
                                        //$valor_base = CN_TABLE::ceiling($valor_base, 1000);
                                        $valor_base = CN_TABLE::ceiling($valor_base, 1);
                                    }
                                }
                            }
                            //Valida salario minimo - 20130523
                            elseif ($valor_base < $valor_base_smlv) {
                                //Solo para ARP id_clase_fondo 3 - 20130523
                                if ($id_clase_fondo == 3) {
                                    $this->logMessage("[Liquidación Agrupación] ARP id_clase_fondo 3.");
                                    //$valor_base = round($valor_base_smlv, -3);
                                    //$valor_base_smlv = round($valor_base_smlv_arl, 0, PHP_ROUND_HALF_UP);//Se cambio ya que no toma correcto para inci, se toma base calculado - 20210219:LAVILA
                                    $valor_base_smlv = round($valor_base, 0, PHP_ROUND_HALF_UP);
                                    //$valor_base = CN_TABLE::ceiling($valor_base_smlv, 1000);
                                    //Ya no se redondea valor de riesgo -- 20170307
                                    $valor_base = CN_TABLE::ceiling($valor_base_smlv, 1);
                                }
                            }

                            $this->logMessage("[Liquidación Agrupación] Valor base: " . $valor_base . " - Valor_base_smlv:" . $valor_base_smlv);

                            /**
                             * Validar si se redondea valor o se deja valor entero del resultado - 20141027
                             */
                            if ($tag_valor_base) {
                                //round ( $valor_base * tarifa / 100 , -2)
                                $valor_calculo = ( $valor_base * $tarifa / 100 );
                                //Redondeo con ceiling - 20170223
                                //$valor_calculo = round($valor_calculo, 0, PHP_ROUND_HALF_UP);
                                $this->logMessage("[Liquidación Agrupación] Valor PHP_ROUND_HALF_UP: " . $valor_calculo);
                                //Se trunca a dos decimales el resultado - 20171117
                                $valor_calculo = CN_TABLE::truncate($valor_calculo, 2);
                                $valor_calculo = CN_TABLE::ceiling($valor_calculo, 100);
                                $this->logMessage("[Liquidación Agrupación] Valor ceiling: " . $valor_calculo);
                                //Proceso para calcular el total del aporte redondeado a la centena
                                /*
                                  if (($valor_calculo + 50) == round($valor_calculo, -2)) {
                                  $valor_calculo = $valor_calculo - 50;
                                  } else {
                                  $valor_calculo = round($valor_calculo, -2);
                                  } */
                            } else {

                                $valor_calculo = ( $valor_base * $tarifa / 100 );
                                //Extraemos la parte entera 
                                $valor_calculo_mod = fmod($valor_calculo, 1);
                                $valor_calculo = $valor_calculo - $valor_calculo_mod;
                                //Redondeo al cien mas cercano - 20160519
                                //$valor_calculo = round($valor_calculo, -2);
                                $valor_calculo = CN_TABLE::ceiling($valor_calculo, 100);

                                //Tope maximo de ley no redondea, solo los decimales - 20160519
                                if ($id_clase_fondo == 3) {
                                    $this->logMessage("[Liquidación Agrupación] Tope maximo de ley no redondea, solo los decimales. Valor_base::" . $valor_base);
                                    if ($tag_valor_base_tope) {
                                        $valor_calculo_tope = ( $valor_base * $tarifa / 100 );
                                        $valor_calculo = ceil($valor_calculo_tope);
                                        $this->logMessage("[Liquidación Agrupación] Tope maximo de ley no redondea, solo los decimales. Valor_calculo::" . $valor_calculo);
                                    }
                                }
                            }

                            $aporte_func = $aporte_func;


                            /*
                             * Actualizar registro aporte
                             * Se calcula el valor del patrono, valor total aporte calculado menos el aporte funcionario
                             * Cuando el IBC  de cualquier tipo de aporte de NEGATIVO  inmediatamente este valor debe ser (0),   
                             * DIAS DE APORTE (0)  Y VALOR DE APORTE (0) - 20150205
                             */
                            if ($valor_base < 0) {

                                //sentencia sql
                                $sql = <<<EOD
update NO_LIQUIDA_APORTE set valor_base = 0
        , aporte_patrono =  0
            , aporte_func =  0
                , num_dias =  0
    where id_liquida_aporte = $id_liquida_aporte 
EOD;
                            } else {
                                /*
                                 * NOM-115 <-> SGC::Nomina - Autoliquidación de Aportes, solo para parafiscales - 20150430
                                 * NOM-464 <-> SGC::Nomina - Se coloca validacion para dias igual a 0 - 20170123
                                 * Se retiran los $num_dias para los parafiscales Ticket#23494, para incluir liquidacion definitivas para dias no trabajados - 2010902::LAVILA
                                 */
                                if (($valor_base == 0 /* || $num_dias == 0 */ ) && $id_clase_fondo != 1 && $id_clase_fondo != 2 && $id_clase_fondo != 3) {
                                    //sentencia sql
                                    $sql = <<<EOD
update NO_LIQUIDA_APORTE set valor_base = 0
        , aporte_patrono =  0
            , aporte_func =  0
                , num_dias =  0
    where id_liquida_aporte = $id_liquida_aporte 
EOD;
                                    //ejecuta y obtiene el resultado del sql
                                    CN_TABLE::executeSQL($sql);
                                } else {
                                    //sentencia sql
                                    $sql = <<<EOD
update NO_LIQUIDA_APORTE set valor_base = $valor_base
        , aporte_patrono =  case when porcentaje_patrono > 0 then $valor_calculo - $aporte_func else 0 end 
            , aporte_func =  case when porcentaje_patrono = 0 then $valor_calculo else $aporte_func end
    where id_liquida_aporte = $id_liquida_aporte 
EOD;
                                    //ejecuta y obtiene el resultado del sql
                                    CN_TABLE::executeSQL($sql);
                                }
                            }


                            /*
                             * Valida si es fondo de solidaridad
                             */
                            if ($id_clase_fondo == 1 && $tarifa == 1) {
                                $this->logMessage("[Liquidación Agrupación] Valida si es fondo de solidaridad.");
//                        if (true) {

                                $valor_base_vac = 0;
                                $array_valor_base = $this->valor_base_fsp($valor_base, $salario_minimo, $valor_base_vac);
                                $valor_fsp = $array_valor_base['valor_fsp'];
                                $porcentaje_fsp = $array_valor_base['porcentaje_fsp'];

                                //Se redondea el 5 hacia arriba - 20140522
                                //Se elimina redondeo hacia arriba - 20140730 : $valor_base_fsp = CN_TABLE::redondeoValor((($valor_base +1) * 0.5 / 100), -2);
                                //$tag_valor_base_tope si supera el ope no redondea a 100, y la diferencia la resta de $valor_fsp - 20160816
                                if ($tag_valor_base_tope) {
                                    $valor_base_fsp = CN_TABLE::redondeoValor((($valor_base) * 0.5 / 100), 0);
                                    //$valor_base_fsp_dif = CN_TABLE::redondeoValor((($valor_base) * 0.5 / 100), -2) - $valor_base_fsp;
                                    //Redondeo es hacia arriba - 20170303
                                    $valor_base_fsp_dif = CN_TABLE::ceiling((($valor_base) * 0.5 / 100), 100) - $valor_base_fsp;
                                    $valor_fsp = $valor_fsp - $valor_base_fsp_dif;
                                } else {
                                    //$valor_base_fsp = CN_TABLE::redondeoValor((($valor_base) * 0.5 / 100), -2);
                                    //Redondeo es hacia arriba - 20170303
                                    $valor_base_fsp = CN_TABLE::ceiling((($valor_base) * 0.5 / 100), 100);
                                }

                                //Validar que el valor fsp es mayor a cero
                                if ($valor_fsp > 0) {

                                    /*
                                     * Actualizar valor aporte_func
                                     */
                                    //sentencia sql
                                    $sql = <<<EOD
update NO_LIQUIDA_APORTE set aporte_func =  $valor_fsp
        , porcentaje_func = $porcentaje_fsp
        , tarifa = $porcentaje_fsp
            , valor_base_fsp = $valor_base_fsp 
    where id_liquida_aporte = $id_liquida_aporte 
EOD;
                                    //ejecuta y obtiene el resultado del sql
                                    CN_TABLE::executeSQL($sql);
                                } else {

                                    /*
                                     * Borrar del FSP
                                     */
                                    //sentencia sql
                                    $sql = <<<EOD
delete from NO_LIQUIDA_APORTE where id_liquida_aporte = $id_liquida_aporte 
and id_periodo = $id_periodo
EOD;
                                    //ejecuta y obtiene el resultado del sql
                                    CN_TABLE::executeSQL($sql);
                                }


//                                MemcacheHandler::getInstance()->set($progress_key, 100);
//                                exit("-");
                            }

                            $i++;



                            $this->conn->commit();
                        }
                        MemcacheHandler::getInstance()->set($progress_key, 98);

                        /*
                         * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
                         */
                        $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

                        $int = 0;
                        foreach ($array as $routeName => $routeData) {
                            //echo $routeName . "\n";
                            if ('entidad_cliente' == $routeName) {
                                foreach ($routeData as $key => $value) {
                                    //echo $value . "\n";
                                    if ($key == 'value') {
                                        $entidadCliente = $value;
                                    }
                                }
                            }
                            $int++;
                        }

                        /**
                         * SQL para optener registros de aportes licencia no remunerada - 20131119
                         * No debe llevar registro de pension de aportes licencia no remunerada - 20140729
                         * Se coloca que para CYC, se toma el valor de pension para lic no remunerada - 20170131
                         * Se corrige por dias de retiro - 20170228
                         * Redondeo es hacia arriba y por metodo de ceil - 20170303
                         * La base no se redondea al mil - 20171219
                         * Se coloca que para SGC - 20180808
                         * Se activa para todos - 20190213
                         * Incidente #30208, Tomar correctamente el ultimo no_nombramiento - 20220616::LAVILA
                         */
                        //Sql
                        $sql = <<<EOD
SELECT
    tab3.c37_num_dias as num_dias_licnorem,
    /*case when $entidadCliente in (1,4)
        then tab3.PENSION + tab3.salud
        else tab3.salud end as aporte_patrono_licnorem,*/                                
--    tab3.salud as aporte_patrono_licnorem,
    tab3.PENSION + tab3.salud as aporte_patrono_licnorem,
    tab3.PENSION,
    tab3.salud,
    tab3.id_periodo,tab3.id_clase_fondo,
    tab3.id_mae_fondos,
    tab3.id_concep_nomina,
    tab3.codigo,tab3.fondo,
    tab3.num_doc,
    tab3.id_tipo_doc

        FROM(

        select
                                
        tab3.c37_num_dias,
                                
        case when tab1.id_clase_fondo =1 then nvl((case when  tab1.porcentaje_func != 1  then tab3.c47_pension else 0 end),0)
        when tab1.id_clase_fondo = 2 then 0
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS PENSION,
        
         case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then nvl(tab3.c55_salud,0) 
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS salud
        ,
        
        
        tab1.id_periodo as id_periodo,
        tab1.id_clase_fondo,
        tab1.id_concep_nomina,
        tab2.id_mae_fondos,
        tab2.codigo as codigo,
        tab1.id_tipo_doc,
        tab1.num_doc,
        tab2.num_doc as num_doc_mae,
        tab2.razon_social AS FONDO,
                                
        case when tab1.id_clase_fondo =1 then tab1.aporte_func
        when tab1.id_clase_fondo = 2 then 0
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_FUNC_PENSION,
        case when tab1.id_clase_fondo =1 then tab1.aporte_patrono
            +nvl((case when  tab1.porcentaje_func != 1  then tab3.c47_pension else 0 end),0)
        when tab1.id_clase_fondo = 2 then 0
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_PATRONO_PENSION,
        case when tab1.id_clase_fondo =1 then tab1.aporte_patrono+tab1.aporte_func
            +nvl((case when  tab1.porcentaje_func != 1  then tab3.c47_pension else 0 end),0)
        when tab1.id_clase_fondo = 2 then 0
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS TOTAL_PENSION,

        case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then tab1.aporte_func
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_FUNC_SALUD,
        case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then tab1.aporte_patrono+nvl(tab3.c55_salud,0)
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_PATRONO_SALUD,
        case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then tab1.aporte_patrono+tab1.aporte_func+tab1.upc_adicio+nvl(tab3.c55_salud,0)
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS TOTAL_SALUD,

        case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then tab1.upc_adicio
        when tab1.id_clase_fondo = 3 then 0
        else 0 end AS UPC_ADICIO,

        case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then 0
        when tab1.id_clase_fondo = 3 then tab1.aporte_patrono
        else 0 end AS APORTE_PATRONO_ARP,

        case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then 0
        when tab1.id_clase_fondo = 3 then tab1.aporte_patrono
        else 0 end AS TOTAL_ARP,

        case when tab1.id_clase_fondo =1 then 0
        when tab1.id_clase_fondo = 2 then 0
        when tab1.id_clase_fondo = 3 then 0
        else tab1.aporte_patrono end AS PARAFISCALES


        from no_liquida_aporte tab1

        left join no_mae_fondos tab2 ON tab2.id_mae_fondos = tab1.id_mae_fondos

        left join (
        select
licnoremun.*
from
(

select

tab0.num_doc AS C4_num_doc,
                                
--30-nvl(salud1.dias,0) - nvl(30- case when nvl( to_number(to_char(tab5.fecha_termina,'dd')) ,0) != 31 then nvl( to_number(to_char(tab5.fecha_termina,'dd')) ,0) else 30 end ,0)  as c37_num_dias,
nvl(30-nvl(pension2.dias-nvl(kardex4.cantidad,0),0)- (tab5.dias_retiro),0) as c37_num_dias, 
    
--Se forza redondeo hacia arriba - 20170307
--La base no se redondea al mil - 20171219
ceil( ( ( round( nvl(tab6.asignacion_basica,0)/30*(30-nvl(pension2.dias-nvl(kardex4.cantidad,0),0)- (tab5.dias_retiro))  )
 * nvl( case when ( max_marca = 0 or max_marca_susinc = 1 ) then pension2.tarifa else 0 end ,0) ) ) /100)*100  as c47_pension,

ceil( ( ( round( nvl(tab6.asignacion_basica,0)/30*(30-nvl(salud1.dias-nvl(kardex4.cantidad,0),0)- (tab5.dias_retiro))  )
 * nvl( case when ( max_marca = 0 or max_marca_susinc = 1 ) then salud1.tarifa else 0 end ,0) ) ) /100)*100  as c55_salud

from no_estado_func_v tab0

left join centro_operacion tab1 ON tab1.id_cen_op = tab0.id_cen_op
left join departamento tab2 ON tab2.id_depto = tab1.id_depto
left join municipios tab3 ON tab3.codmun = tab1.codmun
left join no_datos_funcionario_v tab4 ON tab4.id_tipo_doc = tab0.id_tipo_doc and tab4.num_doc = tab0.num_doc

--left join no_nombramiento tab5 on tab5.id_tipo_doc = tab0.id_tipo_doc and tab5.num_doc = tab0.num_doc
left join (
  SELECT
   case when aut.fecha_termina
  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
  and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') )) 
  then (30 - to_char(aut.fecha_termina,'dd') ) else 0 end as dias_retiro,                                
   aut.*,
   ROW_NUMBER() OVER (
    partition by aut.num_doc
    ORDER BY aut.num_doc, aut.estado DESC, aut.fecha_ingreso DESC
   ) AS rn
  from no_nombramiento aut
)tab5
on tab5.id_tipo_doc = tab0.id_tipo_doc
and tab5.num_doc = tab0.num_doc
and tab5.rn = 1

--left join no_dp_v tab6 on tab6.id_dp = tab0.id_dp
/*
Se cambia para tomar valor de concepto_periodo para el concepto_nomina 1001 del periodo de tipo mensual o nomina adicional - 20130827
*/
left join(

    select * from(
            select
            concep.id_tipo_doc,
            concep.num_doc,
            concep.valor as asignacion_basica ,

             ROW_NUMBER() OVER (
              PARTITION BY concep.num_doc
              order by per.id_tipo_periodo asc, concep.fecha_hasta desc
             ) as rn

            from no_concepto_periodo concep

            join no_periodo per
            on concep.PERIODO = per.id_periodo

            where
            concep.id_concep_nomina = (select id_concep_basica from no_param_concep)

            and (per.id_tipo_periodo = 1 or per.id_tipo_periodo = 2)
            and (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = concep.PERIODO) = (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo)
    )where rn = 1

)tab6 ON tab6.id_tipo_doc = tab0.id_tipo_doc and tab6.num_doc = tab0.num_doc
and tab6.rn = 1


left join
(
    select tab0.num_doc, count(tab0.id_novedad_kardex) CANTIDAD, max(tab1.suspension) as max_marca
    from no_novedad_kardex tab0
    left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka
    where tab1.afecta_antigu = 1 and tab0.estado = 1
     /*
    and (
      tab0.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
      and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') ))
      or
      tab0.fecha_fin between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
      and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') ))
      or
      tab0.id_periodo = $id_periodo
    )*/
    and
    (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = tab0.id_periodo) <= (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = $id_periodo)
    and (
      to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') between tab0.fecha_ini and tab0.fecha_fin
      or
      trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) between tab0.fecha_ini and tab0.fecha_fin
      or
      tab0.id_periodo = $id_periodo
      or
      tab0.fecha_fin between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
      and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') ))
    )
    group by tab0.num_doc
)kardex1 ON kardex1.num_doc = tab0.num_doc

/*
Se cambia de id-4 por atributo en  la tabla no_tip_nov_ka de afecta_riesgo, para validar cuales afectan en los dias de ARP-ARL - 20130919
*/
left join
(
    select tab0.num_doc, sum(tab0.num_dias) CANTIDAD
    from no_novedad_kardex tab0
    left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka
    where tab1.afecta_riesgo = 1 and tab0.estado = 1 and tab0.fecha_inc between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
    and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') ))
    group by tab0.num_doc
)kardex4 ON kardex4.num_doc = tab0.num_doc

/*
Incapacidad -> Suspensión por Incapacidad  - 20150312
*/
left join
(
    select tab0.num_doc, count(tab0.id_novedad_kardex) as max_marca_susinc
    from no_novedad_kardex tab0
    left join no_tip_nov_ka tab1 ON tab1.id_tip_nov_ka = tab0.id_tip_nov_ka
    where tab1.afecta_antigu = 1 and tab0.estado = 1 
    and tab0.id_tip_nov_ka = (select no_param_concep.id_nov_ka_susinc from no_param_concep where no_param_concep.id_param_concep = 1)
     /*   
    and (
      tab0.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
      and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) 
      or
      tab0.fecha_fin between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
      and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) 
      or 
      tab0.id_periodo = $id_periodo
    )*/
    and
    (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = tab0.id_periodo) <= (select id_anhos || lpad(id_meses,2,'0') as vigper from no_periodo where id_periodo = $id_periodo)
    and (
      to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') between tab0.fecha_ini and tab0.fecha_fin
      or
      trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) between tab0.fecha_ini and tab0.fecha_fin
      or 
      tab0.id_periodo = $id_periodo
    )
    group by tab0.num_doc
)kardex5 ON kardex5.num_doc = tab0.num_doc


left join
(
    select tab0.num_doc, sum(tab0.aporte_func) as aporte, sum(tab0.aporte_patrono) as aporte_patrono, max(tab0.num_dias) as dias, max(nvl(tab0.valor_base,0)) as ibc,
    max(tab0.tarifa)/100 as TARIFA/*, tab0.aporte_func AS APORTE*/
    from no_liquida_aporte tab0
    where tab0.id_periodo = $id_periodo and tab0.id_clase_fondo = 1
    and tab0.tipo_planilla = 'A'
    group by tab0.num_doc
)pension1 ON pension1.num_doc = tab0.num_doc

left join
(
    select tab0.num_doc, sum(tab0.aporte_func) as aporte, sum(tab0.aporte_patrono) as aporte_patrono, max(tab0.num_dias) as dias, max(nvl(tab0.valor_base,0)) as ibc,
    max(tab0.porcentaje_patrono/100) as TARIFA--, tab0.aporte_func AS APORTE
    from no_liquida_aporte tab0
    where tab0.id_periodo = $id_periodo and tab0.id_clase_fondo = 1 and tab0.porcentaje_patrono > 0 -- and  ( tab0.tarifa = 16 or tab0.tarifa = 26 )
    and tab0.tipo_planilla = 'A'
    group by tab0.num_doc
)pension2 ON pension2.num_doc = tab0.num_doc

left join
(
    select tab0.num_doc, sum(tab0.aporte_func) AS APORTE, sum(tab0.aporte_patrono) as aporte_patrono, sum(tab0.valor_base_fsp) as aporte_fsp, max(tab0.num_dias) AS DIAS, MAX(nvl(tab0.valor_base,0)) AS IBC/*,
    tab0.tarifa/100 as TARIFA, tab0.aporte_func AS APORTE*/
    from no_liquida_aporte tab0
    where tab0.id_periodo = $id_periodo and tab0.id_clase_fondo = 1 and tab0.porcentaje_patrono = 0 
    and tab0.tipo_planilla = 'A'
    group by tab0.num_doc
)pension3 ON pension3.num_doc = tab0.num_doc

left join
(
    select tab0.num_doc, sum(tab0.aporte_func) AS APORTE, sum(tab0.aporte_patrono) as aporte_patrono, max(tab0.num_dias) AS DIAS, MAX(nvl(tab0.valor_base,0)) AS IBC,
    max(tab0.porcentaje_patrono)/100 as TARIFA/*, tab0.aporte_func AS APORTE*/
    from no_liquida_aporte tab0
    where tab0.id_periodo = $id_periodo and tab0.id_clase_fondo = 2
    and tab0.tipo_planilla = 'A'
    group by tab0.num_doc
)salud1 ON salud1.num_doc = tab0.num_doc


WHERE tab0.periodo = $id_periodo
and (tab0.actual = 1 or
  ( tab0.actual = 0
    /*
    Se cambia fecha de termina(ultimo dia de trabajo) por fecha de retiro,
    para tener encuenta si trabajo en el periodo al menos 1 dia - 20130828
    */
    and tab5.fecha_retiro != to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
    and tab5.fecha_termina
  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
  and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo) ,'dd/mm/yyyy') ))
  )
)
and kardex1.cantidad > 0

)licnoremun

        )tab3 on tab3.C4_num_doc = tab1.num_doc
        
        
        
         )tab3

where tab3.id_periodo = $id_periodo
and (tab3.PENSION + tab3.salud) > 0
--and (tab3.salud) > 0
EOD;

                        //Ejecutar SQL
                        $record_licnorem = CN_TABLE::executeSQL($sql);

                        foreach ($record_licnorem as $value) {

                            $aporte_patrono_licnorem = $value['aporte_patrono_licnorem'];
                            $num_dias_licnorem = $value['num_dias_licnorem'];
                            $id_tipo_doc = $value['id_tipo_doc'];
                            $num_doc = $value['num_doc'];
                            $id_clase_fondo = $value['id_clase_fondo'];
                            $id_mae_fondos = $value['id_mae_fondos'];
                            $id_concep_nomina = $value['id_concep_nomina'];
                            $id_periodo_filtro = $value['id_periodo'];

                            /*
                             * Actualizar liquida_aporte valor aporte_patrono_licnorem
                             */
                            //sentencia sql
                            $sql = <<<EOD
update NO_LIQUIDA_APORTE set aporte_patrono_licnorem = $aporte_patrono_licnorem, num_dias_licnorem = $num_dias_licnorem
    where id_tipo_doc = $id_tipo_doc
    and num_doc = $num_doc
    and id_clase_fondo = $id_clase_fondo
    and id_mae_fondos = $id_mae_fondos
    and id_concep_nomina = $id_concep_nomina
    and id_periodo = $id_periodo_filtro
EOD;
                            //ejecuta y obtiene el resultado del sql
                            CN_TABLE::executeSQL($sql);
                        }

                        MemcacheHandler::getInstance()->set($progress_key, 99);

                        /**
                         * Recalculo de aporte patrono para parafiscales, 
                         * para personas con vacaciones, que su registro puede modificarse por el doble registro de la planilla - 20170309
                         * Se verifica que toma segun planilla los dias calculados y no siempre 30, se valida que tenga dias diferente de 0 - 20210423
                         */
                        //Ejecutar SQL
                        $sql = <<<EOD
select 
tab0.id_tipo_doc,
tab0.num_doc,
vaca.num_dias_vac,
liq.id_liquida_aporte,
liq.id_clase_fondo,
liq.id_mae_fondos,
liq.id_concep_nomina,
liq.valor_base,
liq.num_dias,
liq.aporte_patrono,
liq.tarifa,
ceil( ( (liq.valor_base/liq.num_dias*vaca.num_dias_vac) *liq.tarifa/100) /100)*100 as aaa,
ceil( ( (liq.valor_base/liq.num_dias*(liq.num_dias-vaca.num_dias_vac)) *liq.tarifa/100) /100)*100 as bbb,
(ceil( ( (liq.valor_base/liq.num_dias*vaca.num_dias_vac) *liq.tarifa/100) /100)*100) + (ceil( ( (liq.valor_base/liq.num_dias*(liq.num_dias-vaca.num_dias_vac)) *liq.tarifa/100) /100)*100) as ccc,

( (ceil( ( (liq.valor_base/liq.num_dias*vaca.num_dias_vac) *liq.tarifa/100) /100)*100) + (ceil( ( (liq.valor_base/liq.num_dias*(liq.num_dias-vaca.num_dias_vac)) *liq.tarifa/100) /100)*100) ) - liq.aporte_patrono as dif

from no_estado_func_v tab0

left join no_liquida_aporte liq
on tab0.id_tipo_doc = liq.id_tipo_doc
and tab0.num_doc = liq.num_doc
and liq.id_periodo = $id_periodo

left join centro_operacion tab1 on tab1.id_cen_op = tab0.id_cen_op
left join departamento tab2 on tab2.id_depto = tab1.id_depto
left join municipios tab3 on tab3.codmun = tab1.codmun
left join no_datos_funcionario_v tab4 on tab4.id_tipo_doc = tab0.id_tipo_doc and tab4.num_doc = tab0.num_doc

--left join no_nombramiento tab5 on tab5.id_tipo_doc = tab0.id_tipo_doc and tab5.num_doc = tab0.num_doc
left join (
  select
  case when aut.fecha_termina
  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
  and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) 
  then (30 - to_char(aut.fecha_termina,'dd') ) else 0 end as dias_retiro,
   aut.*,
   row_number() over (
    partition by aut.num_doc
    order by aut.estado desc, aut.fecha_ingreso desc
   ) as rn
  from no_nombramiento aut
)tab5
on tab5.id_tipo_doc = tab0.id_tipo_doc 
and tab5.num_doc = tab0.num_doc
and tab5.rn = 1

/*
Se coloca, tab0.id_periodo en la agrupacion, para tener encuenta todas las novedades - 20161104
*/
left join
(
    select 

   id_tipo_doc,                  
   num_doc,
   sum( nvl(cantidad_vaciones,0) ) as cantidad,
   sum(dias_vaciones) as num_dias_vac,
   max(fecha_ini) as fecha_ini2, 
   case when max(fecha_ini) < to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') then to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') else max(fecha_ini) end as fecha_ini,
   max(fecha_fin) as fecha_fin2,
   case when max(fecha_fin) > trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') ))  then trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') ))  else max(fecha_fin) end as fecha_fin

   from( 

       select 
       
       case  when tipnov.operador  = 1 
                 then nvl(sum(dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) 
                 else nvl(sum(dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo))),0) * (-1)
                 end as dias_vaciones,
                 
       max(tab0.fecha_ini) as fecha_ini, max(tab0.fecha_fin) as fecha_fin,
       tab0.id_tipo_doc, tab0.num_doc, count(tab0.id_novedad_vac) cantidad,
        tipnov.operador,

        case  when tipnov.operador  = 1 
        /*then 1
        else (-1)*/
        then tab0.num_dias_vac
        else (-1 * tab0.num_dias_vac)
        --else nvl(sum( tab0.fecha_fin - tab0.fecha_ini + 1),0) * (-1)
        end as cantidad_vaciones

       from no_novedad_vac tab0
       left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = tab0.id_tipo_nov_vac
       
       where 
       --tipnov.ID_TIPO_NOV_VAC = 1 and
       tipnov.tiempo_liqui = 1 and
       (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = tab0.id_periodo) <= (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo) and
       
      /*
       tab0.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
       and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) 
       */
       /*Marca de vacaciones para todo el tiempo de duracion - 20130917*/
      ( 
          tab0.fecha_ini  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
          and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) 
          or
          tab0.fecha_fin  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
          and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) 
        or
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') between tab0.fecha_ini and tab0.fecha_fin
          or
          trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') )) between tab0.fecha_ini and tab0.fecha_fin
        )
        /* Valida que no sea un dia 31, ya que no se cuenta para liquidacion, que posea dias de vac en el periodo liquidado - 20141031 */        
        --and to_char(tab0.fecha_ini,'dd') != 31
        and dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo = $id_periodo)) > 0
        
        group by tab0.id_tipo_doc, tab0.num_doc,
       tipnov.operador, tab0.num_dias_vac, tab0.id_periodo

   ) 

   group by id_tipo_doc, num_doc
)vaca on vaca.num_doc = tab0.num_doc

where tab0.periodo = $id_periodo 
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc 
and (tab0.actual = 1 or
  ( tab0.actual = 0 
    /*
    Se cambia fecha de termina(ultimo dia de trabajo) por fecha de retiro, 
    para tener encuenta si trabajo en el periodo al menos 1 dia - 20130828                    
    */
    and tab5.fecha_retiro != to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
    and tab5.fecha_termina
  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy')
  and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'dd/mm/yyyy') ))
  )
)
and vaca.num_dias_vac>0
and liq.id_clase_fondo not in (1,2,3)
and liq.num_dias != 0                                

order by
tab0.num_doc,
liq.id_clase_fondo  
EOD;

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

                        foreach ($record_vac_doble as $value) {

                            $id_liquida_aporte = $value['id_liquida_aporte'];
                            $aporte_patrono = $value['ccc'];
                            $dif = $value['dif'];

                            $this->logMessage("[generar_aportes] Valor id_liquida_aporte::" . $id_liquida_aporte);
                            $this->logMessage("[generar_aportes] Valor aporte_patrono::" . $aporte_patrono);
                            $this->logMessage("[generar_aportes] Valor dif::" . $dif);

                            if ($dif != 0) {
                                //sentencia sql
                                $sql = <<<EOD
update no_liquida_aporte set aporte_patrono = $aporte_patrono where id_liquida_aporte = $id_liquida_aporte 
EOD;
                                //ejecuta y obtiene el resultado del sql
                                CN_TABLE::executeSQL($sql);
                            }
                        }


                        /**
                         * Actualizar ibc para las personas de comision - 2020115, Posible  Incidente #18937 de 20201015
                         * Incidente #39277, se coloca condiciones para dias = 0 y solo clase fondo salu, pension  para parafiscales y ARL NO, 
                         * segun revision si trabajo o tuvo vac calcula para pension y salud algun valor y dias, para parafiscales/ARL no si estaba en VAC - 20250122::LAVILA
                         */
                        //Ejecutar SQL
                        $sql = <<<EOD
SELECT
liq.id_liquida_aporte,
liq.num_doc,
nvl(conf.valor,0) as valor

FROM no_liquida_aporte liq

left join no_concepto_func conf
on conf.id_tipo_doc = liq.id_tipo_doc
and conf.num_doc = liq.num_doc
and conf.id_concep_nomina = 1
and conf.actual = 1

where 
liq.id_periodo = $id_periodo
and liq.tipo_planilla = 'A'
and liq.valor_base = 0
and liq.tarifa != 0
and liq.num_dias = 0
and liq.id_clase_fondo in (1,2)                                
and liq.num_doc in (

    select 
    nov.num_doc
    from no_novedad_personal nov
    where
    nov.estado = 1
    and nov.id_novedad = 8                
    and (
        (select fecha_ini from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
        or    
        (select fecha_fin from no_periodo where id_periodo = $id_periodo) between nov.fecha_inicial and nov.fecha_terminacion
    )

)  
EOD;

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

                        foreach ($record_comis as $value) {

                            $valor_base = $value['valor'];
                            $id_liquida_aporte = $value['id_liquida_aporte'];

                            //sentencia sql
                            $sql = <<<EOD
update NO_LIQUIDA_APORTE set valor_base = $valor_base
    where id_liquida_aporte = $id_liquida_aporte  
        and id_periodo = $id_periodo
EOD;
                            //ejecuta y obtiene el resultado del sql
                            CN_TABLE::executeSQL($sql);
                        }

                        MemcacheHandler::getInstance()->set($progress_key, 100);
                    } else {


                        $this->conn->commit();

                        //Anexo del mensaje la identificacion de quien genero el error. -- 20130826
                        $mensaje_func = '';
                        foreach ($record_total as $key => $value) {
                            $mensaje_func .= $value['num_doc'] . ' - ';
                        }

                        MemcacheHandler::getInstance()->set($progress_key, 100);
                        $mensaje = "Verifique que el funcionario(s) este afiliado a todos los fondos. Funcionario(s): " . $mensaje_func;

                        $this->status = 2;
                        $this->mensajeError = $mensaje;
                    }
                } else {
                    $this->conn->commit();
                }
            } else {
                $this->conn->commit();
            }


            /**
             * Abrir nueva conexion con la Base de Datos
             */
            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
select count(*) as count from (

SELECT 
tab0.*
FROM (

    select distinct 
    
    tab0.tipo_planilla,
    tab0.id_liquida_aporte,
    tab0.id_clase_fondo,
    tab0.id_mae_fondos,
    tab0.id_concep_nomina,
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.valor_base,
    tab0.num_dias,
    tab0.aporte_func,
    tab0.aporte_patrono,
    tab0.id_cen_op,
    tab0.id_tipo_aporte,
    tab0.porcentaje_func,
    tab0.porcentaje_patrono,
    tab0.tarifa,
    tab0.id_periodo,
    tab0.upc_adicio,
    tab0.valor_base_fsp,
    tab0.id_tae,
    tab1.razon_social as fondo,
    tab2.descripcion as clase_fondo,
    tab3.codigo||' - '||tab3.descripcion as concepto,
    tab4.nombre_apellido as nombre_apellido,
    tab4.nombre_completo as nombre_completo,
    cla.id_clase_planta,
    cla.codigo,
    cla.descripcion
    
    from NO_LIQUIDA_APORTE  tab0
    left join NO_DATOS_FUNCIONARIO_V tab4 ON tab4.id_tipo_doc = tab0.id_tipo_doc and tab4.num_doc = tab0.num_doc
    left join NO_MAE_FONDOS tab1 ON tab1.id_mae_fondos = tab0.id_mae_fondos
    left join NO_CLASE_FONDO tab2 ON tab2.id_clase_fondo = tab0.id_clase_fondo
    left join NO_CONCEP_NOMINA tab3 ON tab3.id_concep_nomina = tab0.id_concep_nomina

    left join (

       select 
       nom.*,
       cla.codigo,
       cla.descripcion
       from no_nombramiento_v nom

       left join no_clase_planta cla
       on nom.id_clase_planta = cla.id_clase_planta

    )cla
    on cla.id_tipo_doc = tab0.id_tipo_doc and cla.num_doc = tab0.num_doc  
    
    WHERE 
    tab0.id_periodo = $id_periodo
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
    $whereClaseFondo $whereMaestroFondos
    $whereTipoPlanilla     

)tab0

where
1 = 1
$whereClasePlanta                    

)
EOD;


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

            /*
             * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
             */
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
    
SELECT 
tab0.*
FROM (

    select distinct 
    
    tab0.tipo_planilla,
    tab0.id_liquida_aporte,
    tab0.id_clase_fondo,
    tab0.id_mae_fondos,
    tab0.id_concep_nomina,
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.valor_base,
    tab0.num_dias,
    tab0.aporte_func,
    tab0.aporte_patrono,
    tab0.id_cen_op,
    tab0.id_tipo_aporte,
    tab0.porcentaje_func,
    tab0.porcentaje_patrono,
    tab0.tarifa,
    tab0.id_periodo,
    tab0.upc_adicio,
    tab0.valor_base_fsp,
    tab0.id_tae,
    tab1.razon_social as fondo,
    tab2.descripcion as clase_fondo,
    tab3.codigo||' - '||tab3.descripcion as concepto,
    tab4.nombre_apellido as nombre_apellido,
    tab4.nombre_completo as nombre_completo,
    cla.id_clase_planta,
    cla.codigo,
    cla.descripcion
    
    from NO_LIQUIDA_APORTE  tab0
    left join NO_DATOS_FUNCIONARIO_V tab4 ON tab4.id_tipo_doc = tab0.id_tipo_doc and tab4.num_doc = tab0.num_doc
    left join NO_MAE_FONDOS tab1 ON tab1.id_mae_fondos = tab0.id_mae_fondos
    left join NO_CLASE_FONDO tab2 ON tab2.id_clase_fondo = tab0.id_clase_fondo
    left join NO_CONCEP_NOMINA tab3 ON tab3.id_concep_nomina = tab0.id_concep_nomina

    left join (

       select 
       nom.*,
       cla.codigo,
       cla.descripcion
       from no_nombramiento_v nom

       left join no_clase_planta cla
       on nom.id_clase_planta = cla.id_clase_planta

    )cla
    on cla.id_tipo_doc = tab0.id_tipo_doc and cla.num_doc = tab0.num_doc  
    
    WHERE 
    tab0.id_periodo = $id_periodo
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
    $whereClaseFondo $whereMaestroFondos
    $whereTipoPlanilla     

)tab0

where
1 = 1
$whereClasePlanta

$sortBy
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

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

            //Ejecuta sql
            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($records);
            $this->list_data = $records;

            $this->conn->commit();
        } catch (Exception $e) {

            $mensaje = "[generar_aportes] ERROR!!!";

            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $this->logMessage($e->getMessage());

            $this->conn->rollback();
        }
    }

    /**
     * Calcular FSP aporte funcionario
     * @param type $valor_base
     * @param type $salario_minimo
     * @return int
     */
    private function valor_base_fsp($valor_base, $salario_minimo, $valor_base_vac = 0) {

        $valor = 0;
        $valorfps1 = 0;
        $valorfps2 = 0;
        $porcentaje = 0;

        /*
         * Operaciones
         */

        if (($valor_base + $valor_base_vac) > ($salario_minimo * 4) && ($valor_base + $valor_base_vac) <= ($salario_minimo * 16)) {
            $porcentaje = 1;
        } elseif (($valor_base + $valor_base_vac) > ($salario_minimo * 16) && ($valor_base + $valor_base_vac) <= ($salario_minimo * 17)) {
            $porcentaje = 1.2;
        } elseif (($valor_base + $valor_base_vac) > ($salario_minimo * 17) && ($valor_base + $valor_base_vac) <= ($salario_minimo * 18)) {
            $porcentaje = 1.4;
        } elseif (($valor_base + $valor_base_vac) > ($salario_minimo * 18) && ($valor_base + $valor_base_vac) <= ($salario_minimo * 19)) {
            $porcentaje = 1.6;
        } elseif (($valor_base + $valor_base_vac) > ($salario_minimo * 19) && ($valor_base + $valor_base_vac) <= ($salario_minimo * 20)) {
            $porcentaje = 1.8;
        } elseif (($valor_base + $valor_base_vac) > ($salario_minimo * 20)) {
            $porcentaje = 2;
        }

        $valorfps1 = $valor_base * 0.5 / 100;
        $valorfps2 = $valor_base * ($porcentaje - 0.5) / 100;

        //$valor = CN_TABLE::redondeoValor($valorfps1, -2) + CN_TABLE::redondeoValor($valorfps2, -2);
        $valor = CN_TABLE::ceiling($valorfps1, 100) + CN_TABLE::ceiling($valorfps2, 100);

        //Valida que si porcentaje 0, el valor de aporte es 0 - 20170307
        if ($porcentaje == 0) {
            $valor = 0;
        }

        $array_fsp = array(
            'valor_fsp' => $valor,
            'porcentaje_fsp' => $porcentaje
        );

        return $array_fsp;
    }

    /**
     * Reemplaza en la formula las constantes por valores de la tabla NO_CONSTANTE
     * Ejemplo: $con_1
     * @param type $formula
     * @param type $arrayConstantes
     */
    private function reemplazoConstante($formula, $arrayConstantes) {

        /*
         * Recorrer array de Constantes
         */
        foreach ($arrayConstantes as $key => $value) {

            $formula = str_replace($key, $value['valor'], $formula);
        }

        return $formula;
    }

    /**
     * Reemplaza los parametros(variables) a la formula
     * Ejemplo: $key: C1 / $value: valor - 2+5
     * @param type $formula
     * @param type $arrayParametros
     */
    private function reemplazoParametros($formula, $arrayParametros) {

        /*
         * Recorrer array de Parametros
         */
        foreach ($arrayParametros as $key => $value) {

            $formula = str_replace('{' . $key . '}', $value, $formula);
        }

        return $formula;
    }

    /**
     * Obtener resultados de los parametros(variables)
     * Ejemplo: 'C1' => '0'
     * @param type $arrayParametros
     * @param type $record_liq
     */
    private function resultadoParametros($arrayParametros, $record_liq, $record_consulta) {

        /*
         * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
         */
        $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

        $int = 0;
        foreach ($array as $routeName => $routeData) {
            //echo $routeName . "\n";
            if ('entidad_cliente' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $entidadCliente = $value;
                    }
                }
            }
            $int++;
        }

        /*
         * Recorrer array de Parametros
         */
        foreach ($arrayParametros as $key => $value) {

            //Sacar caracter y numero(id_concep_nomina) para consulta
            $caracter = substr($key, 0, 1);
            $id_concep_nomina = substr($key, 1);
            $this->logMessage("[Liquidación] Caracter: " . $caracter . ", numero: " . $id_concep_nomina);

            /*
             * Obtener consulta por caracter
             */
//            //Sql
//            $sql = <<<EOD
//select * from NO_CONSULTA where caracter = '$caracter' 
//EOD;
//            //Ejecutar SQL
//            $record = CN_TABLE::executeSQL($sql);
            //Validar registros SQL
            if (count($record_consulta) > 0) {
//                $this->logMessage("[Liquidación] Caracter: " . $record_consulta[$caracter]['caracter'] . ", consulta: " . $record_consulta[$caracter]['consulta']);
//                die();
//                $consulta = $record[0]['consulta'];
                $consulta = $record_consulta[$caracter]['consulta'];

                //Reemplazo de id_concep_nomina
                $consulta = str_replace('$id_concep_nomina', $id_concep_nomina, $consulta);

                /*
                 * Reemplaza en la consulta los filtros y valores del SQL, que vienen en el record
                 * Ejemplo: select raz_soc from id_cia where id_cia = $id_cia
                 * Reemplaza $id_cia por el valor en el record
                 */
                $consulta = CN_TABLE::reemplazoConsulta($consulta, $record_liq);

                /**
                 * CEV, solo salud y pension quitar 4001 concepto - 20210201::LAVILA
                 */
                $consulta_adic = " ";
                if ($entidadCliente == '8') {
                    if ($id_concep_nomina == 401 && $record_liq['id_clase_fondo'] <= 3 && $record_liq['tag_dias_vac_ant'] > 0) {
                        $consulta_adic = " and per.id_tipo_periodo in (0) ";
                    }
                }

                /*
                 * Ejecutar SQL de consulta
                 */
                //Sql
                $sql = <<<EOD
$consulta     
$consulta_adic      
EOD;
                //Ejecutar SQL
                $record = CN_TABLE::executeSQL($sql);

                //Validar registros SQL
                if (count($record) > 0) {
                    $valor = $record[0]['valor'];
                } else {
                    $valor = 0;
                }
            } else {
                $valor = 0;
            }

            $arrayParametros[$key] = $valor;
        }

        return $arrayParametros;
    }

    /**
     * Parser de la formula para obtener parametros(variables)
     * Ejemplo: 'C1' => '0'
     * @param type $formula
     * @param type $arrayParametros
     */
    private function parametrosFormula($formula) {

        $vars = array();

        CN_TABLE::getVarsInFormula($vars, $formula);

        foreach ($vars as $var) {
            $arrayParametros[$var] = 0;
        }

//        var_dump($arrayParametros);
//        exit();
//        $arrayParametros = array(
//            'C1' => '0',
//            'C2' => '0',
//            'T1' => '0',
//            'A1' => '0'
//        );

        return $arrayParametros;
    }

    /**
     * Reemplaza las agrupaciones por los parametros(variables)
     * Ejemplo: A1 -> (+C1-C2-T1)
     * @param type $id_agrup_var
     */
    private function reemplazoAgrupacion($id_agrup_var) {

        $agrup = '( ';

        /*
         * Ejecutar SQL de agrupciones
         */
        //Sql
        $sql = <<<EOD
select 
agru.*,
agru.tipo_valor as caracter
from
no_agrup_deta agru
where agru.id_agrup_concepto = $id_agrup_var  
EOD;
        //Ejecutar SQL
        $records = CN_TABLE::executeSQL($sql);

        /*
         * Recorrer registros 
         */
        foreach ($records as $value) {

            $operador = ($value['operador'] == 1 ? '+' : '-');

            //Concatenar todas las agrupaciones
            $agrup .= $operador . '{' . $value['caracter'] . $value['id_concep_nomina'] . '}';
        }

        $agrup .= ' )';

        return $agrup;
    }

}
