<?php

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

    /**
     * Obtener records para los saldos
     *
     * @param sfWebRequest $request
     */
    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");


        /*
         * variables por defecto para el registro de log
         */
        $id_tabla = 'null';
        $id_vigencia = 'null';
        $id_cen_op = 'null';

        $id_cia = 'null';
        if (isset($request['id_cia'])) {
            $id_cia = $request['id_cia'];
        }

        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_SALDOS_APORTE');

        //1 - indica operacion de consulta
        $id_ope_bd = 1;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        $username = 'admin';
        if (isset($request['username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $username = $request['username'];
            }
        }
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }
        //construir observacion
        $observacion = "'Se consulto regenerar saldos de aportes desde la funcionalidad: " . $comando . "'";


        /*
         * registro de consulta en tabla de log
         */
        $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);



        /*
         * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
         */
        $sql = <<<EOD
select distinct

per.id_anhos, per.id_meses,
mes.descripcion, 
per.periodo, per.estado, per.activo

from no_saldos_aporte sal

join no_periodo_v per
on sal.id_periodo = per.id_periodo
and per.id_tipo_periodo = 1

join meses mes on
per.id_meses = mes.id_meses

order by 
per.id_anhos desc, 
per.id_meses desc 
EOD;

        //Ejecuta sql
        $this->list_data = CN_TABLE::executeSQL($sql);
    }

    /**
     * Metodo para adjuntar nuevos saldos
     * @param sfWebRequest $request
     */
    public function executeAdd(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");


        /*
         * Obtiene las vigencias y periodos que se encuentran en los saldos
         */
        $sql = <<<EOD
select distinct

per.id_anhos, per.id_meses,
mes.descripcion, 
per.periodo, per.estado, per.activo

from no_saldos_aporte sal

join no_periodo_v per
on sal.id_periodo = per.id_periodo
and per.id_tipo_periodo = 1

join meses mes on
per.id_meses = mes.id_meses

order by 
per.id_anhos desc, 
per.id_meses desc 
EOD;

        //Ejecuta sql
        $saldos_rec = CN_TABLE::executeSQL($sql);

        $numero_saldos_ant = count($saldos_rec);

        //Valida si esta vacio
        if (empty($saldos_rec)) {
            $this->logMessage("[SALDO] Valida si esta vacio");


            /*
             * Valores de vigencia/periodo en los aportes
             */
            $sql = <<<EOD
select * from(
select
con.*,
con.id_anhos as anho,
con.id_meses as mes
from no_concepto_periodo con

join no_periodo_v per
on con.periodo = per.id_periodo
and per.id_tipo_periodo = 1

order by
con.fecha_desde

)
where rownum = 1 
EOD;

            //Ejecuta sql
            $recaudos = CN_TABLE::executeSQL($sql);

            //si hay aportes ultima fecha
            if (!empty($recaudos)) {
                $this->logMessage("[SALDO] Si hay aportes ultima fecha");

                //Elimina datos de la tabla
                $sql = 'TRUNCATE TABLE NO_SALDOS_APORTE';

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);

                /*
                 * insertar saldos del mes mas antiguo
                 */
                $anho = $recaudos[0]['anho'];
                $mes = $recaudos[0]['mes'];


                $saldos = array(
                    'id_anhos' => $anho,
                    'id_meses' => $mes
                );
                $saldosAnt = CN_TABLE::fechaAnterior($anho, $mes);

                $this->removeSaldo($saldos, $saldosAnt); //borra y genera nuevos saldos

                /*
                 * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
                 */
                $sql = <<<EOD
select distinct

per.id_anhos, per.id_meses,
mes.descripcion, 
per.periodo, per.estado, per.activo

from NO_SALDOS_APORTE sal

join no_periodo_v per
on sal.id_periodo = per.id_periodo
and per.id_tipo_periodo = 1

join meses mes on
per.id_meses = mes.id_meses

order by 
per.id_anhos desc, 
per.id_meses desc 
EOD;

                //Ejecuta sql
                $records = CN_TABLE::executeSQL($sql);
                $vigencia_periodo_add[0] = $records[0];
                $this->list_data = $vigencia_periodo_add;
            } else {
                $this->status = 1;
                $this->list_data = array();
                $this->logMessage("No hay aportes.");
            }
        } else {
            $this->logMessage("[SALDO] Si NO hay aportes ultima fecha");

            /*
             * obtener fecha siguiente anho - mes
             */
            $anho = $saldos_rec[0]['id_anhos'];
            $mes = $saldos_rec[0]['id_meses'];


            $saldosAnt = array(
                'id_anhos' => $anho,
                'id_meses' => $mes
            );
            $saldos = CN_TABLE::fechaSiguiente($anho, $mes);

            $this->logMessage("--------------------------------------------------*  Remover y generar saldo.");
            $this->removeSaldo($saldos, $saldosAnt); //borra y genera nuevos saldos

            /*
             * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
             */
            $sql = <<<EOD
select distinct

per.id_anhos, per.id_meses,
mes.descripcion, 
per.periodo, per.estado, per.activo

from NO_SALDOS_APORTE sal

join no_periodo_v per
on sal.id_periodo = per.id_periodo
and per.id_tipo_periodo = 1

join meses mes on
per.id_meses = mes.id_meses

order by 
per.id_anhos desc, 
per.id_meses desc 
EOD;

            //Ejecuta sql
            $records = CN_TABLE::executeSQL($sql);
            $vigencia_periodo_add[0] = $records[0];

            $numero_saldos_act = count($records);
            $this->logMessage("[SALDO] No. Saldos Ant." . $numero_saldos_ant . " No. Saldos Act." . $numero_saldos_act);

            //validar que si se inserto un nuevo periodo a los saldos
            if ($numero_saldos_ant < $numero_saldos_act) {
                $this->logMessage("Si hay aportes para el siguiente periodo.");
                $this->list_data = $vigencia_periodo_add;
            } else {
                $this->status = 1;
                $this->list_data = array();
                $mensaje = "No hay aportes para el siguiente periodo.";
                $this->mensajeError = "[Saldos Aportes] " . $mensaje;
                $this->logMessage($mensaje);
            }


            /*
             * Validar si se adiciono saldo nuevo - falta completar
             */
            if (true) {
                $this->logMessage("[SALDO] Validar si se adiciono saldo nuevo - falta completar");

                /*
                 * variables por defecto para el registro de log
                 */
                $id_tabla = 'null';
                $id_vigencia = 'null';
                $id_cen_op = 'null';

                $id_cia = 'null';
                if (isset($request['id_cia'])) {
                    $id_cia = $request['id_cia'];
                }

                //obtener id maestro tabla
                $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_SALDOS_APORTE');

                //3 - indica operacion de adicion
                $id_ope_bd = 3;

                //id del maestro tercero
                $id_mae_ter = 1;
                if (isset($request['id_username'])) {
                    $id_mae_ter = $request['id_username'];
                }
                $username = 'admin';
                if (isset($request['username'])) {
                    if (!is_null($request['username']) && $request['username'] != '') {
                        $username = $request['username'];
                    }
                }
                $comando = 'sin comando';
                if (isset($request['comando'])) {
                    $comando = $request['comando'];
                }


                //construir observacion
                $observacion = "'Se adiciono saldos para el siguiente $mes/$anho desde la funcionalidad: " . $comando . "'";


                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);
            }
        }
    }

    /**
     * Remueve el saldo ultimo por fecha
     *
     * @param sfWebRequest $request
     */
    public function executeRemove(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");



        /*
         * variables por defecto para el registro de log
         */
        $id_tabla = 'null';
        $id_vigencia = 'null';
        $id_cen_op = 'null';

        $id_cia = 'null';
        if (isset($request['id_cia'])) {
            $id_cia = $request['id_cia'];
        }

        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_SALDOS_APORTE');

        //4 - indica operacion de eliminar
        $id_ope_bd = 4;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        $username = 'admin';
        if (isset($request['username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $username = $request['username'];
            }
        }
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }


        /*
         * Obtiene las vigencias y periodos que se encuentran en los saldos
         */
        $sql = <<<EOD
select distinct

per.id_anhos, per.id_meses,
mes.descripcion, 
per.periodo, per.estado, per.activo

from no_saldos_aporte sal

join no_periodo_v per
on sal.id_periodo = per.id_periodo
and per.id_tipo_periodo = 1

join meses mes on
per.id_meses = mes.id_meses

order by 
per.id_anhos desc, 
per.id_meses desc 
EOD;

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

        //Valida si esta vacio
        if (!empty($records)) {

            $firstRow = $records[0];

            //Obtiene valores de la primera fila
            /*
             * obtener fecha siguiente anho - mes
             */
            $anho = $firstRow['id_anhos'];
            $mes = $firstRow['id_meses'];

            /*
             * Elimina saldos por vigencia/periodo
             */
            $sql = <<<EOD
delete from no_saldos_aporte where id_saldos_aporte in (

    select sal.id_saldos_aporte from no_saldos_aporte sal
    
    join no_periodo_v per
    on sal.id_periodo = per.id_periodo
    and per.id_tipo_periodo = 1
    
    where 
    per.id_anhos = $anho 
    and per.id_meses = $mes

)  
EOD;

            //Ejecuta sql
            CN_TABLE::executeSQL($sql);

            //construir observacion
            $observacion = "'Se removio saldo para periodo/vigencia - $mes/$anho desde la funcionalidad: " . $comando . "'";



            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);


            //Retorna la fila inicial eliminada
            $this->list_data = array($firstRow);
        } else {
            $this->status = 1;
            $this->list_data = array();
            $mensaje = "No hay saldos de aportes.";
            $this->mensajeError = "[Saldos Aportes] " . $mensaje;
            $this->logMessage($mensaje);
        }
    }

    /**
     * Actualiza los saldos
     * se actualizan de la vigencia/periodo hasta las siguientes por orden de fecha
     *
     * @param sfWebRequest $request
     */
    public function executeUpdate(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");



        /*
         * variables por defecto para el registro de log
         */
        $id_tabla = 'null';
        $id_vigencia = 'null';
        $id_cen_op = 'null';

        $id_cia = 'null';
        if (isset($request['id_cia'])) {
            $id_cia = $request['id_cia'];
        }

        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_SALDOS_APORTE');

        //2 - indica operacion de actualizar
        $id_ope_bd = 2;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        $username = 'admin';
        if (isset($request['username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $username = $request['username'];
            }
        }
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        //2 - indica operacion de actualizar
        $id_ope_bd = 2;

        //obtener datos de actualizacion
        $vig = $request['id_anhos'];
        $per_cont = $request['id_meses'];
        $estado = $request['estado'];
        //construir observacion
        $observacion = "'Se actualizaron saldos desde el periodo/vigencia - $per_cont/$vig, desde la funcionalidad: " . $comando . "'";


        //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 = null;
        $whereFuncionarioTipoDoc = "";
        if (isset($request['id_tipo_doc'])) {
            $id_tipo_doc = $request['id_tipo_doc'];
            $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
        }


        /**
         * Valdiar estado del periodo - 20150318
         */
        if ($estado != "" && $estado != null && $estado == 'true') {
            //if (true) {
            $this->logMessage(" [Update] Valdiar estado del periodo :: " . $estado);

            /*
             * Obtiene las vigencias y periodos que se encuentran en los saldos
             */
            $sql = <<<EOD
select distinct

per.id_anhos, per.id_meses,
mes.descripcion, 
per.periodo, per.estado, per.activo

from NO_SALDOS_APORTE sal

join no_periodo_v per
on sal.id_periodo = per.id_periodo
and per.id_tipo_periodo = 1

join meses mes on
per.id_meses = mes.id_meses

order by 
per.id_anhos desc, 
per.id_meses desc 
EOD;

            //Ejecuta sql
            $saldos_rec = CN_TABLE::executeSQL($sql);

            //Valida si estan vacio los saldos
            if (!empty($saldos_rec)) {


                //Obtiene valores de la ultima fila
                $anho = $saldos_rec[0]['id_anhos'];
                $mes = $saldos_rec[0]['id_meses'];

                //variables del request
                $anho_req = $request['id_anhos'];
                $mes_req = $request['id_meses'];

                do {

                    $saldosAnt = CN_TABLE::fechaAnterior($anho_req, $mes_req);

                    $saldos = array(
                        'id_anhos' => $anho_req,
                        'id_meses' => $mes_req
                    );

                    $this->logMessage(" [Update]  Remover y generar saldo.");
                    $this->removeSaldo($saldos, $saldosAnt, $whereFuncionarioNumDoc, $whereFuncionarioTipoDoc); //borra y genera nuevos saldos

                    $saldos = CN_TABLE::fechaSiguiente($anho_req, $mes_req);

                    //variables del request - actualiza por siguientes
                    $anho_req = $saldos['id_anhos'];
                    $mes_req = $saldos['id_meses'];

                    //validar ciclo infinito
                    if ($anho_req > 2111) {
                        die();
                    }

                    $this->logMessage(" [Update]  Anho - Mes for." . $anho_req . " - " . $mes_req);
                    $this->logMessage(" [Update]  Anho - Mes ultimo." . $anho . " - " . $mes);

                    /*
                     * Cambio por ciclo comparacion fecha - 20120724
                     */
                    $comparar_req = $anho_req . str_pad($mes_req, 2, '0', STR_PAD_LEFT);
                    $comparar = $anho . str_pad($mes, 2, '0', STR_PAD_LEFT);

                    $this->logMessage(" [Update]  Anho - Mes Comparar." . $comparar_req . " - " . $comparar);

//            } while ($anho_req <= $anho && $mes_req <= $mes);
                } while ($comparar_req <= $comparar);

                $this->logMessage(" [Update] Termino ciclo de regenerar saldos.");


                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);


                $this->list_data = array();
            } else {

                $this->status = 1;
                $this->list_data = array();
                $this->logMessage("No hay saldos de los aportes.");
            }
        } else {
            $this->status = 1;
            $this->list_data = array();
            $mensaje = "El periodo/vigencia - $per_cont/$vig seleccionado ya esta inactivo.";
            $this->mensajeError = "[Saldos Aportes] " . $mensaje;
            $this->logMessage($mensaje);
        }
    }

    /**
     * Remueve los saldo e inserta los nuevos calculos
     * Se omite periodo de retroactivo - 20150622
     * Se agrega filtro de funcionario - 20170222
     *
     * @param sfWebRequest $request
     */
    public static function removeSaldo($saldos, $saldosAnt, $whereFuncionarioNumDoc = " ", $whereFuncionarioTipoDoc = " ") {

        //manejo de errores
        try {

            //Obtener valores
            $anho = $saldos['id_anhos'];
            $mes = $saldos['id_meses'] + 0;

            $anho_ant = $saldosAnt['id_anhos'];
            $mes_ant = $saldosAnt['id_meses'];

            /*
             * Elimina saldos por vigencia/periodo
             */
            $sql = <<<EOD
delete from no_saldos_aporte where id_saldos_aporte in (

    select tab0.id_saldos_aporte 
        
    from no_saldos_aporte tab0
    
    join no_periodo_v per
    on tab0.id_periodo = per.id_periodo
    and per.id_tipo_periodo = 1
    
    where 
    per.id_anhos = $anho 
    and per.id_meses = $mes
    $whereFuncionarioNumDoc
    $whereFuncionarioTipoDoc

)  
EOD;

            //Ejecuta sql
            CN_TABLE::executeSQL($sql);

            /*
             * verificar periodo por año y mes
             */
            $sql = <<<EOD
select * from no_periodo
where id_tipo_periodo = 1
and id_anhos = $anho
and id_meses = $mes 
EOD;

            //Ejecuta sql
            $saldos_rec = CN_TABLE::executeSQL($sql);
            if (count($saldos_rec)) {

                $id_periodo = $saldos_rec[0]['id_periodo'];

                /*
                 * NOM-75 :: Se quita filtro para que salgan todos con saldo o no - 20150401
                  where
                  saldo_anterior !=0
                  --or valor_nomina !=0
                  --or valor_aporte_func !=0
                  --or valor_aporte_patrono !=0
                  or saldo_actual !=0
                 */

                /**
                 * Se crean registros de saldos del nuevo mes, con los valores de saldo anterior si posee
                 * Se agregan valores de retroactivo - 20191003
                 * Incidente #38865, en los valores del retro se añade NVL ya que al restar null, no tomaba ningun valor - 20241017::LAVILA
                 */
                $sql = <<<EOD
INSERT INTO NO_SALDOS_APORTE
 
SELECT * FROM
(   

select 
null as ID_SALDOS_APORTE,
tab.ID_PERIODO as ID_PERIODO,
tab.id_tipo_doc as ID_TIPO_DOC,
tab.num_doc as NUM_DOC,
tab.ID_CLASE_FONDO as ID_CLASE_FONDO,
foncon.id_descuento_ss as ID_DESCUENTO_SS,
tab.id_mae_fondos as ID_MAE_FONDOS,
tab.id_concep_nomina as ID_CONCEP_NOMINA,
nvl(sal.saldo_actual,0) as SALDO_ANTERIOR,
tab.valor_liquidado as VALOR_NOMINA,
tab.APORTE_FUNC_PENSION + tab.APORTE_FUNC_SALUD as VALOR_APORTE_FUNC,
tab.APORTE_PATRONO_PENSION + tab.APORTE_PATRONO_SALUD as VALOR_APORTE_PATRONO,                        
nvl(sal.saldo_actual,0) + tab.valor_liquidado + tab.valor_liquidado_retro - (tab.APORTE_FUNC_PENSION + tab.APORTE_FUNC_SALUD) - (tab.APORTE_FUNC_PENSION_retro + tab.APORTE_FUNC_SALUD_retro) as SALDO_ACTUAL,
                        
tab.valor_liquidado_retro as VALOR_NOMINA_RETRO,
tab.APORTE_FUNC_PENSION_retro + tab.APORTE_FUNC_SALUD_retro as VALOR_APORTE_FUNC_RETRO,
tab.APORTE_PATRONO_PENSION_retro + tab.APORTE_PATRONO_SALUD_retro as VALOR_APORTE_PATRONO_RETRO
                        
from(


    SELECT
    
    sum( nvl( tab0.valor_liquidado_retro ,0) ) as valor_liquidado_retro,
    
    sum( nvl( tab0.APORTE_FUNC_PENSION_liq ,0) ) as APORTE_FUNC_PENSION_liq,
    sum( nvl( tab0.APORTE_FUNC_SALUD_liq ,0) ) as APORTE_FUNC_SALUD_liq,
    
    sum( nvl( tab0.valor_liquidado ,0) ) as valor_liquidado,
    
    tab0.id_concep_nomina,
    tab0.codigo_concep,
    tab0.id_mae_fondos,
    tab0.descripcion_concep,
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.nombre_apellido,
    tab0.nombre_completo,
    
    tab0.ID_PERIODO,tab0.ID_CLASE_FONDO,tab0.CODIGO, tab0.FONDO
    
    ,sum( nvl( tab0.APORTE_FUNC_PENSION ,0) ) APORTE_FUNC_PENSION
    ,sum( nvl( tab0.APORTE_PATRONO_PENSION ,0) ) APORTE_PATRONO_PENSION
    ,sum( nvl( tab0.TOTAL_PENSION ,0) ) TOTAL_PENSION
    ,sum( nvl( tab0.APORTE_FUNC_SALUD ,0) ) APORTE_FUNC_SALUD
    ,sum( nvl( tab0.APORTE_PATRONO_SALUD ,0) ) APORTE_PATRONO_SALUD
    ,sum( nvl( tab0.TOTAL_SALUD ,0) ) TOTAL_SALUD
    ,sum( nvl( tab0.UPC_ADICIO ,0) ) UPC_ADICIO
    ,sum( nvl( tab0.APORTE_PATRONO_ARP ,0) ) APORTE_PATRONO_ARP
    ,sum( nvl( tab0.TOTAL_ARP ,0) ) TOTAL_ARP
    ,sum( nvl( tab0.PARAFISCALES ,0) ) PARAFISCALES
    ,sum( nvl( tab0.TOTAL_EMPLEADO ,0) ) TOTAL_EMPLEADO
    ,sum( nvl( tab0.TOTAL_APORTES ,0) ) TOTAL_APORTES,
    (select distinct periodo.periodo from no_liquida_v periodo where periodo.id_periodo = tab0.id_periodo) AS PERIODO,
    (select distinct periodo.tipper from no_liquida_v periodo where periodo.id_periodo = tab0.id_periodo) AS TIPPER
    
    ,sum( nvl( tab0.APORTE_FUNC_PENSION_retro ,0) ) APORTE_FUNC_PENSION_retro
    ,sum( nvl( tab0.APORTE_PATRONO_PENSION_retro ,0) ) APORTE_PATRONO_PENSION_retro
    ,sum( nvl( tab0.APORTE_FUNC_SALUD_retro ,0) ) APORTE_FUNC_SALUD_retro
    ,sum( nvl( tab0.APORTE_PATRONO_SALUD_retro ,0) ) APORTE_PATRONO_SALUD_retro
                        
    FROM(
    
        SELECT
        
        tab3.valor_liquidado_retro,
    
        tab3.valor_liquidado,
        tab3.APORTE_FUNC_PENSION_liq,
        tab3.APORTE_FUNC_SALUD_liq,
    
        tab3.id_concep_nomina,
        tab3.codigo_concep,
        tab3.descripcion_concep,
        tab3.id_tipo_doc,
        tab3.num_doc,
        tab3.nombre_apellido,
        tab3.nombre_completo,
        tab3.ID_PERIODO,tab3.ID_CLASE_FONDO,tab3.CODIGO,tab3.FONDO,tab3.id_mae_fondos,
    
        tab3.APORTE_FUNC_PENSION,
        tab3.APORTE_PATRONO_PENSION,
        tab3.TOTAL_PENSION,
        tab3.APORTE_FUNC_SALUD,
        tab3.APORTE_PATRONO_SALUD,
        tab3.TOTAL_SALUD,
        tab3.UPC_ADICIO,
        tab3.APORTE_PATRONO_ARP,
        tab3.TOTAL_ARP,
        tab3.PARAFISCALES,
        ( nvl( APORTE_FUNC_PENSION ,0)  +  nvl( APORTE_FUNC_SALUD ,0) ) AS TOTAL_EMPLEADO,
        ( nvl( tab3.TOTAL_PENSION ,0)  +  nvl( tab3.TOTAL_SALUD ,0)  +  nvl( tab3.TOTAL_ARP ,0) +  nvl( tab3.PARAFISCALES ,0) ) AS TOTAL_APORTES,
        
        tab3.APORTE_FUNC_PENSION_retro,
        tab3.APORTE_PATRONO_PENSION_retro,
        tab3.APORTE_FUNC_SALUD_retro,
        tab3.APORTE_PATRONO_SALUD_retro
    
        FROM(
    
            select
    
            (liqretro.valor_liquidado + liqretro.val_ajus - liqretro.val_rein) as valor_liquidado_retro,
    
            (liq.valor_liquidado + liq.val_ajus - liq.val_rein) as valor_liquidado,
    
            case when tab1.id_clase_fondo =1 then (liq.valor_liquidado + liq.val_ajus - liq.val_rein) - 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_liq,
    
    
            case when tab1.id_clase_fondo =1 then 0
            when tab1.id_clase_fondo = 2 then (liq.valor_liquidado + liq.val_ajus - liq.val_rein) - tab1.aporte_func
            when tab1.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_SALUD_liq,
    
            tab1.id_concep_nomina,
            concep.codigo as codigo_concep,
            concep.descripcion as descripcion_concep,
            tab1.id_tipo_doc,
            tab1.num_doc,
            dat.nombre_apellido,
            dat.nombre_completo,
            tab1.id_periodo AS ID_PERIODO, tab1.id_clase_fondo,tab2.codigo AS CODIGO,tab2.razon_social AS FONDO,tab2.id_mae_fondos,
    
            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 + tab1.aporte_patrono_licnorem
            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 + tab1.aporte_patrono_licnorem
            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 + tab1.aporte_patrono_licnorem
            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 + tab1.aporte_patrono_licnorem
            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,
    
            /*Valores retro - 20191004*/
            case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_func
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_PENSION_retro,    
            case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_patrono + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_PATRONO_PENSION_retro,
            case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_patrono+apotipoc.aporte_func + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS TOTAL_PENSION_retro,    
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_func
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_SALUD_retro,    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_patrono + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_PATRONO_SALUD_retro,
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_patrono+apotipoc.aporte_func + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS TOTAL_SALUD_retro,
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then apotipoc.aporte_patrono
            else 0 end AS APORTE_PATRONO_ARP_retro,
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then apotipoc.aporte_patrono
            else 0 end AS TOTAL_ARP_retro,
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else apotipoc.aporte_patrono end AS PARAFISCALES_retro
    
    
            from no_liquida_aporte tab1
    
            join no_datos_funcionario_v dat
            on tab1.id_tipo_doc = dat.id_tipo_doc
            and tab1.num_doc = dat.num_doc
    
            JOIN NO_CONCEPTOS_V concep ON tab1.id_concep_nomina = concep.id_concep_nomina
    
            /*
            left join no_liquida_nomina liq
            on liq.id_concep_nomina = tab1.id_concep_nomina
            and liq.id_tipo_doc = tab1.id_tipo_doc
            and liq.num_doc = tab1.num_doc
            and tab1.id_periodo = liq.id_periodo
            */
            left join (
                select
                sum(liq.valor_liquidado) as valor_liquidado,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null         
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_ajuste from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_ajus,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null 
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_rein from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_rein,
                liq.id_concep_nomina,
                liq.id_tipo_doc,
                liq.num_doc
                from no_liquida_nomina liq
                where liq.id_periodo in
                (
    
                    select distinct
                    id_periodo as  periodos
                    from no_periodo
                    where id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                    and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                    --and id_tipo_periodo in (1 , 2)
    
                )
                and liq.id_periodo_ajuste is null 
                group by
                liq.id_concep_nomina,
                liq.id_tipo_doc,
                liq.num_doc
    
            )liq
            on liq.id_concep_nomina = tab1.id_concep_nomina
            and liq.id_tipo_doc = tab1.id_tipo_doc
            and liq.num_doc = tab1.num_doc
    
            left join no_mae_fondos tab2 ON tab2.id_mae_fondos = tab1.id_mae_fondos
    
            left join (
    
                  select nom.*,
                  case when tab.num_doc is not null then 1 else 0 end as pago
                  from no_nombramiento_v nom
    
                  left join (select distinct
                  pago.id_tipo_doc,
                  pago.num_doc
                  from no_pago_func pago
                  where
                  (select fecha_fin from no_periodo where id_periodo = $id_periodo) between pago.fecha_activacion and nvl(pago.fecha_terminacion, (select fecha_fin from no_periodo where id_periodo = $id_periodo))
                  )tab
                  on tab.id_tipo_doc = nom.id_tipo_doc and tab.num_doc = nom.num_doc
    
            )tab0
            on tab0.id_tipo_doc = tab1.id_tipo_doc and tab0.num_doc = tab1.num_doc
    
            /*
            Obtener valores de retro - 20191003
            */
            left join (
                select
                sum(liq.valor_liquidado) as valor_liquidado,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null         
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_ajuste from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_ajus,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null 
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_rein from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_rein,
                liq.id_concep_nomina,
                liq.id_tipo_doc,
                liq.num_doc
                from no_liquida_nomina liq
                where liq.id_periodo in
                (
    
                    select distinct
                    id_periodo as  periodos
                    from no_periodo
                    where id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                    and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                    and id_tipo_periodo in (6,7)
    
                )
                and liq.id_periodo_ajuste is not null 
                group by
                liq.id_concep_nomina,
                liq.id_tipo_doc,
                liq.num_doc
    
            )liqretro
            on liqretro.id_concep_nomina = tab1.id_concep_nomina
            and liqretro.id_tipo_doc = tab1.id_tipo_doc
            and liqretro.num_doc = tab1.num_doc
            
            /*Se deja para que salga aportse en septiembre del retro de todo el año - 20191004*/
            /*Se deja parametrizado tabla no_param_gen para saldo retro de todo el año - 20200805*/
            left join(            
            
                select
                tab0.id_clase_fondo,
                tab0.id_mae_fondos,
                tab0.id_concep_nomina,
                tab0.id_tipo_doc,
                tab0.num_doc,
                    
                sum(tab0.aporte_func) as aporte_func,
                sum(tab0.aporte_patrono) as aporte_patrono,
                sum(tab0.aporte_patrono_licnorem) as aporte_patrono_licnorem
                
                from(
                
                    select
                    
                    tabretro.id_periodo,
                    tabretro.id_clase_fondo,
                    tabretro.id_mae_fondos,
                    tabretro.id_concep_nomina,
                    tabretro.id_tipo_doc,
                    tabretro.num_doc,
                    
                    sum(nvl(tabretro.aporte_func,0) - nvl(tabtipoa.aporte_func,0)) as aporte_func,
                    sum(nvl(tabretro.aporte_patrono,0) - nvl(tabtipoa.aporte_patrono,0)) as aporte_patrono,
                    sum(nvl(tabretro.aporte_patrono_licnorem,0) - nvl(tabtipoa.aporte_patrono_licnorem,0)) as aporte_patrono_licnorem
                    
                    from no_liquida_aporte tabretro
                    
                    join no_periodo per on per.id_periodo = tabretro.id_periodo 
                    
                    left join no_liquida_aporte tabtipoa
                    on tabtipoa.tipo_planilla = 'A'
                    and tabtipoa.id_periodo = tabretro.id_periodo
                    and tabtipoa.id_clase_fondo = tabretro.id_clase_fondo
                    and tabtipoa.id_mae_fondos = tabretro.id_mae_fondos
                    and tabtipoa.id_concep_nomina = tabretro.id_concep_nomina
                    and tabtipoa.id_tipo_doc = tabretro.id_tipo_doc
                    and tabtipoa.num_doc = tabretro.num_doc
                    
                    where  
                    1 = 1 
                    and tabretro.tipo_planilla = 'C'
                    and per.id_anhos = ( select id_anhos from no_periodo where id_periodo = $id_periodo )
                    and nvl((select min(mes_saldo_retro) from no_param_gen where id_param_gen = 1),per.id_meses) = ( select id_meses from no_periodo where id_periodo = $id_periodo )
                    
                    group by 
                    tabretro.id_periodo,
                    tabretro.id_clase_fondo,
                    tabretro.id_mae_fondos,
                    tabretro.id_concep_nomina,
                    tabretro.id_tipo_doc,
                    tabretro.num_doc
                
                )tab0
                
                group by 
                tab0.id_clase_fondo,
                tab0.id_mae_fondos,
                tab0.id_concep_nomina,
                tab0.id_tipo_doc,
                tab0.num_doc
            
            )apotipoc
            on apotipoc.id_clase_fondo = tab1.id_clase_fondo
            and apotipoc.id_mae_fondos = tab1.id_mae_fondos
            and apotipoc.id_concep_nomina = tab1.id_concep_nomina
            and apotipoc.id_tipo_doc = tab1.id_tipo_doc
            and apotipoc.num_doc = tab1.num_doc
    
            where tab1.tipo_planilla = 'A'
            and tab1.id_periodo = $id_periodo
            
    
        )tab3
    
    )tab0
    
    where tab0.id_periodo = $id_periodo
    and tab0.id_clase_fondo in (1,2)   
    $whereFuncionarioNumDoc
    $whereFuncionarioTipoDoc
    /*
    having
    (sum( nvl( tab0.APORTE_FUNC_PENSION_liq ,0)) )!= 0
    or
    (sum( nvl( tab0.APORTE_FUNC_SALUD_liq ,0) ))  != 0
    */
                        
    group by
    
    tab0.id_concep_nomina,
    tab0.id_mae_fondos,
    tab0.codigo_concep,
    tab0.descripcion_concep,
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.nombre_apellido,
    tab0.nombre_completo,
    tab0.ID_PERIODO,tab0.ID_CLASE_FONDO,tab0.CODIGO, tab0.FONDO

)tab

left join no_fondo_concepto foncon
on foncon.id_mae_fondos = tab.id_mae_fondos
and foncon.id_concep_nomina = tab.id_concep_nomina 

left join no_saldos_aporte sal
on sal.id_tipo_doc = tab.id_tipo_doc
and sal.num_doc = tab.num_doc
and sal.id_clase_fondo = tab.id_clase_fondo
and sal.id_descuento_ss = foncon.id_descuento_ss
and sal.id_mae_fondos = tab.id_mae_fondos
and sal.id_concep_nomina = tab.id_concep_nomina
and sal.id_periodo in (
    select distinct id_periodo from no_periodo
    where id_tipo_periodo = 1
    and id_anhos = $anho_ant
    and id_meses = $mes_ant
    and rownum = 1
)  
   
)                
EOD;

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);


                /**
                 * Se crean registros para valores que estan en la liquidacion y no en los aportes - 20150311
                 * Se cambia para todos los periodos del mes - 20150325
                 * Se agregan valores de retroactivo - 20191003
                 * Relacion con apotipoc cambia, para la planilla tipo C - 20221110::LAVILA
                 * Incidente #38865, en los valores del retro se añade NVL ya que al restar null, no tomaba ningun valor - 20241017::LAVILA
                 * Incidente #38865, consulta interna de union de valores de nomina, se agrupa primero por concepto y luego si se busca ajsute o reintegro del concepto - 20241017::LAVILA
                 */
                $sql = <<<EOD
INSERT INTO NO_SALDOS_APORTE   

SELECT * FROM
(   

select 
null as ID_SALDOS_APORTE,
$id_periodo as ID_PERIODO,
tab.id_tipo_doc as ID_TIPO_DOC,
tab.num_doc as NUM_DOC,
tab.ID_CLASE_FONDO as ID_CLASE_FONDO,
foncon.id_descuento_ss as ID_DESCUENTO_SS,
tab.id_mae_fondos as ID_MAE_FONDOS,
tab.id_concep_nomina as ID_CONCEP_NOMINA,
nvl(sal.saldo_actual,0) as SALDO_ANTERIOR,
tab.valor_liquidado as VALOR_NOMINA,
tab.APORTE_FUNC_PENSION + tab.APORTE_FUNC_SALUD as VALOR_APORTE_FUNC,
tab.APORTE_PATRONO_PENSION + tab.APORTE_PATRONO_SALUD as VALOR_APORTE_PATRONO,                        
nvl(sal.saldo_actual,0) + tab.valor_liquidado + tab.valor_liquidado_retro - (tab.APORTE_FUNC_PENSION + tab.APORTE_FUNC_SALUD) - (tab.APORTE_FUNC_PENSION_retro + tab.APORTE_FUNC_SALUD_retro) as SALDO_ACTUAL,
                        
tab.valor_liquidado_retro as VALOR_NOMINA_RETRO,
tab.APORTE_FUNC_PENSION_retro + tab.APORTE_FUNC_SALUD_retro as VALOR_APORTE_FUNC_RETRO,
tab.APORTE_PATRONO_PENSION_retro + tab.APORTE_PATRONO_SALUD_retro as VALOR_APORTE_PATRONO_RETRO
                        
from(


    SELECT
    
    sum( nvl( tab0.valor_liquidado_retro ,0) ) as valor_liquidado_retro,
    
    sum( nvl( tab0.APORTE_FUNC_PENSION_liq ,0) ) as APORTE_FUNC_PENSION_liq,
    sum( nvl( tab0.APORTE_FUNC_SALUD_liq ,0) ) as APORTE_FUNC_SALUD_liq,
    
    sum( nvl( tab0.valor_liquidado ,0) ) as valor_liquidado,
    
    tab0.id_concep_nomina,
    tab0.codigo_concep,
    tab0.id_mae_fondos,
    tab0.descripcion_concep,
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.nombre_apellido,
    tab0.nombre_completo,
    
    tab0.ID_PERIODO,tab0.ID_CLASE_FONDO,tab0.CODIGO, tab0.FONDO
    
    ,sum( nvl( tab0.APORTE_FUNC_PENSION ,0) ) APORTE_FUNC_PENSION
    ,sum( nvl( tab0.APORTE_PATRONO_PENSION ,0) ) APORTE_PATRONO_PENSION
    ,sum( nvl( tab0.TOTAL_PENSION ,0) ) TOTAL_PENSION
    ,sum( nvl( tab0.APORTE_FUNC_SALUD ,0) ) APORTE_FUNC_SALUD
    ,sum( nvl( tab0.APORTE_PATRONO_SALUD ,0) ) APORTE_PATRONO_SALUD
    ,sum( nvl( tab0.TOTAL_SALUD ,0) ) TOTAL_SALUD
    ,sum( nvl( tab0.UPC_ADICIO ,0) ) UPC_ADICIO
    ,sum( nvl( tab0.APORTE_PATRONO_ARP ,0) ) APORTE_PATRONO_ARP
    ,sum( nvl( tab0.TOTAL_ARP ,0) ) TOTAL_ARP
    ,sum( nvl( tab0.PARAFISCALES ,0) ) PARAFISCALES
    ,sum( nvl( tab0.TOTAL_EMPLEADO ,0) ) TOTAL_EMPLEADO
    ,sum( nvl( tab0.TOTAL_APORTES ,0) ) TOTAL_APORTES,
    (select distinct periodo.periodo from no_liquida_v periodo where periodo.id_periodo = tab0.id_periodo) AS PERIODO,
    (select distinct periodo.tipper from no_liquida_v periodo where periodo.id_periodo = tab0.id_periodo) AS TIPPER
    
    ,sum( nvl( tab0.APORTE_FUNC_PENSION_retro ,0) ) APORTE_FUNC_PENSION_retro
    ,sum( nvl( tab0.APORTE_PATRONO_PENSION_retro ,0) ) APORTE_PATRONO_PENSION_retro
    ,sum( nvl( tab0.APORTE_FUNC_SALUD_retro ,0) ) APORTE_FUNC_SALUD_retro
    ,sum( nvl( tab0.APORTE_PATRONO_SALUD_retro ,0) ) APORTE_PATRONO_SALUD_retro
    
    FROM(
    

        SELECT
        
        tab3.valor_liquidado_retro,
    
        tab3.valor_liquidado,
        tab3.APORTE_FUNC_PENSION_liq,
        tab3.APORTE_FUNC_SALUD_liq,
    
        tab3.id_concep_nomina,
        tab3.codigo_concep,
        tab3.descripcion_concep,
        tab3.id_tipo_doc,
        tab3.num_doc,
        tab3.nombre_apellido,
        tab3.nombre_completo,
        tab3.ID_PERIODO,tab3.ID_CLASE_FONDO,tab3.CODIGO,tab3.FONDO,tab3.id_mae_fondos,
    
        tab3.APORTE_FUNC_PENSION,
        tab3.APORTE_PATRONO_PENSION,
        tab3.TOTAL_PENSION,
        tab3.APORTE_FUNC_SALUD,
        tab3.APORTE_PATRONO_SALUD,
        tab3.TOTAL_SALUD,
        tab3.UPC_ADICIO,
        tab3.APORTE_PATRONO_ARP,
        tab3.TOTAL_ARP,
        tab3.PARAFISCALES,
        ( nvl( APORTE_FUNC_PENSION ,0)  +  nvl( APORTE_FUNC_SALUD ,0) ) AS TOTAL_EMPLEADO,
        ( nvl( tab3.TOTAL_PENSION ,0)  +  nvl( tab3.TOTAL_SALUD ,0)  +  nvl( tab3.TOTAL_ARP ,0) +  nvl( tab3.PARAFISCALES ,0) ) AS TOTAL_APORTES,
        
        tab3.APORTE_FUNC_PENSION_retro,
        tab3.APORTE_PATRONO_PENSION_retro,
        tab3.APORTE_FUNC_SALUD_retro,
        tab3.APORTE_PATRONO_SALUD_retro
    
        FROM(
        
        
            select
            
            (liq.valor_liquidado_retro + liq.val_ajus_retro - liq.val_rein_retro) as valor_liquidado_retro,
                        
            foncon.id_fondo_concepto,
            tab1.id_liquida_aporte,
            (liq.valor_liquidado + liq.val_ajus - liq.val_rein) as valor_liquidado,
    
            case when concep.id_clase_fondo =1 then (liq.valor_liquidado + liq.val_ajus - liq.val_rein) - tab1.aporte_func
            when concep.id_clase_fondo = 2 then 0
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_PENSION_liq,
    
    
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then (liq.valor_liquidado + liq.val_ajus - liq.val_rein) - tab1.aporte_func
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_SALUD_liq,
    
            liq.id_concep_nomina,
            concep.codigo as codigo_concep,
            concep.descripcion as descripcion_concep,
            liq.id_tipo_doc,
            liq.num_doc,
            dat.nombre_apellido,
            dat.nombre_completo,
            liq.id_periodo AS ID_PERIODO, concep.id_clase_fondo,tab2.codigo AS CODIGO,tab2.razon_social AS FONDO,tab2.id_mae_fondos,
    
            case when concep.id_clase_fondo =1 then tab1.aporte_func
            when concep.id_clase_fondo = 2 then 0
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_PENSION,
    
            case when concep.id_clase_fondo =1 then tab1.aporte_patrono + tab1.aporte_patrono_licnorem
            when concep.id_clase_fondo = 2 then 0
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_PATRONO_PENSION,
            case when concep.id_clase_fondo =1 then tab1.aporte_patrono+tab1.aporte_func + tab1.aporte_patrono_licnorem
            when concep.id_clase_fondo = 2 then 0
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS TOTAL_PENSION,
    
    
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then tab1.aporte_func
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_SALUD,
    
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then tab1.aporte_patrono + tab1.aporte_patrono_licnorem
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_PATRONO_SALUD,
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then tab1.aporte_patrono+tab1.aporte_func+tab1.upc_adicio + tab1.aporte_patrono_licnorem
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS TOTAL_SALUD,
    
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then tab1.upc_adicio
            when concep.id_clase_fondo = 3 then 0
            else 0 end AS UPC_ADICIO,
    
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then 0
            when concep.id_clase_fondo = 3 then tab1.aporte_patrono
            else 0 end AS APORTE_PATRONO_ARP,
    
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then 0
            when concep.id_clase_fondo = 3 then tab1.aporte_patrono
            else 0 end AS TOTAL_ARP,
    
            case when concep.id_clase_fondo =1 then 0
            when concep.id_clase_fondo = 2 then 0
            when concep.id_clase_fondo = 3 then 0
            else tab1.aporte_patrono end AS PARAFISCALES,
    
            /*Valores retro - 20191004*/
            case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_func
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_PENSION_retro,    
            case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_patrono + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_PATRONO_PENSION_retro,
            case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_patrono+apotipoc.aporte_func + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS TOTAL_PENSION_retro,    
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_func
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_FUNC_SALUD_retro,    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_patrono + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS APORTE_PATRONO_SALUD_retro,
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_patrono+apotipoc.aporte_func + apotipoc.aporte_patrono_licnorem
            when apotipoc.id_clase_fondo = 3 then 0
            else 0 end AS TOTAL_SALUD_retro,
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then apotipoc.aporte_patrono
            else 0 end AS APORTE_PATRONO_ARP_retro,
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then apotipoc.aporte_patrono
            else 0 end AS TOTAL_ARP_retro,
    
            case when apotipoc.id_clase_fondo =1 then 0
            when apotipoc.id_clase_fondo = 2 then 0
            when apotipoc.id_clase_fondo = 3 then 0
            else apotipoc.aporte_patrono end AS PARAFISCALES_retro
    
    
            from (
    
                select
                liq.*,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null 
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_ajuste from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_ajus,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null 
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_rein from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_rein
                
                from (
                
                    select
                    0 as retro,
                    
                    0 as valor_liquidado_retro,
                    0 as val_ajus_retro,
                    0 as val_rein_retro,
                            
                    sum(liq.valor_liquidado) as valor_liquidado,
                    
                    liq.id_concep_nomina,
                    liq.id_tipo_doc,
                    liq.num_doc,
                    $id_periodo as id_periodo
                    from no_liquida_nomina liq
                    where liq.id_periodo in
                    (
        
                        select distinct
                        id_periodo as  periodos
                        from no_periodo
                        where id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                        and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                        --and id_tipo_periodo in (1 , 2)
        
                    )
                    and liq.id_periodo_ajuste is null 
                    
                    group by
                    liq.id_concep_nomina,
                    liq.id_tipo_doc,
                    liq.num_doc/*,
                    liq.id_periodo*/
                
                )liq
                
                
                union
                
                select
                liq.*,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null 
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_ajuste from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_ajus,
                (
                
                select nvl(sum(liqnom.valor_liquidado),0) as valor 
                from no_liquida_nomina liqnom 
                join no_periodo per on per.id_periodo = liqnom.id_periodo 
                where    1 = 1 
                and liqnom.id_periodo_ajuste is null 
                and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                and liqnom.num_doc = liq.num_doc and liqnom.id_tipo_doc = liq.id_tipo_doc 
                and liqnom.id_concep_nomina = (select con.id_concep_rein from no_concep_nomina con where con.id_concep_nomina = liq.id_concep_nomina) 
                
                ) as val_rein
                
                from (
                
                    select
                    1 as retro,
                    
                    sum(liq.valor_liquidado) as valor_liquidado_retro,
                                        
                    0 as valor_liquidado,
                    0 as val_ajus,
                    0 as val_rein,
                    
                    liq.id_concep_nomina,
                    liq.id_tipo_doc,
                    liq.num_doc,
                    $id_periodo as id_periodo
                    from no_liquida_nomina liq
                    where liq.id_periodo in
                    (
        
                        select distinct
                        id_periodo as  periodos
                        from no_periodo
                        where id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                        and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
                        and id_tipo_periodo in (6,7)
        
                    )
                    and liq.id_periodo_ajuste is not null 
                    
                    group by
                    liq.id_concep_nomina,
                    liq.id_tipo_doc,
                    liq.num_doc/*,
                    liq.id_periodo*/
                
                )liq
    
            )liq
            
                        
            left join  no_liquida_aporte tab1
            on liq.id_concep_nomina = tab1.id_concep_nomina
            and liq.id_tipo_doc = tab1.id_tipo_doc
            and liq.num_doc = tab1.num_doc
            and liq.id_periodo = tab1.id_periodo
            and tab1.tipo_planilla = 'A'
    
            join no_datos_funcionario_v dat
            on liq.id_tipo_doc = dat.id_tipo_doc
            and liq.num_doc = dat.num_doc
    
            JOIN NO_CONCEPTOS_V concep ON liq.id_concep_nomina = concep.id_concep_nomina
    
                
            left join no_fondo_concepto foncon
            on foncon.id_concep_nomina = liq.id_concep_nomina 
    
            left join no_mae_fondos tab2 ON tab2.id_mae_fondos = foncon.id_mae_fondos
    
            left join (
    
                  select nom.*,
                  case when tab.num_doc is not null then 1 else 0 end as pago
                  from no_nombramiento_v nom
    
                  left join (select distinct
                  pago.id_tipo_doc,
                  pago.num_doc
                  from no_pago_func pago
                  where
                  (select fecha_fin from no_periodo where id_periodo = $id_periodo) between pago.fecha_activacion and nvl(pago.fecha_terminacion, (select fecha_fin from no_periodo where id_periodo = $id_periodo))
                  )tab
                  on tab.id_tipo_doc = nom.id_tipo_doc and tab.num_doc = nom.num_doc
    
            )tab0
            on tab0.id_tipo_doc = liq.id_tipo_doc and tab0.num_doc = liq.num_doc
            
            /*Se deja para que salga aportse en septiembre del retro de todo el año - 20191004*/
            /*Se deja parametrizado tabla no_param_gen para saldo retro de todo el año - 20200805*/
            left join(            
            
                select
                tab0.id_clase_fondo,
                tab0.id_mae_fondos,
                tab0.id_concep_nomina,
                tab0.id_tipo_doc,
                tab0.num_doc,
                    
                sum(tab0.aporte_func) as aporte_func,
                sum(tab0.aporte_patrono) as aporte_patrono,
                sum(tab0.aporte_patrono_licnorem) as aporte_patrono_licnorem
                
                from(
                
                    select
                    
                    tabretro.id_periodo,
                    tabretro.id_clase_fondo,
                    tabretro.id_mae_fondos,
                    tabretro.id_concep_nomina,
                    tabretro.id_tipo_doc,
                    tabretro.num_doc,
                    
                    sum(nvl(tabretro.aporte_func,0) - nvl(tabtipoa.aporte_func,0)) as aporte_func,
                    sum(nvl(tabretro.aporte_patrono,0) - nvl(tabtipoa.aporte_patrono,0)) as aporte_patrono,
                    sum(nvl(tabretro.aporte_patrono_licnorem,0) - nvl(tabtipoa.aporte_patrono_licnorem,0)) as aporte_patrono_licnorem
                    
                    from no_liquida_aporte tabretro
                    
                    join no_periodo per on per.id_periodo = tabretro.id_periodo 
                    
                    left join no_liquida_aporte tabtipoa
                    on tabtipoa.tipo_planilla = 'A'
                    and tabtipoa.id_periodo = tabretro.id_periodo
                    and tabtipoa.id_clase_fondo = tabretro.id_clase_fondo
                    and tabtipoa.id_mae_fondos = tabretro.id_mae_fondos
                    and tabtipoa.id_concep_nomina = tabretro.id_concep_nomina
                    and tabtipoa.id_tipo_doc = tabretro.id_tipo_doc
                    and tabtipoa.num_doc = tabretro.num_doc
                    
                    where  
                    1 = 1 
                    and tabretro.tipo_planilla = 'C'
                    and per.id_anhos = ( select id_anhos from no_periodo where id_periodo = $id_periodo )
                    and nvl((select min(mes_saldo_retro) from no_param_gen where id_param_gen = 1),per.id_meses) = ( select id_meses from no_periodo where id_periodo = $id_periodo )
                    
                    group by 
                    tabretro.id_periodo,
                    tabretro.id_clase_fondo,
                    tabretro.id_mae_fondos,
                    tabretro.id_concep_nomina,
                    tabretro.id_tipo_doc,
                    tabretro.num_doc
                
                )tab0
                
                group by 
                tab0.id_clase_fondo,
                tab0.id_mae_fondos,
                tab0.id_concep_nomina,
                tab0.id_tipo_doc,
                tab0.num_doc
            
            )apotipoc
            on apotipoc.id_clase_fondo = concep.id_clase_fondo
            --and apotipoc.id_mae_fondos = tab1.id_mae_fondos
            and apotipoc.id_concep_nomina = liq.id_concep_nomina
            and apotipoc.id_tipo_doc = dat.id_tipo_doc
            and apotipoc.num_doc = dat.num_doc
            
                    
            where                          
            liq.id_periodo in (select distinct
                    id_periodo as  periodos
                    from no_periodo
                    where id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
                    and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
            ) 
            --and tab1.tipo_planilla = 'A'
            and foncon.id_fondo_concepto is not null
            and tab1.id_liquida_aporte is null
    
    )tab3
    
    
    )tab0
    
    where 
    --tab0.id_periodo = $id_periodo               
    tab0.id_periodo in (select distinct
            id_periodo as  periodos
            from no_periodo
            where id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
            and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
    )  
    and tab0.id_clase_fondo in (1,2) 
    $whereFuncionarioNumDoc
    $whereFuncionarioTipoDoc
    /*
    having
    (sum( nvl( tab0.APORTE_FUNC_PENSION_liq ,0)) )!= 0
    or
    (sum( nvl( tab0.APORTE_FUNC_SALUD_liq ,0) ))  != 0
    */
                        
    group by
    
    tab0.id_concep_nomina,
    tab0.id_mae_fondos,
    tab0.codigo_concep,
    tab0.descripcion_concep,
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.nombre_apellido,
    tab0.nombre_completo,
    tab0.ID_PERIODO,tab0.ID_CLASE_FONDO,tab0.CODIGO, tab0.FONDO

)tab

left join no_fondo_concepto foncon
on foncon.id_mae_fondos = tab.id_mae_fondos
and foncon.id_concep_nomina = tab.id_concep_nomina 

left join no_saldos_aporte sal
on sal.id_tipo_doc = tab.id_tipo_doc
and sal.num_doc = tab.num_doc
and sal.id_clase_fondo = tab.id_clase_fondo
and sal.id_descuento_ss = foncon.id_descuento_ss
and sal.id_mae_fondos = tab.id_mae_fondos
and sal.id_concep_nomina = tab.id_concep_nomina
and sal.id_periodo in (
    select distinct id_periodo from no_periodo
    where id_tipo_periodo = 1
    and id_anhos = $anho_ant
    and id_meses = $mes_ant
    and rownum = 1
)  
   
)    
                        
EOD;

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);

                /**
                 * Crear saldos del mes anterior, que no se generan por no estar en aportes(cambio fondo) ni en la liquidacion(ajuste) - 20150317
                 * Se agregan valores de retroactivo - 20191003
                 * Incidente #38865, en los valores del retro se añade NVL ya que al restar null, no tomaba ningun valor - 20241017::LAVILA
                 */
                $sql = <<<EOD
INSERT INTO NO_SALDOS_APORTE
 
SELECT 

tab0.ID_SALDOS_APORTE,
$id_periodo as ID_PERIODO,
tab0.ID_TIPO_DOC,
tab0.NUM_DOC,
tab0.ID_CLASE_FONDO,
tab0.ID_DESCUENTO_SS,
tab0.ID_MAE_FONDOS,
tab0.ID_CONCEP_NOMINA,
tab0.SALDO_ANTERIOR,
(tab0.val_conp+tab0.val_ajus-tab0.val_rein) as VALOR_NOMINA,
tab0.VALOR_APORTE_FUNC,
tab0.VALOR_APORTE_PATRONO,                          
(tab0.SALDO_ANTERIOR+(tab0.val_conp+tab0.val_ajus-tab0.val_rein)+(tab0.val_conp_retro+tab0.val_ajus_retro-tab0.val_rein_retro) 
    - (tab0.APORTE_FUNC_PENSION_retro + tab0.APORTE_FUNC_SALUD_retro) ) as SALDO_ACTUAL,
                        
(tab0.val_conp_retro+tab0.val_ajus_retro-tab0.val_rein_retro) as VALOR_NOMINA_RETRO,
tab0.APORTE_FUNC_PENSION_retro + tab0.APORTE_FUNC_SALUD_retro as VALOR_APORTE_FUNC_RETRO,
tab0.APORTE_PATRONO_PENSION_retro + tab0.APORTE_PATRONO_SALUD_retro as VALOR_APORTE_PATRONO_RETRO

FROM
(   
    
        SELECT distinct
        null as ID_SALDOS_APORTE,
        $id_periodo as ID_PERIODO,
        sal.ID_TIPO_DOC,
        sal.NUM_DOC,
        sal.ID_CLASE_FONDO,
        sal.ID_DESCUENTO_SS,
        sal.ID_MAE_FONDOS,
        sal.ID_CONCEP_NOMINA,
        sal.SALDO_ACTUAL as SALDO_ANTERIOR,
        0 as VALOR_NOMINA,
        0 as VALOR_APORTE_FUNC,
        0 as VALOR_APORTE_PATRONO,
        0 as SALDO_ACTUAL,
        
        (
        
        select nvl(sum(liqnom.valor_liquidado),0) as valor 
        from no_liquida_nomina liqnom 
        join no_periodo per on per.id_periodo = liqnom.id_periodo 
        where    1 = 1 
        and liqnom.id_periodo_ajuste is null 
        and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
        and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
        and liqnom.num_doc = sal.num_doc and liqnom.id_tipo_doc = sal.id_tipo_doc 
        and liqnom.id_concep_nomina = (sal.id_concep_nomina) 
        
        ) as val_conp,
        
        (
        
        select nvl(sum(liqnom.valor_liquidado),0) as valor 
        from no_liquida_nomina liqnom 
        join no_periodo per on per.id_periodo = liqnom.id_periodo 
        where    1 = 1 
        and liqnom.id_periodo_ajuste is null 
        and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
        and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
        and liqnom.num_doc = sal.num_doc and liqnom.id_tipo_doc = sal.id_tipo_doc 
        and liqnom.id_concep_nomina = (select con.id_concep_ajuste from no_concep_nomina con where con.id_concep_nomina = sal.id_concep_nomina) 
        
        ) as val_ajus,
        
        (
        
        select nvl(sum(liqnom.valor_liquidado),0) as valor 
        from no_liquida_nomina liqnom 
        join no_periodo per on per.id_periodo = liqnom.id_periodo 
        where    1 = 1 
        and liqnom.id_periodo_ajuste is null 
        and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
        and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
        and liqnom.num_doc = sal.num_doc and liqnom.id_tipo_doc = sal.id_tipo_doc 
        and liqnom.id_concep_nomina = (select con.id_concep_rein from no_concep_nomina con where con.id_concep_nomina = sal.id_concep_nomina) 
        
        ) as val_rein,
        
        (
        
        select nvl(sum(liqnom.valor_liquidado),0) as valor 
        from no_liquida_nomina liqnom 
        join no_periodo per on per.id_periodo = liqnom.id_periodo 
        where    1 = 1 
        and liqnom.id_periodo_ajuste is not null 
        and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
        and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
        and liqnom.num_doc = sal.num_doc and liqnom.id_tipo_doc = sal.id_tipo_doc 
        and liqnom.id_concep_nomina = (sal.id_concep_nomina) 
        
        ) as val_conp_retro,
        
        (
        
        select nvl(sum(liqnom.valor_liquidado),0) as valor 
        from no_liquida_nomina liqnom 
        join no_periodo per on per.id_periodo = liqnom.id_periodo 
        where    1 = 1 
        and liqnom.id_periodo_ajuste is not null 
        and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
        and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
        and liqnom.num_doc = sal.num_doc and liqnom.id_tipo_doc = sal.id_tipo_doc 
        and liqnom.id_concep_nomina = (select con.id_concep_ajuste from no_concep_nomina con where con.id_concep_nomina = sal.id_concep_nomina) 
        
        ) as val_ajus_retro,
        
        (
        
        select nvl(sum(liqnom.valor_liquidado),0) as valor 
        from no_liquida_nomina liqnom 
        join no_periodo per on per.id_periodo = liqnom.id_periodo 
        where    1 = 1 
        and liqnom.id_periodo_ajuste is not null 
        and per.id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo )
        and per.id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo )
        and liqnom.num_doc = sal.num_doc and liqnom.id_tipo_doc = sal.id_tipo_doc 
        and liqnom.id_concep_nomina = (select con.id_concep_rein from no_concep_nomina con where con.id_concep_nomina = sal.id_concep_nomina) 
        
        ) as val_rein_retro,
    
        /*Valores retro - 20191004*/
        case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_func
        when apotipoc.id_clase_fondo = 2 then 0
        when apotipoc.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_FUNC_PENSION_retro,    
        case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_patrono + apotipoc.aporte_patrono_licnorem
        when apotipoc.id_clase_fondo = 2 then 0
        when apotipoc.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_PATRONO_PENSION_retro,
        case when apotipoc.id_clase_fondo =1 then apotipoc.aporte_patrono+apotipoc.aporte_func + apotipoc.aporte_patrono_licnorem
        when apotipoc.id_clase_fondo = 2 then 0
        when apotipoc.id_clase_fondo = 3 then 0
        else 0 end AS TOTAL_PENSION_retro,    

        case when apotipoc.id_clase_fondo =1 then 0
        when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_func
        when apotipoc.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_FUNC_SALUD_retro,    
        case when apotipoc.id_clase_fondo =1 then 0
        when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_patrono + apotipoc.aporte_patrono_licnorem
        when apotipoc.id_clase_fondo = 3 then 0
        else 0 end AS APORTE_PATRONO_SALUD_retro,
        case when apotipoc.id_clase_fondo =1 then 0
        when apotipoc.id_clase_fondo = 2 then apotipoc.aporte_patrono+apotipoc.aporte_func + apotipoc.aporte_patrono_licnorem
        when apotipoc.id_clase_fondo = 3 then 0
        else 0 end AS TOTAL_SALUD_retro,

        case when apotipoc.id_clase_fondo =1 then 0
        when apotipoc.id_clase_fondo = 2 then 0
        when apotipoc.id_clase_fondo = 3 then apotipoc.aporte_patrono
        else 0 end AS APORTE_PATRONO_ARP_retro,

        case when apotipoc.id_clase_fondo =1 then 0
        when apotipoc.id_clase_fondo = 2 then 0
        when apotipoc.id_clase_fondo = 3 then apotipoc.aporte_patrono
        else 0 end AS TOTAL_ARP_retro,

        case when apotipoc.id_clase_fondo =1 then 0
        when apotipoc.id_clase_fondo = 2 then 0
        when apotipoc.id_clase_fondo = 3 then 0
        else apotipoc.aporte_patrono end AS PARAFISCALES_retro
                        
        FROM NO_SALDOS_APORTE sal
        
        /*Se deja para que salga aportse en septiembre del retro de todo el año - 20191004*/
        /*Se deja parametrizado tabla no_param_gen para saldo retro de todo el año - 20200805*/
        left join(            
        
            select
            tab0.id_clase_fondo,
            tab0.id_mae_fondos,
            tab0.id_concep_nomina,
            tab0.id_tipo_doc,
            tab0.num_doc,
                
            sum(tab0.aporte_func) as aporte_func,
            sum(tab0.aporte_patrono) as aporte_patrono,
            sum(tab0.aporte_patrono_licnorem) as aporte_patrono_licnorem
            
            from(
            
                select
                
                tabretro.id_periodo,
                tabretro.id_clase_fondo,
                tabretro.id_mae_fondos,
                tabretro.id_concep_nomina,
                tabretro.id_tipo_doc,
                tabretro.num_doc,
                
                sum(nvl(tabretro.aporte_func,0) - nvl(tabtipoa.aporte_func,0)) as aporte_func,
                sum(nvl(tabretro.aporte_patrono,0) - nvl(tabtipoa.aporte_patrono,0)) as aporte_patrono,
                sum(nvl(tabretro.aporte_patrono_licnorem,0) - nvl(tabtipoa.aporte_patrono_licnorem,0)) as aporte_patrono_licnorem
                
                from no_liquida_aporte tabretro
                
                join no_periodo per on per.id_periodo = tabretro.id_periodo 
                
                left join no_liquida_aporte tabtipoa
                on tabtipoa.tipo_planilla = 'A'
                and tabtipoa.id_periodo = tabretro.id_periodo
                and tabtipoa.id_clase_fondo = tabretro.id_clase_fondo
                and tabtipoa.id_mae_fondos = tabretro.id_mae_fondos
                and tabtipoa.id_concep_nomina = tabretro.id_concep_nomina
                and tabtipoa.id_tipo_doc = tabretro.id_tipo_doc
                and tabtipoa.num_doc = tabretro.num_doc
                
                where  
                1 = 1 
                and tabretro.tipo_planilla = 'C'
                and per.id_anhos = ( select id_anhos from no_periodo where id_periodo = $id_periodo )
                and nvl((select min(mes_saldo_retro) from no_param_gen where id_param_gen = 1),per.id_meses) = ( select id_meses from no_periodo where id_periodo = $id_periodo )
                
                group by 
                tabretro.id_periodo,
                tabretro.id_clase_fondo,
                tabretro.id_mae_fondos,
                tabretro.id_concep_nomina,
                tabretro.id_tipo_doc,
                tabretro.num_doc
            
            )tab0
            
            group by 
            tab0.id_clase_fondo,
            tab0.id_mae_fondos,
            tab0.id_concep_nomina,
            tab0.id_tipo_doc,
            tab0.num_doc
        
        )apotipoc
        on apotipoc.id_clase_fondo = sal.id_clase_fondo
        and apotipoc.id_mae_fondos = sal.id_mae_fondos
        and apotipoc.id_concep_nomina = sal.id_concep_nomina
        and apotipoc.id_tipo_doc = sal.id_tipo_doc
        and apotipoc.num_doc = sal.num_doc
                        
        where 
        sal.saldo_actual !=0      
        and sal.id_periodo in (
            select distinct id_periodo from no_periodo
            where id_tipo_periodo = 1
            and id_anhos = $anho_ant
            and id_meses = $mes_ant
            and rownum = 1
        )  
        and (sal.ID_TIPO_DOC,
        sal.NUM_DOC,
        sal.ID_CLASE_FONDO,
        sal.ID_DESCUENTO_SS,
        sal.ID_MAE_FONDOS,
        sal.ID_CONCEP_NOMINA)
        not in (
            SELECT distinct
            salant.ID_TIPO_DOC,
            salant.NUM_DOC,
            salant.ID_CLASE_FONDO,
            salant.ID_DESCUENTO_SS,
            salant.ID_MAE_FONDOS,
            salant.ID_CONCEP_NOMINA 
            FROM NO_SALDOS_APORTE salant
            where salant.ID_PERIODO = $id_periodo
        )    
    
)tab0 
     
where
1 = 1                         
$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc 
                        
EOD;

                //Ejecuta sql
                CN_TABLE::executeSQL($sql);


//            $this->list_data = array();
//            $this->logMessage("Se ingreso saldos");
            }
        } catch (Exception $e) {

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

}
