<?php

/**
 * caco_novedad_contrato actions.
 *
 * @package    cartera
 * @subpackage caco_novedad_contrato
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23811 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class caco_novedad_contratoActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'CACO_NOVEDAD_CONTRATO_V',
        'CACO_CONTRATO_V',
        'CACO_TIPO_NOV_CONT',
        'TS_TD'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'CACO_CONTRATO_V' =>
        array(
            'id_contrato' => 'CACO_NOVEDAD_CONTRATO_V'
        ),
        'CACO_TIPO_NOV_CONT' =>
        array(
            'id_tipo_nov_cont' => 'CACO_NOVEDAD_CONTRATO_V'
        ),
        'TS_TD, LEFT' =>
        array(
            'id_ts_td-id' => 'CACO_NOVEDAD_CONTRATO_V'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CACO_NOVEDAD_CONTRATO_V' =>
        array(
            'id_novedad_contrato' => 'id_novedad_contrato',
            'id_contrato' => 'id_contrato',
            'id_ts_td' => 'id_ts_td',
            'doc_soporte' => 'doc_soporte',
            'id_tipo_nov_cont' => 'id_tipo_nov_cont',
            'fecha_novedad' => 'fecha_novedad',
            'observaciones' => 'observaciones',
            'fecha_log' => 'fecha_log',
            'usuario_log' => 'usuario_log',
            'valor_desembolsado' => 'valor_desembolsado',
            'valor_rendimientos' => 'valor_rendimientos',
            'valor_no_ejecutado' => 'valor_no_ejecutado',
            'valor_no_reconocido' => 'valor_no_reconocido',
            'indexacion' => 'indexacion',
            'valor_intereses_banco' => 'valor_intereses_banco',
            'valor_intereses_mora' => 'valor_intereses_mora',
            'reintegros_efectuados' => 'reintegros_efectuados',
            'no_certificado' => 'no_certificado',
            'destinatario' => 'destinatario',
            'destinatario_cargo' => 'destinatario_cargo',
            'no_radicado' => 'no_radicado',
            'objeto' => 'objeto',
            'fecha_legalizacion' => 'fecha_legalizacion',
            'dias_leg' => 'dias_leg',
            'obser_indexacion' => 'obser_indexacion',
            'obser_interes_mora' => 'obser_interes_mora',
            'obser_interes_banco' => 'obser_interes_banco',
            'obser_saldo_pendiente' => 'obser_saldo_pendiente',
            'anexo_cetificado' => 'anexo_cetificado',
            'firmado' => 'firmado',
            'fecha_firmado' => 'fecha_firmado',
            'usuario_firmado' => 'usuario_firmado',
            'valor_ajuste_banco' => 'valor_ajuste_banco',
            'valor_ajuste_mora' => 'valor_ajuste_mora',
            'valor_ajuste_indexacion' => 'valor_ajuste_indexacion',
            'fecha_legalizacion_real' => 'fecha_legalizacion_real',
            'fecha_legalizacion_limite' => 'fecha_legalizacion_limite',
            'aplica_dia_ant' => 'aplica_dia_ant',
            'fecha_inicial_indexacion' => 'fecha_inicial_indexacion',
            'fecha_final_indexacion' => 'fecha_final_indexacion'
        ),
        'CACO_CONTRATO_V' =>
        array(
            'id_tipo_contrato' => 'id_tipo_contrato',
            'descripcion' => 'descripcion',
            'codigo' => 'codigo',
            'id_anhos' => 'id_anhos',
            'codigo_anhos' => 'codigo_anhos',
            'fecha_proceso' => 'fecha_proceso',
            'fecha_inicial' => 'fecha_inicial',
            'fecha_termina' => 'fecha_termina',
            'valor_compania' => 'valor_compania',
            'valor_entidad' => 'valor_entidad',
            'valor_contrato' => 'valor_contrato',
            'aplica_salvedad' => 'aplica_salvedad',
            'aplica_indexacion' => 'aplica_indexacion',
            'estado' => 'estado',
            'id_supervisor_cont' => 'id_supervisor_cont',
            'codigo_tipcont' => 'codigo_tipcont',
            'descripcion_tipcont' => 'descripcion_tipcont',
            'id_mae_ter_sup' => 'id_mae_ter_sup',
            'num_doc_sup' => 'num_doc_sup',
            'dv_sup' => 'dv_sup',
            'razon_soc_sup' => 'razon_soc_sup',
            'correo_sup' => 'correo_sup',
            'cargo_sup' => 'cargo_sup',
            'correo_ter' => 'correo_ter'
        ),
        'CACO_TIPO_NOV_CONT' =>
        array(
            'codigo' => 'codigo_tipnov',
            'descripcion' => 'descripcion_tipnov',
            'estado' => 'estado_tipnov',
            'aplica_cartera' => 'aplica_cartera'
        ),
        'TS_TD' =>
        array(
            'documento' => 'documento',
            'descripcion' => 'descripcion_td'
        )
    ); //por cada tabla especificar los campos del select

    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'CACO_NOVEDAD_CONTRATO_V' => array(
            'id_novedad_contrato,a' => array('!=' => array(-1)),
            'id_novedad_contrato,b' => array('=' => array('id_novedad_contrato')),
            'id_contrato' => array('=' => array('id_contrato')),
            'id_ts_td' => array('=' => array('id_ts_td')),
            'doc_soporte' => array('=' => array('doc_soporte')),
            'id_tipo_nov_cont' => array('=' => array('id_tipo_nov_cont')),
            'fecha_novedad' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'usuario_log' => array('=' => array('usuario_log')),
            'no_certificado' => array('=' => array('no_certificado')),
            'no_radicado' => array('=' => array('no_radicado')),
            'firmado' => array('=' => array('firmado')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        ),
        'CACO_CONTRATO_V' => array(
            'id_tipo_contrato' => array('=' => array('id_tipo_contrato')),
            'id_entidad_contrato' => array('=' => array('id_entidad_contrato')),
            'id_supervisor_cont' => array('=' => array('id_supervisor_cont')),
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(
    ); // filtros de condicion or
    protected $fields_orderBy = array(
        'id_anhos', 'codigo', 'id_tipo_nov_cont', 'fecha_novedad', 'no_certificado'
    ); //campos para el ordenamiento de la consulta
//    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = true;
    //si es servicio para filtro agregar campo
//    protected $filtro = 'Area';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_novedad_contrato'; //identificador de la tabla
    protected $id_names = array('id_novedad_contrato'); //llave primaria
    protected $field_names = array('id_contrato', 'id_ts_td', 'doc_soporte', 'id_tipo_nov_cont', 'fecha_novedad',
        'observaciones', 'usuario_log', 'valor_desembolsado', 'valor_rendimientos', 'valor_no_ejecutado',
        'valor_no_reconocido', 'indexacion', 'valor_intereses_banco', 'valor_intereses_mora', 'reintegros_efectuados',
        'no_certificado', 'destinatario', 'destinatario_cargo', 'no_radicado', 'objeto',
        'fecha_legalizacion', 'dias_leg', 'obser_indexacion', 'obser_interes_mora', 'obser_interes_banco', 'obser_saldo_pendiente',
        'anexo_cetificado', 'valor_ajuste_banco', 'valor_ajuste_mora', 'valor_ajuste_indexacion',
        'fecha_legalizacion_limite', 'aplica_dia_ant'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CACO_NOVEDAD_CONTRATO'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS - CARTERA
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = true; //si posee secuencia la tabla
//    protected $en_mayuscula = true; // si se pone, se puede poner en mayucula con true y en minuscula con false, de lo contrario la pone tal cual la BD
    protected $campo_fecha_sistema_hora = array('fecha_log');

    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_novedad_contrato'; //identificador unico de la tabla
    //false - Registrar log para list - consultar
    protected $log_list = false;
    //false - Registrar log para add - update - remove
    protected $log_crud = false;

    // Validate
    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a validateAdd");


        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */
        $id_contrato = $request['id_contrato'];
        $id_tipo_nov_cont = $request['id_tipo_nov_cont'];

        //sentencia sql
        $sql = <<<EOD
SELECT aplica_cartera
    FROM caco_tipo_nov_cont 
    where id_tipo_nov_cont = $id_tipo_nov_cont 
EOD;
        //ejecuta el sql
        $records = CN_TABLE::executeSQL($sql, true);

        $aplica_cartera = $records[0]['aplica_cartera'];

        /*
         *  Generar errores en $errors
         */
        //Validación de no poder registrar mas solicitudes de reintegro si ya existe un acta de legalizacion - 20200228
        //sentencia sql
        $sql = <<<EOD
SELECT
tip.aplica_cartera,
    nov.*
FROM caco_novedad_contrato nov

left join caco_tipo_nov_cont tip
on tip.id_tipo_nov_cont = nov.id_tipo_nov_cont

where
nov.id_contrato = $id_contrato
and tip.aplica_cartera = 1
and $aplica_cartera = 0 
EOD;
        //ejecuta el sql
        $records = CN_TABLE::executeSQL($sql);
        if (count($records) > 0) {

            $errors['mensaje'] = "No permite registrar novedad de tipo Solicitud de Reintegro, ya existe una novedad que aplica cartera(Acta Liq.); verificar.";
            $errors['servicio'] = "caco_novedad_contrato";
            $logger->info("No permite registrar novedad de tipo Solicitud de Reintegro, ya existe una novedad que aplica cartera(Acta Liq.); verificar.");
        }


        //Validación de nodejar registrar aplica cartera si no hay una SOLICITUD DE REINTEGRO firmada - 20200228
        if ($aplica_cartera == 1) {
            //sentencia sql
            $sql = <<<EOD
SELECT
tip.aplica_cartera,
    nov.*
FROM caco_novedad_contrato nov

left join caco_tipo_nov_cont tip
on tip.id_tipo_nov_cont = nov.id_tipo_nov_cont

where
nov.id_contrato = $id_contrato
and nov.firmado = 1
and tip.aplica_cartera = 0 
EOD;
            //ejecuta el sql
            $records = CN_TABLE::executeSQL($sql);
            if (count($records) == 0) {

                /**
                 * Si ya tiene un acta firmada deja pasar - 20200619::LAVILA
                 */
                //sentencia sql
                $sql = <<<EOD
SELECT
tip.aplica_cartera,
    nov.*
FROM caco_novedad_contrato nov

left join caco_tipo_nov_cont tip
on tip.id_tipo_nov_cont = nov.id_tipo_nov_cont

where
nov.id_contrato = $id_contrato
and nov.firmado = 1
and tip.aplica_cartera = 1 
EOD;
                //ejecuta el sql
                $records = CN_TABLE::executeSQL($sql);
                if (count($records) == 0) {

                    $errors['mensaje'] = "No permite registrar novedad si no existe una Solicitud de Reintegro Firmada; verificar.";
                    $errors['servicio'] = "caco_novedad_contrato";
                    $logger->info("No permite registrar novedad si no existe una Solicitud de Reintegro Firmada; verificar.");
                }
            }
        }

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");
        $valor_interes_banco = 0;

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {

            $id_novedad_contrato = "";
            $request['usuario_log'] = $request['username'];

            /**
             * Consecutivo certif - 20190308
             */
            $sql = <<<EOD
select to_char(sysdate,'YYYY') as ID_ANHOS FROM DUAL
EOD;
            $records = CN_TABLE::executeSQL($sql);
            $id_anhos = $records[0]['id_anhos'];
            $request['id_anhos'] = $id_anhos;

            //Se desactiva por solicitud usuario mientras se estabiliza el proceso - 20190409
            $sql = <<<EOD
select consecutivo from caco_consecutivo_certif 
    where vigencia = $id_anhos
EOD;
            $records = CN_TABLE::executeSQL($sql);

            /*
             * Se crea validacion para nuevo año
             */
//            if (count($records) > 0) {
//
//                $consecutivo = $records[0]['consecutivo'] + 1;
//                $request['no_certificado'] = $consecutivo;
//
//                $sql = <<<EOD
//update caco_consecutivo_certif set consecutivo =($consecutivo) 
//    where vigencia = $id_anhos
//EOD;
//
//                CN_TABLE::executeSQL($sql);
//            } else {
//
//                //Verifica consecutivo maximo
//                $sql = <<<EOD
//select max(consecutivo) from caco_consecutivo_certif 
//EOD;
//                $records = CN_TABLE::executeSQL($sql);
//                if (count($records) > 0) {
//                    $consecutivo = $records[0]['consecutivo'] + 1;
//                } else {
//                    $consecutivo = 1;
//                }
//                $request['no_certificado'] = $consecutivo;
//
//                $sql = <<<EOD
//Insert into caco_consecutivo_certif (ID_CONSECUTIVO_CCERTIF,VIGENCIA,CONSECUTIVO) 
//    values (null,'$id_anhos',($consecutivo)) 
//EOD;
//
//                CN_TABLE::executeSQL($sql);
//            }

            /**
             * Calculo de intereses - 20190313
             */
            $id_tipo_nov_cont = $request['id_tipo_nov_cont'];
            $id_contrato = $request['id_contrato'];

            //Verifica consecutivo maximo
            $sql = <<<EOD
select * from caco_tipo_nov_cont 
    where id_tipo_nov_cont = $id_tipo_nov_cont
EOD;
            $records = CN_TABLE::executeSQL($sql);
            //validar el tipo de novedad contrato
            if (count($records) > 0) {
                $aplica_cartera = $records[0]['aplica_cartera'];

                $tag_aplica_inter_banc = false;
                /*
                 * Si es moratorio y no tiene registros firmados que no apliquen cartera - 20190426
                 * Verifica que si tenga registros en caco_calculo_interes_banco - 20200930
                 */
                $sql = <<<EOD
SELECT
nov.*

FROM caco_novedad_contrato nov

left join caco_tipo_nov_cont tipnov
on tipnov.id_tipo_nov_cont = nov.id_tipo_nov_cont

where
nov.id_contrato = $id_contrato 
and nov.firmado = 1
and tipnov.id_tipo_nov_cont in (SELECT
    caco_tipo_nov_cont.id_tipo_nov_cont
    FROM caco_tipo_nov_cont where caco_tipo_nov_cont.aplica_cartera = 0) 
    
and nov.id_contrato in (select distinct id_contrato from caco_calculo_interes_banco )
    
order by
nov.fecha_log desc 
EOD;
                $records_cartera = CN_TABLE::executeSQL($sql);
                if (count($records_cartera) > 0) {
                    $reg_no_aplica_cartera = 1;
                    $id_novedad_contrato_firm = $records_cartera[0]['id_novedad_contrato'];
                    $fecha_legalizacion_firm = $records_cartera[0]['fecha_legalizacion'];
                    $valor_no_ejecutado_firm = $records_cartera[0]['valor_no_ejecutado'];
                    $valor_no_reconocido_firm = $records_cartera[0]['valor_no_reconocido'];
                    $valor_no_ejecutado_req = $request['valor_no_ejecutado'];
                    $valor_no_reconocido_req = $request['valor_no_reconocido'];

                    /**
                     * Borrar calculo por novedad - 20190403
                     */
                    $sql = <<<EOD
delete from caco_calculo_interes_banco where id_novedad_contrato = $id_novedad_contrato_firm 
EOD;
                    CN_TABLE::executeSQL($sql);

                    /**
                     * Registra valorse de calculo banc segun novedad anterior - 20190813
                     */
                    $sql = <<<EOD
insert into caco_calculo_interes_banco(
ID_NOVEDAD_CONTRATO,
ID_CONTRATO,
VIGENCIA_MES,
FECHA_INI,
FECHA_FIN,
ID_ANHOS,
ID_MESES,
DIAS,
TASA_ANU,
TASA_MEN,
VALOR_CAPITAL,
VALOR_INTERES
)

select
$id_novedad_contrato_firm as ID_NOVEDAD_CONTRATO,
ID_CONTRATO,
VIGENCIA_MES,
FECHA_INI,
FECHA_FIN,
ID_ANHOS,
ID_MESES,
DIAS,
TASA_ANU,
TASA_MEN,
VALOR_CAPITAL,
VALOR_INTERES
FROM caco_calculo_interes_banco
where
id_novedad_contrato = $id_novedad_contrato_firm
and id_contrato = $id_contrato  
EOD;
                    CN_TABLE::executeSQL($sql);

                    /**
                     * Se verifica validaciones nuevas para recalcular int banc - 20210301::LAVILA
                     */
                    $logger->info("Calculo de intereses valor_no_ejecutado_req::" . $valor_no_ejecutado_req);
                    $logger->info("Calculo de intereses valor_no_ejecutado_firm::" . $valor_no_ejecutado_firm);
                    $logger->info("Calculo de intereses valor_no_reconocido_req::" . $valor_no_reconocido_req);
                    $logger->info("Calculo de intereses valor_no_reconocido_firm::" . $valor_no_reconocido_firm);
                    if (isset($request['fecha_legalizacion']) && $fecha_legalizacion_firm != $request['fecha_legalizacion']) {
                        $tag_aplica_inter_banc = true;
                    } else if ($valor_no_ejecutado_req != $valor_no_ejecutado_firm || $valor_no_reconocido_req != $valor_no_reconocido_firm) {
                        $tag_aplica_inter_banc = true;
                    }
                } else {
                    $reg_no_aplica_cartera = 0;
                }

                if ($aplica_cartera == 1 && isset($request['fecha_legalizacion']) && $reg_no_aplica_cartera == 0) {
                    $logger->info("Calculo de intereses tag_aplica_inter_banc");
                    $tag_aplica_inter_banc = true;
                }

                /**
                 * Calculo de intereses Bancarios - 20190313
                 * $tag_aplica_inter_banc, Si aplica para calculo banc al registrar los moratorios(tipo acta legalizacion) - 20190426
                 */
                if ($aplica_cartera == 0 || $tag_aplica_inter_banc) {
                    $logger->info("Calculo de intereses Bancarios");

                    /*
                     * Verifica valores de calculo
                     * Pendiente fecha reintegro primero
                     * Si aplica calculo de intereses banco - 20190404
                     * Se toma el reintegro de la ultima novedad firmada y con relacion activa(novdeb.estado = 1) - 20190415
                     */
                    $sql = <<<EOD
select 
extract(month from tab1.fecha_caculo_int_banc) || extract(year from tab1.fecha_caculo_int_banc)  as mes_ini_int_banc,   
to_char(tab1.fecha_caculo_int_banc,'yyyy-mm-dd') as fecha_caculo_int_banc,
to_char(cred.fecha_novedad,'yyyy-mm-dd') as fecha_reintegro,
nvl(cred.valor_reintegro,0) as valor_reintegro 
                            
from caco_contrato tab1

left join(

    select
    id_contrato,
    min(fecha_novedad) as fecha_novedad,
    sum(valor_reintegro) as valor_reintegro,
    sum(valor_excedente) as valor_excedente
    
    FROM caco_novedad_reintegro
    
    where
    id_contrato = $id_contrato 
    and tipo_valor in ( 'RE' )
    
    group by
    id_contrato

)cred
on cred.id_contrato = tab1.id_contrato
                            
where tab1.id_contrato = $id_contrato 
and tab1.aplica_interes_banco = 1 
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {

                        $request['reintegros_efectuados'] = $valor_reintegro = $records[0]['valor_reintegro'];

                        $mes_ini_int_banc = $records[0]['mes_ini_int_banc'];
                        $fecha_ini = $records[0]['fecha_caculo_int_banc'];
                        $fecha_fin = CN_TABLE::fechaSistema();
                        $valor_capital = $request['valor_no_ejecutado'];
                        $tag_ini = 0;
                        $tag_fin = 0;

                        /**
                         * Validaciones de fecha reintegro, legalizacion y actual - 20190319
                         */
                        if (isset($request['fecha_legalizacion'])) {
                            $logger->info("Entro a Validaciones de fecha reintegro, legalizacion y actual");
                            $datetime1 = new DateTime($request['fecha_legalizacion']);
                            $datetime2 = new DateTime($fecha_fin);
                            if ($datetime1 < $datetime2) {
                                $fecha_fin = $request['fecha_legalizacion'];
                                $tag_fin = 1;
                            }
                        }

                        /**
                         * Validacion para fecha de credito-reintegro - 20190319
                         */
//                        if (!is_null($records[0]['fecha_reintegro'])) {
//                            $logger->info("Entro a Validacion para fecha de credito-reintegro");
//                            $datetime1 = new DateTime($records[0]['fecha_reintegro']);
//                            $datetime2 = new DateTime($fecha_fin);
//                            if ($datetime1 < $datetime2) {
//                                $fecha_fin = $records[0]['fecha_reintegro'];
//                                $tag_fin = 1;
//                            }
//                        }

                        if ($tag_fin == 1) {
                            /**
                             * Restar dia si no es la actual - 20190319
                             * to_char(to_date('$fecha_fin', 'yyyy-mm-dd')-1, 'yyyy-mm-dd') as fecha_fin
                             * Se cambia hasta el dia de leg., no se pierda dias - 20200930
                             * Se resta dias si aplica_dia_ant - 20201126
                             */
                            $dia_ant = 0;
                            if (isset($request['aplica_dia_ant']) && $request['aplica_dia_ant'] == '1') {
                                $dia_ant = 1;
                            }

                            $logger->info("Entro a Restar dia si no es la actual");
                            $sql = <<<EOD
select 
to_char(to_date('$fecha_fin', 'yyyy-mm-dd')-$dia_ant, 'yyyy-mm-dd') as fecha_fin
from dual 
EOD;

                            //ejecuta y obtiene el resultado del sql
                            $records = CN_TABLE::executeSQL($sql, true);
                            $fecha_fin = $records[0]['fecha_fin'];
                        }


                        /*
                         * Calculo mensual para meses de 30 - 20210301
                         * 0-Cuando NO se marque el campo el sistema deberá liquidar los intereses con la fecha de legalización registrada.
                         * 1-Cuando se marque el campo el sistema deberá liquidar los intereses un día antes de la fecha de legalización registrada.
                         * 2-Calcula el mes de 30 dias, calculo mensual.
                         */
                        $aplica_dia_ant = 0;
                        if (isset($request['aplica_dia_ant'])) {
                            $aplica_dia_ant = $request['aplica_dia_ant'];
                        }

                        $datetime1 = new DateTime($fecha_ini);
                        $datetime2 = new DateTime($fecha_fin);
                        ///Validar fecha ini y fin
                        if ($datetime1 < $datetime2) {
                            $logger->info("Llamado a calculoInteresBancario");

                            /**
                             * Reintegro por novedad - 20200311
                             */
                            $sql = <<<EOD
SELECT
to_char(fecha_novedad,'yyyy-mm-dd') as fecha_novedad,
to_char(fecha_novedad-1,'yyyy-mm-dd') as fecha_novedad_ant,
valor_reintegro,
valor_excedente    
FROM caco_novedad_reintegro
where
id_contrato = $id_contrato 
and tipo_valor = 'RE'
order by
fecha_novedad,
id_novedad_reintegro 
EOD;
                            $records = CN_TABLE::executeSQL($sql);
                            if (count($records) > 0) {
                                $logger->info("Con reintegro por novedad");

                                $fecha_ini_nov = $fecha_ini;
                                $fecha_fin_nov = $fecha_fin;
                                $valor_capital_nov = $valor_capital;

                                //Recorre cada novedad y hace llamado por cada rango de fecha segun novedad reintegro - 20200311
                                foreach ($records as $value) {

                                    $fecha_novedad = $value['fecha_novedad'];
                                    $fecha_novedad_ant = $value['fecha_novedad_ant'];
                                    $valor_reintegro = $value['valor_reintegro'] - $value['valor_excedente'];

                                    $datetime1 = new DateTime($fecha_novedad);
                                    $datetime2 = new DateTime($fecha_fin);
                                    //Validar fecha ini y fin
                                    if ($datetime1 < $datetime2) {
                                        $fecha_fin_nov = $fecha_novedad_ant;
                                    }

                                    $logger->info("Llamar calculoInteresBancario fecha::" . $fecha_novedad);
                                    $logger->info("Llamar calculoInteresBancario valor::" . $valor_reintegro);
                                    $logger->info("Llamar calculoInteresBancario valor capital::" . $valor_capital_nov);

                                    $datetime1nov = new DateTime($fecha_ini_nov);
                                    $datetime2nov = new DateTime($fecha_fin_nov);
                                    //Validar saldo mayor que 0 y las fechas aplican
                                    if ($valor_capital_nov > 0 && $datetime1nov <= $datetime2nov) {

                                        $logger->info($datetime1nov->format('nY') . "::Verificar fecha ini y primer reintegro::" . $mes_ini_int_banc);
                                        if ($datetime1nov->format('nY') != "$mes_ini_int_banc") {
                                            //$tag_ini = 1;//Se omite para que siempre el primer mes sea dias completos del mes - 20210907::LAVILA
                                        }

                                        $valor_interes_banco += $this->calculoInteresBancario($fecha_ini_nov, $fecha_fin_nov, $valor_capital_nov, $tag_ini, 1, $id_novedad_contrato, $id_contrato, 0);
                                    }

                                    //nuevo valor a capital
                                    $valor_capital_nov = $valor_capital_nov - $valor_reintegro;
                                    //Validar que el reintegro es antes a la fecha inicial del contrato - 20210908::LAVILA                                    
                                    $datetime1novval = new DateTime($fecha_ini);
                                    $datetime2novval = new DateTime($fecha_novedad);
                                    if($datetime1novval <= $datetime2novval){
                                        $fecha_ini_nov = $fecha_novedad;
                                    }
                                }

                                $logger->info("Llamar calculoInteresBancario fecha_ini::" . $fecha_ini_nov);
                                $logger->info("Llamar calculoInteresBancario fecha_fin::" . $fecha_fin);
                                $logger->info("Llamar calculoInteresBancario valor capital::" . $valor_capital_nov);

                                //Validar saldo mayor que 0
                                if ($valor_capital_nov > 0) {

                                    $datetime1novmes = new DateTime($fecha_ini_nov);
                                    $logger->info($datetime1novmes->format('nY') . "::Verificar fecha ini y primer reintegro, para ulitmo llamado::" . $mes_ini_int_banc);
                                    if ($datetime1novmes->format('nY') != "$mes_ini_int_banc") {
                                        //$tag_ini = 1;//Se omite para que siempre el primer mes sea dias completos del mes - 20210907::LAVILA
                                    }

                                    $valor_interes_banco += $this->calculoInteresBancario($fecha_ini_nov, $fecha_fin, $valor_capital_nov, $tag_ini, $tag_fin, $id_novedad_contrato, $id_contrato, $aplica_dia_ant);
                                }
                            } else {
                                $logger->info("Sin reintegro por novedad");
                                $valor_interes_banco += $this->calculoInteresBancario($fecha_ini, $fecha_fin, $valor_capital, $tag_ini, $tag_fin, $id_novedad_contrato, $id_contrato, $aplica_dia_ant);
                            }
                            $logger->info("Respuesta de calculoInteresBancario: " . $valor_interes_banco);
                        } else {
                            $logger->info("NO se hace Llamado a calculoInteresBancario");
                            $logger->info("Fecha ini::" . $fecha_ini);
                            $logger->info("Fecha fin::" . $fecha_fin);
                        }
                        if ($valor_interes_banco > 0) {
                            $request['valor_intereses_banco'] = $valor_interes_banco;
                        }
                    } else {
                        $request['valor_intereses_banco'] = null;
                    }
                }

                /**
                 * Calculo de intereses Moratorios - 20190319
                 * =SI((Fecha legalizacion Hasta+Dias de Legalizacion)<(Fecha de Legalizacion-1);
                  Saldo a Reintegrar*((Fecha de Legalizacion -1)-(Fecha legalizacion Hasta+Dias de Legalizacion))*((6%*2)/360);0) - Hasta 31/10/2018
                 * =SI((Fecha de Legalizacion+1)<(Fecha si Reintegro);
                  Saldo a Reintegrar*((Fecha Reint-1)-(Fecha de Legalizacion+1))*((6%*1,5)/360);0)
                 */
                if ($aplica_cartera == 1 && isset($request['fecha_legalizacion'])) {
                    $logger->info("Calculo de intereses Moratorios");

                    $fecha_legalizacion = $request['fecha_legalizacion'];
                    $dias_leg = $request['dias_leg'];

                    $fecha_legalizacion_real = CN_TABLE::fechaSistema();
                    if (isset($request['fecha_legalizacion_real'])) {
                        $fecha_legalizacion_real = $request['fecha_legalizacion_real'];
                    }

                    /**
                     * Verifica valores de calculo, valor_reintegro un dia antes
                     * Si aplica calculo de intereses mora - 20190404
                     * Se toma el reintegro de la ultima novedad firmada y con relacion activa(novdeb.estado = 1) - 20190415
                     * A la fecha de legalizacion no se le suman los dias en int - 20190531
                     * Se valida que el valor_reintegro_resta solo tome  los valores antes del inicio de calculo - 20211011::LAVILA
                     */
                    $sql = <<<EOD
select 
to_char(to_date('$fecha_legalizacion','yyyy-mm-dd'),'yyyy-mm-dd') as fecha_legalizacion,
to_char(tab1.fecha_caculo_int_banc,'yyyy-mm-dd') as fecha_caculo_int_banc,
to_char(cred.fecha_novedad,'yyyy-mm-dd') as fecha_reintegro,
to_char(cred.fecha_novedad-1,'yyyy-mm-dd') as fecha_reintegro_ant,
nvl(cred.valor_reintegro,0) as valor_reintegro,
nvl(cred.valor_reintegro_resta,0) as valor_reintegro_resta 
                            
from caco_contrato tab1

left join(

    select
    id_contrato,
    min(fecha_novedad) as fecha_novedad,
    sum(valor_reintegro) as valor_reintegro,
    sum(valor_excedente) as valor_excedente,
    
    sum( case when fecha_novedad <= to_date('$fecha_legalizacion_real','yyyy-mm-dd') 
        then valor_reintegro else 0 end ) as valor_reintegro_resta
    
    FROM caco_novedad_reintegro
    
    where
    id_contrato = $id_contrato 
    and tipo_valor in ( 'RE' , 'RC')
    
    group by
    id_contrato

)cred
on cred.id_contrato = tab1.id_contrato
                            
where tab1.id_contrato = $id_contrato 
and tab1.aplica_interes_mora = 1 
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {

                        $request['reintegros_efectuados'] = $valor_reintegro = $records[0]['valor_reintegro'];
                        $valor_reintegro_resta = $records[0]['valor_reintegro_resta'];

                        $fecha_ini = $records[0]['fecha_legalizacion'];
                        //$fecha_fin = $records[0]['fecha_legalizacion'];
                        $fecha_fin = CN_TABLE::fechaSistema();

                        $valor_capital = $request['valor_no_ejecutado'] + $request['valor_no_reconocido'];
                        $valor_capital = $valor_capital_validar = $valor_capital - $valor_reintegro_resta;

                        /**
                         * Validacion para fecha de credito-reintegro - 20190319
                         */
//                        if (!is_null($records[0]['fecha_reintegro'])) {
//                            $logger->info("Entro a Validacion para fecha de credito-reintegro");
//                            $fecha_fin = $records[0]['fecha_reintegro'];
//                        }

                        /**
                         * Validacion para fecha de corte interes mora - 20190524
                         */
                        if (isset($request['fecha_legalizacion_limite'])) {
                            $logger->info("Entro a Validacion para fecha de corte interes mora");
                            $fecha_fin = $request['fecha_legalizacion_limite'];
                        }
                        $request['fecha_legalizacion_limite'] = $fecha_fin;

                        //Validar valor a capital
                        if ($valor_capital_validar > 0) {
                            $datetime1 = new DateTime($fecha_ini);
                            $datetime2 = new DateTime($fecha_fin);
                            //Validar fecha ini y fin
                            if ($datetime1 < $datetime2) {
                                $fecha_ini = $fecha_legalizacion;

                                /**
                                 * For para Reintegro por novedad - 20200311
                                 */
                                $sql = <<<EOD
SELECT
id_contrato,
to_char(fecha_novedad,'yyyy-mm-dd') as fecha_novedad,
to_char(fecha_novedad-1,'yyyy-mm-dd') as fecha_novedad_ant,

sum(valor_reintegro) as valor_reintegro,
sum(valor_excedente) as  valor_excedente

FROM caco_novedad_reintegro

where
id_contrato = $id_contrato 
and tipo_valor in ( 'RE' , 'RC')
and fecha_novedad BETWEEN to_date('$fecha_ini','yyyy-mm-dd')  and to_date('$fecha_fin','yyyy-mm-dd')                                     

group by
id_contrato,
fecha_novedad
                                        
order by
id_contrato,
fecha_novedad 
EOD;
                                $records = CN_TABLE::executeSQL($sql);
                                if (count($records) > 0) {
                                    $logger->info("Con reintegro por novedad");
                                    $tag_ini = 1;

                                    $fecha_ini_nov = $fecha_ini;
                                    $fecha_fin_nov = $fecha_fin;
                                    $valor_capital_nov = $valor_capital;

                                    //Recorre cada novedad y hace llamado por cada rango de fecha segun novedad reintegro - 20200311
                                    foreach ($records as $value) {

                                        $fecha_novedad = $value['fecha_novedad'];
                                        $fecha_novedad_ant = $value['fecha_novedad_ant'];
                                        $valor_reintegro = $value['valor_reintegro'] - $value['valor_excedente'];

                                        $datetime1 = new DateTime($fecha_novedad);
                                        $datetime2 = new DateTime($fecha_fin);
                                        //Validar fecha ini y fin
                                        if ($datetime1 < $datetime2) {
                                            $fecha_fin_nov = $fecha_novedad_ant;
                                        }

                                        $logger->info("Llamar calculoInteresMoratorio fecha::" . $fecha_novedad);
                                        $logger->info("Llamar calculoInteresMoratorio valor::" . $valor_reintegro);
                                        $logger->info("Llamar calculoInteresMoratorio valor capital::" . $valor_capital_nov);

                                        $datetime1nov = new DateTime($fecha_ini_nov);
                                        $datetime2nov = new DateTime($fecha_fin_nov);
                                        //Validar saldo mayor que 0 y las fechas aplican
                                        if ($valor_capital_nov > 0 && $datetime1nov <= $datetime2nov) {
                                            $valor_interes_mora += $this->calculoInteresMoratorio($fecha_ini_nov, $fecha_fin_nov, $valor_capital_nov, $dias_leg, $id_novedad_contrato, $id_contrato, $tag_ini);
                                            $dias_leg = 0;
                                        }

                                        //nuevo valor a capital
                                        $valor_capital_nov = $valor_capital_nov - $valor_reintegro;
                                        $fecha_ini_nov = $fecha_novedad;
                                        $tag_ini = 0;
                                    }

                                    $logger->info("Llamar calculoInteresMoratorio fecha_ini::" . $fecha_ini_nov);
                                    $logger->info("Llamar calculoInteresMoratorio fecha_fin::" . $fecha_fin);
                                    $logger->info("Llamar calculoInteresMoratorio valor capital::" . $valor_capital_nov);

                                    //Validar saldo mayor que 0
                                    if ($valor_capital_nov > 0) {
                                        $logger->info("Llamado a calculoInteresMoratorio");
                                        $valor_interes_mora += $this->calculoInteresMoratorio($fecha_ini_nov, $fecha_fin, $valor_capital_nov, $dias_leg, $id_novedad_contrato, $id_contrato, $tag_ini);
                                        $logger->info("Respuesta de calculoInteresMoratorio: " . $valor_interes_mora);
                                    }
                                } else {
                                    $logger->info("Sin reintegro por novedad");

                                    $logger->info("Llamado a calculoInteresMoratorio");
                                    $valor_interes_mora += $this->calculoInteresMoratorio($fecha_ini, $fecha_fin, $valor_capital, $dias_leg, $id_novedad_contrato, $id_contrato, 1);
                                    $logger->info("Respuesta de calculoInteresMoratorio: " . $valor_interes_mora);
                                }
                            }
                            if ($valor_interes_mora > 0) {
                                $request['valor_intereses_mora'] = $valor_interes_mora;
                            }
                        }
                    } else {
                        $request['valor_intereses_mora'] = null;
                    }
                }



                /**
                 * Calculo de indexacion - 20191021
                 * 
                 * Para indexar se aplica la siguiente fórmula:

                  VR = VH x (IPC actual/IPC inicial)

                  VR: corresponde al valor a reintegrar.
                  VH: Recursos no ejecutados.
                  IPC: Índice de Precios al Consumidor.
                 */
                if (isset($request['fecha_inicial_indexacion']) && isset($request['fecha_final_indexacion']) && $request['fecha_inicial_indexacion'] != null && $request['fecha_final_indexacion'] != null) {
                    $logger->info("Calculo de indexacion");
                    $dias_leg = $request['dias_leg'];

                    /**
                     * Verifica valores de calculo
                     */
                    $sql = <<<EOD
select 
tab1.*
                            
from caco_contrato tab1

left join(

    select
    id_contrato,
    min(fecha_novedad) as fecha_novedad,
    sum(valor_reintegro) as valor_reintegro,
    sum(valor_excedente) as valor_excedente
    
    FROM caco_novedad_reintegro
    
    where
    id_contrato = $id_contrato 
    and tipo_valor in ( 'RE' )
    
    group by
    id_contrato

)cred
on cred.id_contrato = tab1.id_contrato
                            
where tab1.id_contrato = $id_contrato 
and tab1.aplica_indexacion = 1 
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {

                        $fecha_ini = $request['fecha_inicial_indexacion'];
                        $fecha_fin = $request['fecha_final_indexacion'];

                        $valor_capital = $request['valor_no_ejecutado'];
                        $valor_capital_validar = $valor_capital;


                        //Validar valor a capital
                        if ($valor_capital_validar > 0) {
                            $datetime1 = new DateTime($fecha_ini);
                            $datetime2 = new DateTime($fecha_fin);
                            //Validar fecha ini y fin
                            if ($datetime1 < $datetime2) {
                                $logger->info("Llamado a calculoIndexacion");
                                $valor_interes_mora = $this->calculoIndexacion($fecha_ini, $fecha_fin, $valor_capital, $id_novedad_contrato, $id_contrato);
                                $logger->info("Respuesta de calculoIndexacion: " . $valor_interes_mora);
                            }
                            if ($valor_interes_mora > 0) {
                                $request['indexacion'] = $valor_interes_mora;
                            }
                        }
                    } else {
                        $request['indexacion'] = null;
                    }
                }
            }
        }

        //accion update
        if ($Action == "UPDATE") {

            /**
             * Calculo de intereses - 20190313
             */
            $id_novedad_contrato = $request['id_novedad_contrato'];
            $id_tipo_nov_cont = $request['id_tipo_nov_cont'];
            $id_contrato = $request['id_contrato'];

            /*
             * Borrar relacion de cont_reintegro - 20200311
             */
            $sql = <<<EOD
delete from caco_nov_cont_reint 
where id_novedad_contrato = $id_novedad_contrato 
EOD;
            CN_TABLE::executeSQL($sql);

            //Verifica consecutivo maximo
            $sql = <<<EOD
select * from caco_tipo_nov_cont 
    where id_tipo_nov_cont = $id_tipo_nov_cont
EOD;
            $records = CN_TABLE::executeSQL($sql);

            //validar el tipo de novedad contrato
            if (count($records) > 0) {
                $aplica_cartera = $records[0]['aplica_cartera'];

                $tag_aplica_inter_banc = false;
                /*
                 * Si es moratorio y no tiene registros firmados que no apliquen cartera - 20190426
                 * Verifica que si tenga registros en caco_calculo_interes_banco - 20200930
                 */
                $sql = <<<EOD
SELECT
nov.*

FROM caco_novedad_contrato nov

left join caco_tipo_nov_cont tipnov
on tipnov.id_tipo_nov_cont = nov.id_tipo_nov_cont

where
nov.id_contrato = $id_contrato 
and nov.firmado = 1
and tipnov.id_tipo_nov_cont in (SELECT
    caco_tipo_nov_cont.id_tipo_nov_cont
    FROM caco_tipo_nov_cont where caco_tipo_nov_cont.aplica_cartera = 0) 
    
and nov.id_contrato in (select distinct id_contrato from caco_calculo_interes_banco )
    
order by
nov.fecha_log desc 
EOD;
                $records_cartera = CN_TABLE::executeSQL($sql);
                if (count($records_cartera) > 0) {
                    $reg_no_aplica_cartera = 1;
                    $id_novedad_contrato_firm = $records_cartera[0]['id_novedad_contrato'];
                    $fecha_legalizacion_firm = $records_cartera[0]['fecha_legalizacion'];
                    $valor_no_ejecutado_firm = $records_cartera[0]['valor_no_ejecutado'];
                    $valor_no_reconocido_firm = $records_cartera[0]['valor_no_reconocido'];
                    $valor_no_ejecutado_req = $request['valor_no_ejecutado'];
                    $valor_no_reconocido_req = $request['valor_no_reconocido'];

                    /**
                     * Borrar calculo por novedad - 20190403
                     */
                    $sql = <<<EOD
delete from caco_calculo_interes_banco where id_novedad_contrato = $id_novedad_contrato 
EOD;
                    CN_TABLE::executeSQL($sql);

                    /**
                     * Registra valorse de calculo banc segun novedad anterior - 20190813
                     */
                    $sql = <<<EOD
insert into caco_calculo_interes_banco(
ID_NOVEDAD_CONTRATO,
ID_CONTRATO,
VIGENCIA_MES,
FECHA_INI,
FECHA_FIN,
ID_ANHOS,
ID_MESES,
DIAS,
TASA_ANU,
TASA_MEN,
VALOR_CAPITAL,
VALOR_INTERES
)

select
$id_novedad_contrato as ID_NOVEDAD_CONTRATO,
ID_CONTRATO,
VIGENCIA_MES,
FECHA_INI,
FECHA_FIN,
ID_ANHOS,
ID_MESES,
DIAS,
TASA_ANU,
TASA_MEN,
VALOR_CAPITAL,
VALOR_INTERES
FROM caco_calculo_interes_banco
where
id_novedad_contrato = $id_novedad_contrato_firm
and id_contrato = $id_contrato  
EOD;
                    CN_TABLE::executeSQL($sql);

                    /**
                     * Se verifica validaciones nuevas para recalcular int banc - 20210301::LAVILA
                     */
                    $logger->info("Calculo de intereses valor_no_ejecutado_req::" . $valor_no_ejecutado_req);
                    $logger->info("Calculo de intereses valor_no_ejecutado_firm::" . $valor_no_ejecutado_firm);
                    $logger->info("Calculo de intereses valor_no_reconocido_req::" . $valor_no_reconocido_req);
                    $logger->info("Calculo de intereses valor_no_reconocido_firm::" . $valor_no_reconocido_firm);
                    if (isset($request['fecha_legalizacion']) && $fecha_legalizacion_firm != $request['fecha_legalizacion']) {
                        $tag_aplica_inter_banc = true;
                    } else if ($valor_no_ejecutado_req != $valor_no_ejecutado_firm || $valor_no_reconocido_req != $valor_no_reconocido_firm) {
                        $tag_aplica_inter_banc = true;
                    }
                } else {
                    $reg_no_aplica_cartera = 0;
                }

                if ($aplica_cartera == 1 && isset($request['fecha_legalizacion']) && $reg_no_aplica_cartera == 0) {
                    $logger->info("Calculo de intereses tag_aplica_inter_banc");
                    $tag_aplica_inter_banc = true;
                }

                /**
                 * Calculo de intereses Bancarios - 20190313
                 * $tag_aplica_inter_banc, Si aplica para calculo banc al registrar los moratorios(tipo acta legalizacion) - 20190426
                 */
                if ($aplica_cartera == 0 || $tag_aplica_inter_banc) {
                    $logger->info("Calculo de intereses Bancarios");

                    /**
                     * Borrar calculo por novedad - 20190403
                     */
                    $sql = <<<EOD
delete from caco_calculo_interes_banco where id_novedad_contrato = $id_novedad_contrato 
EOD;
                    CN_TABLE::executeSQL($sql);

                    /*
                     * Verifica valores de calculo
                     * Pendiente fecha reintegro primero
                     * Si aplica calculo de intereses banco - 20190404
                     * Se toma el reintegro de la ultima novedad firmada y con relacion activa(novdeb.estado = 1) - 20190415
                     */
                    $sql = <<<EOD
select 
extract(month from tab1.fecha_caculo_int_banc) || extract(year from tab1.fecha_caculo_int_banc)  as mes_ini_int_banc,   
to_char(tab1.fecha_caculo_int_banc,'yyyy-mm-dd') as fecha_caculo_int_banc,
to_char(cred.fecha_novedad,'yyyy-mm-dd') as fecha_reintegro,
nvl(cred.valor_reintegro,0) as valor_reintegro 
                            
from caco_contrato tab1

left join(

    select
    id_contrato,
    min(fecha_novedad) as fecha_novedad,
    sum(valor_reintegro) as valor_reintegro,
    sum(valor_excedente) as valor_excedente
    
    FROM caco_novedad_reintegro
    
    where
    id_contrato = $id_contrato 
    and tipo_valor in ( 'RE' )
    
    group by
    id_contrato

)cred
on cred.id_contrato = tab1.id_contrato
                            
where tab1.id_contrato = $id_contrato 
and tab1.aplica_interes_banco = 1 
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {

                        $request['reintegros_efectuados'] = $valor_reintegro = $records[0]['valor_reintegro'];

                        $mes_ini_int_banc = $records[0]['mes_ini_int_banc'];
                        $fecha_ini = $records[0]['fecha_caculo_int_banc'];
                        $fecha_fin = CN_TABLE::fechaSistema();
                        $valor_capital = $request['valor_no_ejecutado'];
                        $tag_ini = 0;
                        $tag_fin = 0;

                        /**
                         * Validaciones de fecha reintegro, legalizacion y actual - 20190319
                         */
                        if (isset($request['fecha_legalizacion'])) {
                            $logger->info("Entro a Validaciones de fecha reintegro, legalizacion y actual");
                            $datetime1 = new DateTime($request['fecha_legalizacion']);
                            $datetime2 = new DateTime($fecha_fin);
                            if ($datetime1 < $datetime2) {
                                $fecha_fin = $request['fecha_legalizacion'];
                                $tag_fin = 1;
                            }
                        }

                        /**
                         * Validacion para fecha de credito-reintegro - 20190319
                         * Se toma de las nuevas novedades de reintegro del contrato y no de cartera - 20200311
                         */
//                        if (!is_null($records[0]['fecha_reintegro'])) {
//                            $logger->info("Entro a Validacion para fecha de credito-reintegro");
//                            $datetime1 = new DateTime($records[0]['fecha_reintegro']);
//                            $datetime2 = new DateTime($fecha_fin);
//                            if ($datetime1 < $datetime2) {
//                                $fecha_fin = $records[0]['fecha_reintegro'];
//                                $tag_fin = 1;
//                            }
//                        }

                        if ($tag_fin == 1) {
                            /**
                             * Restar dia si no es la actual - 20190319
                             * to_char(to_date('$fecha_fin', 'yyyy-mm-dd')-1, 'yyyy-mm-dd') as fecha_fin
                             * Se cambia hasta el dia de leg., no se pierda dias - 20200930
                             * Se resta dias si aplica_dia_ant - 20201126
                             */
                            $dia_ant = 0;
                            if (isset($request['aplica_dia_ant']) && $request['aplica_dia_ant'] == '1') {
                                $dia_ant = 1;
                            }

                            $logger->info("Entro a Restar dia si no es la actual");
                            $sql = <<<EOD
select 
to_char(to_date('$fecha_fin', 'yyyy-mm-dd')-$dia_ant, 'yyyy-mm-dd') as fecha_fin
from dual 
EOD;

                            //ejecuta y obtiene el resultado del sql
                            $records = CN_TABLE::executeSQL($sql, true);
                            $fecha_fin = $records[0]['fecha_fin'];
                        }


                        /*
                         * Calculo mensual para meses de 30 - 20210301
                         * 0-Cuando NO se marque el campo el sistema deberá liquidar los intereses con la fecha de legalización registrada.
                         * 1-Cuando se marque el campo el sistema deberá liquidar los intereses un día antes de la fecha de legalización registrada.
                         * 2-Calcula el mes de 30 dias, calculo mensual.
                         */
                        $aplica_dia_ant = 0;
                        if (isset($request['aplica_dia_ant'])) {
                            $aplica_dia_ant = $request['aplica_dia_ant'];
                        }

                        $datetime1 = new DateTime($fecha_ini);
                        $datetime2 = new DateTime($fecha_fin);
                        //Validar fecha ini y fin
                        if ($datetime1 < $datetime2) {
                            $logger->info("Llamado a calculoInteresBancario");

                            /**
                             * Reintegro por novedad - 20200311
                             */
                            $sql = <<<EOD
SELECT
to_char(fecha_novedad,'yyyy-mm-dd') as fecha_novedad,
to_char(fecha_novedad-1,'yyyy-mm-dd') as fecha_novedad_ant,
valor_reintegro,
valor_excedente    
FROM caco_novedad_reintegro
where
id_contrato = $id_contrato 
and tipo_valor = 'RE'
order by
fecha_novedad,
id_novedad_reintegro 
EOD;
                            $records = CN_TABLE::executeSQL($sql);
                            if (count($records) > 0) {
                                $logger->info("Con reintegro por novedad");

                                $fecha_ini_nov = $fecha_ini;
                                $fecha_fin_nov = $fecha_fin;
                                $valor_capital_nov = $valor_capital;

                                //Recorre cada novedad y hace llamado por cada rango de fecha segun novedad reintegro - 20200311
                                foreach ($records as $value) {

                                    $fecha_novedad = $value['fecha_novedad'];
                                    $fecha_novedad_ant = $value['fecha_novedad_ant'];
                                    $valor_reintegro = $value['valor_reintegro'] - $value['valor_excedente'];

                                    $datetime1 = new DateTime($fecha_novedad);
                                    $datetime2 = new DateTime($fecha_fin);
                                    //Validar fecha ini y fin
                                    if ($datetime1 < $datetime2) {
                                        $fecha_fin_nov = $fecha_novedad_ant;
                                    }

                                    $logger->info("Llamar calculoInteresBancario fecha::" . $fecha_novedad);
                                    $logger->info("Llamar calculoInteresBancario valor::" . $valor_reintegro);
                                    $logger->info("Llamar calculoInteresBancario valor capital::" . $valor_capital_nov);

                                    $datetime1nov = new DateTime($fecha_ini_nov);
                                    $datetime2nov = new DateTime($fecha_fin_nov);
                                    //Validar saldo mayor que 0 y las fechas aplican
                                    if ($valor_capital_nov > 0 && $datetime1nov <= $datetime2nov) {

                                        $logger->info($datetime1nov->format('nY') . "::Verificar fecha ini y primer reintegro::" . $mes_ini_int_banc);
                                        if ($datetime1nov->format('nY') != "$mes_ini_int_banc") {
                                            //$tag_ini = 1;//Se omite para que siempre el primer mes sea dias completos del mes - 20210907::LAVILA
                                        }

                                        $valor_interes_banco += $this->calculoInteresBancario($fecha_ini_nov, $fecha_fin_nov, $valor_capital_nov, $tag_ini, 1, $id_novedad_contrato, $id_contrato, 0);
                                    }

                                    //nuevo valor a capital
                                    $valor_capital_nov = $valor_capital_nov - $valor_reintegro;
                                    //Validar que el reintegro es antes a la fecha inicial del contrato - 20210908::LAVILA                                    
                                    $datetime1novval = new DateTime($fecha_ini);
                                    $datetime2novval = new DateTime($fecha_novedad);
                                    if($datetime1novval <= $datetime2novval){
                                        $fecha_ini_nov = $fecha_novedad;
                                    }
                                }

                                $logger->info("Llamar calculoInteresBancario fecha_ini::" . $fecha_ini_nov);
                                $logger->info("Llamar calculoInteresBancario fecha_fin::" . $fecha_fin);
                                $logger->info("Llamar calculoInteresBancario valor capital::" . $valor_capital_nov);

                                //Validar saldo mayor que 0
                                if ($valor_capital_nov > 0) {

                                    $datetime1novmes = new DateTime($fecha_ini_nov);
                                    $logger->info($datetime1novmes->format('nY') . "::Verificar fecha ini y primer reintegro, para ulitmo llamado::" . $mes_ini_int_banc);
                                    if ($datetime1novmes->format('nY') != "$mes_ini_int_banc") {
                                        //$tag_ini = 1;//Se omite para que siempre el primer mes sea dias completos del mes - 20210907::LAVILA
                                    }

                                    $valor_interes_banco += $this->calculoInteresBancario($fecha_ini_nov, $fecha_fin, $valor_capital_nov, $tag_ini, $tag_fin, $id_novedad_contrato, $id_contrato, $aplica_dia_ant);
                                }
                            } else {
                                $logger->info("Sin reintegro por novedad");
                                $valor_interes_banco += $this->calculoInteresBancario($fecha_ini, $fecha_fin, $valor_capital, $tag_ini, $tag_fin, $id_novedad_contrato, $id_contrato, $aplica_dia_ant);
                            }
                            $logger->info("Respuesta de calculoInteresBancario: " . $valor_interes_banco);
                        } else {
                            $logger->info("NO se hace Llamado a calculoInteresBancario");
                            $logger->info("Fecha ini::" . $fecha_ini);
                            $logger->info("Fecha fin::" . $fecha_fin);
                        }
                        if ($valor_interes_banco > 0) {
                            $request['valor_intereses_banco'] = $valor_interes_banco;
                        }
                    } else {
                        $request['valor_intereses_banco'] = null;
                    }
                }

                /**
                 * Calculo de intereses Moratorios - 20190319
                 * =SI((Fecha legalizacion Hasta+Dias de Legalizacion)<(Fecha de Legalizacion-1);
                  Saldo a Reintegrar*((Fecha de Legalizacion -1)-(Fecha legalizacion Hasta+Dias de Legalizacion))*((6%*2)/360);0) - Hasta 31/10/2018
                 * =SI((Fecha de Legalizacion+1)<(Fecha si Reintegro);
                  Saldo a Reintegrar*((Fecha Reint-1)-(Fecha de Legalizacion+1))*((6%*1,5)/360);0)
                 */
                if ($aplica_cartera == 1 && isset($request['fecha_legalizacion'])) {

                    /**
                     * Borrar calculo por novedad - 20190403
                     */
                    $sql = <<<EOD
delete from caco_calculo_interes_mora where id_novedad_contrato = $id_novedad_contrato 
EOD;
                    CN_TABLE::executeSQL($sql);

                    $logger->info("Calculo de intereses Moratorios");

                    $fecha_legalizacion = $request['fecha_legalizacion'];
                    $dias_leg = $request['dias_leg'];

                    $fecha_legalizacion_real = CN_TABLE::fechaSistema();
                    if (isset($request['fecha_legalizacion_real'])) {
                        $fecha_legalizacion_real = $request['fecha_legalizacion_real'];
                    }

                    /**
                     * Verifica valores de calculo, valor_reintegro un dia antes
                     * Si aplica calculo de intereses mora - 20190404
                     * Se toma el reintegro de la ultima novedad firmada y con relacion activa(novdeb.estado = 1) - 20190415
                     * A la fecha de legalizacion no se le suman los dias en int - 20190531
                     * Se valida que el valor_reintegro_resta solo tome  los valores antes del inicio de calculo - 20211011::LAVILA
                     */
                    $sql = <<<EOD
select 
to_char(to_date('$fecha_legalizacion','yyyy-mm-dd'),'yyyy-mm-dd') as fecha_legalizacion,
to_char(tab1.fecha_caculo_int_banc,'yyyy-mm-dd') as fecha_caculo_int_banc,
to_char(cred.fecha_novedad,'yyyy-mm-dd') as fecha_reintegro,
to_char(cred.fecha_novedad-1,'yyyy-mm-dd') as fecha_reintegro_ant,
nvl(cred.valor_reintegro,0) as valor_reintegro,
nvl(cred.valor_reintegro_resta,0) as valor_reintegro_resta 
                            
from caco_contrato tab1

left join(

    select
    id_contrato,
    min(fecha_novedad) as fecha_novedad,
    sum(valor_reintegro) as valor_reintegro,
    sum(valor_excedente) as valor_excedente,
    
    sum( case when fecha_novedad <= to_date('$fecha_legalizacion_real','yyyy-mm-dd') 
        then valor_reintegro else 0 end ) as valor_reintegro_resta
    
    FROM caco_novedad_reintegro
    
    where
    id_contrato = $id_contrato 
    and tipo_valor in ( 'RE' , 'RC')
    
    group by
    id_contrato

)cred
on cred.id_contrato = tab1.id_contrato
                            
where tab1.id_contrato = $id_contrato 
and tab1.aplica_interes_mora = 1 
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {

                        $request['reintegros_efectuados'] = $valor_reintegro = $records[0]['valor_reintegro'];
                        $valor_reintegro_resta = $records[0]['valor_reintegro_resta'];

                        $fecha_ini = $records[0]['fecha_legalizacion'];
                        //$fecha_fin = $records[0]['fecha_legalizacion'];
                        $fecha_fin = CN_TABLE::fechaSistema();

                        $valor_capital = $request['valor_no_ejecutado'] + $request['valor_no_reconocido'];
                        $valor_capital = $valor_capital_validar = $valor_capital - $valor_reintegro_resta;

                        /**
                         * Validacion para fecha de credito-reintegro - 20190319
                         */
//                        if (!is_null($records[0]['fecha_reintegro'])) {
//                            $logger->info("Entro a Validacion para fecha de credito-reintegro");
//                            $fecha_fin = $records[0]['fecha_reintegro'];
//                        }

                        /**
                         * Validacion para fecha de corte interes mora - 20190524
                         */
                        if (isset($request['fecha_legalizacion_limite'])) {
                            $logger->info("Entro a Validacion para fecha de corte interes mora");
                            $fecha_fin = $request['fecha_legalizacion_limite'];
                        }
                        $request['fecha_legalizacion_limite'] = $fecha_fin;

                        //Validar valor a capital
                        if ($valor_capital_validar > 0) {
                            $datetime1 = new DateTime($fecha_ini);
                            $datetime2 = new DateTime($fecha_fin);
                            //Validar fecha ini y fin
                            if ($datetime1 < $datetime2) {
                                $fecha_ini = $fecha_legalizacion;

                                /**
                                 * For para Reintegro por novedad - 20200311
                                 */
                                $sql = <<<EOD
SELECT
id_contrato,
to_char(fecha_novedad,'yyyy-mm-dd') as fecha_novedad,
to_char(fecha_novedad-1,'yyyy-mm-dd') as fecha_novedad_ant,

sum(valor_reintegro) as valor_reintegro,
sum(valor_excedente) as  valor_excedente

FROM caco_novedad_reintegro

where
id_contrato = $id_contrato 
and tipo_valor in ( 'RE' , 'RC')
and fecha_novedad BETWEEN to_date('$fecha_ini','yyyy-mm-dd')  and to_date('$fecha_fin','yyyy-mm-dd')                                     

group by
id_contrato,
fecha_novedad
                                        
order by
id_contrato,
fecha_novedad 
EOD;
                                $records = CN_TABLE::executeSQL($sql);
                                if (count($records) > 0) {
                                    $logger->info("Con reintegro por novedad");
                                    $tag_ini = 1;

                                    $fecha_ini_nov = $fecha_ini;
                                    $fecha_fin_nov = $fecha_fin;
                                    $valor_capital_nov = $valor_capital;

                                    //Recorre cada novedad y hace llamado por cada rango de fecha segun novedad reintegro - 20200311
                                    foreach ($records as $value) {

                                        $fecha_novedad = $value['fecha_novedad'];
                                        $fecha_novedad_ant = $value['fecha_novedad_ant'];
                                        $valor_reintegro = $value['valor_reintegro'] - $value['valor_excedente'];

                                        $datetime1 = new DateTime($fecha_novedad);
                                        $datetime2 = new DateTime($fecha_fin);
                                        //Validar fecha ini y fin
                                        if ($datetime1 < $datetime2) {
                                            $fecha_fin_nov = $fecha_novedad_ant;
                                        }

                                        $logger->info("Llamar calculoInteresMoratorio fecha::" . $fecha_novedad);
                                        $logger->info("Llamar calculoInteresMoratorio valor::" . $valor_reintegro);
                                        $logger->info("Llamar calculoInteresMoratorio valor capital::" . $valor_capital_nov);

                                        $datetime1nov = new DateTime($fecha_ini_nov);
                                        $datetime2nov = new DateTime($fecha_fin_nov);
                                        //Validar saldo mayor que 0 y las fechas aplican
                                        if ($valor_capital_nov > 0 && $datetime1nov <= $datetime2nov) {
                                            $valor_interes_mora += $this->calculoInteresMoratorio($fecha_ini_nov, $fecha_fin_nov, $valor_capital_nov, $dias_leg, $id_novedad_contrato, $id_contrato, $tag_ini);
                                            $dias_leg = 0;
                                        }

                                        //nuevo valor a capital
                                        $valor_capital_nov = $valor_capital_nov - $valor_reintegro;
                                        $fecha_ini_nov = $fecha_novedad;
                                        $tag_ini = 0;
                                    }

                                    $logger->info("Llamar calculoInteresMoratorio fecha_ini::" . $fecha_ini_nov);
                                    $logger->info("Llamar calculoInteresMoratorio fecha_fin::" . $fecha_fin);
                                    $logger->info("Llamar calculoInteresMoratorio valor capital::" . $valor_capital_nov);

                                    //Validar saldo mayor que 0
                                    if ($valor_capital_nov > 0) {
                                        $logger->info("Llamado a calculoInteresMoratorio");
                                        $valor_interes_mora += $this->calculoInteresMoratorio($fecha_ini_nov, $fecha_fin, $valor_capital_nov, $dias_leg, $id_novedad_contrato, $id_contrato, $tag_ini);
                                        $logger->info("Respuesta de calculoInteresMoratorio: " . $valor_interes_mora);
                                    }
                                } else {
                                    $logger->info("Sin reintegro por novedad");

                                    $logger->info("Llamado a calculoInteresMoratorio");
                                    $valor_interes_mora += $this->calculoInteresMoratorio($fecha_ini, $fecha_fin, $valor_capital, $dias_leg, $id_novedad_contrato, $id_contrato, 1);
                                    $logger->info("Respuesta de calculoInteresMoratorio: " . $valor_interes_mora);
                                }
                            }
                            if ($valor_interes_mora > 0) {
                                $request['valor_intereses_mora'] = $valor_interes_mora;
                            }
                        }
                    } else {
                        $request['valor_intereses_mora'] = null;
                    }
                }


                /**
                 * Calculo de indexacion - 20191021
                 * 
                 * Para indexar se aplica la siguiente fórmula:

                  VR = VH x (IPC actual/IPC inicial)

                  VR: corresponde al valor a reintegrar.
                  VH: Recursos no ejecutados.
                  IPC: Índice de Precios al Consumidor.
                 */
                if (isset($request['fecha_inicial_indexacion']) && isset($request['fecha_final_indexacion']) && $request['fecha_inicial_indexacion'] != null && $request['fecha_final_indexacion'] != null) {

                    /**
                     * Borrar calculo por novedad - 20190403
                     */
                    $sql = <<<EOD
delete from caco_calculo_indexacion where id_novedad_contrato = $id_novedad_contrato 
EOD;
                    CN_TABLE::executeSQL($sql);

                    $logger->info("Calculo de indexacion");
                    $dias_leg = $request['dias_leg'];

                    /**
                     * Verifica valores de calculo
                     */
                    $sql = <<<EOD
select 
tab1.*
                            
from caco_contrato tab1

left join(

    select
    tab0.id_novedad_contrato,
    tab0.id_contrato,
    min(tab0.fecha_cre) as fecha_cre,
    sum(tab0.valor_abono) as valor_abono
    from(
        SELECT
        nov.*,
        debcre.id_credito,
        debcre.sec_credito,
        debcre.fecha_cre,
        nvl(debcre.valor_cre,0) as valor_cre,
        nvl(debcre.valor_abono,0) as valor_abono,
        nvl(debcre.excedente,0) as excedente,
        debcre.observaciones_credet

        FROM caco_novedad_contrato nov

        join caco_novedad_contrato_debito novdeb
        on novdeb.id_contrato = nov.id_contrato

        left join ca_debito_credito debcre
        on debcre.id_debito = novdeb.id_debito

        left join caco_tipo_nov_cont tab2
        on tab2.id_tipo_nov_cont = nov.id_tipo_nov_cont

        where
        nov.firmado = 1
        and nov.id_contrato = $id_contrato
        and novdeb.estado = 1
        and debcre.estado = 1
        and debcre.estado_cre = 1
        and debcre.id_credito is not null
    
    )tab0
    
    group by
    tab0.id_novedad_contrato,
    tab0.id_contrato

)cred
on cred.id_contrato = tab1.id_contrato
                            
where tab1.id_contrato = $id_contrato 
and tab1.aplica_indexacion = 1 
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {

                        $fecha_ini = $request['fecha_inicial_indexacion'];
                        $fecha_fin = $request['fecha_final_indexacion'];

                        $valor_capital = $request['valor_no_ejecutado'];
                        $valor_capital_validar = $valor_capital;


                        //Validar valor a capital
                        if ($valor_capital_validar > 0) {
                            $datetime1 = new DateTime($fecha_ini);
                            $datetime2 = new DateTime($fecha_fin);
                            //Validar fecha ini y fin
                            if ($datetime1 < $datetime2) {
                                $logger->info("Llamado a calculoIndexacion");
                                $valor_interes_mora = $this->calculoIndexacion($fecha_ini, $fecha_fin, $valor_capital, $id_novedad_contrato, $id_contrato);
                                $logger->info("Respuesta de calculoIndexacion: " . $valor_interes_mora);
                            }
                            if ($valor_interes_mora > 0) {
                                $request['indexacion'] = $valor_interes_mora;
                            }
                        }
                    } else {
                        $request['indexacion'] = null;
                    }
                }
            }
        }

        //accion remove
        if ($Action == "REMOVE") {

            $id_novedad_contrato = $request['id_novedad_contrato'];

            /**
             * Borrar calculo banco interes por novedad - 20190628
             */
            $sql = <<<EOD
delete from caco_calculo_interes_banco where id_novedad_contrato = $id_novedad_contrato 
EOD;
            CN_TABLE::executeSQL($sql);


            /**
             * Borrar calculo mora interes por novedad - 20190628
             */
            $sql = <<<EOD
delete from caco_calculo_interes_mora where id_novedad_contrato = $id_novedad_contrato 
EOD;
            CN_TABLE::executeSQL($sql);

            /*
             * Borrar calculo Indexacion - 20191021
             */
            $sql = <<<EOD
delete from caco_calculo_indexacion where id_novedad_contrato = $id_novedad_contrato 
EOD;
            CN_TABLE::executeSQL($sql);

            /*
             * Borrar relacion de cont_reintegro - 20200311
             */
            $sql = <<<EOD
delete from caco_nov_cont_reint 
where id_novedad_contrato = $id_novedad_contrato 
EOD;
            $records = CN_TABLE::executeSQL($sql);
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {

            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            /**
             * Actualizo datos de relacion - 20190227
             */
            try {

                $id_novedad_contrato = $list_data_post[0]['id_novedad_contrato'];
                $id_contrato = $request['id_contrato'];

                //Bancarios
                $sql = <<<EOD
update caco_calculo_interes_banco set id_novedad_contrato = $id_novedad_contrato 
    where id_contrato = $id_contrato and id_novedad_contrato is null 
EOD;
                $this->conn->execute($sql);

                //Moratorios
                $sql = <<<EOD
update caco_calculo_interes_mora set id_novedad_contrato = $id_novedad_contrato 
    where id_contrato = $id_contrato and id_novedad_contrato is null 
EOD;
                $this->conn->execute($sql);

                //Indexacion
                $sql = <<<EOD
update caco_calculo_indexacion set id_novedad_contrato = $id_novedad_contrato 
    where id_contrato = $id_contrato and id_novedad_contrato is null 
EOD;
                $this->conn->execute($sql);

                //Crea relacion con el certificado y los reintegros hasta el momento - 20200311
                $sql = <<<EOD
insert into caco_nov_cont_reint 
select 
$id_novedad_contrato as ID_NOVEDAD_CONTRATO,
id_novedad_reintegro 
from caco_novedad_reintegro 
where
id_contrato = $id_contrato 
EOD;
                $this->conn->execute($sql);

                //COMMIT DE TODAS LAS TRANSACCIONES
                $this->conn->commit();
            } catch (Exception $e) {


                //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                $this->conn->rollback();
            }
        }

        //accion update
        if ($Action == "UPDATE") {

            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            /**
             * Actualizo datos de relacion - 20190227
             */
            try {

                $id_novedad_contrato = $list_data_post[0]['id_novedad_contrato'];
                $id_contrato = $request['id_contrato'];

                //Crea relacion con el certificado y los reintegros hasta el momento - 20200311
                $sql = <<<EOD
insert into caco_nov_cont_reint 
select 
$id_novedad_contrato as ID_NOVEDAD_CONTRATO,
id_novedad_reintegro 
from caco_novedad_reintegro 
where
id_contrato = $id_contrato 
EOD;
                $this->conn->execute($sql);

                //COMMIT DE TODAS LAS TRANSACCIONES
                $this->conn->commit();
            } catch (Exception $e) {

                //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                $this->conn->rollback();
            }
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Calculo por mes de intereses bancarios segun fechas
     * 
     * Calculo segun fechas ini y fin, para el primer mes dias completos, demas meses de 30  - 20201223
     * 
     * aplica_dia_ant - 20210301::LAVILA
      0-Cuando NO se marque el campo el sistema deberá liquidar los intereses con la fecha de legalización registrada.
      1-Cuando se marque el campo el sistema deberá liquidar los intereses un día antes de la fecha de legalización registrada.
      2-Calcula el mes de 30 dias, calculo mensual.
     * 
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $valor_capital
     * @param type $tag_ini - para calculo de fecha ini o tomar mes a 30 dias
     * @param type $tag_fin - para calculo de fecha fin o tomar mes a 30 dias
     */
    public function calculoInteresBancario($fecha_ini, $fecha_fin, $valor_capital, $tag_ini, $tag_fin, $id_novedad_contrato, $id_contrato, $aplica_dia_ant) {

        $this->logMessage("[caco_novedad_contrato] Calculo datos IB. Desde: " . $fecha_ini . ", Hasta: " . $fecha_fin . ", Valor Capital: " . $valor_capital);
        $valor_interes = 0;

        try {

            $sql = <<<EOD
select 
to_date('$fecha_ini', 'yyyy-mm-dd') as fecha_ini,
to_char(to_date('$fecha_ini', 'yyyy-mm-dd'), 'mm') as fecha_ini_mes,
to_char(to_date('$fecha_ini', 'yyyy-mm-dd'), 'yyyy') as fecha_ini_anho,
to_date('$fecha_fin', 'yyyy-mm-dd') as fecha_fin,
to_char(to_date('$fecha_fin', 'yyyy-mm-dd'), 'mm') as fecha_fin_mes,
to_char(to_date('$fecha_fin', 'yyyy-mm-dd'), 'yyyy') as fecha_fin_anho
from dual 
EOD;

            //ejecuta y obtiene el resultado del sql
            $records = CN_TABLE::executeSQL($sql, true);
            $anho_req = $records[0]['fecha_ini_anho'];
            $mes_req = $records[0]['fecha_ini_mes'];
            $comparar_req = $anho_req . str_pad($mes_req, 2, '0', STR_PAD_LEFT);
            $comparar = $records[0]['fecha_fin_anho'] . str_pad($records[0]['fecha_fin_mes'], 2, '0', STR_PAD_LEFT);

            $sql_total = ' ';
            //echo $comparar_req . '-' . $comparar;
            $this->logMessage("[caco_novedad_contrato] Comparar: " . $comparar_req . '-' . $comparar);
            $tag = false;

            //Recorre cada mes y coloca un registro por tasa
            while ($comparar_req <= $comparar) {
                //$this->logMessage("[caco_novedad_contrato] Recorre cada mes y coloca un registro por tasa");

                if ($tag) {
                    $sql_total .= ' union ';
                } else {
                    $tag = true;
                }

                /* Se valida Incidente #9150 - 20190221 */
                $sql = <<<EOD
select 
case when to_char(to_date('$fecha_ini', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_ini', 'yyyy-mm-dd') else to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd') end as fecha_ini,
case when to_char(to_date('$fecha_fin', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_fin', 'yyyy-mm-dd') else last_day(to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd')) end as fecha_fin,                            
$valor_capital as valor_capital,
nvl((select max(tas.id_tasa_intereses_banc) from caco_tasa_intereses_banc tas where tas.id_anhos = $anho_req and tas.id_meses = $mes_req),0) as id_tasa_intereses_banc,                            
$comparar_req as comparar_req  
from dual 
EOD;

                $ref_siguiente = CN_TABLE::fechaSiguiente($anho_req, $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();
                }

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

                $sql_total .= $sql;
            }
            //$this->logMessage("[caco_novedad_contrato] sql_total::" . $sql_total);
            //die();
            //Validar que hay sql para consulta 
            if (strlen($sql_total) > 10) {

                /**
                 * Calcula segun tabla caco_tasa_interes_banc
                 * Para el primer mes se toma dias calendario - 20190329
                 * Se cambia el calculo para que tome en el primer mes los dias con 31 y febrero segun dias - 20190710
                 * Calculo de dias segun mes y año igual ini y fin - 20190813
                 */
                $sql_total_inter = "
select round( sum(nvl(VALOR_INTERES,0)) ) as VALOR_INTERES from(

select

max(int.comparar_req) as comparar_req,
min(int.fecha_ini) as fecha_ini,
max(int.fecha_fin) as fecha_fin,
to_char(int.fecha_fin, 'yyyy') as vigencia,
listagg(to_char(int.fecha_fin, 'mm'), ',') within group (order by mes.id_meses) as mes,
mes.id_meses,
int.valor_capital,
nvl(ti.valor_mensual,0) as tasa_men,
nvl(ti.valor_anual,0) as tasa_anu,
( ( power( (1+(nvl(ti.valor_anual,0)/100)) , (30/360) ) ) - 1 ) * 100 as tasa_dec,
max(int.dias) as dias,
( ( ( int.valor_capital * ( ( power( (1+(nvl(ti.valor_anual,0)/100)) , (30/360) ) ) - 1 ) ) /30) * max(int.dias) ) as valor_interes

from(

    select
    fecha_ini,
    fecha_fin,
    
    --FECHA_RANGO_SIN_TREINTAYUNO(fecha_ini,fecha_fin) as dias,
    case 
    when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 0 and fecha_fin = to_date('$fecha_fin', 'yyyy-mm-dd') then (fecha_fin - fecha_ini) + 1
    when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 0 then ( last_day(fecha_ini) - fecha_ini )+1
    
    when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 1 and fecha_fin  = to_date('$fecha_fin', 'yyyy-mm-dd') then DIAS_RANGO_MES_SIN_TREINTAYUNO(fecha_ini,fecha_fin,extract(month from fecha_ini))  
    when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 1 and fecha_fin != to_date('$fecha_fin', 'yyyy-mm-dd') then 30 - (1 * to_char(fecha_ini, 'dd')) + 1    
    
    when fecha_fin = to_date('$fecha_fin', 'yyyy-mm-dd') and $aplica_dia_ant = 2 then 30
    when fecha_fin = to_date('$fecha_fin', 'yyyy-mm-dd') and $tag_fin = 1 
        then case when (1 * to_char(to_date('$fecha_fin', 'yyyy-mm-dd'), 'dd')) > 30 then 30 else (1 * to_char(to_date('$fecha_fin', 'yyyy-mm-dd'), 'dd')) end  
    else 30 end as dias,
    
    valor_capital,
    id_tasa_intereses_banc,
    comparar_req
    
    from(

        $sql_total
            
    )

)int 

join caco_tasa_intereses_banc ti on int.id_tasa_intereses_banc = ti.id_tasa_intereses_banc
left join meses mes on mes.id_meses = ti.id_meses

group by
to_char(int.fecha_fin, 'yyyy'),
mes.id_meses,
int.valor_capital,
ti.valor_mensual,
ti.valor_anual 

/*order by int.comparar_req*/

)";

                //echo $sql_total;
                //die();
                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql_total_inter, true);
                if (count($records) == 0) {
                    throw new Exception("Valor del calculo de intereses erroneo.");
                }

                $valor_interes = $records[0]['valor_interes'];

                /**
                 * Guardar calculo por novedad - 20190403
                 * Se cambia el calculo para que tome en el primer mes los dias con 31 y febrero segun dias - 20190710
                 * Calculo de dias segun mes y año igual ini y fin - 20190813
                 */
                $sql_total = <<<EOD
insert into caco_calculo_interes_banco (
ID_NOVEDAD_CONTRATO,
ID_CONTRATO,
VIGENCIA_MES,
FECHA_INI,
FECHA_FIN,
ID_ANHOS,
ID_MESES,
DIAS,
TASA_ANU,
TASA_MEN,
VALOR_CAPITAL,
VALOR_INTERES)

select

'$id_novedad_contrato' as id_novedad_contrato,
$id_contrato as id_contrato,
tab0.comparar_req as VIGENCIA_MES,
tab0.fecha_ini as FECHA_INI,
tab0.fecha_fin as FECHA_FIN,
tab0.vigencia as ID_ANHOS,
tab0.id_meses as ID_MESES,
tab0.dias as DIAS,
tab0.tasa_anu as TASA_ANU,
tab0.tasa_men as TASA_MEN,
tab0.valor_capital as VALOR_CAPITAL,
tab0.valor_interes as VALOR_INTERES

from(

    select

    max(int.comparar_req) as comparar_req,
    min(int.fecha_ini) as fecha_ini,
    max(int.fecha_fin) as fecha_fin,
    to_char(int.fecha_fin, 'yyyy') as vigencia,
    listagg(to_char(int.fecha_fin, 'mm'), ',') within group (order by mes.id_meses) as mes,
    mes.id_meses,
    int.valor_capital,
    nvl(ti.valor_mensual,0) as tasa_men,
    nvl(ti.valor_anual,0) as tasa_anu,
    ( ( power( (1+(nvl(ti.valor_anual,0)/100)) , (30/360) ) ) - 1 ) * 100 as tasa_dec,
    max(int.dias) as dias,
    ( ( ( int.valor_capital * ( ( power( (1+(nvl(ti.valor_anual,0)/100)) , (30/360) ) ) - 1 ) ) /30) * max(int.dias) ) as valor_interes

    from(

        select
        fecha_ini,
        fecha_fin,
        --FECHA_RANGO_SIN_TREINTAYUNO(fecha_ini,fecha_fin) as dias,
        case 
        when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 0 and fecha_fin = to_date('$fecha_fin', 'yyyy-mm-dd') then (fecha_fin - fecha_ini) + 1
        when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 0 then ( last_day(fecha_ini) - fecha_ini )+1

        when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 1 and fecha_fin  = to_date('$fecha_fin', 'yyyy-mm-dd') then DIAS_RANGO_MES_SIN_TREINTAYUNO(fecha_ini,fecha_fin,extract(month from fecha_ini))  
        when fecha_ini = to_date('$fecha_ini', 'yyyy-mm-dd') and $tag_ini = 1 and fecha_fin != to_date('$fecha_fin', 'yyyy-mm-dd') then 30 - (1 * to_char(fecha_ini, 'dd')) + 1    

        when fecha_fin = to_date('$fecha_fin', 'yyyy-mm-dd') and $aplica_dia_ant = 2 then 30 
        when fecha_fin = to_date('$fecha_fin', 'yyyy-mm-dd') and $tag_fin = 1 
            then case when (1 * to_char(to_date('$fecha_fin', 'yyyy-mm-dd'), 'dd')) > 30 then 30 else (1 * to_char(to_date('$fecha_fin', 'yyyy-mm-dd'), 'dd')) end  
        else 30 end as dias,

        valor_capital,
        id_tasa_intereses_banc,
        comparar_req
                        
        from(

            $sql_total
                        
        )

    )int 

    join caco_tasa_intereses_banc ti on int.id_tasa_intereses_banc = ti.id_tasa_intereses_banc
    left join meses mes on mes.id_meses = ti.id_meses

    group by
    to_char(int.fecha_fin, 'yyyy'),
    mes.id_meses,
    int.valor_capital,
    ti.valor_mensual,
    ti.valor_anual 

)tab0

order by tab0.comparar_req 
EOD;
                $records = CN_TABLE::executeSQL($sql_total, true);
            }
        } catch (Exception $e) {
            $valor_interes = 0;
            $this->logMessage("[caco_novedad_contrato] ERROR!");
            $this->logMessage($e->getMessage());
        }

        return $valor_interes;
    }

    /**
     * Calculo moratorio por rango de fechas y dias leg
     * 
     * Este interés de mora se calcula en dos etapas, una 1ra etapa se calcula asi:
     * el doble del interes legal civil , (2*6%)/360, desde el momento de la legalización del acta de liquidación o la firmeza del acta unilateral, hasta el 31 de octubre del 2018, y
     * otra etapa desde el 01 de noviembre del 2018, hasta el día del reintegro, al una y media veces del interés legal civil  (1.5*6%)/360
     * 
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $valor_capital
     * @param type $dias_leg
     */
    public function calculoInteresMoratorio($fecha_ini, $fecha_fin, $valor_capital, $dias_leg, $id_novedad_contrato, $id_contrato, $tag_ini) {

        $this->logMessage("[caco_novedad_contrato] Calculo datos IM. Desde: " . $fecha_ini . ", Hasta: " . $fecha_fin . ", Valor Capital: " . $valor_capital);
        $valor_interes = 0;

        //Suma un dia a la fecha ini, para no tener encuenta el primer dia - 20190531
        //$tag_ini solo para el primer registro - 20201228
        $sql_dia = <<<EOD
select 
to_char( to_date('$fecha_ini', 'yyyy-mm-dd') + $tag_ini , 'yyyy-mm-dd') as fecha_ini
from dual 
EOD;
        $records = CN_TABLE::executeSQL($sql_dia, true);
        $fecha_ini = $records[0]['fecha_ini'];

        try {

            $sql_total = <<<EOD
select 
to_date('$fecha_ini', 'yyyy-mm-dd') + $dias_leg as fecha_ini,
case when to_date('$fecha_fin', 'yyyy-mm-dd') < to_date('2018-10-31', 'yyyy-mm-dd') then to_date('$fecha_fin', 'yyyy-mm-dd') else to_date('2018-10-31', 'yyyy-mm-dd') end as fecha_fin,                            
$valor_capital as valor_capital,
2 as id_tasa_intereses_banc
from dual 
where
to_date('$fecha_ini', 'yyyy-mm-dd') + $dias_leg < to_date('2018-10-31', 'yyyy-mm-dd')

union

select 
case when (to_date('$fecha_ini', 'yyyy-mm-dd') + $dias_leg) >= to_date('2018-11-01', 'yyyy-mm-dd') then to_date('$fecha_ini', 'yyyy-mm-dd') + $dias_leg else to_date('2018-11-01', 'yyyy-mm-dd') end as fecha_ini,
to_date('$fecha_fin', 'yyyy-mm-dd') as fecha_fin,                            
$valor_capital as valor_capital,
1.5 as id_tasa_intereses_banc
from dual 
where
to_date('$fecha_fin', 'yyyy-mm-dd') > to_date('2018-10-31', 'yyyy-mm-dd') 
EOD;
            //$this->logMessage("[caco_novedad_contrato] sql_total::" . $sql_total);
            //die();
            //Validar que hay sql para consulta 
            if (strlen($sql_total) > 10) {

                /**
                 * Calcula segun SQL
                 * Meses de 30 - 20190403
                 * Incidente #13278,tomar los meses de acuerdo con los días que tenga (28, 30 ó 31) - 20190710
                 */
                $sql_total_inter = "
select round( sum(nvl(VALOR_INTERES,0)) ) as VALOR_INTERES from(

select
int.fecha_ini,
int.fecha_fin,
int.dias,
int.valor_capital,
int.id_tasa_intereses_banc,
(int.valor_capital) * (int.dias) * ((6/100)*int.id_tasa_intereses_banc) / 360 as valor_interes

from(

    select
    fecha_ini,
    fecha_fin,
    --fecha_fin - fecha_ini as dias,
    --FECHA_RANGO_SIN_TREINTAYUNO(fecha_ini,fecha_fin) as dias,
    fecha_fin - fecha_ini as dias,
    valor_capital,
    id_tasa_intereses_banc
    from(

        $sql_total
    )

)int     
    
/*order by int.fecha_ini*/

)";

                //echo $sql_total;
                //die();
                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql_total_inter, true);
                if (count($records) == 0) {
                    throw new Exception("Valor del calculo de intereses erroneo.");
                }

                $valor_interes = $records[0]['valor_interes'];

                /**
                 * Guardar calculo por novedad - 20190403
                 * Incidente #13278,tomar los meses de acuerdo con los días que tenga (28, 30 ó 31) - 20190710
                 */
                $sql_total = <<<EOD
insert into caco_calculo_interes_mora (
ID_NOVEDAD_CONTRATO,
ID_CONTRATO,
FECHA_INI,
FECHA_FIN,
DIAS,
TASA_INTERES_BANC,
VALOR_CAPITAL,
VALOR_INTERES)

select

'$id_novedad_contrato' as id_novedad_contrato,
$id_contrato as id_contrato,
tab0.fecha_ini as FECHA_INI,
tab0.fecha_fin as FECHA_FIN,
tab0.dias as DIAS,
tab0.id_tasa_intereses_banc as TASA_INTERES_BANC,
tab0.valor_capital as VALOR_CAPITAL,
tab0.valor_interes as VALOR_INTERES

from(    
   
    select
    int.fecha_ini,
    int.fecha_fin,
    int.dias,
    int.valor_capital,
    int.id_tasa_intereses_banc,
    (int.valor_capital) * (int.dias) * ((6/100)*int.id_tasa_intereses_banc) / 360 as valor_interes

    from(

        select
        fecha_ini,
        fecha_fin,
        --fecha_fin - fecha_ini as dias,
        --FECHA_RANGO_SIN_TREINTAYUNO(fecha_ini,fecha_fin) as dias,
        fecha_fin - fecha_ini as dias,
        valor_capital,
        id_tasa_intereses_banc
        from(

            $sql_total
        )

    )int 

)tab0

order by tab0.FECHA_INI                      
EOD;
                $records = CN_TABLE::executeSQL($sql_total, true);
            }
        } catch (Exception $e) {
            $valor_interes = 0;
            $this->logMessage("[caco_novedad_contrato] ERROR!");
            $this->logMessage($e->getMessage());
        }

        return $valor_interes;
    }

    /**
     * CalculoIndexacion
     * 
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $valor_capital
     * @param type $id_novedad_contrato
     * @param type $id_contrato
     */
    public function calculoIndexacion($fecha_ini, $fecha_fin, $valor_capital, $id_novedad_contrato, $id_contrato) {


        $this->logMessage("[caco_novedad_contrato] Calculo datos IX. Desde: " . $fecha_ini . ", Hasta: " . $fecha_fin . ", Valor Capital: " . $valor_capital);
        $valor_interes = 0;

        try {

            $fecha_ini_ind = explode('-', $fecha_ini);
            $fecha_fin_ind = explode('-', $fecha_fin);

            $mes_ini = $fecha_ini_ind[1]; //mes con dos digitos
            $anho_fin = $fecha_ini_ind[0]; //dia con dos digitos

            $mes = $fecha_fin_ind[1]; //mes con dos digitos
            $anho = $fecha_fin_ind[0]; //dia con dos digitos

            if ($mes == 1) {
                $anho = $anho - 1;
                $mes = 12;
            } elseif ($mes <= 12) {
                $mes = $mes - 1;
            }

            /**
             * IPC inicial
             */
            $sql = <<<EOD
SELECT 
ID_IPC,
ID_ANHOS,
ID_MESES,
VALOR,
VALOR_IPC
                    
FROM CA_IPC

WHERE ID_ANHOS='$anho_fin' AND ID_MESES='$mes_ini'                                           
EOD;
            $records = CN_TABLE::executeSQL($sql);
            $ipc_inicial = $records[0]['valor_ipc'];

            /**
             * IPC final
             */
            $sql = <<<EOD
SELECT 
ID_IPC,
ID_ANHOS,
ID_MESES,
VALOR,
VALOR_IPC
                    
FROM CA_IPC

WHERE ID_ANHOS='$anho' AND ID_MESES='$mes'                                            
EOD;
            $records = CN_TABLE::executeSQL($sql);
            $ipc_final = $records[0]['valor_ipc'];


            $tasa_total = $ipc_final / $ipc_inicial;
            $total = ($ipc_final / $ipc_inicial) * $valor_capital;
            $total_indexado = $total - $valor_capital;
            $total_indexado = round($total_indexado, 2);
            $total_meses = CN_TABLE::mesesEntreFechas($fecha_ini, $fecha_fin, $calendario = TRUE);

            $f = CN_TABLE::fechaSistema();

            /*
             * Crea registro en CACO_CALCULO_INDEXACION - 27092019 
             * con el objetivo de calcular la indexación total de contrato a esta fecha.
             */
            $this->logMessage("[caco_novedad_contrato]  Crea registro en CACO_CALCULO_INDEXACION");
            $sql = <<<EOD
INSERT INTO CACO_CALCULO_INDEXACION
( ID_NOVEDAD_CONTRATO,  
  ID_CONTRATO,
  FECHA_INI,
  FECHA_FIN,
  TASA_TOTAL_IND,
  VALOR_CAPITAL,
  VALOR_IND,
  IPC_INCIAL,
  IPC_FINAL
)
VALUES
(
'$id_novedad_contrato',
$id_contrato,
to_date('$fecha_ini', 'yyyy-mm-dd'),
to_date('$fecha_fin', 'yyyy-mm-dd'),
'$tasa_total',
'$valor_capital',
'$total_indexado',
'$ipc_inicial',
'$ipc_final'
)                
EOD;
            $records = CN_TABLE::executeSQL($sql);

            //redondeo de valores
            $valor_interes = round($total_indexado);
        } catch (Exception $e) {
            $valor_interes = 0;
            $this->logMessage("[caco_novedad_contrato] ERROR!");
            $this->logMessage($e->getMessage());
        }

        return $valor_interes;
    }

    /**
     * Calculo y guardado de  indexacion por fecha inicial y final
     * 
     * Se calcula usando la formula  valor de indexacion=(IPCFINAL/IPCINICIAL)*valor_capital
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $valor_contrato */
//    public function calculoIndexSave(sfWebRequest $request, $list_data_post) {
//
//
//
//        /* CASO DE AÑADIR UNA NUEVA INDEXACION */
//
//        /*
//         * Se instancia la clase del manejo del log
//         */
//        $logger = sfContext::getInstance()->getLogger();
//        $logger->info("Entro a CalculoIndexacion -SAVE " . $list_data_post);
//        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
//        $this->conn->beginTransaction();
//        $id_novedad_contrato = $list_data_post[0]['id_novedad_contrato'];
//        $sql = <<<EOD
//                        SELECT ID_CONTRATO,
//                        ID_TIPO_CONTRATO,
//                        DESCRIPCION,
//                        CODIGO,
//                        ID_ANHOS,
//                        FECHA_PROCESO,
//                        FECHA_INICIAL,
//                        FECHA_TERMINA,
//                        VALOR_COMPANIA,
//                        VALOR_ENTIDAD,
//                        VALOR_CONTRATO,
//                        APLICA_SALVEDAD,
//                        ESTADO,
//                        FECHA_LOG,
//                        USUARIO_LOG,
//                        FECHA_ANU,
//                        MOTIVO_ANU,
//                        USUARIO_ANU,
//                        ID_SUPERVISOR_CONT,
//                        FECHA_CACULO_INT_BANC,
//                        APLICA_INTERES_BANCO,
//                        APLICA_INTERES_MORA,
//                        APLICA_INDEXACION
//                    FROM CACO_CONTRATO
//                    WHERE ID_CONTRATO=$request[id_contrato]
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        //$total_contrato = $records[0]['valor_contrato'];
//        //$id_novedad_contrato = 0;
//        $total_contrato = $records[0]['valor_contrato'];
//        $fecha_fin_ind = explode('-', $request['fecha_final_indexacion']);
//
//        $fecha_ini_ind = explode('-', $request['fecha_inicial_indexacion']);
//        $indexacion = $records[0]['aplica_indexacion'];
//
//        $mes = $fecha_fin_ind[1]; //mes con dos digitos
//        $anho = $fecha_fin_ind[0]; //dia con dos digitos
//        if ($mes == 1) {
//            $anho = $anho - 1;
//            $mes = 12;
//        } elseif ($mes <= 12) {
//            $mes = $mes - 1;
//        }
//
//        $sql = <<<EOD
//                        SELECT ID_IPC,
//                                ID_ANHOS,
//                                ID_MESES,
//                                VALOR,
//                                VALOR_IPC
//                                FROM CA_IPC
//                                    WHERE ID_ANHOS='$anho' AND ID_MESES='$mes'                                            
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        $ipc_final = $records[0]['valor_ipc'];
//        $sql = <<<EOD
//                        SELECT ID_IPC,
//                                ID_ANHOS,
//                                ID_MESES,
//                                VALOR,
//                                VALOR_IPC
//                                FROM CA_IPC
//                                    WHERE ID_ANHOS='$fecha_ini_ind[0]' AND ID_MESES='$fecha_ini_ind[1]'                                           
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        $ipc_inicial = $records[0]['valor_ipc'];
//        /*
//         * Procesar Request
//         */
//        //accion add
//
//
//        $sql = <<<EOD
//                       SELECT ID_NOVEDAD_CONTRATO,
//                        ID_CONTRATO,
//                        ID_TS_TD,
//                        DOC_SOPORTE,
//                        ID_TIPO_NOV_CONT,
//                        FECHA_NOVEDAD,
//                        OBSERVACIONES,
//                        FECHA_LOG,
//                        USUARIO_LOG,
//                        VALOR_DESEMBOLSADO,
//                        VALOR_RENDIMIENTOS,
//                        VALOR_NO_EJECUTADO,
//                        VALOR_NO_RECONOCIDO,
//                        INDEXACION,
//                        VALOR_INTERESES_MORA,
//                        VALOR_INTERESES_BANCO,
//                        REINTEGROS_EFECTUADOS,
//                        NO_CERTIFICADO,
//                        DESTINATARIO,
//                        DESTINATARIO_CARGO,
//                        NO_RADICADO,
//                        OBJETO,
//                        FECHA_LEGALIZACION,
//                        DIAS_LEG,
//                        OBSER_INDEXACION,
//                        OBSER_INTERES_MORA,
//                        OBSER_INTERES_BANCO,
//                        OBSER_SALDO_PENDIENTE,
//                        ANEXO_CETIFICADO,
//                        FIRMADO,
//                        FECHA_FIRMADO,
//                        USUARIO_FIRMADO,
//                        VALOR_AJUSTE_BANCO,
//                        VALOR_AJUSTE_MORA,
//                        FECHA_LEGALIZACION_LIMITE
//                 FROM CACO_NOVEDAD_CONTRATO
//                     WHERE ID_NOVEDAD_CONTRATO=$id_novedad_contrato
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        $total_contrato = $records[0]['valor_no_ejecutado'];
//
//
//
//        try {
//            $id_contrato = $request['id_contrato'];
//            $id_entidad_contrato = $request['id_entidad_contrato'];
//            if ($indexacion && $request['fecha_inicial_indexacion'] != null && $request['fecha_final_indexacion'] != null) {
//                $tasa_total = $ipc_final / $ipc_inicial;
//                $total = ($ipc_final / $ipc_inicial) * $total_contrato;
//                $total_indexado = $total - $total_contrato;
//                $total_meses = CN_TABLE::mesesEntreFechas($fecha_ini, $fecha_fin, $calendario = TRUE);
//                $total_indexado = round($total_indexado, 2);
//                /*
//                  //Crea registro en CACO_CALCULO_INDEXACION - 27092019
//                  /* con el objetivo de calcular la indexación total de contrato a esta fecha.
//                 */
//
//                $sql = <<<EOD
//                          INSERT INTO CACO_CALCULO_INDEXACION
//                        ( ID_NOVEDAD_CONTRATO,  
//                          ID_CONTRATO,
//                          FECHA_INI,
//                          FECHA_FIN,
//                          TASA_TOTAL_IND,
//                          VALOR_CAPITAL,
//                          VALOR_IND,
//                          IPC_INCIAL,
//                          IPC_FINAL
//                        )
//                        VALUES
//                        ($id_novedad_contrato,$id_contrato,
//                        '$request[fecha_inicial_indexacion]',
//                            '$request[fecha_final_indexacion]',
//                        '$tasa_total',
//                             '$total_contrato',
//                             '$total_indexado',
//                        '$ipc_inicial',
//                         '$ipc_final'
//                        )
//EOD;
//
//
//                $this->conn->execute($sql);
//
//                /*
//                  //Actualiza columna indexacion en caco_novedad_contrato_indexacion - 30092019
//                  /*
//                 */
//                $ind = round($total_indexado);
//
//                $sql = <<<EOD
//                          UPDATE CACO_NOVEDAD_CONTRATO
//                        SET INDEXACION = $ind
//                        WHERE ID_NOVEDAD_CONTRATO = $id_novedad_contrato
//EOD;
//
//                $this->conn->execute($sql);
//
//
//                //COMMIT DE TODAS LAS TRANSACCIONES
//                $this->conn->commit();
//            }
//        } catch (Exception $ex) {
//            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
//            $this->conn->rollback();
//        }
//    }

    /**
     * Calculo y edición de indexacion por fecha inicial y final
     * 
     * Se calcula usando la formula  valor de indexacion=(IPCFINAL/IPCINICIAL)*valor_capital
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $valor_contrato */
//    public function calculoIndexEdit(sfWebRequest $request, $list_data_post) {
//
//        /*
//         * Se instancia la clase del manejo del log
//         */
//        $logger = sfContext::getInstance()->getLogger();
//        $logger->info("Entro a CalculoIndexacion - EDIT" . $list_data_post);
//        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
//        $this->conn->beginTransaction();
//        $id_novedad_contrato = $list_data_post[0]['id_novedad_contrato'];
//        $sql = <<<EOD
//                        SELECT ID_CONTRATO,
//                        ID_TIPO_CONTRATO,
//                        DESCRIPCION,
//                        CODIGO,
//                        ID_ANHOS,
//                        FECHA_PROCESO,
//                        FECHA_INICIAL,
//                        FECHA_TERMINA,
//                        VALOR_COMPANIA,
//                        VALOR_ENTIDAD,
//                        VALOR_CONTRATO,
//                        APLICA_SALVEDAD,
//                        ESTADO,
//                        FECHA_LOG,
//                        USUARIO_LOG,
//                        FECHA_ANU,
//                        MOTIVO_ANU,
//                        USUARIO_ANU,
//                        ID_SUPERVISOR_CONT,
//                        FECHA_CACULO_INT_BANC,
//                        APLICA_INTERES_BANCO,
//                        APLICA_INTERES_MORA,
//                        APLICA_INDEXACION
//                    FROM CACO_CONTRATO
//                    WHERE ID_CONTRATO=$request[id_contrato]
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        //$total_contrato = $records[0]['valor_contrato'];
//        //$id_novedad_contrato = 0;
//        //$total_contrato = $records[0]['valor_contrato'];
//        $fecha_fin_ind = explode('-', $request['fecha_final_indexacion']);
//
//        $fecha_ini_ind = explode('-', $request['fecha_inicial_indexacion']);
//        $indexacion = $records[0]['aplica_indexacion'];
//
//        $mes = $fecha_fin_ind[1]; //mes con dos digitos
//        $anho = $fecha_fin_ind[0]; //dia con dos digitos
//        if ($mes == 1) {
//            $anho = $anho - 1;
//            $mes = 12;
//        } elseif ($mes <= 12) {
//            $mes = $mes - 1;
//        }
//
//        $sql = <<<EOD
//                        SELECT ID_IPC,
//                                ID_ANHOS,
//                                ID_MESES,
//                                VALOR,
//                                VALOR_IPC
//                                FROM CA_IPC
//                                    WHERE ID_ANHOS='$anho' AND ID_MESES='$mes'                                            
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        $ipc_final = $records[0]['valor_ipc'];
//        $sql = <<<EOD
//                        SELECT ID_IPC,
//                                ID_ANHOS,
//                                ID_MESES,
//                                VALOR,
//                                VALOR_IPC
//                                FROM CA_IPC
//                                    WHERE ID_ANHOS='$fecha_ini_ind[0]' AND ID_MESES='$fecha_ini_ind[1]'                                           
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        $ipc_inicial = $records[0]['valor_ipc'];
//        /*
//         * Procesar Request
//         */
//        //accion add
//
//
//        $sql = <<<EOD
//                       SELECT ID_NOVEDAD_CONTRATO,
//                        ID_CONTRATO,
//                        ID_TS_TD,
//                        DOC_SOPORTE,
//                        ID_TIPO_NOV_CONT,
//                        FECHA_NOVEDAD,
//                        OBSERVACIONES,
//                        FECHA_LOG,
//                        USUARIO_LOG,
//                        VALOR_DESEMBOLSADO,
//                        VALOR_RENDIMIENTOS,
//                        VALOR_NO_EJECUTADO,
//                        VALOR_NO_RECONOCIDO,
//                        INDEXACION,
//                        VALOR_INTERESES_MORA,
//                        VALOR_INTERESES_BANCO,
//                        REINTEGROS_EFECTUADOS,
//                        NO_CERTIFICADO,
//                        DESTINATARIO,
//                        DESTINATARIO_CARGO,
//                        NO_RADICADO,
//                        OBJETO,
//                        FECHA_LEGALIZACION,
//                        DIAS_LEG,
//                        OBSER_INDEXACION,
//                        OBSER_INTERES_MORA,
//                        OBSER_INTERES_BANCO,
//                        OBSER_SALDO_PENDIENTE,
//                        ANEXO_CETIFICADO,
//                        FIRMADO,
//                        FECHA_FIRMADO,
//                        USUARIO_FIRMADO,
//                        VALOR_AJUSTE_BANCO,
//                        VALOR_AJUSTE_MORA,
//                        FECHA_LEGALIZACION_LIMITE
//                 FROM CACO_NOVEDAD_CONTRATO
//                     WHERE ID_NOVEDAD_CONTRATO=$id_novedad_contrato
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
//        $total_contrato = $records[0]['valor_no_ejecutado'];
//
//
//        /* CASO PARA ACTUALIZAR LA INDEXACION EN LOS CONTRATOS */
//        try {
//            $id_contrato = $request['id_contrato'];
//            $id_entidad_contrato = $request['id_entidad_contrato'];
//            if ($indexacion && $request['fecha_inicial_indexacion'] != null && $request['fecha_final_indexacion'] != null) {
//
//                $tasa_total = $ipc_final / $ipc_inicial;
//                $total = ($ipc_final / $ipc_inicial) * $total_contrato;
//                $total_indexado = $total - $total_contrato;
//                $total_indexado = round($total_indexado, 2);
//                $total_meses = CN_TABLE::mesesEntreFechas($fecha_ini, $fecha_fin, $calendario = TRUE);
//
//
//                $f = CN_TABLE::fechaSistema();
//
//                /*                 * *
//                 * Crea registro en CACO_CALCULO_INDEXACION - 27092019 
//                 * con el objetivo de calcular la indexación total de contrato a esta fecha.
//                 */
//                $sql = <<<EOD
//                            INSERT INTO CACO_CALCULO_INDEXACION
//                        ( ID_NOVEDAD_CONTRATO,  
//                          ID_CONTRATO,
//                          FECHA_INI,
//                          FECHA_FIN,
//                          TASA_TOTAL_IND,
//                          VALOR_CAPITAL,
//                          VALOR_IND,
//                          IPC_INCIAL,
//                          IPC_FINAL
//                        )
//                        VALUES
//                        ($id_novedad_contrato,$id_contrato,
//                        '$request[fecha_inicial_indexacion]',
//                            '$request[fecha_final_indexacion]',
//                        '$tasa_total',
//                             '$total_contrato',
//                             '$total_indexado',
//                        '$ipc_inicial',
//                         '$ipc_final'
//                        )                
//EOD;
//                $this->conn->execute($sql);
//                $ind = round($total_indexado);
//
//                $sql = <<<EOD
//                          UPDATE CACO_NOVEDAD_CONTRATO
//                        SET INDEXACION = $ind
//                        WHERE ID_NOVEDAD_CONTRATO = $id_novedad_contrato
//EOD;
//
//                $this->conn->execute($sql);
//                //
//                //COMMIT DE TODAS LAS TRANSACCIONES
//                $this->conn->commit();
//            }
//        } catch (Exception $ex) {
//            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
//            $this->conn->rollback();
//        }
//    }

    /**
     * Eliminación de indexacion por id_novedad_contrato
     * 
     * Se calcula usando la formula  valor de indexacion=(IPCFINAL/IPCINICIAL)*valor_capital
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $valor_contrato */
//    public function calculoIndexDelete(sfWebRequest $request, $list_data_post) {
//
//        // $id_novedad_contrato = $list_data_post[0]['id_novedad_contrato'];
//        //$id_contrato = $request['id_contrato'];
//        /*
//         * Se instancia la clase del manejo del log
//         */
//        $logger = sfContext::getInstance()->getLogger();
//        $logger->info("Entro a CalculoIndexacionDelete - " . $list_data_post);
//        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
//        $this->conn->beginTransaction();
//        $id_novedad_contrato = $request['id_novedad_contrato'];
//
//        /* Eliminar las indexaciones de un contrato */
//
//        try {
//
//
//            $sql = <<<EOD
//                DELETE
//              FROM
//                CACO_CALCULO_INDEXACION
//                    WHERE
//                      ID_NOVEDAD_CONTRATO=$id_novedad_contrato                        
//EOD;
//            $this->conn->execute($sql);
//            //COMMIT DE TODAS LAS TRANSACCIONES
//            $this->conn->commit();
//        } catch (Exception $ex) {
//            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
//            $this->conn->rollback();
//        }
//    }
}
