<?php

/**
 * Creado 20190307
 * webservice_pago_titulo actions.
 *
 * Link Prueba::
 * http://soporte14.sofhouse.net/cartera/web/api_dev.php/api/webservice_pago_titulo/list.json?pin=91&id_tipo_pago=1&valor_total=450977&fecha_credito=07/03/2019&num_doc=23922423&correo=aaa&id_debito=47532
 *
 * @package    cartera
 * @subpackage webservice_pago_titulo
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webservice_pago_tituloActions 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("[WEBSERVICE_PAGO_TITULO] Servicio executeList webservice_pago_titulo.\n");
        $this->custom_logger->info("---BEGIN Logging request--- (Revisar log proceso_completo.log)");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] 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 = 'webservice_pago_titulo';
        //construir observacion
        $observacion = "'Se ingreso a generar credito desde servicio web webservice_pago_titulo'";

        //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("[WEBSERVICE_PAGO_TITULO] " . $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_debito'])) {
                //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_debito = $request['id_debito'];
                $this->num_doc = $request['num_doc'];
                $this->valida = 0; //Campo nuevo para reproceso de pagos, codigo manuel - 20200319
                if (isset($request['valida']) && $request['valida'] != 0) {
                    $this->valida = 1;
                }
                $observacion = "'--[VALOR_TOTAL]->" . $this->valor_total .
                        "[FECHA_CREDITO]->" . $this->fecha_credito .
                        "[PIN]->" . $this->pin .
                        "[TIPO_PAGO]->" . $this->id_tipo_pago .
                        "[ID_DEBITO]->" . $this->id_debito .
                        "[VALIDA]->" . $this->valida . "--'";
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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);
            } 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_debito)");
            }
            //Validar null - 20201127::LAVILA
            if (empty($this->id_debito)) {
                $this->parameters = false;
                throw new Exception("Alguno de los parámetros obligatorios (pin, id_tipo_pago, valor_total, fecha_credito, num_doc, correo, id_debito) esta vacio");
            }

            /**
             * Validar PIN y datos repetidos
             * ManuelEnriqueParedesLopez
             */
            $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 num_doc = '$this->pin'
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);
            /*
             * Verifica que sea un registro para insertar las referencias del debito
             */
            if (count($resultado) > 0) {

                $observacion = "'El PIN($this->pin) para el $id_anhos del registro de pago ya existe; favor verificar.";
                $observacion = $observacion . "  --[VALOR_TOTAL]->" . $this->valor_total .
                        "[FECHA_CREDITO]->" . $this->fecha_credito .
                        "[PIN]->" . $this->pin .
                        "[TIPO_PAGO]->" . $this->id_tipo_pago .
                        "[ID_DEBITO]->" . $this->id_debito .
                        "[VALIDA]->" . $this->valida . "--'";
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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);
                throw new Exception("El PIN($this->pin) para el $id_anhos del registro de pago ya existe; favor verificar.");
            }
            /**
             * 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
             * Campos nuevos de vista y unificacion de ND CANON - 20200505::LAVILA
             */
            $sql = <<<EOD
select 
tab0.id_debito,
tab0.id_titulo,
tab0.cod_titulo,
to_char(to_date(tab0.fecha_vence, '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.aplica_usura, 
tab0.saldo_actual as valor_capital,

tab0.id_debito as id_debitos,
tab0.vig_rec,

tab0.valor_total,
tab0.valor_intereses

from(

    select

    tab0.id_debito,
    tab0.vig_rec,
    tab0.sec_debito,
    tab0.fecha_debito,
    tab0.fecha_vence,
    tab0.id_producto,
    tab0.cod_titulo,
    tab0.valor_debito,
    tab0.saldo_actual,
    tab0.valor_intereses,
    tab0.valor_total,
    tab0.dias_mora,
    tab0.concepto,
    tab0.concepto_intereses,
    tab0.id_titulo,
    tab0.aplica_usura,
    tab0.tasa_interes_aplicada,
    tab0.periodo_ini,
    tab0.periodo_fin,
    tab0.id_etapa,
    tab0.anualidad,
    tab0.resol_mod

    from v_pago_obligaciones_titulo@CAN.ANM.LOCAL tab0

)tab0

where tab0.id_debito = $this->id_debito  
EOD;

            //ejecuta y obtiene el resultado del sql
            $records = CN_TABLE::executeSQL($sql, true);
            if (count($records) == 0) {
                throw new Exception("El identificador id_debito 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'];

            //Capturar debitos a pagar
            $id_debito_var = $records[0]['id_debitos'];
            $vig_rec = $records[0]['vig_rec'];
            $cod_titulo = $records[0]['cod_titulo'];
            $id_debito = $records[0]['id_debito'];
            $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_capital']; 
            $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 && $this->valida != 1) {
                $observacion = "'El valor real pagado no corresponde al valor esperado de pago valor esperado: $valor_total_recibo; valor pagado: " . $this->valor_total;
                $observacion = $observacion . "  --[VALOR_TOTAL]->" . $this->valor_total .
                        "[VALOR_TOTAL_RECIBO]->" . $valor_total_recibo .
                        "[FECHA_CREDITO]->" . $this->fecha_credito .
                        "[PIN]->" . $this->pin .
                        "[TIPO_PAGO]->" . $this->id_tipo_pago .
                        "[ID_DEBITO]->" . $this->id_debito .
                        "[VALIDA]->" . $this->valida . "--'";

                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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);
                throw new Exception("El valor real pagado no corresponde al valor esperado de pago valor esperado: $valor_total_recibo; valor pagado: " . $this->valor_total);
            } else {
                $valor_total_recibo = $this->valor_total;
                $valor_interes_recibo = $this->valor_total - $valor_capital;
                $observacion = "'CAMBIOS EN VALOR_TOTAL y VALOR_INTERESES";
                $observacion = $observacion . "  --[VALOR_TOTAL]->" . $this->valor_total .
                        "--[VALOR_TOTAL_RECIBO_CAMBIO]->" . $valor_total_recibo .
                        "--[VALOR_INTERESES_RECIBO_CAMBIO]->" . $valor_interes_recibo .
                        "--[FECHA_CREDITO]->" . $this->fecha_credito .
                        "--[PIN]->" . $this->pin .
                        "--[TIPO_PAGO]->" . $this->id_tipo_pago .
                        "--[ID_DEBITO]->" . $this->id_debito .
                        "--[VALIDA]->" . $this->valida . "--'";

                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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);
            }

            //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;
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] 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 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_debito'] = $id_debito;
                $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);
            $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] SQL de Validar que el valor bruto del recibo: " . $sql);

            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 = '';
            }

            //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 - PAGO PSE'";
            } else if ($this->id_tipo_pago == 75) {
                $observaciones = "'CTO $cod_titulo Cancela $conceptos_deb - PAGO CODIGO BARRAS'";
            } else {
                $observaciones = "'CTO $cod_titulo Cancela $conceptos_deb'";
            }

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

                $sec_credito = 1;
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] 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("[WEBSERVICE_PAGO_TITULO] 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("[WEBSERVICE_PAGO_TITULO] SQL de actualizacion secuencia credito: " . $sql);
            } else {
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] 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("[WEBSERVICE_PAGO_TITULO] 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: webservice_pago_titulo'";
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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("[WEBSERVICE_PAGO_TITULO] $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("[WEBSERVICE_PAGO_TITULO] $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 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_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: webservice_pago_titulo por valor de $valor_venc'";
                    $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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 .= "[WEBSERVICE_PAGO_TITULO] 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 .= '[WEBSERVICE_PAGO_TITULO] 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 webservice_pago_titulo, registros creados correctamente.'";
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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("[WEBSERVICE_PAGO_TITULO] OK. Registros creados correctamente.");
                $this->logMessage("[WEBSERVICE_PAGO_TITULO] 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_local' == $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);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification
                    $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("[WEBSERVICE_PAGO_TITULO] " . $mensajeError);
                    } else {
                        $this->logMessage("[WEBSERVICE_PAGO_TITULO] Genero movimiento de bancos.");
                    }
                } else {
                    $this->logMessage("[WEBSERVICE_PAGO_TITULO] 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("[WEBSERVICE_PAGO_TITULO] " . $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);
                //Para validar posibles errores - 20190530
                try {
                    $ch = curl_init($url);

                    //Parametros de retorno en cURL
                    curl_setopt($ch, CURLOPT_HEADER, 0);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification
                    //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();
                    }
                } catch (Exception $ex) {
                    $this->logMessage("Error en la generacion del credito por correo");
                }
                //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_local' == $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);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification
                $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("[WEBSERVICE_PAGO_TITULO] " . $mensajeError);
                } else {
                    $this->logMessage("[WEBSERVICE_PAGO_TITULO] 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_local' == $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);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification
                $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("[WEBSERVICE_PAGO_TITULO] " . $mensajeError);
                } else {
                    $this->logMessage("[WEBSERVICE_PAGO_TITULO] 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 = "[WEBSERVICE_PAGO_TITULO] 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 webservice_pago_titulo, se generaron errores en el proceso de creación.'";
                $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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 = "[WEBSERVICE_PAGO_TITULO] 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 webservice_pago_titulo, se generaron errores en el proceso de creación.'";
            $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] " . $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_debito = $debito_info['id_debito'];
        $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'];

        //verificar producto del debito y colocar nuevo de multa - 20210810::LAVILA
        $sql = <<<EOD
SELECT
nvl(prod.aplica_multa,0) as aplica_multa,
det.*
FROM ca_debito_detalle det
left join ca_producto prod
on prod.id_producto = det.id_producto
where
det.id_debito in ($id_debito)            
EOD;

        $records = CN_TABLE::executeSQL($sql, true);
        if (count($records) == 0) {
            throw new Exception("La obligación a pagar es invalida no tiene detalle de producto");
        }
        $aplica_multa = $records[0]['aplica_multa'];

        /**
         * Se coloca nuevo 11-INTERESES DIST - 20230425::LAVILA
         */
        $sql = <<<EOD
SELECT

case when gi.ID_PR_TIPO_INGRE in (7) then 1 else 0 end as aplica_distribucion,
gi.ID_PR_TIPO_INGRE,

nvl(prod.aplica_multa,0) as aplica_multa,
det.*
FROM ca_debito_detalle det
left join ca_producto prod
on prod.id_producto = det.id_producto
left join ts_gi gi on prod.id_grupo = gi.id
where
det.id_debito in ($id_debito)            
EOD;

        $records = CN_TABLE::executeSQL($sql, true);
        $aplica_distribucion = 0;
        if (count($records) > 0) {
            $this->custom_logger->info("La obligación a pagar es invalida no tiene tipo de ingreso en el detalle de producto");
            $aplica_distribucion = $records[0]['aplica_distribucion'];
        }
        
        /**
         * Se coloca nuevo 9::DIS - RECURSOS PARA DISTRIBUIR - 20230425::LAVILA
         */
        if ($aplica_distribucion == 1) {
            $id_pr_tipo_ingre = 7; //DIS - RECURSOS PARA DISTRIBUIR
        }

        //ca_debito_vencimientos - 20190307
        $sql = <<<EOD
select 
to_char( tab0.fecha_vence ,'yyyy-mm-dd') as fecha_inicio,
tab0.* 
from ca_debito_vencimientos tab0 
    
where tab0.id_debito in ($id_debito) 
and tab0.estado = 1                
EOD;

        $records = CN_TABLE::executeSQL($sql, true);
        if (count($records) == 0) {
            throw new Exception("La obligación a pagar es invalida");
        }
        $fecha_inicio_anu = $records[0]['fecha_inicio'];

        //Observaciones ND
        $observaciones = "Título minero " . $debito_info['cod_titulo'] . ", Interés por concepto de Sec. Debito: " . $records[0]['sec_debito'] .
                ", vigencia " . $records[0]['id_anhos'] . ", desde " . $fecha_inicio_anu . " hasta " . $fecha_activacion_pin;


        //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("[WEBSERVICE_PAGO_TITULO] La secuencia = " . $sec_debito);
        } else {
            $sec_debito = 1;
            $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] 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("[WEBSERVICE_PAGO_TITULO] 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("[WEBSERVICE_PAGO_TITULO] SQL de actualizacion secuencia debito: " . $sql);
        } else {
            $this->custom_logger->info("[WEBSERVICE_PAGO_TITULO] 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("[WEBSERVICE_PAGO_TITULO] 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
         * Incidente #17543, DECRETO 574 DEL 15-04-2020 - 20200617::LAVILA
         * Incidente #19148, se desactiva IPC decreto - 20201104
         */
        $tag_covid = 0;
        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 
case when tab0.fecha_vence BETWEEN TO_DATE('15/04/2020','dd/mm/yyyy') and TO_DATE('31/07/2020','dd/mm/yyyy') then 1 else 0 end as tag_covid,
tab0.* 
from ca_vencimientos tab0
where 
tab0.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'];
                    $tag_covid = $result[0]['tag_covid']; //Incidente #17543, DECRETO 574 DEL 15-04-2020 - 20200617::LAVILA
                    $tag_covid = 0; //Incidente #19148, se desactiva IPC decreto - 20201104

                    /*
                     * 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("[WEBSERVICE_PAGO_TITULO] SQL de creacion saldo vencimientos: " . $sql);
                } else {
                    $mensaje = "[WEBSERVICE_PAGO_TITULO] 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 = 'webservice_pago_titulo';

                //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("[WEBSERVICE_PAGO_TITULO] SQL de las referencias del debito: " . $sql);
        }

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

        //Variables Obligatorias
        //TODO PRODUCTO HARD CODED

        /**
         * Incidente #17543, DECRETO 574 DEL 15-04-2020 - 20200617::LAVILA
         */
        if ($tag_covid == 0) {
            $id_producto = 1; //INTERESES RP
        } else {
            $id_producto = 101; //INTERESES IPC
        }
        /**
         *  Incidente #22503, ID-2101 =	07-INDEXACION MULTAS RP - 20210810::LAVILA
         */
        if ($aplica_multa == 1) {
            $id_producto = 2101; //INDEXACION MULTAS RP
        }
        /**
         * Se coloca nuevo 11-INTERESES DIST - 20230425::LAVILA
         */
        if ($aplica_distribucion == 1) {
            $id_producto = 11; //INDEXACION MULTAS RP
        }


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

        return $id_debito;
    }

}
