<?php

/**
 * Creado 20190307
 * credito_completo actions.
 * 
 * Link Prueba::
 * http://soporte14.sofhouse.net/cartera/web/api_dev.php/api/credito_completo/list.json?pin=91&id_tipo_pago=1&valor_total=391372&fecha_credito=03/10/2016&num_doc=23922423&correo=aaa&id_obligacion=2500
 * http://10.0.100.66/cartera/web/api_dev.php/api/credito_completo/list.json?pin=20170606092049&id_tipo_pago=68&valor_total=35633807&fecha_credito=06/06/2017&num_doc=20170606092049&correo=soceacmin@hotmail.com&id_obligacion=65954
 *
  update ca_vencimientos set cancelado = 0 where id_vencimiento = 33961;
  DELETE FROM ca_credito_detalle where id_credito >= 35510;
  DELETE FROM ca_credito where id_credito >= 35510;
  update ca_saldos set saldo_actual = saldo_anterior, creditos_mes = 0 where id_vencimiento = 33961 and id_anhos = 2016 and id_meses = 10;
 * 
 * @package    cartera
 * @subpackage credito_completo
 * @author     Your name her
 * @version    SVN: $Id: actions.class.php 23810 2015-09-30
 */
class credito_completoActions extends sfActions {

    /**
     * Executes list action
     * Metodo para crear un Credito, con varios detalles
     * Crea Cabecera del credito
     * Crea Detalles del credito
     * Retorna el Credito Creado
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //TODO ADICIONAR COLUMNA ERROR EN CA LOG CREDITO
        //Log especifico de procesos completos
        $logPath = sfConfig::get('sf_log_dir') . '/credito_completo.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));
        $this->custom_logger->info("[CREDITO_COMPLETO] Servicio executeList credito_completo.\n");
        $this->custom_logger->info("---BEGIN Logging request--- (Revisar log proceso_completo.log)");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->custom_logger->info("[CREDITO_COMPLETO] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[CREDITO_COMPLETO] request[$key] = $value");
        }
        $this->custom_logger->info("---END Logging request");

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

        $id_log_credito = 0;
        //Adicion de campos para log - 20170627
        $id_mae_ter = '';
        $cod_titulo = '';
        $this->parameters = true;

        //Cargar parametricas
        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_punto_venta'  
EOD;

        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_punto_venta = $result[0]['valor']; //ca_parametrica
        }

        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_tipo_debito'  
EOD;

        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_tipo_debito = $result[0]['valor']; //ca_parametrica
        }

        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_tip_mon'  
EOD;

        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_tip_mon = $result[0]['valor']; //ca_parametrica
        }

        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_pr_tipo_ingre'  
EOD;

        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_pr_tipo_ingre = $result[0]['valor']; //ca_parametrica
        }

        //sentencia sql
        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_tipo_credito'  
EOD;
        //ejecuta el sql
        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_tipo_credito = $result[0]['valor']; //ca_parametrica   
        }
        //sentencia sql
        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_con_credito_pse_codbar'  
EOD;
        //ejecuta el sql
        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_con_credito = $result[0]['valor']; //ca_parametrica
        }
        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_bn'  
EOD;
        //ejecuta el sql
        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_bn = $result[0]['valor']; //ca_parametrica
        }
        $sql = <<<EOD
select * from ca_parametrica@CAN.ANM.LOCAL
where 
alias = 'id_cb'  
EOD;
        //ejecuta el sql
        $result = CN_TABLE::executeSQL($sql);
        if (count($result) > 0) {
            $id_cb = $result[0]['valor']; //ca_parametrica
        }

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

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

        //  1- CONSULTAR, 2- ACTUALIZAR, 3 - ADICIONAR, 4 - ELIMINAR, 5 - ANULAR
        $id_ope_bd = 3;
        //id del maestro tercero
        $id_mae_ter_log = 1;
        $usuario = 'admin';
        $comando = 'credito_completo';
        //construir observacion
        $observacion = "'Se ingreso a generar credito desde servicio web credito completo'";

        //Manejo de errores
        //Variables obligatorias
        $id_anhos = date('Y');
        $fecha_proceso = CN_TABLE::fechaSistema();
        try {
            // Registro de consulta en tabla de log
            $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");
            CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

            // Variables de retorno
            $resultado = array();
            $valor_credito_rev = 0;
            $cantidad_vec = 0;

            //revisar para dejar parametrizado        
            $this->valor_total = 0;

            /*
             * Tipo de pago (75    CODIGO DE BARRAS    COD BAR, 68    PSE - PROVEEDOR SERVICIOS ELEC    PSE  )
             */
            if (isset($request['valor_total']) && isset($request['fecha_credito']) && isset($request['num_doc']) && isset($request['pin']) && isset($request['id_tipo_pago']) && isset($request['correo']) && isset($request['id_obligacion'])) {
                //Inicializacion de parametros de entrada
                $this->valor_total = $request['valor_total'];
                //input format dd/mm/yyyy
                $this->fecha_credito = $request['fecha_credito'];
                $this->pin = $request['pin'];
                $this->id_tipo_pago = $request['id_tipo_pago'];
                $this->id_obligacion = $request['id_obligacion'];
            } else {
                $this->parameters = false;
                throw new Exception("Falta alguno de los parámetros obligatorios (pin, id_tipo_pago, valor_total, fecha_credito, num_doc, correo, id_obligacion)");
            }

            //Incidente #17127, Se desactiva servicio de pago canon - 20200505::LAVILA
            throw new Exception("Incidente #17127, Se desactiva servicio de pago canon.");

            /**
             * Incidente #6059, calcula para cada mes el valor para cada tasa, no el total por todo el tiempo - 20170531
             */
            $valor_usura = 0;

            /*
             * Traer si es de usuara y fecha_pago_oportuno 
             * Se valida optener el valor correcto si el titulo aplica usura - 20170623
             */
            /*Se cambia para que tome el saldo actual del debito, y no completa la anualidad cambio debi.valor_bruto por sal.saldo_actual - 20190909*/ 
            /*Se toma la fecha de vencimiento si no es valor completo sino saldo - 20191004*/ 
            $sql = <<<EOD
select 
tab0.id_obligacion,tab0.id_titulo,tab0.cod_titulo,
to_char(to_date(tab0.fecha_pago_oportuno, 'dd/mm/yyyy'), 'yyyy-mm-dd') as fecha_pago_oportuno,
to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'yyyy-mm-dd') as fecha_pago,                   
tab0.valor, tab0.aplica_usura, tab0.valor_capital

from(

  select tab0.id_obligacion,tab0.id_titulo,tab0.cod_titulo,tab0.fecha_pago_oportuno,tab0.concepto2,tab0.valor,
  tab0.aplica_usura, tab0.valor_capital                  
      
   from (
    
    select 
    det.id_etapa,
    det.anualidad, 
    det.id_anual_etapa as id_obligacion, tit.id_titulo, tit.cod_titulo, 
        
    /*to_char(ae.fecha_inicio+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end), 'dd/mm/yyyy') as fecha_pago_oportuno,*/ 
    to_char(trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end)), 'dd/mm/yyyy') as fecha_pago_oportuno, 
   
    wmsys.wm_concat(debi.observaciones) as concepto2, 
    sum(sal.saldo_actual) as valor,
    case
      when ti.aplica_usura=0 then 0
      else 1
    end as aplica_usura,
    nvl(sum(sal.saldo_actual),0) as valor_capital     
                    
    from ca_det_liq_canon@can.anm.local det
                    
    join rmn_titulo@can.anm.local tit on det.id_titulo=tit.id_titulo
    join ca_anual_etapa@can.anm.local ae on det.id_anual_etapa=ae.id_anual_etapa
    join ca_recibo@can.anm.local rec on det.id_det_liq_canon=rec.id_det_liq_canon and det.vigencia = rec.vig_liq
    --join ca_recibo_debito_v rdv on rec.id_recibo = rdv.id_recibo and rec.vigencia = rdv.vigencia
    join ca_recibo_debito@can.anm.local rd on rd.id_recibo =  rec.id_recibo and rd.vigencia=rec.vigencia
    join ca_debito debi on debi.id_debito=rd.id_debito 
    join ca_vencimientos vence on debi.id_debito=vence.id_debito 
    join ca_saldos sal on rd.id_debito=sal.id_debito and sal.id_anhos=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'yyyy') and sal.id_meses=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'mm')
    --Se agrega estado de tasa, para que tome la actual - 20170512
    join ca_titulo_tasa@can.anm.local tt on tt.id_titulo = det.id_titulo and tt.estado = 1
    left join ca_tasa_interes@can.anm.local ti on tt.id_tasa_interes = ti.id_tasa_interes
    join ca_tasa_interes@can.anm.local tiact on tiact.vigencia=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'yyyy') and tiact.id_meses=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'mm')
    where 
    --Liquidaciones aprobadas
    det.aprobado=1 and det.anulado=0
    --ND activas
    and debi.estado=1
    and sal.saldo_actual!=0
    -- Solo pagos completos de anualidades 
    --and det.valor=sal.saldo_actual
    
    group by 
    det.id_etapa,
    det.anualidad, 
    det.id_anual_etapa, tit.id_titulo, tit.cod_titulo, ae.fecha_inicio, ae.fecha_fin, ti.aplica_usura, ti.valor, tiact.valor, rec.cod_bar, rec.id_recibo, rec.vigencia, vence.fecha_vence

    having
    --Solo pagos completos de anualidades,Se coloca en having, ya que por ser 2 debitos el detalle se duplica, valida el total de saldo con el del detalle - 20161125 
    --sum(sal.saldo_actual) = avg(det.valor)    
    sum(sal.saldo_actual) <= avg(det.valor)                    
                    
  )tab0

)tab0

where id_obligacion = $this->id_obligacion  
EOD;

            //ejecuta y obtiene el resultado del sql
            $records = CN_TABLE::executeSQL($sql, true);
            if (count($records) == 0) {
                throw new Exception("El identificador id_obligacion no es valido.");
            }
            $aplica_usura = $records[0]['aplica_usura'];
            $fecha_pago_oportuno = $records[0]['fecha_pago_oportuno'];
            $fecha_pago = $records[0]['fecha_pago'];
            $valor_capital = $records[0]['valor_capital'];

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

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

                $sql_total = ' ';
                //echo $comparar_req . '-' . $comparar;
                $tag = false;

                //Recorre cada mes y coloca un registro por tasa
                while ($comparar_req <= $comparar) {


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

                    /* Se valida Incidente #9150 - 20190221*/
                    $sql = <<<EOD
select 
case when to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') else to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd') end as fecha_pago_oportuno,
case when to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_pago', 'yyyy-mm-dd') else last_day(to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd')) end as fecha_pago,                            
$valor_capital as valor_capital,
nvl((select max(tas.id_tasa_interes) as id_tasa_interes from ca_tasa_interes@CAN.ANM.LOCAL tas where tas.vigencia = $anho_req and tas.id_meses = $mes_req),1) as id_tasa_interes,                            
$comparar_req as comparar_req  
from dual 
EOD;

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

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

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

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

                    $sql_total .= $sql;
                }

                //echo $sql_total;
                //Validar que hay sql para consulta - 20180124
                if (strlen($sql_total) > 10) {

                    /**
                     * Incidente #6543, calcula para cada mes el valor para cada tasa, no el total por todo el tiempo - 20170630
                     * Calculo Trimestral - 20170704
                     */
                    $sql_total = "
select sum(nvl(VALOR_INTERES,0)) as VALOR_INTERES from(

select

max(int.comparar_req) as comparar_req,
min(FECHA_PAGO_OPORTUNO) as FECHA_PAGO_OPORTUNO,
max(FECHA_PAGO) as FECHA_PAGO,
to_char(FECHA_PAGO, 'yyyy') as vigencia,
LISTAGG(to_char(FECHA_PAGO, 'mm'), ',') WITHIN GROUP (ORDER BY mes.id_meses) as mes,
mes.trimestre,
VALOR_CAPITAL,
TI.nombre,
TI.valor as tasa,
sum(TRUNC(INT.FECHA_PAGO)-TRUNC(INT.FECHA_PAGO_OPORTUNO)+1) AS DIAS_MORA,
--ROUND((POWER((1+(TI.VALOR/100)), (1/365))-1)*VALOR_CAPITAL*(NVL(TRUNC(INT.FECHA_PAGO)-TRUNC(INT.FECHA_PAGO_OPORTUNO)+1,0))) AS VALOR_INTERES
ROUND((POWER((1+(TI.VALOR/100)), ( sum((NVL(TRUNC(INT.FECHA_PAGO)-TRUNC(INT.FECHA_PAGO_OPORTUNO)+1,0)))/365))-1)*VALOR_CAPITAL) AS VALOR_INTERES

from(

$sql_total

)INT 

JOIN CA_TASA_INTERES@CAN.ANM.LOCAL TI ON INT.ID_TASA_INTERES=TI.ID_TASA_INTERES
left join meses@CAN.ANM.LOCAL mes on mes.id_meses = ti.id_meses

group by
to_char(FECHA_PAGO, 'yyyy'),
mes.trimestre,
VALOR_CAPITAL,
TI.nombre,
TI.valor

/*order by int.comparar_req*/

)";

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

                    $valor_usura = $records[0]['valor_interes'];
                } else {

                    $valor_usura = 0;
                }

                //echo 'valor_usura::' . $valor_usura;
                //die();
            }

            //Consultar debitos a pagar
            /*Se valida Incidente #9150 - 20190221*/
            /*Se cambia para que tome el saldo actual del debito, y no completa la anualidad cambio debi.valor_bruto por sal.saldo_actual - 20190909*/ 
            $sql = <<<EOD

select 
tab0.id_obligacion,tab0.id_titulo,tab0.cod_titulo,tab0.fecha_pago_oportuno,
tab0.valor,tab0.valor_intereses,
tab0.fecha_inicio_anu,tab0.fecha_fin_anu,tab0.num_pin,tab0.fecha_generacion_recibo,tab0.fecha_vencimiento_recibo,tab0.dias_mora,
tab0.tasa_interes_aplicada,
tab0.valor_total, to_char(tab0.id_debitos) as id_debitos,tab0.id_recibo,tab0.vig_rec, to_char(tab0.concepto2) as concepto 
from(
  select tab0.id_obligacion,tab0.id_titulo,tab0.cod_titulo,tab0.fecha_pago_oportuno,tab0.concepto2,tab0.valor,tab0.valor_intereses,
  tab0.fecha_inicio_anu,tab0.fecha_fin_anu,tab0.num_pin,tab0.fecha_generacion_recibo,tab0.fecha_vencimiento_recibo,tab0.dias_mora,
  tab0.tasa_interes_aplicada, round(tab0.valor+valor_intereses) as valor_total, tab0.id_debitos, tab0.id_recibo, tab0.vig_rec from (
    
    select 
    det.id_etapa,
    det.anualidad,
    det.id_anual_etapa as id_obligacion, tit.id_titulo, tit.cod_titulo, 
    to_char((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end), 'dd/mm/yyyy') as fecha_pago_oportuno,
    wmsys.wm_concat(debi.observaciones) as concepto2, 
    sum(sal.saldo_actual) as valor,
                                        
    -- IM=K X (TU/366) X n (IM: Intereses en mora, TU: Tasa de interes, n: Numero de dias en mora) 
    --Interés periódico= [(1+i)^(1/365) ]-1                
    case
    -- no hay intereses cuando la fecha de pago oportuno no ha llegado
    /* Se deja que opere si es el mismo dia de pago, para que tenga en cuenta 1 dia de liq - 20170922 */ 
    when trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy')) < trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)) then 0
    -- aplica formula con tasa de interes sin usura; la que aplique para ese titulo
    when ti.aplica_usura=0 
    --then round((power((1+(ti.valor/100)), ((nvl(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy'))-trunc(ae.fecha_inicio)+1,0))/365))-1)*nvl(sum(debi.valor_bruto),0))   
    --then consulta_sql_interes_normal@CAN.ANM.LOCAL(to_number(to_char(trunc(ae.fecha_inicio),'yyyy')),to_number(to_char(trunc(ae.fecha_inicio),'mm')),to_number(to_char(trunc(ae.fecha_inicio),'dd')),to_number(to_char(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy')),'yyyy')),to_number(to_char(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy')),'mm')),to_char(trunc(ae.fecha_inicio),'yyyy-mm-dd'),to_char(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy')),'yyyy-mm-dd'),NVL(sum(debi.valor_bruto),0), tt.id_tasa_interes )                
    then consulta_sql_interes_normal@CAN.ANM.LOCAL(to_number(to_char(trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end)),'yyyy')),to_number(to_char(trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end)),'mm')),to_number(to_char(trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end)),'dd')),to_number(to_char(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy')),'yyyy')),to_number(to_char(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy')),'mm')),to_char(trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end)),'yyyy-mm-dd'),to_char(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy')),'yyyy-mm-dd'),NVL(sum(sal.saldo_actual),0), tt.id_tasa_interes )                
                    
    -- aplica formula con tasa de usuara vigente 
    --else round((power((1+(tiact.valor/100)), (1/365))-1)*nvl(sum(debi.valor_bruto),0)*(nvl(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy'))-trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)),0)))
    -- calculado por mes - 20170531
    else $valor_usura               
    --valor intereses
    end as valor_intereses,
                    
    to_char((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end), 'dd/mm/yyyy') as fecha_inicio_anu,
    to_char(ae.fecha_fin, 'dd/mm/yyyy') as fecha_fin_anu, 
    rec.cod_bar as num_pin, 
    to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'dd/mm/yyyy HH24:MI:SS') as fecha_generacion_recibo,
    case 
      when trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy'))<=trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)) then to_char((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end), 'dd/mm/yyyy')
      else to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'dd/mm/yyyy') 
    end as fecha_vencimiento_recibo,
    --dias de mora
    case 
      when trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy'))<=trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end)) then 0
      else nvl(trunc(to_date('$this->fecha_credito', 'dd/mm/yyyy'))-trunc((case when max(det.valor) != sum(sal.saldo_actual) then vence.fecha_vence else ae.fecha_inicio end)+(case when det.id_etapa = 1 and det.anualidad = 1 then 4 else 0 end))+1,0) 
    end as dias_mora,
    -- tasa de interes aplicada
    case
      when ti.aplica_usura=0 then ti.valor
      else tiact.valor
    end as tasa_interes_aplicada,
    wmsys.wm_concat(rd.id_debito) as id_debitos,
    rec.id_recibo,
    rec.vigencia as vig_rec
                    
    from ca_det_liq_canon@can.anm.local det
    join rmn_titulo@can.anm.local tit on det.id_titulo=tit.id_titulo
    join ca_anual_etapa@can.anm.local ae on det.id_anual_etapa=ae.id_anual_etapa
    join ca_recibo@can.anm.local rec on det.id_det_liq_canon=rec.id_det_liq_canon and det.vigencia = rec.vig_liq
    --join ca_recibo_debito_v rdv on rec.id_recibo = rdv.id_recibo and rec.vigencia = rdv.vigencia
    join ca_recibo_debito@can.anm.local rd on rd.id_recibo =  rec.id_recibo and rd.vigencia=rec.vigencia
    join ca_debito debi on debi.id_debito=rd.id_debito 
    join ca_vencimientos vence on debi.id_debito=vence.id_debito 
    join ca_saldos sal on rd.id_debito=sal.id_debito and sal.id_anhos=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'yyyy') and sal.id_meses=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'mm')
    --Se agrega estado de tasa, para que tome la actual - 20170512
    join ca_titulo_tasa@can.anm.local tt on tt.id_titulo = det.id_titulo and tt.estado = 1
    left join ca_tasa_interes@can.anm.local ti on tt.id_tasa_interes = ti.id_tasa_interes
    join ca_tasa_interes@can.anm.local tiact on tiact.vigencia=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'yyyy') and tiact.id_meses=to_char(to_date('$this->fecha_credito', 'dd/mm/yyyy'), 'mm')
    where 
    --Liquidaciones aprobadas
    det.aprobado=1 and det.anulado=0
    --ND activas
    and debi.estado=1
    and sal.saldo_actual!=0
    -- Solo pagos completos de anualidades 
    --and det.valor=sal.saldo_actual
    
    group by 
    det.id_etapa,
    det.anualidad,
    det.id_anual_etapa, tit.id_titulo, tit.cod_titulo, ae.fecha_inicio, ae.fecha_fin, ti.aplica_usura, ti.valor, tiact.valor, rec.cod_bar, rec.id_recibo, rec.vigencia, tt.id_tasa_interes, vence.fecha_vence

    having
    -- Solo pagos completos de anualidades,Se coloca en having, ya que por ser 2 debitos el detalle se duplica, valida el total de saldo con el del detalle - 20161125 
    --sum(sal.saldo_actual) = avg(det.valor) 
    sum(sal.saldo_actual) <= avg(det.valor)                  
                    
    )tab0

)tab0

where id_obligacion=$this->id_obligacion                   

EOD;
            //echo 'sql::' . $sql;
            //die();
            $records = CN_TABLE::executeSQL($sql, true);
            if (count($records) == 0) {
                throw new Exception("El identificador id_obligacion no es valido!");
            }

            //Capturar debitos a pagar
            $id_debito_var = $records[0]['id_debitos'];
            $id_recibo = $records[0]['id_recibo'];
            $vig_rec = $records[0]['vig_rec'];
            $cod_titulo = $records[0]['cod_titulo'];
            $id_obligacion = $records[0]['id_obligacion'];
            $id_titulo = $records[0]['id_titulo'];

            //$valor_bruto_recibo = $records[0]['valor_bruto'];
            $valor_total_recibo = $records[0]['valor_total'];
            $valor_interes_recibo = $records[0]['valor_intereses']; //$this->valor_total - $records[0]['valor']; 
            $fecha_activacion_pin = $this->fecha_credito;

            /**
             * Validar coherencia del pago con el pin activado anteriormente
             * Se quita control para dejar pagar, Incidente #5832 - 20170404
             */
            $valor_total_recibo = $this->valor_total;
            if ($valor_total_recibo != $this->valor_total) {
                throw new Exception("El valor real pagado no corresponde al valor esperado de pago valor esperado: $valor_total_recibo; valor pagado: " . $this->valor_total);
            }

            //Crear debito de intereses si los tiene
            $id_debito_interes = 0;
            if ($valor_interes_recibo != 0) {
                //Setear datos requeridos para crear el debito
                $debito_info = array();
                $debito_info['valor_interes_recibo'] = $valor_interes_recibo;

                $sql = <<<EOD

select * from ca_debito where id_debito in ($id_debito_var)

EOD;

                $records = CN_TABLE::executeSQL($sql, true);
                if (count($records) == 0) {
                    throw new Exception("El o los débitos de la anualidad son invalidos");
                }

                //Tomar el tercero de la ND original como refeencia para la creacion de la ND intereses
                $id_mae_ter = $debito_info['id_mae_ter'] = $records[0]['id_mae_ter'];
                //Variables de la ND
                $debito_info['id_punto_venta'] = $id_punto_venta;
                $debito_info['id_tipo_debito'] = $id_tipo_debito;
                $debito_info['id_tip_mon'] = $id_tip_mon;
                $debito_info['username'] = $usuario;
                $debito_info['cod_titulo'] = $cod_titulo;
                $debito_info['id_obligacion'] = $id_obligacion;
                $debito_info['fecha_activacion_pin'] = $fecha_activacion_pin;
                $debito_info['id_pr_tipo_ingre'] = $id_pr_tipo_ingre;
                //Crear ND
                $id_debito_interes = $this->crearDebito($debito_info, $request);

                //Adicionar id_debito interes a las ND a pagar
                $id_debito_var = $id_debito_var . ',' . $id_debito_interes;
            }

            //Validar que el valor bruto del recibo sea igual a la suma del valor de las notas debito a  pagar
            $sql = <<<EOD

select round(sum(sal.saldo_actual)) as sum_valor_nd from ca_saldos sal
where id_debito in ($id_debito_var) and sal.id_anhos=to_char(sysdate, 'yyyy') 
and sal.id_meses=to_char(sysdate, 'mm')

EOD;

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

            if (count($records) != 0) {
                $sum_notas_debito = $records[0]['sum_valor_nd'];
                if ($valor_total_recibo != $sum_notas_debito) {
                    throw new Exception("Ha ocurrido un error: Las notas debito a pagar suman un total de $sum_notas_debito y el total recibido del pago fue de $valor_total_recibo");
                }
            } else {
                throw new Exception('Ha ocurrido un error en la verificacion de los saldos de las notas debito');
            }

            //sentencia sql
            $sql = <<<EOD
select
ter.id_mt_ubi,
ter.mail as mail,
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,
deb.id_mae_ter
from ca_vencimientos ven
join ca_debito deb  on ven.id_debito = deb.id_debito
                    
left join interceros_du_dir_v ter
on ter.id_mae_ter = deb.id_mae_ter
                    
where ven.id_debito in ($id_debito_var)
and ven.estado = 1  
and ven.cancelado = 0
EOD;

            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);
            $id_mae_ter = 1;
            $email = '';
            if (isset($request['correo'])) {
                $email = $request['correo'];
            }
            if (count($result) > 0) {
                $id_mae_ter = $result[0]['id_mae_ter']; //tercero del debito
                $id_mt_ubi = $result[0]['id_mt_ubi']; //id_mt_ubi del tercero

                /**
                 * Actualiza el correo del tercero - 20160601
                 */
                if ($id_mt_ubi == null || $id_mt_ubi == '' || $id_mt_ubi == 'null') {
                    $sql = <<<EOD
Insert into INTERCER_DU (ID_MT_UBI,ID_MAE_TER,ID_LOC_DIR,WEB_SITE,MAIL,CONTACTO,CARGO_CON,AP_AEREO,MAIL_CON,ID_PAIS,COPDEPTO,CIUDAD) 
values (null,'$id_mae_ter','1',null,'$email',null,null,null,null,'49','11','BOGOTA') 
EOD;

                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                } else {
                    $sql = <<<EOD
update intercer_du
set mail = '$email'
where id_mae_ter = $id_mae_ter
and id_mt_ubi = $id_mt_ubi  
EOD;

                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                }
            }

            $num_doc = 'null';
            if (isset($request['num_doc'])) {
                $num_doc = $this->pin;
            }
            $oficina = 'null';
            if (isset($request['oficina'])) {
                $oficina = "'" . $request['oficina'] . "'";
            }

            $sql = <<<EOD
                                
select 
WMSYS.wm_concat('Nota Débito No.'||deb.sec_debito||' '||prod.descripcion||' de fecha '||to_char(deb.fecha_proceso, 'dd/mm/yyyy')) as desc_concepto_prod
from ca_debito deb
join ca_debito_detalle debdet on deb.id_debito=debdet.id_debito
join ca_producto prod on debdet.id_producto= prod.id_producto
where deb.id_debito in ($id_debito_var)


EOD;

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

            if (count($result) != 0) {
                $conceptos_deb = $result[0]['desc_concepto_prod'];
            } else {
                $conceptos_deb = '';
            }

            $sql = <<<EOD

select e.nombre as nombre_etapa, ae.anualidad        
from ca_anual_etapa@CAN.ANM.LOCAL ae
join ca_titulo_etapa@CAN.ANM.LOCAL te on te.id_titulo_etapa=ae.id_titulo_etapa
join ca_etapa@CAN.ANM.LOCAL e on te.id_etapa=e.id_etapa
where ae.id_anual_etapa=$id_obligacion

EOD;

            $records = CN_TABLE::executeSQL($sql, true);
            if (count($records) == 0) {
                throw new Exception("La obligación a pagar es invalida");
            } else {
                $nom_etapa = $records[0]['nombre_etapa'];
                $anu = $records[0]['anualidad'];
            }
            //Tipo de pago (75    CODIGO DE BARRAS    COD BAR, 68    PSE - PROVEEDOR SERVICIOS ELEC    PSE  )
            if ($this->id_tipo_pago == 68) {
                $observaciones = "'CTO $cod_titulo Cancela $conceptos_deb (Etapa: $nom_etapa, Anualidad: $anu) - PAGO PSE'";
            } else if ($this->id_tipo_pago == 75) {
                $observaciones = "'CTO $cod_titulo Cancela $conceptos_deb (Etapa: $nom_etapa, Anualidad: $anu)- PAGO CODIGO BARRAS'";
            } else {
                $observaciones = "'CTO $cod_titulo Cancela $conceptos_deb (Etapa: $nom_etapa, Anualidad: $anu)'";
            }

            $id_ts_td = $this->id_tipo_pago;

            // Validar username
            if (isset($request['username'])) {
                $username = $request['username'];
            } else {
                if (isset($request['username_log'])) {
                    $username = $request['username_log'];
                } else {
                    $username = $usuario;
                }
            }

            $variables = " - id_anhos: $id_anhos - id_punto_venta: $id_punto_venta - id_tipo_credito: $id_tipo_credito - id_mae_ter: $id_mae_ter";
            $variables .= " - id_con_credito: $id_con_credito - valor_total: $this->valor_total - fecha_credito: $this->fecha_credito";

            /*
             * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
             */
            $id_tabla = 'null';
            $id_ope_bd = 3;
            //construir observacion
            $observacion = "'Se van a registrar detalles del credito de los id_debitos: $id_debito_var $variables'";
            $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");
            CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

            //Se registra un log de credito, para conocer todas las trasacciones exitosas que se realizen
            $sql = <<<EOD
insert into ca_log_credito (id_log_credito,id_anhos,id_punto_venta,id_tipo_credito,id_con_credito,
id_mae_ter,fecha_credito,id_bn,id_cb,num_doc,oficina,valor,observaciones,
id_ts_td,fecha_proceso,usuariolog,id_debito_var) 
values (null,$id_anhos,$id_punto_venta,$id_tipo_credito,$id_con_credito,
$id_mae_ter,to_date('$this->fecha_credito','dd/mm/yyyy'),$id_bn,$id_cb,$num_doc,$oficina,$this->valor_total,$observaciones,
$id_ts_td,to_date('$fecha_proceso','yyyy-mm-dd'),'$username','$id_debito_var')
EOD;

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

            //Ultimo registro insertado CA_LOG_CREDITO
            $sql = <<<EOD
select 
REPLACE(translate($observaciones,'áéíóúÁÉÍÓÚ','aeiouAEIOU'), ' ', '999') as obs,
tab.* from ca_log_credito tab
where id_log_credito = (
      select
      max (id_log_credito)
      --id_log_credito
      from ca_log_credito
      where
      id_anhos = $id_anhos
      and id_punto_venta = $id_punto_venta
      and id_tipo_credito = $id_tipo_credito
      and id_con_credito = $id_con_credito   
      and id_debito_var = '$id_debito_var'
)
and tab.id_anhos = $id_anhos
and tab.id_punto_venta = $id_punto_venta
and tab.id_tipo_credito = $id_tipo_credito 
and tab.id_con_credito = $id_con_credito
and tab.id_debito_var = '$id_debito_var'  
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado_log = CN_TABLE::executeSQL($sql);
            if (count($resultado_log) > 0) {
                $id_log_credito = $resultado_log[0]['id_log_credito'];
                $observaciones_correo = $resultado_log[0]['obs']; //obs
            }

            // 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->custom_logger->info("[CREDITO_COMPLETO] La secuencia = " . $sec_credito);
            } else {

                $sec_credito = 1;
                $this->custom_logger->info("[CREDITO_COMPLETO] La secuencia = " . $sec_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) 
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,$this->valor_total,$observaciones,
        1 ,null,null,to_date('$this->fecha_credito','dd/mm/yyyy'),$id_ts_td,'$username',$id_mae_ter) 
EOD;

            //ejecuta el sql
            $this->conn->execute($sql);

            // inicio actualizar secuencia credito
            if (count($result) == 1) {
                $this->custom_logger->info("[CREDITO_COMPLETO] 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
                $this->conn->execute($sql);

                $this->custom_logger->info("[CREDITO_COMPLETO] SQL de actualizacion secuencia credito: " . $sql);
            } else {
                $this->custom_logger->info("[CREDITO_COMPLETO] 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
                $this->conn->execute($sql);

                $this->custom_logger->info("[CREDITO_COMPLETO] SQL de creacion secuencia credito: " . $sql);
            }
            //fin actualizar secuencia credito
            $sql = <<<EOD
select * from ca_credito
where id_credito = (
      select
      --max (id_credito)
      id_credito
      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 = (
              select consecutivo
              from ca_consecutivo_cre
              where id_anhos = $id_anhos
              and id_punto_venta = $id_punto_venta
              and id_tipo_credito = $id_tipo_credito
      )
)
and id_anhos = $id_anhos
and id_punto_venta = $id_punto_venta
and id_tipo_credito = $id_tipo_credito 
EOD;
            //ejecuta y obtiene el resultado del sql

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

            // Verifica que sea un registro del credito
            if (count($resultado) > 0) {

                $id_credito = $resultado[0]['id_credito'];
                $this->custom_logger->info("SQL CREDITO nueva. " . $id_credito);

                //Traer correos de competencia - 201960601
                $sql = <<<EOD
select 
titcom.*,
trim(com.email) as email
from in_titulo_competencia@can.anm.local titcom
left join ca_competencia_admin@can.anm.local com
on com.id_competencia = titcom.id_competencia
where 
titcom.id_titulo = $id_titulo
and titcom.actual = 1
and com.estado = 1 
EOD;

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

                $whereArrayParametros = '';
                $tag = false;
                foreach ($records as $value_com) {
                    if ($tag) {
                        $whereArrayParametros .= '/';
                    }
                    $tag = true;

                    $whereArrayParametros .= $id_credito . ';' . $value_com['email'];
                }

                /*
                 * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
                 */
                $id_tabla = $id_credito;
                $id_ope_bd = 3;
                $observacion = "'Se adiciono id: $id_credito a la tabla ca_credito desde la funcionalidad: credito_completo'";
                $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");
                CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

                $this->custom_logger->info("[CREDITO_COMPLETO] $id_debito_var");

                //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_var)
and ven.estado = 1  
and ven.cancelado = 0  
EOD;

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

                $cantidad_vec = count($result);
                $this->custom_logger->info("[CREDITO_COMPLETO] $cantidad_vec");
                $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 = $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 suman todos los abonos que tienen - 20191009
                    $sql = <<<EOD

select sum(valor_bruto) as valor_bruto from ca_credito_detalle where id_vencimiento=$id_vencimiento                       
                            

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_venc, 0, $valor_venc,
    $id_tip_mon, 0, 1, 0, '$observaciones')  
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    $sql = <<<EOD

update ca_saldos
set creditos_mes = creditos_mes + $valor_venc,
saldo_actual = saldo_actual - $valor_venc                            
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;

                    $records = 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_ope_bd = 3;
                    $observacion = "'Se adiciono id: $id_vencimiento de un vencimiento para el detalle del id_credito $id_credito desde la funcionalidad: credito_completo por valor de $valor_venc'";
                    $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");
                    CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

                    //actualizo el vencimiento
                    $sql = <<<EOD
update ca_vencimientos
set cancelado = 1
where id_vencimiento = $id_vencimiento  
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                    $valor_credito_rev = $valor_credito_rev + $valor_venc;


                    /**
                     * Anula los debitos automaticos que se relacionan con el debito cancelado - 20180404
                     */
                    //sentencia sql
                    $sql = <<<EOD
select
to_char((select max(cre.fecha_proceso) from ca_credito cre where cre.id_credito = $id_credito), 'yyyy-mm-dd') as text_date,                                         
(select max(cre.sec_credito) from ca_credito cre where cre.id_credito = $id_credito) as sec_credito,
(select max(cre.id_anhos) from ca_credito cre where cre.id_credito = $id_credito) as id_anhos_credito,                                        
debbase.sec_debito,
debbase.id_anhos as id_anhos_aut,
debaut.*
from ca_debito_automatico debaut

join ca_debito_vencimientos deb 
on deb.id_debito = debaut.id_debito

join ca_debito debbase
on debbase.id_debito = debaut.id_debito_base

where
debaut.id_debito_base in (
    select 
    deb.id_debito 
    from ca_debito_vencimientos deb
    
    where
    deb.id_debito in (select ca_debito_automatico.id_debito_base from ca_debito_automatico)
    and deb.cancelado = 1
    and deb.estado = 1
)
and deb.estado = 1
and deb.cancelado = 0
and debaut.estado = 1
and debaut.id_debito_base in ( select id_debito from ca_debito_vencimientos where ca_debito_vencimientos.id_vencimiento = $id_vencimiento )
EOD;
                    //ejecuta el sql
                    $result_automatico = CN_TABLE::executeSQL($sql);

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

                    foreach ($result_automatico as $value_automatico) {

                        $id_debito_aut = $value_automatico['id_debito'];
                        $sec_debito_aut = $value_automatico['sec_debito'];
                        $id_anhos_aut = $value_automatico['id_anhos_aut'];
                        $text_date = $value_automatico['text_date'];
                        $sec_credito = $value_automatico['sec_credito'];
                        $id_anhos_credito = $value_automatico['id_anhos_credito'];

                        /*
                         * Anula vencimiento
                         */
                        //sentencia sql
                        $sql = <<<EOD
update ca_vencimientos set estado = 0, fecha_anu = to_date('$text_date','yyyy-mm-dd'), 
    motivo_anu = 'CANCELADA POR PAGO A CAPITAL NC.$sec_credito de $id_anhos_credito, CONCILIACION CON INTERESES REALES ND.$sec_debito_aut de $id_anhos_aut' 
        where id_debito = $id_debito_aut
EOD;
                        //ejecuta el sql
                        $this->conn->execute($sql);

                        /**
                         * Anula debito
                         */
                        //sentencia sql
                        $sql = <<<EOD
update ca_debito set usuario_anu = '$usuario', estado = 0, fecha_anu = to_date('$text_date','yyyy-mm-dd'), 
    motivo_anu = 'CANCELADA POR PAGO A CAPITAL NC.$sec_credito de $id_anhos_credito, CONCILIACION CON INTERESES REALES ND.$sec_debito_aut de $id_anhos_aut' 
        where id_debito = $id_debito_aut
EOD;
                        //ejecuta el sql
                        $this->conn->execute($sql);
                    }
                }
            }

            $sql = <<<EOD

select round($sum_notas_credito) as sum_notas_credito_round from dual
                    
EOD;


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

            if (count($records) != 0) {
                $sum_notas_credito = $records[0]['sum_notas_credito_round'];
            } else {
                $sum_notas_credito = 0;
            }

            // Validacionces del proceso
            $tag_error = true;
            $mensaje_error = '';
            //El valor del credito es diferente al de los debitos que va a pagar
            if ($sum_notas_credito != $sum_notas_debito) {

                $tag_error = false;
                $mensaje_error .= "[CREDITO_COMPLETO] El valor del credito es diferente al de los debitos que va a pagar. "
                        . "(Valor creditos: $sum_notas_credito - Valor debitos: $sum_notas_debito )";
            }
            //No hay Vencimientos para el debito o ya estan cancelados
            if ($cantidad_vec <= 0) {

                $tag_error = false;
                $mensaje_error .= '[CREDITO_COMPLETO] No hay Vencimientos para el debito o ya estan cancelados. ';
            }

            // Validar tag_error
            if ($tag_error) {

                /*
                 * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
                 */
                $id_tabla = 'null';
                $id_ope_bd = 3;
                $observacion = "'Se termino el proceso de credito_completo, registros creados correctamente.'";
                $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");
                CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);


                // sentencia sql actualiza el log de credito, si termino
                $sql = <<<EOD
update ca_log_credito set termino_proceso = 1 
where id_log_credito = $id_log_credito 
EOD;

                $this->conn->execute($sql);

                /*
                 * COMMIT DE TODAS LAS TRANSACCIONES
                 */
                $this->conn->commit();
                $this->list_data = $resultado;
                $this->totalRows = 1;
                $this->startRow = 0;
                $this->endRow = 1;
                $this->status = 0;
                $this->custom_logger->info("[CREDITO_COMPLETO] OK. Registros creados correctamente.");
                $this->logMessage("[CREDITO_COMPLETO] OK. Registros creados correctamente.");


                /**
                 * GENERAR MOVIMIENTO BANCO - 20160211
                 */
                $this->logMessage("INICIO GENERAR MOVIMIENTO BANCO");

                $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
                CN_TABLE::executeSQL($sql);

                //Valida que aplica banco
                $sql = <<<EOD
select * from ca_con_credito
where id_con_credito = $id_con_credito
and aplica_bn = 1 
EOD;

                $resultado = CN_TABLE::executeSQL($sql);
                $aplica_banco = false;
                if (count($resultado) > 0) {
                    $aplica_banco = true;
                }

                if ($aplica_banco) {
                    $this->logMessage("GENERAR MOVIMIENTO BANCO");

                    //Traer datos de la factura
                    $sql = <<<EOD
select * from ca_credito
where
id_credito = $id_credito 
EOD;

                    $resultado = CN_TABLE::executeSQL($sql);
                    if (count($resultado) > 0) {
                        $id_credito = $resultado[0]['id_credito'];
                        $id_anhos = $resultado[0]['id_anhos'];
                        $id_punto_venta = $resultado[0]['id_punto_venta'];
                        $id_tipo_credito = $resultado[0]['id_tipo_credito'];
                        $sec_credito = $resultado[0]['sec_credito'];
                        $id_con_credito = $resultado[0]['id_con_credito'];
                        $fecha_proceso = $resultado[0]['fecha_proceso'];
                        $id_bn = $resultado[0]['id_bn'];
                        $id_cb = $resultado[0]['id_cb'];
                        $num_doc = $resultado[0]['num_doc'];
                        $oficina = $resultado[0]['oficina'];
                        $valor = $resultado[0]['valor'];
                        $fecha = $resultado[0]['fecha'];
                        $id_ts_td = $resultado[0]['id_ts_td'];
                        $id_mae_ter = $resultado[0]['id_mae_ter'];
                    }

                    //Se trae de la configuracipon la url que se ha establecido para las interfaces contables
                    $arrayAtrib = array();

                    $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

                    $int = 0;
                    foreach ($array as $routeName => $routeData) {
                        if ('service_url' == $routeName) {
                            foreach ($routeData as $key => $value) {
                                if ($key == 'value') {
                                    $service_url = $value;
                                }
                            }
                        }
                        $int++;
                    }
                    $url = $service_url;
                    $url = $url . 'movimiento_banco/list.json?id_mod=12&username=websafi&nitocc=800189921&id_username=946';

                    //variables del credito
                    $url = $url . '&id_credito=' . $id_credito;
                    $url = $url . '&id_anhos=' . $id_anhos;
                    $url = $url . '&id_punto_venta=' . $id_punto_venta;
                    $url = $url . '&id_tipo_credito=' . $id_tipo_credito;
                    $url = $url . '&sec_credito=' . $sec_credito;
                    $url = $url . '&id_con_credito=' . $id_con_credito;
                    $url = $url . '&fecha_proceso=' . $fecha_proceso;
                    $url = $url . '&id_bn=' . $id_bn;
                    $url = $url . '&id_cb=' . $id_cb;
                    $url = $url . '&num_doc=' . $num_doc;
                    $url = $url . '&oficina=' . $oficina;
                    $url = $url . '&valor=' . $valor;
                    $url = $url . '&fecha=' . $fecha;
                    $url = $url . '&id_ts_td=' . $id_ts_td;
                    $url = $url . '&id_mae_ter=' . $id_mae_ter;
                    $url = $url . '&tag_portal_web=1'; //facturas portal web - validar el retorno del json - 20160512

                    $ch = curl_init($url);

                    //Parametros de retorno en cURL
                    curl_setopt($ch, CURLOPT_HEADER, 0);
                    $rta = curl_exec($ch);
                    curl_close($ch);

                    $arrayRespuesta = json_decode($rta, true);
                    //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
                    if ($arrayRespuesta['response']['status'] == 1) {
                        $mensajeError = "Error :: Al generar el movimiento de bancos, se debe anular la factura.";
                        $this->status = 1;
                        $this->list_data = array();
                        $this->mensajeError = $mensajeError;
                        $this->logMessage("[CREDITO_COMPLETO] " . $mensajeError);
                    } else {
                        $this->logMessage("[CREDITO_COMPLETO] Genero movimiento de bancos.");
                    }
                } else {
                    $this->logMessage("[CREDITO_COMPLETO] No aplica bancos.");
                }
                /**
                 * FIN MOVBANC
                 */
                /**
                 * Envio de factura por correo - 20160601
                 * http://soporte14.sofhouse.net/jasperphp/whereExecuteReportCartera.php?uri=%2Freports%2Fcartera%2Fnota_credito&PARAM_id_credito=33960&PARAM_valor=181480&format=HTML
                 */
                /*
                 * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
                 */
                $id_ope_bd = 3;
                //construir observacion
                $observacion = "'INICIO Envio de factura por correo'";
                $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");
//                CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);


                $this->logMessage("INICIO Envio de factura por correo");
                $this->custom_logger->info("INICIO Envio de factura por correo");
                //Se trae de la configuracipon la url que se ha establecido para las interfaces contables
                $arrayAtrib = array();

                $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

                $int = 0;
                foreach ($array as $routeName => $routeData) {
                    //echo $routeName . "\n";
                    if ('jasper_url' == $routeName) {
                        foreach ($routeData as $key => $value) {
                            //echo $value . "\n";
                            if ($key == 'value') {
                                $url = $value;
                            }
                        }
                    }
                    if ('ipServidorCorreo' == $routeName) {
                        foreach ($routeData as $key => $value) {
                            //echo $value . "\n";
                            if ($key == 'value') {
                                $ipServidorCorreo = $value;
                            }
                        }
                    }
                    if ('correoEnvio' == $routeName) {
                        foreach ($routeData as $key => $value) {
                            //echo $value . "\n";
                            if ($key == 'value') {
                                $correoEnvio = $value;
                            }
                        }
                    }
                    $int++;
                }
                //$url = sfConfig::get('app-gwt_jasper_url');
                //echo $url;
                //$ch = curl_init("http://www.sofhouse.net/");
                /*
                 * $ch = curl_init("http://soporte14.sofhouse.net/jasperphp/whereExecuteReportCartera.php
                 * ?uri=%2Freports%2Fcartera%2Fnota_credito&PARAM_id_credito=33960&PARAM_valor=181480&format=HTML");
                 */
                $url = $url . 'nota_credito&PARAM_nombre_reporte=Credito&format=PDF&PARAM_id_mod=11&PARAM_username=websafi&PARAM_nitocc=800189921&PARAM_id_username=946';
                $url = $url . '&PARAM_id_credito=' . $id_credito;
                $url = $url . '&PARAM_ipServidorCorreo=' . $ipServidorCorreo;
                $url = $url . '&PARAM_email_envio=' . $correoEnvio;
                $url = $url . '&PARAM_email=' . $email;
                $url = $url . '&PARAM_valor=' . $this->valor_total;
                $url = $url . '&PARAM_observaciones=' . $observaciones_correo;
                $url = $url . '&PARAM_sec_credito=' . $sec_credito;
                $url = $url . '&PARAM_cod_titulo=' . $cod_titulo; //codigo del titulo - 20161010
                $url = $url . '&PARAM_pin=' . $num_doc; //pin - 20161021
                $url = $url . '&PARAM_envio_correo=true&PARAM_mensaje_log=1&PARAM_envio_sgd=1';
                //Para envio al SGD - PARAM_envio_sgd - 20161005

                if ($whereArrayParametros != '') {
                    $whereArrayParametros .= '/' . $id_credito . ';' . $email;
                    $url = $url . '&PARAM_parametros=' . $whereArrayParametros;
                }
                $this->custom_logger->info($url);
                $ch = curl_init($url);

                //Parametros de retorno en cURL
                curl_setopt($ch, CURLOPT_HEADER, 0);
                //Ejecuta la petición
                $rta = curl_exec($ch);
                //Se cierra la conexión
                curl_close($ch);

                $arrayRespuesta = json_decode($rta, true);
                //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
                if ($arrayRespuesta['response']['status'] == 0) {
                    //echo "<h3>Me llamo desde el cURL</h3>";
//              $mensaje=$arrayRespuesta['response']['data'];
//              $this->status = 3;
//              $a = $mensaje[0]['mensaje'];
//              $b = htmlspecialchars($a, ENT_QUOTES);
//              $this->mensajeError = $b;
//              $this->list_data = array();
                }
                //FIN Envio de factura por correo
                $this->logMessage("FIN Envio de credito por correo");
                $this->custom_logger->info("FIN Envio de credito por correo");


                /**
                 * Llamado INTERFAZ CONTABLE - 20170724
                 * Se coloca al final al hacer COMMIT de todo el debito y credito - 20170906
                 */
                $this->logMessage("INICIO INTERFAZ CONTABLE DEBITO");

                //Se trae de la configuracion la url que se ha establecido para las interfaces contables
                $arrayAtrib = array();

                $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

                $int = 0;
                foreach ($array as $routeName => $routeData) {
                    if ('service_url' == $routeName) {
                        foreach ($routeData as $key => $value) {
                            if ($key == 'value') {
                                $service_url = $value;
                            }
                        }
                    }
                    $int++;
                }
                $url = $service_url;
                $url = $url . 'ejecutaInterfacesContables/list.json?id_mod=11&username=websafi&nitocc=800189921&id_username=946';
                //variables del debito
                //$fecha_proceso = $fecha_sistema;
                $id_mae_ter = 946;
                $mov_ejecutado = "Notas-.-Debito";
                $url = $url . '&fecha_proceso=' . $fecha_proceso;
                $url = $url . '&id_mae_ter=' . $id_mae_ter;
                $url = $url . '&mov_ejecutado=' . $mov_ejecutado;
                $url = $url . '&id_movimiento=' . $id_debito_interes;
                $url = $url . '&tag_portal_web=1'; //facturas portal web - validar el retorno del json

                $ch = curl_init($url);

                //Parametros de retorno en cURL
                curl_setopt($ch, CURLOPT_HEADER, 0);
                $rta = curl_exec($ch);
                curl_close($ch);

                $arrayRespuesta = json_decode($rta, true);
                //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
                if ($arrayRespuesta['response']['status'] == 1) {
                    $mensajeError = "Error :: Al generar la interfaz contable.";
                    $this->status = 1;
                    $this->list_data = array();
                    $this->mensajeError = $mensajeError;
                    $this->logMessage("[credito_completo] " . $mensajeError);
                } else {
                    $this->logMessage("[credito_completo] Genero interfaz contable.");
                }

                $this->logMessage("FIN INTERFAZ CONTABLE DEBITO");


                /**
                 * Llamado INTERFAZ CONTABLE - 20170724
                 */
                $this->logMessage("INICIO INTERFAZ CONTABLE CREDITO");

                //Se trae de la configuracion la url que se ha establecido para las interfaces contables
                $arrayAtrib = array();

                $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

                $int = 0;
                foreach ($array as $routeName => $routeData) {
                    if ('service_url' == $routeName) {
                        foreach ($routeData as $key => $value) {
                            if ($key == 'value') {
                                $service_url = $value;
                            }
                        }
                    }
                    $int++;
                }
                $url = $service_url;
                $url = $url . 'ejecutaInterfacesContables/list.json?id_mod=11&username=websafi&nitocc=800189921&id_username=946';
                //variables del credito
                //$fecha_proceso = $fecha_sistema;
                $id_mae_ter = 946;
                $mov_ejecutado = "Notas-.-Credito";
                $url = $url . '&fecha_proceso=' . $fecha_proceso;
                $url = $url . '&id_mae_ter=' . $id_mae_ter;
                $url = $url . '&mov_ejecutado=' . $mov_ejecutado;
                $url = $url . '&id_movimiento=' . $id_credito;
                $url = $url . '&tag_portal_web=1'; //facturas portal web - validar el retorno del json

                $ch = curl_init($url);

                //Parametros de retorno en cURL
                curl_setopt($ch, CURLOPT_HEADER, 0);
                $rta = curl_exec($ch);
                curl_close($ch);

                $arrayRespuesta = json_decode($rta, true);
                //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
                if ($arrayRespuesta['response']['status'] == 1) {
                    $mensajeError = "Error :: Al generar la interfaz contable.";
                    $this->status = 1;
                    $this->list_data = array();
                    $this->mensajeError = $mensajeError;
                    $this->logMessage("[credito_completo] " . $mensajeError);
                } else {
                    $this->logMessage("[credito_completo] Genero interfaz contable.");
                }

                $this->logMessage("FIN INTERFAZ CONTABLE CREDITO");
            } else {
                //rollback de todas las transacciones en caso de que ocurra algun error
                $this->conn->rollback();

                $this->custom_logger->info($mensaje_error);
                $this->custom_logger->info("" . $mensaje_error . "\n");
                $mensaje = "[CREDITO_COMPLETO] ERROR al Generar el credito completo. !!!";
                $this->custom_logger->info($mensaje);
                $this->status = 1;
                $this->list_data = array(
                    array(
                        'Mensaje' => $mensaje_error
                    )
                );

                /*
                 * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
                 */
                $id_tabla = 'null';
                $id_ope_bd = 3;
                $observacion = "'Se termino el proceso de credito_completo, se generaron errores en el proceso de creación.'";
                $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");
                $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
                $this->conn->beginTransaction();
                CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

                if ($this->parameters) {

                    $sql = <<<EOD

insert
into ca_log_credito_errores
  (
    id_log_credito_errores,
    pin,
    id_tipo_pago,
    motivo_error,
    fecha_credito,
    valor_total,
    id_mae_ter,
    cod_titulo    
  )
  values
  (
    null,
    $this->pin,
    $this->id_tipo_pago,
    '$mensaje_error',
    to_date('$this->fecha_credito', 'dd/mm/yyyy'),
    $this->valor_total,
    '$id_mae_ter',
    '$cod_titulo'    
  )


EOD;

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

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

            //rollback de todas las transacciones en caso de que ocurra algun error
            $this->conn->rollback();

            $mensaje = "[CREDITO_COMPLETO] ROLLBACK ERROR al Generar la credito completo. !!!";
            $this->custom_logger->info($mensaje);
            $this->custom_logger->info("state 2");
            $this->custom_logger->info("Code " . $e->getCode());
            $this->custom_logger->info("Message " . $e->getMessage());

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );

            /*
             * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
             */
            $id_tabla = 'null';
            $id_ope_bd = 3;
            $observacion = "'Se termino el proceso de credito_completo, se generaron errores en el proceso de creación.'";
            $this->custom_logger->info("[CREDITO_COMPLETO] " . $observacion . ".\n");

            /**
             * Abrir nueva conexion con la Base de Datos
             */
            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();
            CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);

            //Se cambian ' por chr(39), para no dañar el insert del log - 20161202            
            //$error_log = $mensaje . ' error message: ' . $e->getMessage() . ' code: ' . $e->getCode();
            $error_log = $mensaje . ' error message: ' . str_replace("'", "'|| chr(39) ||'", $e->getMessage()) . ' code: ' . $e->getCode();

            $error_log = substr($error_log, 1, 4000);

            if ($this->parameters) {

                $sql = <<<EOD

insert
into ca_log_credito_errores
  (
    id_log_credito_errores,
    pin,
    id_tipo_pago,
    motivo_error,
    fecha_credito,
    valor_total,
    id_mae_ter,
    cod_titulo                        
  )
  values
  (
    null,
    $this->pin,
    $this->id_tipo_pago,
    '$error_log',
    to_date('$this->fecha_credito', 'dd/mm/yyyy'),
    $this->valor_total,
    '$id_mae_ter',
    '$cod_titulo'                     
  )


EOD;

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

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

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

        // Variables obligatorias
        $id_anhos = date('Y');
        $id_mae_ter = $debito_info['id_mae_ter'];
        $id_punto_venta = $debito_info['id_punto_venta'];
        $id_tipo_debito = $debito_info['id_tipo_debito'];
        $fecha_proceso = CN_TABLE::fechaSistema();
        $dias_pago = 0;
        $valor_bruto = $debito_info['valor_interes_recibo'];
        $valor_total = $debito_info['valor_interes_recibo'];
        $valor_moneda = $debito_info['valor_interes_recibo'];
        $trm_debito = 1;
        $id_tip_mon = $debito_info['id_tip_mon'];
        $username = $debito_info['username'];
        $id_obligacion = $debito_info['id_obligacion'];
        $fecha_activacion_pin = $debito_info['fecha_activacion_pin'];
        $valor_iva = 0;
        $valor_dcto = 0;
        $porcen_dcto = 0;
        $id_mae_ter_ven = 'null';
        $id_pr_tipo_ingre = $debito_info['id_pr_tipo_ingre'];
        $id_referencia2 = $debito_info['cod_titulo'];

        //Dias de mas por primera anualidad - 20190225
        $sql = <<<EOD

select e.nombre as nombre_etapa, ae.anualidad, 
to_char(ae.fecha_inicio+(case when te.id_etapa = 1 and ae.anualidad = 1 then 4 else 0 end), 'yyyy') as vigencia_anu, 
to_char(ae.fecha_inicio+(case when te.id_etapa = 1 and ae.anualidad = 1 then 4 else 0 end),'yyyy-mm-dd') as fecha_inicio, 
(case when te.id_etapa = 1 and ae.anualidad = 1 then '"De conformidad con la Resolución N° 181552 del 16 de septiembre de 2008 expedida por el Ministerio de Minas y Energía, Artículo Primero, el titular minero dentro de los (3) días siguientes a la respectiva inscripción, deberá proceder a la cancelación del canon superficiario"' else '' end) as resol_mod       
from ca_anual_etapa@CAN.ANM.LOCAL ae
join ca_titulo_etapa@CAN.ANM.LOCAL te on te.id_titulo_etapa=ae.id_titulo_etapa
join ca_etapa@CAN.ANM.LOCAL e on te.id_etapa=e.id_etapa
where ae.id_anual_etapa=$id_obligacion

EOD;

        $records = CN_TABLE::executeSQL($sql, true);
        if (count($records) == 0) {
            throw new Exception("La obligación a pagar es invalida");
        }
        //Observaciones ND
        $observaciones = "Título minero " . $debito_info['cod_titulo'] . ", Interés por concepto de la etapa: " . $records[0]['nombre_etapa'] . ", anualidad"
                . $records[0]['anualidad'] . ", vigencia " . $records[0]['vigencia_anu'] . ", desde " . $records[0]['fecha_inicio'] . " hasta " . $fecha_activacion_pin . $records[0]['resol_mod'];

        $fecha_inicio_anu = $records[0]['fecha_inicio'];

        //obtener secuencia para el debito
        $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->custom_logger->info("[CREDITO_COMPLETO] La secuencia = " . $sec_debito);
        } else {
            $sec_debito = 1;
            $this->custom_logger->info("[CREDITO_COMPLETO] La secuencia = " . $sec_debito);
        }

        $periodo_ini = " to_date('" . $fecha_inicio_anu . "','yyyy-mm-dd') ";
        $periodo_fin = " to_date('" . $fecha_activacion_pin . "','dd/mm/yyyy') ";

        //crear 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_inicio_anu','yyyy-mm-dd'))
EOD;

        //ejecuta el sql
        $this->conn->execute($sql);

        //inicio actualizar secuencia debito
        if (count($result) == 1) {
            $this->custom_logger->info("[CREDITO_COMPLETO] 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
            $this->conn->execute($sql);
            $this->custom_logger->info("[CREDITO_COMPLETO] SQL de actualizacion secuencia debito: " . $sql);
        } else {
            $this->custom_logger->info("[CREDITO_COMPLETO] 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
            $this->conn->execute($sql);
            $this->custom_logger->info("[CREDITO_COMPLETO] SQL de creacion secuencia debito: " . $sql);
        }


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

        /*
         * 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'];
            $this->custom_logger->info("ID DEBITO NUEVO. " . $id_debito);

            //INICIO registro saldo nuevo por vencimiento
            {
                //obtener vencimiento nuevo
                $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
                    $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;
                    CN_TABLE::executeSQL($sql);
                    $this->custom_logger->info("[CREDITO_COMPLETO] SQL de creacion saldo vencimientos: " . $sql);
                } else {
                    $mensaje = "[CREDITO_COMPLETO] El vencimiento no existe.";
                    $this->custom_logger->info($mensaje);
                    throw new Exception($mensaje);
                }
            }

            //inicio variables por defecto para el registro de log
            {
                //obtiene el valor para su identificador unico
                $id_tabla = $id_debito;
                $id_vigencia = $id_anhos;
                $id_cen_op = 'null';
                $id_cia = 'null';
                //obtener id maestro tabla
                $id_mae_bd = CN_TABLE::consultarIdTablaBD('CA_DEBITO');
                //3 - indica operacion de adicionar de registro
                $id_ope_bd = 3;

                //comando que identifica la funcionalidad
                $comando = 'credito_completo';

                //username del sistema
                $usuario = 'admin';
                $id_mae_ter_log = 1;
                $observacion = "'Se adiciono id_debito : " . $id_tabla . " desde la funcionalidad: " . $comando . "'";
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta);
            }

            //sentencia sql
            $sql = <<<EOD
insert into ca_debito_ref values ( $id_debito, null, '$id_referencia2')
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);
            $this->custom_logger->info("[CREDITO_COMPLETO] SQL de las referencias del debito: " . $sql);
        }

        $this->custom_logger->info("[CREDITO_COMPLETO] Total filas: " . count($resultado));
        $id_debito = $resultado[0]['id_debito'];

        //Variables Obligatorias
        //TODO PRODUCTO HARD CODED
        $id_producto = 1;
        $cantidad = 1;
        $valor_unitario = $valor_total;
        $valor_total = $valor_total;
        $por_iva = 0;

        //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
        $this->conn->execute($sql);
        $this->custom_logger->info("[CREDITO_COMPLETO] Se registro debito detalle.");
        $this->custom_logger->info("[CREDITO_COMPLETO] ND $id_debito asociada al interes de la obligacion creada exitosamente");

        return $id_debito;
    }

}
