<?php

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

    /**
     * Obtener records para los 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");

        $tag_error = false;

        /*
         * Se crea conexión
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Manejo de 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);


            /*
             * Variables de filtro
             */
            $sec_debito = $request['sec_debito'];
            $concepto = $request['concepto'];
            $fecha_ini = $request['periodo_ini'];
            $fecha_fin = $request['periodo_fin'];
            $fecha_vence = $request['fecha_vencimiento']; //ipc_pasa
            $fecha_pago = $request['fecha_pago']; //ipc_pres
            $capital = $request['capital']; //valor_deuda
            $titulo = $request['titulo'];
            $num_doc = $request['num_doc'];
            $razon_soc = $request['razon_soc'];


            $aplica_usura_tag = false;
            if ($request['tasa'] != "") {

                $id_tasa_interes = $request['tasa'];
                $sql = <<<EOD
SELECT tab0.* from ca_tasa_interes tab0 where tab0.id_tasa_interes = $id_tasa_interes
EOD;
                $consec = CN_TABLE::executeSQL($sql);

                $aplica_usura = $consec[0]['aplica_usura'];
                if (!$aplica_usura) {
                    $tasa = $consec[0]['valor'];
                } else {
                    $sql = <<<EOD
SELECT * from ca_tasa_usura
where id_anhos = extract(year from to_date('$fecha_pago', 'yyyy-mm-dd')) and id_meses = extract(month from to_date('$fecha_pago', 'yyyy-mm-dd')) 
EOD;
                    $consec = CN_TABLE::executeSQL($sql);

                    if (count($consec) > 0) {
                        $tasa = $consec[0]['valor'];
                    } else {
                        $tasa = 1;
                    }
                    $aplica_usura_tag = true;
                }
            } else {

                $tasa = 0;
            }



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

            $id_username = $request['id_username'];

            /*
             * Consulta por comando para el tipo de calculo
             */
            $sql = <<<EOD
SELECT tab0.id_tipo_calculo from ca_tipo_calculo tab0 where tab0.comando = '$comando_accion'
EOD;
            $consec = CN_TABLE::executeSQL($sql);

            $id_tipo_calculo = $consec[0]['id_tipo_calculo'];

            //1-Calculo de interes
            if ($id_tipo_calculo == 1) {

                /**
                 * Incidente #6543, calcula para cada mes el valor para cada tasa, no el total por todo el tiempo - 20170630
                 */
                if ($aplica_usura == 'true') {

                    $fecha_pago_oportuno = $fecha_vence;

                    $sql = <<<EOD
select 
to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') as FECHA_PAGO_OPORTUNO,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_OPORTUNO_mes,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_OPORTUNO_anho,
to_date('$fecha_pago', 'yyyy-mm-dd') as FECHA_PAGO,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_mes,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_anho
from dual 
EOD;

                    //ejecuta y obtiene el resultado del sql
                    $records = CN_TABLE::executeSQL($sql);
                    $anho_req = $records[0]['fecha_pago_oportuno_anho'];
                    $mes_req = $records[0]['fecha_pago_oportuno_mes'];
                    $comparar_req = $anho_req . str_pad($mes_req, 2, '0', STR_PAD_LEFT);
                    $comparar = $records[0]['fecha_pago_anho'] . str_pad($records[0]['fecha_pago_mes'], 2, '0', STR_PAD_LEFT);

                    //Recorre cada mes y coloca un registro por tasa
                    $intereses = 0;
                    $dias_trim = 0;
                    $this->logMessage("---Intereses--- " . $intereses);
                    while ($comparar_req <= $comparar) {

                        /*
                         * Record para calculo de formula
                         */
                        //Sql para tomar id de retefuente
                        $sql = <<<EOD
select 
$sec_debito as sec_debito,
'$concepto' as concepto,
'$fecha_ini' as fecha_ini,
'$fecha_fin' as fecha_fin,
'$fecha_vence' as fecha_vence,
'$fecha_pago' as fecha_pago,
$capital as valor_deuda,
'$titulo' as titulo,
'$num_doc' as num_doc,
'$razon_soc' as razon_soc,
nvl((select max(valor) as id_tasa_interes from ca_tasa_usura where id_anhos = $anho_req and id_meses = $mes_req),1) as tasa,
'$comando_accion' as comando,
$id_username as id_username,
(case when to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_pago', 'yyyy-mm-dd') else last_day(to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd')) end) - (case when to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') else to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd') end) + 1 as dias,
nvl((select sum(valor) as  valor from ca_ipc 
where id_anhos = extract(year from to_date('$fecha_vence', 'yyyy-mm-dd')) and id_meses = extract(month from to_date('$fecha_vence', 'yyyy-mm-dd')) ),1) as ipc_pasa,--fecha_vence
nvl((select sum(valor) as  valor from ca_ipc 
where id_anhos = extract(year from to_date('$fecha_pago', 'yyyy-mm-dd')) and id_meses = extract(month from to_date('$fecha_pago', 'yyyy-mm-dd')) ),1) as ipc_pres--fecha_pago                   
from dual
EOD;
                        //Ejecutar SQL
                        $records = CN_TABLE::executeSQL($sql);


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


                        /**
                         * Año/Mes calculo, para saber si el siguiente es trimestre diferente - 20170704
                         */
                        $anho_ant = $anho_req;
                        $mes_ant = $mes_req;

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

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



                        //Sql para tomar id de retefuente
                        $sql = <<<EOD
select 
nvl((select trimestre from meses where id_meses = $mes_ant),0) as trim1,
nvl((select trimestre from meses where id_meses = $mes_req),0) as trim2
from dual 
EOD;
                        //Ejecutar SQL
                        $records_trim = CN_TABLE::executeSQL($sql);
                        if (count($records_trim) > 0) {
                            if ($records_trim[0]['trim1'] != $records_trim[0]['trim2']) {
                                $tag_trim = true;
                            } else {
                                $tag_trim = false;
                            }
                        } else {
                            $tag_trim = false;
                        }


                        foreach ($records as $record) {
                            //$fecha_pago - $fecha_vence
                            $dias_mora = $record['dias']; //dias
                            $tasa_mora = $record['tasa']; //dias

                            /**
                             * Validacion de valores IPC - 20161101
                             */
                            $ipc_pasa = $record['ipc_pasa']; //dias
                            $ipc_pres = $record['dias']; //ipc_pres
                            if ($ipc_pasa == 1 || $ipc_pres == 1) {
                                $tag_error = true;
                                throw new Exception('No se encuentra parametrizado valores IPC, favor verificar para la fecha de pago y vencimiento.');
                            }

                            /*
                             * Llamar al metodo de calculo
                             */
                            $dias_trim += $dias_mora;
                            /**
                             * Calculo Trimestral 
                             * Si es diferene el trimestre del año/mes siguiente - 20170704
                             */
                            if ($tag_trim) {
                                $record['dias'] = $dias_trim;
                                $int = $this->liquidar($request, $id_tipo_calculo, $record);
                                $dias_trim = 0;
                            }
                            $this->logMessage("---dias_mora/tasa/capital/intereses--- " . $dias_mora . "/" . $tasa_mora . "/" . $capital . "/" . $int);
                            $intereses += $int;
                            $int = 0;
                            $this->logMessage("---Intereses--- " . $intereses);
                        }

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

                    //Incidente #6809, si no es usura, calcula por rango de años - 20170727

                    $fecha_pago_oportuno = $fecha_vence;

                    $sql = <<<EOD
select 
to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') as FECHA_PAGO_OPORTUNO,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'dd') as FECHA_PAGO_OPORTUNO_dia,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_OPORTUNO_mes,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_OPORTUNO_anho,
to_date('$fecha_pago', 'yyyy-mm-dd') as FECHA_PAGO,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_mes,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_anho
from dual 
EOD;

                    //ejecuta y obtiene el resultado del sql
                    $records = CN_TABLE::executeSQL($sql);
                    $anho_req = $records[0]['fecha_pago_oportuno_anho'];
                    $mes_req = $records[0]['fecha_pago_oportuno_mes'];
                    $dia_req = $records[0]['fecha_pago_oportuno_dia'];
                    $comparar_req = $anho_req;
                    $comparar = $records[0]['fecha_pago_anho'];

                    //Recorre cada mes y coloca un registro por tasa
                    $intereses = 0;
                    $dias_trim = 0;
                    $dias_mora_tot = 0;
                    $this->logMessage("---Intereses--- " . $intereses);
                    while ($comparar_req <= $comparar) {

                        $anho_req_pag = $anho_req + 1;

                        /*
                         * Record para calculo de formula
                         */
                        //Sql para tomar id de retefuente
                        $sql = <<<EOD
select 
$sec_debito as sec_debito,
'$concepto' as concepto,
'$fecha_ini' as fecha_ini,
'$fecha_fin' as fecha_fin,
'$fecha_vence' as fecha_vence,
'$fecha_pago' as fecha_pago,
$capital as valor_deuda,
'$titulo' as titulo,
'$num_doc' as num_doc,
'$razon_soc' as razon_soc,
$tasa as tasa,
'$comando_accion' as comando,
$id_username as id_username,
(case when to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyy') = $anho_req then to_date('$fecha_pago', 'yyyy-mm-dd') 
        else case when (to_date('$anho_req_pag-$mes_req-$dia_req', 'yyyy-mm-dd')-1) <= to_date('$fecha_pago', 'yyyy-mm-dd')
            then (to_date('$anho_req_pag-$mes_req-$dia_req', 'yyyy-mm-dd')-1)
                else to_date('$fecha_pago', 'yyyy-mm-dd') end
                    end) 
    - 
        (case when to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyy') = $anho_req then to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') else to_date('$anho_req-$mes_req-$dia_req', 'yyyy-mm-dd') end) 
            + 1 as dias,
nvl((select sum(valor) as  valor from ca_ipc 
where id_anhos = extract(year from to_date('$fecha_vence', 'yyyy-mm-dd')) and id_meses = extract(month from to_date('$fecha_vence', 'yyyy-mm-dd')) ),1) as ipc_pasa,--fecha_vence
nvl((select sum(valor) as  valor from ca_ipc 
where id_anhos = extract(year from to_date('$fecha_pago', 'yyyy-mm-dd')) and id_meses = extract(month from to_date('$fecha_pago', 'yyyy-mm-dd')) ),1) as ipc_pres--fecha_pago                   
from dual
EOD;
                        //Ejecutar SQL
                        $records = CN_TABLE::executeSQL($sql);
                        /**
                         * Año/Mes calculo, para saber si el siguiente es trimestre diferente - 20170704
                         */
                        $anho_ant = $anho_req;

                        //variables del request - actualiza por siguientes
                        $anho_req = $anho_req + 1;

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

                        foreach ($records as $record) {
                            //$fecha_pago - $fecha_vence
                            $dias_mora = $record['dias']; //dias

                            if ($dias_mora > 0) {
                                $dias_mora_tot += $dias_mora;
                            }

                            /**
                             * Validacion de valores IPC - 20161101
                             */
                            $ipc_pasa = $record['ipc_pasa']; //dias
                            $ipc_pres = $record['dias']; //ipc_pres
                            if ($ipc_pasa == 1 || $ipc_pres == 1) {
                                $tag_error = true;
                                throw new Exception('No se encuentra parametrizado valores IPC, favor verificar para la fecha de pago y vencimiento.');
                            }

                            /*
                             * Llamar al metodo de calculo
                             */
                            $int = $this->liquidar($request, $id_tipo_calculo, $record);
                            $this->logMessage("---dias_mora/capital/intereses--- " . $dias_mora . "/" . $capital . "/" . $int);
                            $intereses += $int;
                            $int = 0;
                            $this->logMessage("---Intereses--- " . $intereses);
                        }

                        /*
                         * Cambio por ciclo comparacion fecha - 20120724
                         */
                        $comparar_req = $anho_req;
                    }
                }
            } else {

                //Incidente #6859, si no es de interes, toma calculo normar por fango de fechas - 20170803

                /*
                 * Record para calculo de formula
                 */
                $sql = <<<EOD
select 
$sec_debito as sec_debito,
'$concepto' as concepto,
'$fecha_ini' as fecha_ini,
'$fecha_fin' as fecha_fin,
'$fecha_vence' as fecha_vence,
'$fecha_pago' as fecha_pago,
$capital as valor_deuda,
'$titulo' as titulo,
'$num_doc' as num_doc,
'$razon_soc' as razon_soc,
$tasa as tasa,
'$comando_accion' as comando,
$id_username as id_username,
to_date('$fecha_pago', 'yyyy-mm-dd') - to_date('$fecha_vence', 'yyyy-mm-dd') as dias,
nvl((select sum(valor) as  valor from ca_ipc 
where id_anhos = extract(year from to_date('$fecha_vence', 'yyyy-mm-dd')) and id_meses = extract(month from to_date('$fecha_vence', 'yyyy-mm-dd')) ),1) as ipc_pasa,--fecha_vence
nvl((select sum(valor) as  valor from ca_ipc 
where id_anhos = extract(year from to_date('$fecha_pago', 'yyyy-mm-dd')) and id_meses = extract(month from to_date('$fecha_pago', 'yyyy-mm-dd')) ),1) as ipc_pres--fecha_pago                   
from dual
EOD;
                //Ejecutar SQL
                $records = CN_TABLE::executeSQL($sql);
                foreach ($records as $record) {
                    //$fecha_pago - $fecha_vence
                    $dias_mora_tot = $dias_mora = $record['dias']; //dias

                    /**
                     * Validacion de valores IPC - 20161101
                     */
                    $ipc_pasa = $record['ipc_pasa']; //dias
                    $ipc_pres = $record['dias']; //ipc_pres
                    if ($ipc_pasa == 1 || $ipc_pres == 1) {
                        $tag_error = true;
                        throw new Exception('No se encuentra parametrizado valores IPC, favor verificar para la fecha de pago y vencimiento.');
                    }

                    /*
                     * Llamar al metodo de calculo
                     */
                    $intereses = $this->liquidar($request, $id_tipo_calculo, $record);
                }
            }


            $total = $capital + $intereses;
            $total = round($total, -3);

            /*
             * Insert del calculo
             */

            if ($fecha_ini == "null")
                $fecha_ini = "";
            if ($fecha_fin == "null")
                $fecha_fin = "";

            $sql = <<<EOD
INSERT INTO CA_INT_CALCULADO_T (SEC_DEBITO,CONCEPTO,FECHA_INI,FECHA_FIN
,FECHA_VENCE,CAPITAL,INTERESES,TOTAL,TASA,ID_USERNAME,FECHA_PAGO,TITULO,NUM_DOC,RAZON_SOC,DIAS_MORA,ID_TIPO_CALCULO)
    VALUES ($sec_debito,'$concepto',to_date('$fecha_ini','YYYY-MM-DD')
        ,to_date('$fecha_fin','YYYY-MM-DD')
            ,to_date('$fecha_vence','YYYY-MM-DD'),$capital,
                $intereses, $total, $tasa, $id_username,to_date('$fecha_pago','YYYY-MM-DD'),
                    '$titulo','$num_doc','$razon_soc',$dias_mora_tot,$id_tipo_calculo)   
                    
EOD;
            $this->conn->execute($sql);

            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();

            $mensaje = "";

            $this->list_data = array();
            $this->status = 0;
            //$mensaje = "Se cargo archivo.";
            $this->mensajeError = $mensaje;
        } catch (Exception $e) {
            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $mensaje = "No se puede Guardar la Obligación.";
            $this->conn->rollback();

            $this->status = 1;
            if ($tag_error) {
                $this->mensajeError = "[CA_INT_CALCULADO] Ocurrio un error: " . $e->getMessage();
            } else {
                $this->mensajeError = "[CA_INT_CALCULADO] Ocurrio un error: " . $mensaje;
            }
            $this->list_data = array();
            $this->logMessage("[CA_INT_CALCULADO] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

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

        /*
         * Se crea conexión
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Manejo de 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);

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

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

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


            $where = "";

            if ($id_int_calculado != "") {

                $where = "where id_int_calculado = " . $id_int_calculado;
            } else {
                $sql = <<<EOD
SELECT tab0.id_tipo_calculo from ca_tipo_calculo tab0 where tab0.comando = '$comando_accion'
EOD;
                $consec = CN_TABLE::executeSQL($sql);


                $id_tipo_calculo = $consec[0]['id_tipo_calculo'];

                $where = "where id_username =" . $id_username . " and id_tipo_calculo =" . $id_tipo_calculo;
            }


            $sql = <<<EOD
DELETE FROM CA_INT_CALCULADO_T  $where
EOD;

            CN_TABLE::executeSQL($sql);
            $this->conn->commit();



            $mensaje = "";

            $this->list_data = array();
            $this->status = 0;
            //$mensaje = "Se cargo archivo.";
            $this->mensajeError = $mensaje;
        } catch (Exception $e) {

            $mensaje = "Se limpio el Historial de Consulta";
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $this->logMessage($e->getMessage());
        }
    }

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


        /*
         * Manejo de 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);


            /*
             * Variables obligatorias
             */

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

            /*
             * Paginacion
             */
            if (isset($request['_startRow'])) {
                $rowStart = $request['_startRow'];
            } else {
                $rowStart = 0;
            }

            if (isset($request['_endRow'])) {
                $rowEnd = $request['_endRow'];
            } else {
                $rowEnd = 75;
            }

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

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */

            $sql = <<<EOD
                    SELECT tab0.id_tipo_calculo from ca_tipo_calculo tab0 where tab0.comando = '$comando_accion'
EOD;
            $consec = CN_TABLE::executeSQL($sql);


            $id_tipo_calculo = $consec[0]['id_tipo_calculo'];

            $sql = <<<EOD
select count(*) as count from (

                    select tab0.*
                    
                    from CA_INT_CALCULADO_T tab0
                    
                    where tab0.id_username = $id_username and tab0.id_tipo_calculo = $id_tipo_calculo

)
EOD;

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

            //validar si hay registros
            if ($total_record_count > 0) {




                /*
                 * Obtiene los registros de debito/vencimiento con su saldo respectivo
                 */
                $sql = <<<EOD

SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

 select tab0.*
                    
                    from CA_INT_CALCULADO_T tab0
                    
                    where tab0.id_username = $id_username and tab0.id_tipo_calculo = $id_tipo_calculo

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

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


                $this->totalRows = $total_record_count;
                $this->startRow = $rowStart;
                $this->endRow = $rowStart + count($records);
                $this->list_data = $records;
                $this->logMessage("[CONSULTA DEBITOS] Consulta exitosa.");
            } else {

                $mensaje = "[CONSULTA DEBITOS] No hay registros debito.";
                $this->status = 0;
                $this->totalRows = 0;
                $this->startRow = 0;
                $this->endRow = 0;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /*
     * Calcular formula por tipo calculo
     * 
     * @param type $request
     * @param type $id_tipo_calculo
     * @param type $record_calculo
     */

    private function liquidar($request, $id_tipo_calculo, $record_calculo) {
        $this->logMessage("[Calculo de Formula] Calcular: TipoCalculo " . $id_tipo_calculo);

        /*
         * Inicializar variables
         * Valor del calculo
         */
        $valor_calculado = 0;
        $formula = '';

        /*
         * Cargar formulas por tipo de calculo
         */
        //Sql
        $sql = <<<EOD
select 
ID_FORMULA,
ID_TIPO_CALCULO,
FORMULA,
NOMBRE
from ca_formula 
where id_tipo_calculo = $id_tipo_calculo  
EOD;
        //Ejecutar SQL
        $records = CN_TABLE::executeSQL($sql);

        /*
         * Valida si posee formula el tipo de calculo
         */
        if (count($records) > 0) {
            $this->logMessage("[Calculo de Formula] Entro a calcular Formula.");

            /*
             * Recorrer todas las formulas encontradas
             */
            foreach ($records as $value) {
                $formula = $value['formula'];
                $this->logMessage("[Calculo de Formula] 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_calculo);
                $this->logMessage("[Calculo de Formula] Formula consulta los filtros: " . $formula);


                /*
                 * 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) {
                    $this->logMessage("[Calculo de Formula] Formula No cumple con la condicion: " . $formula);
                    $result = 0;
                }


                /*
                 * Acumulan resultados de liquidacion
                 */
                if ($result !== -9999) // Validar al cumplir condicion -9999 - no cumplue con la condicion de la formula
                    $valor_calculado += $result;
            }
        } else {
            $this->logMessage("[Calculo de Formula] No Entro a calcular Formula.");
        }

        /*
         * Valor del calculo
         */
        $this->logMessage("[Calculo de Formula] Valor de calculo = " . $valor_calculado);

        /*
         * Retornar Valor del calculo
         */
        return $valor_calculado;
    }

}
