<?php

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

    /**
     * Actualizar el estado del formato de pago
     * tipo_boton
     * 1-Firmado
     *
     * @param sfRequest $request A request object
     */
    public function executeUpdate(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---function executeUpdate");
        $this->logMessage("---BEGIN Logging request");

        $status = 0;
        $response = array();
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------* Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        $records = array();
        $mensaje = "";

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

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD HH24:MI:SS" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        try {

            /*
             * variables por defecto para el registro de log
             */
            $id_tabla = $request['id_novedad_contrato'];
            $id_vigencia = "";
            $cen_op = "";
            $id_cia = "";

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

            /**
              1	CONSULTAR
              2	ACTUALIZAR
              3	ADICIONAR
              4	ELIMINAR
              5	ANULAR
             */
            $id_ope_bd = 2;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_username'])) {
                $id_mae_ter = $request['id_username'];
            }

            //username
            $username = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $username = $request['username'];
                }
            }

            //comando de la funcionalidad
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }

            //construir observacion
            $observacion_log = "'Se actualizo tabla de novedad_contrato desde la funcionalidad: " . $comando . "'";

            $id_punto_venta = $request['punto_venta_log'];

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

            /*
             * Variables de filtro
             */
            $tipo_boton = $request['tipo_boton'];
            $id_novedad_contrato = $request['id_novedad_contrato'];

            $usuario_estado = $request['username'];
            $fecha_estado = CN_TABLE::fechaSistema();

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

            //Opcion segun boton
            switch ($tipo_boton) {

                //FIRMADO
                case 1:
                    //actualizar como contratista
                    $sql = <<<EOD
update caco_novedad_contrato 
set firmado = 1,
fecha_firmado = SYSDATE,
usuario_firmado = '$usuario_estado' 
where
id_novedad_contrato = $id_novedad_contrato
and firmado = 0 
EOD;
                    $this->conn->execute($sql);


                    //construir observacion
                    $observacion_log = "'Novedad Contrato firmado del proceso del id: " . $id_novedad_contrato . "'";

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

                    /**
                     * Consulta datos debito
                     */
                    //sentencia sql
                    $sql = <<<EOD
select
nov.*,
cont.codigo,
cont.referencia,
cont.id_mae_ter,
to_char(cont.fecha_caculo_int_banc,'yyyy-mm-dd') as fecha_vence_rec,
tipnov.aplica_cartera,
tipnov.aplica_cartera as aplica_cartera_num,
to_char(cont.fecha_inicial,'yyyy-mm-dd') as periodo_ini,
to_char(cont.fecha_termina,'yyyy-mm-dd') as periodo_fin,

tipprodre.id_tipo_nov_producto as id_tipo_nov_producto_re,
tipprodre.id_producto as id_producto_re,
tipprodre.tipo_valor as tipo_valor_re,
tipprodrc.id_tipo_nov_producto as id_tipo_nov_producto_rc,
tipprodrc.id_producto as id_producto_rc,
tipprodrc.tipo_valor as tipo_valor_rc,
tipprodix.id_tipo_nov_producto as id_tipo_nov_producto_ix,
tipprodix.id_producto as id_producto_ix,
tipprodix.tipo_valor as tipo_valor_ix,
tipprodib.id_tipo_nov_producto as id_tipo_nov_producto_ib,
tipprodib.id_producto as id_producto_ib,
tipprodib.tipo_valor as tipo_valor_ib,
tipprodim.id_tipo_nov_producto as id_tipo_nov_producto_im,
tipprodim.id_producto as id_producto_im,
tipprodim.tipo_valor as tipo_valor_im

from caco_novedad_contrato nov

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

left join caco_contrato_v cont
on nov.id_contrato = cont.id_contrato

left join caco_tipo_nov_producto tipprodre
on tipprodre.id_tipo_nov_cont = nov.id_tipo_nov_cont
and tipprodre.tipo_valor = 'RE'
and tipprodre.estado = 1

left join caco_tipo_nov_producto tipprodrc
on tipprodrc.id_tipo_nov_cont = nov.id_tipo_nov_cont
and tipprodrc.tipo_valor = 'RC'
and tipprodrc.estado = 1

left join caco_tipo_nov_producto tipprodix
on tipprodix.id_tipo_nov_cont = nov.id_tipo_nov_cont
and tipprodix.tipo_valor = 'IX'
and tipprodix.estado = 1

left join caco_tipo_nov_producto tipprodib
on tipprodib.id_tipo_nov_cont = nov.id_tipo_nov_cont
and tipprodib.tipo_valor = 'IB'
and tipprodib.estado = 1

left join caco_tipo_nov_producto tipprodim
on tipprodim.id_tipo_nov_cont = nov.id_tipo_nov_cont
and tipprodim.tipo_valor = 'IM'
and tipprodim.estado = 1

where
nov.id_novedad_contrato = $id_novedad_contrato
and nov.firmado = 1 
EOD;
                    //ejecuta el sql
                    $records = CN_TABLE::executeSQL($sql);

                    $id_mae_ter = $records[0]['id_mae_ter'];
                    $aplica_cartera = $records[0]['aplica_cartera_num'];
                    $id_contrato = $records[0]['id_contrato'];
                    $id_tipo_nov_cont = $records[0]['id_tipo_nov_cont'];

                    $valor_no_ejecutado = $records[0]['valor_no_ejecutado'];
                    $valor_no_reconocido = $records[0]['valor_no_reconocido'];
                    $valor_intereses_banco = $records[0]['valor_intereses_banco'] + $records[0]['valor_ajuste_banco'];
                    $valor_intereses_mora = $records[0]['valor_intereses_mora'] + $records[0]['valor_ajuste_mora'];
                    $valor_indexacion = $records[0]['indexacion'];

                    $records[0]['id_referencia2'] = $records[0]['referencia'];
                    $records[0]['cantidad'] = 1;

                    /**
                     * APLICA CARTERA
                     */
                    switch ($aplica_cartera) {
                        case 0:

                            //RE-RECURSOS NO EJECUTADOS
                            if ($valor_no_ejecutado != 0) {

                                $records[0]['valor_bruto'] = $valor_no_ejecutado;
                                $records[0]['valor_total'] = $valor_no_ejecutado;
                                $records[0]['valor_moneda'] = $valor_no_ejecutado;
                                $records[0]['observaciones'] = $records[0]['observaciones'];

                                $records[0]['valor_unitario'] = $valor_no_ejecutado;
                                $records[0]['id_producto'] = $records[0]['id_producto_re'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_re'];
                                $records[0]['tipo_valor'] = $tipo_valor = $records[0]['tipo_valor_re'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'RE16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RE.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RE.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RE.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RE.";
                                    }
                                }
                            }

                            //RC-RECURSOS NO RECONOCIDOS 
                            if ($valor_no_reconocido != 0) {

                                $records[0]['valor_bruto'] = $valor_no_reconocido;
                                $records[0]['valor_total'] = $valor_no_reconocido;
                                $records[0]['valor_moneda'] = $valor_no_reconocido;
                                $records[0]['observaciones'] = $records[0]['observaciones'];

                                $records[0]['valor_unitario'] = $valor_no_reconocido;
                                $records[0]['id_producto'] = $records[0]['id_producto_rc'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_rc'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'RC16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RC.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RC.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RC.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RC.";
                                    }
                                }
                            }

                            //IB-INTERESES BANCARIOS 
                            if ($valor_intereses_banco != 0) {

                                $records[0]['valor_bruto'] = $valor_intereses_banco;
                                $records[0]['valor_total'] = $valor_intereses_banco;
                                $records[0]['valor_moneda'] = $valor_intereses_banco;
                                $records[0]['observaciones'] = $records[0]['obser_interes_banco'];

                                $records[0]['valor_unitario'] = $valor_intereses_banco;
                                $records[0]['id_producto'] = $records[0]['id_producto_ib'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_ib'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'IB16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IB.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IB.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IB.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IB.";
                                    }
                                }
                            }

                            //IX-INDEXACION
                            if ($valor_indexacion != 0) {

                                $records[0]['valor_bruto'] = $valor_indexacion;
                                $records[0]['valor_total'] = $valor_indexacion;
                                $records[0]['valor_moneda'] = $valor_indexacion;
                                $records[0]['observaciones'] = $records[0]['obser_indexacion'];

                                $records[0]['valor_unitario'] = $valor_indexacion;
                                $records[0]['id_producto'] = $records[0]['id_producto_ix'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_ix'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'IX16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente-IX.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IX.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IX.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero-IX.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente-IX.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IX.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IX.";
                                    }
                                }
                            }

                            break;

                        case 1:

                            //RE-RECURSOS NO EJECUTADOS
                            if ($valor_no_ejecutado != 0) {

                                $records[0]['valor_bruto'] = $valor_no_ejecutado;
                                $records[0]['valor_total'] = $valor_no_ejecutado;
                                $records[0]['valor_moneda'] = $valor_no_ejecutado;
                                $records[0]['observaciones'] = $records[0]['observaciones'];

                                $records[0]['valor_unitario'] = $valor_no_ejecutado;
                                $records[0]['id_producto'] = $records[0]['id_producto_re'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_re'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'RE16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RE.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RE.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RE.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RE.";
                                    }
                                }
                            }

                            //RC-RECURSOS NO RECONOCIDOS 
                            if ($valor_no_reconocido != 0) {

                                $records[0]['valor_bruto'] = $valor_no_reconocido;
                                $records[0]['valor_total'] = $valor_no_reconocido;
                                $records[0]['valor_moneda'] = $valor_no_reconocido;
                                $records[0]['observaciones'] = $records[0]['observaciones'];

                                $records[0]['valor_unitario'] = $valor_no_reconocido;
                                $records[0]['id_producto'] = $records[0]['id_producto_rc'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_rc'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'RC16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RC.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RC.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-RC.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-RC.";
                                    }
                                }
                            }

                            //IB-INTERESES BANCARIOS 
                            if ($valor_intereses_banco != 0) {

                                $records[0]['valor_bruto'] = $valor_intereses_banco;
                                $records[0]['valor_total'] = $valor_intereses_banco;
                                $records[0]['valor_moneda'] = $valor_intereses_banco;
                                $records[0]['observaciones'] = $records[0]['obser_interes_banco'];

                                $records[0]['valor_unitario'] = $valor_intereses_banco;
                                $records[0]['id_producto'] = $records[0]['id_producto_ib'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_ib'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'IB16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IB.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IB.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IB.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IB.";
                                    }
                                }
                            }

                            //IM-INTERESES MORATORIOS 
                            if ($valor_intereses_mora != 0) {

                                $records[0]['valor_bruto'] = $valor_intereses_mora;
                                $records[0]['valor_total'] = $valor_intereses_mora;
                                $records[0]['valor_moneda'] = $valor_intereses_mora;
                                $records[0]['observaciones'] = $records[0]['obser_interes_mora'];

                                $records[0]['valor_unitario'] = $valor_intereses_mora;
                                $records[0]['id_producto'] = $records[0]['id_producto_im'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_im'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'IM16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IM.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IM.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IM.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IM.";
                                    }
                                }
                            }

                            //IX-INDEXACION
                            if ($valor_indexacion != 0) {

                                $records[0]['valor_bruto'] = $valor_indexacion;
                                $records[0]['valor_total'] = $valor_indexacion;
                                $records[0]['valor_moneda'] = $valor_indexacion;
                                $records[0]['observaciones'] = $records[0]['obser_interes_mora'];

                                $records[0]['valor_unitario'] = $valor_indexacion;
                                $records[0]['id_producto'] = $records[0]['id_producto_ix'];
                                $id_tipo_nov_producto = $records[0]['id_tipo_nov_producto_ix'];

                                /**
                                 * Para validar si se crea o edita el debito y relaciones con el contrato - 20190417
                                 * Falta verificar proceso al existir otros registros previos de firma Ticket #16398
                                 */
                                //sentencia sql
                                $sql = <<<EOD
SELECT
nov.*,
tipprod.tipo_valor,
deb.valor_total as valor_debito,
nvl((SELECT count(id_debito) FROM ca_debito_credito where estado_cre = 1 and id_debito = nov.id_debito),0) as tag_credito

FROM caco_novedad_contrato_debito nov

left join ca_debito deb
on nov.id_debito = deb.id_debito 

left join caco_tipo_nov_producto tipprod
on tipprod.id_tipo_nov_producto = nov.id_tipo_nov_producto

where
nov.id_contrato = $id_contrato 
and nov.estado = 1
and tipprod.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 = $aplica_cartera)
and tipprod.tipo_valor = 'IX16398' 
EOD;
                                //ejecuta el sql
                                $records_nov = CN_TABLE::executeSQL($sql);

                                if (count($records_nov) > 0) {

                                    $id_debito = $records_nov[0]['id_debito'];
                                    $valor_debito = $records_nov[0]['valor_debito'];
                                    $id_novedad_contrato_ant = $records_nov[0]['id_novedad_contrato'];
                                    $tag_credito = $records_nov[0]['tag_credito'];

                                    /**
                                     * Actualizo la relacion anterior, e inactivo - 20190417
                                     */
                                    $sql = <<<EOD
update caco_novedad_contrato_debito set estado = 0, fecha_estado = sysdate, 
    id_novedad_contrato_new = $id_novedad_contrato  
        where id_novedad_contrato = $id_novedad_contrato_ant  
EOD;
                                    $this->conn->execute($sql);

                                    //El valor del debito es igual - 20190417
                                    if ($valor_debito == $valor_no_ejecutado) {

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);
                                    } else {
                                        //Si el valor es diferente, verifica que no tenga credito, para anular y crear uno nuevo - 20190417

                                        /**
                                         * Anular debito anterior, si no tiene creditos activos
                                         */
                                        if ($tag_credito == 0) {

                                            /*
                                             * Anula debito
                                             */
                                            $sql = <<<EOD
update ca_debito set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato', usuario_anu = '$usuario_estado' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /*
                                             * Anula vencimiento
                                             */
                                            $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Por creacion de nuevo certificado de contrato' where id_debito = $id_debito 
EOD;
                                            $this->conn->execute($sql);


                                            /**
                                             * Llamar al metodo de crear el debito
                                             */
                                            $resultado = array();
                                            $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                            if (!empty($resultado)) {

                                                $id_debito = $resultado[0]['id_debito'];

                                                /**
                                                 * Relacion de contrato y debitos
                                                 */
                                                $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                                $this->conn->execute($sql);

                                                /**
                                                 * Llamar al metodo de crear el debito
                                                 */
                                                $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                                if (!empty($resultado)) {
                                                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente-IX.");
                                                } else {
                                                    $status = 1;
                                                    $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IX.";
                                                }
                                            } else {
                                                $status = 1;
                                                $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IX.";
                                            }
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] El debito esta asociado con un credito en estado activo, anular NC primero-IX.";
                                        }
                                    }
                                } else {

                                    /**
                                     * Llamar al metodo de crear el debito
                                     */
                                    $resultado = array();
                                    $resultado = $this->crearDebito($id_mae_ter, $request, $records[0], $this->conn);

                                    if (!empty($resultado)) {

                                        $id_debito = $resultado[0]['id_debito'];

                                        /**
                                         * Relacion de contrato y debitos
                                         */
                                        $sql = <<<EOD
Insert into CACO_NOVEDAD_CONTRATO_DEBITO (ID_NOVEDAD_CONTRATO,ID_CONTRATO,ID_DEBITO,
    ID_TIPO_NOV_PRODUCTO,ESTADO,FECHA_ESTADO,ID_NOVEDAD_CONTRATO_NEW) 
values ('$id_novedad_contrato','$id_contrato','$id_debito',
    '$id_tipo_nov_producto','1',sysdate,null)
EOD;
                                        $this->conn->execute($sql);

                                        /**
                                         * Llamar al metodo de crear el debito
                                         */
                                        $resultado = $this->crearDebitoDetalle($id_debito, $request, $records[0], $this->conn);

                                        if (!empty($resultado)) {
                                            $this->logMessage("[caco_novedad_cont_estado] OK. Registros creados correctamente-IX.");
                                        } else {
                                            $status = 1;
                                            $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito detalle-IX.";
                                        }
                                    } else {
                                        $status = 1;
                                        $mensaje = "[caco_novedad_cont_estado] Error en creacion del debito-IX.";
                                    }
                                }
                            }

                            break;

                        default:
                            break;
                    }

                    break;

                default:
                    break;
            }

            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            if ($status == 0) {
                $this->conn->commit();
                $this->status = 0;
                $this->list_data = $response;
                $this->logMessage("[caco_novedad_cont_estado] Exitoso");
            } else {
                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage("[caco_novedad_cont_estado] ERROR!");
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[caco_novedad_cont_estado] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[caco_novedad_cont_estado] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Crear debito
     * 
     * @param type $id_mae_ter
     * @param sfWebRequest $request
     * @return type 
     */
    public function crearDebito($id_mae_ter, sfWebRequest $request, $records, $conn) {

        $this->logMessage("[caco_novedad_cont_estado] Generar crearDebito");

        /*
         * Manejo de errores
         */
        try {

            /*
             * Variables obligatorias
             */
//            $id_anhos = $request['id_anhos'];
            $id_anhos = date('Y');
            $id_punto_venta = $request['punto_venta_log'];
            $id_tipo_debito = 2;
//            $id_mae_ter = $request['id_mae_ter'];
//            $fecha_proceso = $request['fecha_proceso'];
            $fecha_proceso = CN_TABLE::fechaSistema();
            //fecha_vence_rec fecha de vencimiento de canon para los debitos - 20130920
            $fecha_vence_rec = $records['fecha_vence_rec'];
            $dias_pago = 0;
            $valor_bruto = $records['valor_bruto'];
            $valor_total = $records['valor_total'];
            $valor_moneda = $records['valor_moneda'];
            $trm_debito = 1;


            /*
             * Validar username
             */
            if (isset($request['username'])) {
                $username = $request['username'];
            } else {
                if (isset($request['username_log'])) {
                    $username = $request['username_log'];
                } else {
                    $username = "Sin Identificar";
                }
            }

            /*
             * Variables NO obligatorias
             */
            $id_mae_ter_ven = 'null';
            if (isset($request['id_mae_ter_ven'])) {
                $id_mae_ter_ven = $request['id_mae_ter_ven'];
            }
            $id_tip_mon = '1';
            if (isset($request['id_tip_mon'])) {
                $id_tip_mon = $request['id_tip_mon'];
            }
            $observaciones = 'null';
            if (isset($records['observaciones'])) {
                $observaciones = "'" . $records['observaciones'] . "'";
            }
            $id_pr_tipo_ingre = 'null';
            if (isset($request['id_pr_tipo_ingre'])) {
                $id_pr_tipo_ingre = $request['id_pr_tipo_ingre'];
            }


            $valor_dcto = 0;
            if (isset($request['valor_dcto'])) {
                $valor_dcto = $request['valor_dcto'];
            }
            $porcen_dcto = 0;
            if (isset($request['porcen_dcto'])) {
                $porcen_dcto = $request['porcen_dcto'];
            }
            $valor_iva = 0;
            if (isset($request['valor_iva'])) {
                $valor_iva = $request['valor_iva'];
            }


            /*
             * Varialbes de referencias
             */
            $tiene_referencias = false;
            $id_referencia1 = 'null';
            if (isset($request['id_referencia1'])) {
                $tiene_referencias = true;
                $id_referencia1 = $request['id_referencia1'];
            }
            $id_referencia2 = 'null';
            if (isset($records['id_referencia2'])) {
                $tiene_referencias = true;
                $id_referencia2 = $records['id_referencia2'];
            }


            /*
             * OBTENER SECUENCIA PARA EL DEBITO
             * si no esta creada crearla
             */
            //sentencia sql
            $sql = <<<EOD
SELECT * FROM ca_consecutivo_deb
WHERE id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND id_tipo_debito = $id_tipo_debito
EOD;

            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            /*
             * Validar si hay registro de secuencia debito
             */
            if (count($result) == 1) {

                //valores de la secuencia debito
                $sec_debito = $result[0]['consecutivo'] + 1;
                $this->logMessage("[caco_novedad_cont_estado] La secuencia = " . $sec_debito);
            } else {

                $sec_debito = 1;
                $this->logMessage("[caco_novedad_cont_estado] La secuencia = " . $sec_debito);
            }

            /*
             * VALIDAR SI SE GUARDAN LOS PERIODOS DEL DEBITO
             */
            $periodo_ini = 'null';
            $periodo_fin = 'null';
            if ($tiene_referencias) {

                if (isset($records['periodo_ini'])) {
                    $periodo_ini = " to_date('" . $records['periodo_ini'] . "','yyyy-mm-dd') ";
                }
                if (isset($records['periodo_fin'])) {
                    if ($records['periodo_fin'] != 'null' && $records['periodo_fin'] != '' && $records['periodo_fin'] != null) {
                        $periodo_fin = " to_date('" . $records['periodo_fin'] . "','yyyy-mm-dd') ";
                    }
                }
            }


            //sentencia sql ingresar CA_DEBITO
            $sql = <<<EOD
Insert into CA_DEBITO
    (ID_DEBITO,ID_ANHOS,ID_PUNTO_VENTA,ID_TIPO_DEBITO,SEC_DEBITO,ID_MAE_TER,FECHA_PROCESO,DIAS_PAGO,VALOR_BRUTO,
        VALOR_IVA,VALOR_DCTO,PORCEN_DCTO,VALOR_TOTAL,ID_MAE_TER_VEN,OBSERVACIONES,ID_TIP_MON,VALOR_MONEDA,
            TRM_DEBITO,ESTADO,FECHA_ANU,MOTIVO_ANU,PERIODO_INI,PERIODO_FIN,USUARIOLOG,
                ID_PR_TIPO_INGRE,FECHA_VENCIMIENTO)
    values (null,$id_anhos,$id_punto_venta,$id_tipo_debito,$sec_debito,$id_mae_ter, 
            to_date('$fecha_proceso','yyyy-mm-dd'),$dias_pago,$valor_bruto,$valor_iva,$valor_dcto,$porcen_dcto,$valor_total,$id_mae_ter_ven,
            $observaciones,$id_tip_mon,$valor_moneda,$trm_debito,1,null,null,$periodo_ini,$periodo_fin,
                '$username', $id_pr_tipo_ingre,to_date('$fecha_vence_rec','yyyy-mm-dd'))
EOD;

            //ejecuta el sql
            //CN_TABLE::executeSQL($sql);
            $conn->execute($sql);

            /*
             * INICIO ACTUALIZAR SECUENCIA DEBITO
             */
            if (count($result) == 1) {
                $this->logMessage("[caco_novedad_cont_estado] La secuencia existe.");

                //valores de la secuencia debito
                $sec_debito = $result[0]['consecutivo'] + 1;
                $id_consecutivo_deb = $result[0]['id_consecutivo_deb'];

                //sentencia sql actualizar valores  de secuencia debito
                $sql = <<<EOD
UPDATE CA_CONSECUTIVO_DEB SET consecutivo = $sec_debito  WHERE id_consecutivo_deb = $id_consecutivo_deb
EOD;

                //ejecuta el sql
                //CN_TABLE::executeSQL($sql);
                $conn->execute($sql);
                $this->logMessage("[caco_novedad_cont_estado] SQL de actualizacion secuencia debito: " . $sql);
            } else {
                $this->logMessage("[caco_novedad_cont_estado] La secuencia NO existe.");

                $sec_debito = 1;

                //sentencia sql
                $sql = <<<EOD
Insert into CA_CONSECUTIVO_DEB (ID_CONSECUTIVO_DEB,ID_TIPO_DEBITO,ID_ANHOS,ID_PUNTO_VENTA,CONSECUTIVO) 
                values ( null, $id_tipo_debito, $id_anhos, $id_punto_venta, $sec_debito)
EOD;
                //ejecuta el sql
                //CN_TABLE::executeSQL($sql);
                $conn->execute($sql);
                $this->logMessage("[caco_novedad_cont_estado] SQL de creacion secuencia debito: " . $sql);
            }

            /*
             * FIN ACTUALIZAR SECUENCIA DEBITO
             */

            /*
             * INICIO CREAR TRM
             */
            if (isset($request['crear_trm'])) {
                if ($request['crear_trm'] == "true") {

                    $this->logMessage("[caco_novedad_cont_estado] Crear registro TRM.");

                    //sentencia sql
                    $sql = <<<EOD
Insert into CA_TRM ( ID_TRM, ID_TIP_MON, FECHA_TRM, VALOR_TRM)
    values ( null, $id_tip_mon, to_date('$fecha_proceso','yyyy-mm-dd'), $trm_debito)
EOD;
                    //ejecuta el sql
                    //CN_TABLE::executeSQL($sql);
                    $conn->execute($sql);
                } else {

                    $this->logMessage("[caco_novedad_cont_estado] No Crear registro TRM.");
                }
            }

            /**
             * Ultimo registro insertado CA_DEBITO
             */
            $sql = <<<EOD
select * from CA_DEBITO
where id_debito = (
      select
      --max (id_debito)
      id_debito
      from CA_DEBITO
      where
      id_anhos = $id_anhos
      AND id_punto_venta = $id_punto_venta
      AND id_tipo_debito = $id_tipo_debito
      AND sec_debito = (
              SELECT CONSECUTIVO
              FROM ca_consecutivo_deb
              WHERE id_anhos = $id_anhos
              AND id_punto_venta = $id_punto_venta
              AND id_tipo_debito = $id_tipo_debito
      )
)
and id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND id_tipo_debito = $id_tipo_debito
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);
//            $this->logMessage("SQL DEBITO nueva. " . $sql);

            /*
             * Verifica que sea un registro para insertar las referencias del debito
             * y vienen registros para las referenciass
             */
            if (count($resultado) > 0) {

                $id_debito = $resultado[0]['id_debito'];

                /*
                 * INICIO registro saldo nuevo por vencimiento
                 */ {

                    //obtener vencimiento nuevo
                    //sentencia sql
                    $sql = <<<EOD
SELECT * FROM CA_VENCIMIENTOS
WHERE id_debito = $id_debito
EOD;

                    //ejecuta el sql
                    $result = CN_TABLE::executeSQL($sql);

                    //validar si hay registro de VENCIMIENTO
                    if (count($result) == 1) {

                        //valores de VENCIMIENTO
                        $id_vencimiento = $result[0]['id_vencimiento'];
                        $valor = $result[0]['valor'];

                        //registrar saldo nuevo
                        //sentencia sql
                        $sql = <<<EOD
Insert Into Ca_Saldos (Id_Debito, Id_Vencimiento, Id_Anhos, Id_Meses, Saldo_Anterior, Debitos_Mes, Creditos_Mes, Saldo_Actual)
    Values ( $id_debito, $id_vencimiento, $id_anhos,  Extract(Month From to_date('$fecha_proceso','yyyy-mm-dd') ), 0, $valor, 0, $valor)
EOD;
                        //ejecuta el sql
                        //CN_TABLE::executeSQL($sql);
                        $conn->execute($sql);
                        $this->logMessage("[caco_novedad_cont_estado] SQL de creacion saldo vencimientos: " . $sql);
                    } else {

                        $mensaje = "[caco_novedad_cont_estado] El vencimiento no existe.";
                        $this->status = 1;
                        $this->mensajeError = $mensaje;
                        $this->logMessage($mensaje);
                    }
                }
                /*
                 * FIN registro saldo nuevo por vencimiento
                 */

                /*
                 * INICIO variables por defecto para el registro de log
                 */ {
                    //obtiene el valor para su identificador unico
                    $id_tabla = $id_debito;

                    //validar vigencia
                    $id_vigencia = 'null';
                    if ($this->has_vigencia) {
                        if (isset($request['id_anhos'])) {
                            $id_vigencia = $request['id_anhos'];
                        }
                    }

                    //validar centro de operacion
                    $id_cen_op = 'null';
                    if ($this->has_cen_op) {
                        if (isset($request['id_cen_op'])) {
                            $id_cen_op = $request['id_cen_op'];
                        }
                    }

                    $id_cia = 'null';
                    if ($this->has_id_cia) {
                        if (isset($request['id_cia'])) {
                            $id_cia = $request['id_cia'];
                        }
                    }

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

                    //3 - indica operacion de adicionar de registro
                    $id_ope_bd = 3;

                    //id del maestro tercero
                    $id_mae_ter = 1;
                    if (isset($request['id_username'])) {
//                        $id_mae_ter = $request['id_username'];
                    }

                    //el username desde qebsafiERP
                    $usuario = 'admin';
                    if (isset($request['username'])) {
                        if ($request['username'] != '') {
                            $usuario = $request['username'];
                        }
                    } elseif (isset($request['username_log'])) {
                        if ($request['username_log'] != '') {
                            $usuario = $request['username_log'];
                        }
                    }
                    //Obtener id_mae_ter por usuario
                    //sentencia sql
                    $sql = <<<EOD
select * from INTERCEROS where num_doc = (select num_doc from usuario where username = '$usuario') 
EOD;
                    //ejecuta el sql
                    $rec = CN_TABLE::executeSQL($sql);
                    if (count($rec) > 0) {
                        $id_mae_ter = $rec[0]['id_mae_ter'];
                    }


                    //comando que identifica la funcionalidad
                    $comando = 'sin comando';
                    if (isset($request['comando'])) {
                        $comando = $request['comando'];
                    }

                    /*
                     * Construir observacion
                     */
                    $observacion = "'Se adiciono id_debito : " . $id_tabla . " desde la funcionalidad: " . $comando . "'";


                    $id_punto_venta_log = 'null';
                    if (isset($request['punto_venta_log'])) {
                        $id_punto_venta_log = $request['punto_venta_log'];
                    }
                }
                /*
                 * FNI variables por defecto para el registro de log
                 */

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

                if ($tiene_referencias) {
                    //sentencia sql
                    $sql = <<<EOD
Insert into CA_DEBITO_REF values ( $id_debito, $id_referencia1, '$id_referencia2')
EOD;
                    //ejecuta el sql
                    //CN_TABLE::executeSQL($sql);
                    $conn->execute($sql);
                    $this->logMessage("[caco_novedad_cont_estado] SQL de las referencias del debito: " . $sql);
                }
            }

            $this->logMessage("[caco_novedad_cont_estado] Total filas: " . count($resultado));
            return $resultado;
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "[caco_novedad_cont_estado] ERROR!!!";
            $this->logMessage("[caco_novedad_cont_estado] ERROR!!!");
            $this->logMessage($e->getMessage());
            return array();
        }
    }

    /**
     * Crear debito detalle
     * Se crean credito si existen para el producto - 20200312
     * 
     * @param type $id_debito
     * @param sfWebRequest $request 
     */
    public function crearDebitoDetalle($id_debito, sfWebRequest $request, $records, $conn) {

        $this->logMessage("[caco_novedad_cont_estado] Generar crearDebitoDetalle");

        /*
         * Manejo de errores
         */
        try {

            /*
             * Variables Obligatorias
             */
            $id_producto = $records['id_producto'];
            $cantidad = $records['cantidad'];
            $valor_unitario = $records['valor_unitario'];
            $valor_total = $records['valor_total'];

            /*
             * Variables Opcionales
             */
            $observaciones = 'null';
            if (isset($records['observaciones'])) {
                $observaciones = "'" . $records['observaciones'] . "'";
            }

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

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

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

            $por_iva = 0;
            if (isset($request['por_iva'])) {
                $por_iva = $request['por_iva'];
            }
            /*
             * Registro debito detalle
             */
            $sql = <<<EOD
Insert into CA_DEBITO_DETALLE 
(ID_DEBITO_DETALLE,ID_DEBITO,ID_PRODUCTO,CANTIDAD,VALOR_UNITARIO,VALOR_IVA,VALOR_DCTO,PORCEN_DCTO,VALOR_TOTAL,OBSERVACIONES,POR_IVA) 
values ( null, $id_debito, $id_producto, $cantidad, 
            $valor_unitario, $valor_iva, $valor_dcto, $porcen_dcto, $valor_total, $observaciones, $por_iva ) 
EOD;
            //ejecuta el sql
            //CN_TABLE::executeSQL($sql);
            $conn->execute($sql);
            $this->logMessage("[caco_novedad_cont_estado] Se registro debito detalle.");


            /**
             * Crear creditos segun reintegros - 20200312
             */
            $id_novedad_contrato = $records['id_novedad_contrato'];
            $tipo_valor = $records['tipo_valor'];

            //sentencia sql
            $sql = <<<EOD
SELECT
                    
(SELECT min(id_con_credito) FROM ca_con_credito where desc_corta = tab0.tipo_valor) as id_con_credito,                    
                    
tab0.id_novedad_reintegro,
tab0.id_contrato,
tab0.id_ts_td,
tab0.doc_soporte,
tab0.tipo_valor,
to_char(tab0.fecha_novedad,'yyyy-mm-dd') as fecha_novedad,
tab0.valor_reintegro,
tab0.observaciones,
tab0.fecha_log,
tab0.usuario_log,
tab0.valor_excedente,
tab0.id_credito,
reint.id_novedad_contrato,
tipval.nombre_tipo_valor

FROM caco_novedad_reintegro tab0

left join caco_nov_cont_reint reint
on reint.id_novedad_reintegro = tab0.id_novedad_reintegro

left join caco_tipo_valor_v tipval
on tipval.tipo_valor = tab0.tipo_valor

where
reint.id_novedad_contrato = $id_novedad_contrato
and tab0.tipo_valor = '$tipo_valor'
and tab0.id_credito is null

order by
tab0.fecha_novedad,
tipval.orden 
EOD;
            //ejecuta el sql
            $records_reint = CN_TABLE::executeSQL($sql);

            foreach ($records_reint as $value) {
                $this->logMessage("[caco_novedad_cont_estado] Generar records_reint.");

                /**
                 * Llamar al metodo de crear el credito
                 */
                $resultado = $this->crearCredito($id_debito, $request, $records, $conn, $value);
            }

            /**
             * Validar si tiene reintgros -20200619::LAVILA
             */
            if (count($records_reint) > 0) {
                if (!empty($resultado)) {
                    $this->logMessage("[caco_novedad_cont_estado] OK. Registros de credito creados correctamente.");
                } else {
                    throw new Exception('[caco_novedad_cont_estado] Error en creacion de creditos.');
                }
            }

            return $records;
        } catch (Exception $e) {

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

    /**
     * Crear credito segun reintegro - 20200312
     * 
     * @param type $id_debito
     * @param type $request
     * @param type $records
     * @param type $conn
     * @param type $rec_reint
     * @return type
     */
    public function crearCredito($id_debito, sfWebRequest $request, $records, $conn, $rec_reint) {

        $this->logMessage("[caco_novedad_cont_estado] Generar crearCredito");

        /*
         * Manejo de errores
         */
        try {

            $id_novedad_reintegro = $rec_reint['id_novedad_reintegro'];

            /*
             * Variables Obligatorias
             */
            $id_anhos = date('Y');
            $id_punto_venta = $request['punto_venta_log'];
            $id_tipo_credito = 1;
            $id_con_credito = $rec_reint['id_con_credito'];
//            $fecha_proceso = $request['fecha_proceso'];
            $fecha_proceso = CN_TABLE::fechaSistema();
            $id_bn = 'null';
            $id_cb = 'null';
            $num_doc = "'" . $rec_reint['doc_soporte'] . "'";
            $oficina = "'CONTRATOS'";
            $valor_excedente = $rec_reint['valor_excedente'];
            $valor_total = $valor_reintegro = $rec_reint['valor_reintegro'] - $valor_excedente;
            $valor_abono = $$valor_reintegro - $valor_excedente;
            $fecha_credito = $rec_reint['fecha_novedad'];
            $id_ts_td = "'" . $rec_reint['id_ts_td'] . "'";

            /*
             * Variables Opcionales
             */
            $observaciones_cre = 'null';
            if (isset($rec_reint['observaciones'])) {
                $observaciones_cre = "'" . $rec_reint['observaciones'] . "'";
            }

            /*
             * Validar username
             */
            if (isset($request['username'])) {
                $username = $request['username'];
            } else {
                if (isset($request['username_log'])) {
                    $username = $request['username_log'];
                } else {
                    $username = "Sin Identificar";
                }
            }

            /**
             * Obtener secuencia para el credito - si no esta creada crearla
             */
            $sql = <<<EOD
select * from ca_consecutivo_cre
where id_anhos = $id_anhos
and id_punto_venta = $id_punto_venta
and id_tipo_credito = $id_tipo_credito
EOD;

            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            // Validar si hay registro de secuencia credito
            if (count($result) == 1) {

                //valores de la secuencia credito
                $sec_credito = $result[0]['consecutivo'] + 1;
                $this->logMessage("[caco_novedad_cont_estado] La secuencia = " . $sec_credito);
            } else {

                $sec_credito = 1;
                $this->logMessage("[caco_novedad_cont_estado] La secuencia = " . $sec_credito);
            }


            /**
             * Crear credito
             */
            $sql = <<<EOD
insert into ca_credito (id_credito,id_anhos,id_punto_venta,id_tipo_credito,sec_credito,
    id_con_credito,fecha_proceso,id_bn,id_cb,num_doc,oficina,valor,observaciones,
        estado,fecha_anu,motivo_anu,fecha,id_ts_td,usuariolog,id_mae_ter,aplica_sigm) 
values (null, $id_anhos, $id_punto_venta, $id_tipo_credito, $sec_credito,
    $id_con_credito,to_date('$fecha_proceso','yyyy-mm-dd'),
        $id_bn,$id_cb,$num_doc,$oficina,$valor_total,$observaciones_cre,
            1 ,null,null,to_date('$fecha_credito','yyyy-mm-dd'),$id_ts_td,
                '$username',(select id_mae_ter from ca_debito where id_debito = $id_debito),0) 
EOD;

            //ejecuta el sql
            $conn->execute($sql);
            $this->logMessage("[caco_novedad_cont_estado] Se registro credito.");

            //ultimo registro insertado ca_credito
            $sql = <<<EOD
select
*
from ca_credito
where
id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND id_tipo_credito = $id_tipo_credito
AND sec_credito = $sec_credito 
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);

            if (count($resultado) > 0) {
                $id_credito = $resultado[0]['id_credito'];
            }


            /**
             * Generar excedente
             */
            if ($valor_excedente > 0) {
                $this->logMessage("[caco_novedad_cont_estado] Se registro excedente.");

                $sql = <<<EOD
Insert into CA_EXCEDENTES (ID_EXCEDENTE,ID_CREDITO,VALOR,EN_USO,
    ID_CREDITO_APLICADO,ID_NOV_DEVOL_EXCED,ID_MAE_TER) 
values (null,'$id_credito','$valor_excedente','0',
    null,null,null)  
EOD;
                //ejecuta el sql
                $conn->execute($sql);
            }

            /**
             * Actualizamos reitegro con el id_credito creado
             */
            $this->logMessage("[caco_novedad_cont_estado] Registro de id_credito de la novedad de reintegro.");

            $sql = <<<EOD
update caco_novedad_reintegro set id_credito = $id_credito 
    where id_novedad_reintegro = $id_novedad_reintegro 
EOD;
            //ejecuta el sql
            $conn->execute($sql);


            /*
             * INICIO ACTUALIZAR SECUENCIA credito
             */
            if (count($result) == 1) {
                $this->logMessage("[caco_novedad_cont_estado] La secuencia existe.");

                //valores de la secuencia credito
                $sec_credito = $result[0]['consecutivo'] + 1;
                $id_consecutivo_cred = $result[0]['id_consecutivo_cred'];

                //sentencia sql actualizar valores  de secuencia credito
                $sql = <<<EOD
update ca_consecutivo_cre set consecutivo = $sec_credito  
    where id_consecutivo_cred = $id_consecutivo_cred
EOD;

                //ejecuta el sql
                $conn->execute($sql);
                $this->logMessage("[caco_novedad_cont_estado] SQL de actualizacion secuencia credito: " . $sql);
            } else {
                $this->logMessage("[caco_novedad_cont_estado] La secuencia NO existe.");
                $sec_credito = 1;

                //sentencia sql
                $sql = <<<EOD
insert into ca_consecutivo_cre (id_consecutivo_cred,id_tipo_credito,id_anhos,id_punto_venta,consecutivo) 
values ( null, $id_tipo_credito, $id_anhos, $id_punto_venta, $sec_credito)
EOD;
                //ejecuta el sql
                $conn->execute($sql);
                $this->logMessage("[caco_novedad_cont_estado] SQL de creacion secuencia credito: " . $sql);
            }


            /**
             * Crear detalle credito
             */
            //obtener vencimientos de los debitos a aplicar, con estado 1 y cancelado 0
            $sql = <<<EOD
select ven.*,
'Se registra débito detalle del débito sec. ' || deb.sec_debito || ' por valor total = ' || deb.valor_total  as  observaciones,
deb.id_tip_mon
from ca_vencimientos ven
join ca_debito deb  on ven.id_debito = deb.id_debito
where ven.id_debito in ($id_debito)
and ven.estado = 1  
and ven.cancelado = 0  
EOD;

            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            $cantidad_vec = count($result);

            $sum_notas_credito = 0;
            //recorre todos los vencimientos
            foreach ($result as $rec) {

                //$id_debito = $rec['id_debito'];
                $id_vencimiento = $rec['id_vencimiento'];
                $valor_venc = $rec['valor'];
                $observaciones_det = $rec['observaciones'];
                $id_tip_mon = $rec['id_tip_mon'];
                $id_debito_sald = $rec['id_debito'];


                /*
                 * validar si se paga un vencimiento completo o se completa un abono anterior
                 * Se verifica creditos activos, y valor completo de todos - 20190530
                 */
                $sql = <<<EOD
select sum(det.valor_bruto) as valor_bruto 
from ca_credito_detalle det 
join ca_credito cred on det.id_credito = cred.id_credito
where det.id_vencimiento = $id_vencimiento and cred.estado = 1 
EOD;

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

                // se completa un abono anterior, se paga con valor de abono
                if (count($records) != 0 && $records[0]['valor_bruto'] != 0) {
                    $valor_venc = $valor_venc - $records[0]['valor_bruto'];
                }

                $sum_notas_credito = $sum_notas_credito + $valor_venc;

                // Crear detalle del credito
                $sql = <<<EOD
insert into ca_credito_detalle (id_credito_detalle,id_credito,id_vencimiento,valor_bruto,valor_retenciones,valor_abono,
    id_tip_mon,valor_total_moneda,trm_credito,diferencia_cambio,observaciones) 
values (null,$id_credito,$id_vencimiento, $valor_abono, 0, $valor_abono,
    $id_tip_mon, 0, 1, 0, '$observaciones_det')  
EOD;
                //ejecuta el sql
                $conn->execute($sql);

                $sql = <<<EOD

update ca_saldos
set creditos_mes = creditos_mes + $valor_abono,
saldo_actual = saldo_actual - $valor_abono                            
where id_debito = $id_debito_sald and id_vencimiento = $id_vencimiento 
and id_anhos = to_char(sysdate, 'yyyy') and id_meses = to_char(sysdate, 'mm')

EOD;

                CN_TABLE::executeSQL($sql, true);

                /*
                 * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
                 */
                $id_tabla = $id_vencimiento;

                $id_cen_op = 'null';
                $id_cia = 'null';

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

                $id_ope_bd = 3;

                //id del maestro tercero
                $id_mae_ter_log = 1;
                if (isset($request['id_username'])) {
//                    $id_mae_ter_log = $request['id_username'];
                }

                //el username desde qebsafiERP
                $usuario = 'admin';
                if (isset($request['username'])) {
                    if ($request['username'] != '') {
                        $usuario = $request['username'];
                    }
                } elseif (isset($request['username_log'])) {
                    if ($request['username_log'] != '') {
                        $usuario = $request['username_log'];
                    }
                }
                //Obtener id_mae_ter por usuario
                //sentencia sql
                $sql = <<<EOD
select * from INTERCEROS where num_doc = (select num_doc from usuario where username = '$usuario') 
EOD;
                //ejecuta el sql
                $rec = CN_TABLE::executeSQL($sql);
                if (count($rec) > 0) {
                    $id_mae_ter_log = $rec[0]['id_mae_ter'];
                }

                //comando que identifica la funcionalidad
                $comando = 'sin comando';
                if (isset($request['comando'])) {
                    $comando = $request['comando'];
                }

                $observacion = "'Se adiciono id: $id_vencimiento de un vencimiento para el detalle del id_credito $id_credito desde la funcionalidad: caco_novedad_cont_estado por valor de $valor_abono'";

                $this->logMessage("[caco_novedad_cont_estado] " . $observacion . ".\n");
                CN_TABLE::registroTableLog($id_tabla, $id_anhos, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

                //Verifica si es el total del vencimiento
                if ($valor_abono == $valor_venc) {
                    $this->logMessage("[caco_novedad_cont_estado] Verifica si es el total del vencimiento.\n");

                    //actualizo el vencimiento
                    $sql = <<<EOD
update ca_vencimientos
set cancelado = 1
where id_vencimiento = $id_vencimiento  
EOD;
                    //ejecuta el sql
                    $conn->execute($sql);
                }
                //Verifica si es el total del vencimiento es mayor no registra - 20200317
                if ($valor_abono > $valor_venc) {
                    throw new Exception('[caco_novedad_cont_estado] El valor del reintegro(' . $valor_abono . ') supera el valor de saldo del debito(' . $valor_venc . ').');
                }
            }

            return $records;
        } catch (Exception $e) {

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

}
