<?php

require_once(dirname(__FILE__) . '/../../../../../plugins/bhLDAPAuthPlugin/lib/adLDAP.php');

/**
 * Creado: 20190911
 * Link: http://soporte14.sofhouse.net/cartera/web/api_dev.php/api/webservie_sigm_causacion/list.json?num_doc=0011112&id_tipo_doc=1&id_nat_jur=22&id_tip_ter=1&razon_soc=&direccion=CALLE&ciudad=BOG&email=facweb@sof&telefono=4564&id_punto_venta=4&valor_bruto=1230&valor_iva=0&valor_total=1230&observaciones=asf asfas&cod_bar=1214987498498&id_producto=1&cantidad=1&codigo_titulo=ASD-789&id_tip_mon=1&dias_pago=1&id_mineral=1&id_etapa=1&anualidad=2&periodo_ini=2019-09-01&periodo_fin=2020-09-01&valor_uni_bruto=1230&valor_uni_iva=0&valor_uni_total=1230
 * webservie_sigm_causacion actions.
 *
 * @package    cartera
 * @subpackage webservie_sigm_causacion
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webservie_sigm_causacionActions extends sfActions {

    /**
     * Executes list action
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

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

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

        //Codigo de error defecto - 20191001
        $codigo_error = 0;

        $int = 0;
        $service_url = "";
        $entidad_cliente = "";
        foreach ($array as $routeName => $routeData) {
            if ('service_url' == $routeName) {
                foreach ($routeData as $key => $value) {
                    if ($key == 'value') {
                        $service_url = $value;
                    }
                }
            }
            if ('entidad_cliente' == $routeName) {
                foreach ($routeData as $key => $value) {
                    if ($key == 'value') {
                        $entidad_cliente = $value;
                    }
                }
            }
            $int++;
        }

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

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

        $this->parameters = true;
        $parametros = '';

        //Cargar parametricas
        $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_pr_tipo_ingre'  
EOD;

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

        //Variables por defecto para el registro de log
        $id_tabla = 'null';
        $id_vigencia = 'null';
        $id_cen_op = 'null';
        $id_punto_venta = 'null';
        $id_cia = 1;
        $id_producto = '';
        $id_mae_ter = '';
        $fecha_proceso = '';
        $valor = 0;
        $observaciones = '';
        $id_tipo_mon = '';
        $periodo_ini = '';
        $periodo_fin = '';
        $cod_bar = '';
        $email_web = '';
        $id_mineral = '';
        $codigo_titulo = '';
        $id_etapa = '';
        $anualidad = '';
        $id_debito = '';

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

        //  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 = 'webservie_sigm_causacion';
        //construir observacion
        $observacion_log = "'Se ingreso a generar debito desde servicio web sigm causacion'";

        //Manejo de errores
        //Variables obligatorias
        $id_vigencia = $id_anhos = date('Y');
        $fecha_proceso = CN_TABLE::fechaSistema();

        /**
         * Inicio del proceso
         */
        try {

            // Registro de consulta en tabla de log
            $this->custom_logger->info("[webservie_sigm_causacion] " . $observacion_log . ".\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_log, $id_punto_venta);

            // Variables de retorno
            $resultado = array();


            /**
             * Verificar acceso a servicio por LDAP - 20191001
             */
            //Para local sofhouse no valida - 20191001
            if ($entidad_cliente != 7) {

                //Variables de configuracion del servidor de conexion LDAP (app.yml)
                $account_suffix = sfConfig::get('app_account_suffix');
                $domain_controllers = sfConfig::get('app_domain_controllers');
                $base_dn = sfConfig::get('app_base_dn');
                $admin_username = sfConfig::get('app_admin_username');
                $admin_password = sfConfig::get('app_admin_password');

                $config = array(
                    'account_suffix' => $account_suffix,
                    'domain_controllers' => array($domain_controllers),
                    'base_dn' => $base_dn,
                    'admin_username' => $admin_username,
                    'admin_password' => $admin_password,
                );

                $adldap = new adLDAP($config);

                if (!isset($request['usuario_web']) || !isset($request['clave_web'])) {
                    //Codigo de error - 20191001
                    $codigo_error = 1;
                    throw new Exception("Falta los parámetros de acceso obligatorios verificar.");
                }

                $usuario_web = $request['usuario_web'];
                $clave_web = $request['clave_web'];
                $authUser = $adldap->authenticate($usuario_web, $clave_web);

                if ($authUser != true) {
                    //Codigo de error - 20191001
                    $codigo_error = 2;
                    throw new Exception("La autenticación de usuario($usuario_web) para el servicio web fallo; favor verificar.");
                }
            }

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

            /*
             * Verificar parametros - 20190911
             */
            $param_oblig = 'num_doc;id_tipo_doc;id_nat_jur;id_tip_ter;razon_soc;direccion;telefono;ciudad;email;id_punto_venta;valor_bruto;valor_iva;valor_total;observaciones;cod_bar;id_producto;cantidad;codigo_titulo;id_tip_mon;valor_uni_bruto;valor_uni_iva;valor_uni_total';
            $param_oblig_datos = explode(';', $param_oblig);

            foreach ($param_oblig_datos as $value) {
                if (!isset($request[$value])) {
                    $this->parameters = false;
                    $parametros = $parametros . ';' . $value;
                }
            }

            if (!$this->parameters) {
                $parametros = substr($parametros, 1);

                //Codigo de error - 20191001
                $codigo_error = 3;
                throw new Exception("Falta alguno de los parámetros($parametros) obligatorios verificar.");
            }


            /**
             * Variables obligatorias
             */
            $num_doc = $request['num_doc'];
            $email = $request['email'];

            /*
             * Verificar tercero por num_doc, sino lo crea
             */
            //sentencia sql
            $sql = <<<EOD
select * from interceros where num_doc = '$num_doc'   
EOD;
            //ejecuta el sql
            //$this->conn->execute($sql);
            $resultado_ter = CN_TABLE::executeSQL($sql);

            /**
             * Crear tercero
             */
            if (count($resultado_ter) <= 0) {

                /*
                 * TERCERO :: 
                  ID_NAT_JUR
                  ID_TIP_TER
                  ID_TIPO_DOC
                  NUM_DOC
                  PNOMBRE-SNOMBRE-PAPELLIDO-SAPELLIDO
                  RAZON_SOC
                  DIRECCION
                  CIUDAD
                  TELEFONO
                  EMAIL
                  CODDEPTO
                 */
                $id_nat_jur = 'null';
                if (isset($request['id_nat_jur'])) {
                    $id_nat_jur = $request['id_nat_jur'];
                }
                $id_tip_ter = 'null';
                if (isset($request['id_tip_ter'])) {
                    $id_tip_ter = $request['id_tip_ter'];
                }
                $id_tipo_doc = 'null';
                if (isset($request['id_tipo_doc'])) {
                    $id_tipo_doc = $request['id_tipo_doc'];
                }

                /**
                 * PNOMBRE-SNOMBRE-PAPELLIDO-SAPELLIDO=Mario-Andres-Jerez-Quintero
                 */
                $pnombre = '';
                $snombre = '';
                $papellido = '';
                $sapellido = '';
                $pnombre_snombre_papellido_sapellido = '';
                if (isset($request['pnombre_snombre_papellido_sapellido'])) {
                    $pnombre_snombre_papellido_sapellido = $request['pnombre_snombre_papellido_sapellido'];

                    $variables = explode('-', $pnombre_snombre_papellido_sapellido);

                    $pnombre = $variables[0];
                    $snombre = $variables[1];
                    $papellido = $variables[2];
                    $sapellido = $variables[3];
                }

                $razon_soc = '';
                if (isset($request['razon_soc'])) {
                    $razon_soc = str_replace('-', ' ', utf8_encode($request['razon_soc']));
                }
                $direccion = '';
                if (isset($request['direccion'])) {
                    $direccion = utf8_decode($request['direccion']);
                    $direccion = str_replace("'", " ", $direccion); //Quitar comilla simple - 20180713
                    $this->logMessage("Direccion::" . $direccion);
                }
                $ciudad = 'Bogota';
                //Se coloca validacion $request['ciudad'] != '', por si viene vacia - 20160803
                if (isset($request['ciudad']) && $request['ciudad'] != '') {
                    $ciudad = utf8_decode($request['ciudad']);
                }
                $telefono = '';
                if (isset($request['telefono'])) {
                    $telefono = $request['telefono'];
                }
                $coddepto = '';
                if (isset($request['coddepto'])) {
                    $coddepto = $request['coddepto'];
                }

                $id_mae_ter = 0;


                $this->logMessage("Crear tercero");
                $this->custom_logger->info("[FACTURA_PORTAL_ABACO] Crear tercero");

                //verificar persona para el digito de verificacion}
                $dv = 'null';
                if ($num_doc >= 800000000 && $num_doc <= 999999999) {
                    //sentencia sql
                    $sql = <<<EOD
select digito_verificacion($num_doc) as dv from dual 
EOD;
                    //ejecuta el sql
                    //$this->conn->execute($sql);
                    $resultado = CN_TABLE::executeSQL($sql);
                    $dv = $resultado[0]['dv'];
                }
                if (isset($request['digito_verificacion'])) {
                    $dv = $request['digito_verificacion'];
                }

                /**
                 * Crear registros de tercero tabla INTERCEROS - INTERCEROS_DU - INTERCEROS_DU_DIR
                 */
                //sentencia sql
                $sql = <<<EOD
Insert into INTERCEROS (ID_MAE_TER,ID_NAT_JUR,ID_TIP_TER,ID_TIPO_DOC,NUM_DOC,CODIGO,
    RAZON_SOC,CAM_COM,PNOMBRE,SNOMBRE,ESTADO_TER,FECHA_DOC,PAPELLIDO,SAPELLIDO,
        NMATRICULA,NMATRICULAMER,PROFESION,DV,OBJETIVO) 
    values (null,$id_nat_jur,$id_tip_ter,$id_tipo_doc,'$num_doc',null,
        upper('$razon_soc'),null,upper('$pnombre'),upper('$snombre'),1,null,upper('$papellido'),upper('$sapellido'),
            null,null,null,$dv,null)  
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);

                //sentencia sql
                $sql = <<<EOD
select * from interceros where num_doc = '$num_doc'   
EOD;
                //ejecuta el sql
                //$this->conn->execute($sql);
                $resultado_ter = CN_TABLE::executeSQL($sql);
                if (count($resultado_ter) > 0) {
                    $id_mae_ter = $resultado_ter[0]['id_mae_ter'];
                } else {
                    $id_mae_ter = 0;
                }

                //sentencia sql                
                $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',upper('$pnombre $papellido $sapellido'),
        null,null,'$email',49,'$coddepto',upper('$ciudad'))  
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);


                //sentencia sql
                $sql = <<<EOD
select * from INTERCER_DU where id_mae_ter = $id_mae_ter   
EOD;
                //ejecuta el sql
                //$this->conn->execute($sql);
                $resultado_ter = CN_TABLE::executeSQL($sql);
                if (count($resultado_ter) > 0) {
                    $id_mt_ubi = $resultado_ter[0]['id_mt_ubi'];
                } else {
                    $id_mt_ubi = 0;
                }

                //sentencia sql                
                $sql = <<<EOD
Insert into INTERCER_DU_DIR (ID_UBI_DIR,ID_MT_UBI,ID_TIP_DIR,DIRECCION,TEL,FAX,ID_PAIS,CODDEPTO,CIUDAD,ESTADO,PRINCIPAL,CIUDAD_DANE,DEPTO_DANE) 
    values (null,$id_mt_ubi,1,'$direccion','$telefono',null,49,'$coddepto',upper('$ciudad'),1,1,null,null) 
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);

                $this->logMessage("Se creo el tercero");
                $this->custom_logger->info("Se creo el tercero");
            } else {
                $id_mae_ter = $resultado_ter[0]['id_mae_ter'];

                /**
                 * Actualizar datos(telefono,direcion,ciudad) del tercero - 20150318
                 */
                $direccion = '';
                if (isset($request['direccion']) && $request['direccion'] != '') {
                    $direccion = utf8_decode($request['direccion']);
                    $direccion = str_replace("'", " ", $direccion); //Quitar comilla simple - 20180713
                    $this->logMessage("Direccion::" . $direccion);
                }
                $ciudad = 'Bogota';
                //Se coloca validacion $request['ciudad'] != '', por si viene vacia - 20160803
                if (isset($request['ciudad']) && $request['ciudad'] != '') {
                    $ciudad = utf8_decode($request['ciudad']);
                }
                $telefono = '';
                if (isset($request['telefono']) && $request['telefono'] != '') {
                    $telefono = $request['telefono'];
                }
                $coddepto = '';
                if (isset($request['coddepto']) && $request['coddepto'] != '') {
                    $coddepto = $request['coddepto'];
                }

                //sentencia sql
                $sql = <<<EOD
SELECT * FROM INTERCER_DU where ID_MAE_TER = $id_mae_ter  
EOD;
                //ejecuta el sql
                $resultado_terdu = CN_TABLE::executeSQL($sql);

                //Valida si es crear o actualizar tabla - 20160628
                if (count($resultado_terdu) == 0) {

                    $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','$coddepto',upper('$ciudad')) 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                } else {

                    $id_mt_ubi = $resultado_terdu[0]['id_mt_ubi'];

                    //sentencia sql                
                    $sql = <<<EOD
update INTERCER_DU set ciudad = nvl('$ciudad',ciudad)                   
where id_mt_ubi = $id_mt_ubi 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                }

                //sentencia sql
                $sql = <<<EOD
SELECT * FROM INTERCER_DU where ID_MAE_TER = $id_mae_ter  
EOD;
                //ejecuta el sql
                $resultado_terdu = CN_TABLE::executeSQL($sql);

                $id_mt_ubi = $resultado_terdu[0]['id_mt_ubi'];

                //sentencia sql
                $sql = <<<EOD
SELECT * FROM INTERCER_DU_DIR where ID_MT_UBI = $id_mt_ubi 
EOD;
                //ejecuta el sql
                $resultado_terdudir = CN_TABLE::executeSQL($sql);


                if (count($resultado_terdudir) > 0) {

                    $id_ubi_dir = $resultado_terdudir[0]['id_ubi_dir'];

                    //sentencia sql                
                    $sql = <<<EOD
update INTERCER_DU_DIR set  direccion = nvl('$direccion',direccion) , tel = nvl('$telefono',tel) , ciudad = nvl('$ciudad',ciudad) 
where ID_UBI_DIR = $id_ubi_dir 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                } else {
                    //sentencia sql                
                    $sql = <<<EOD
Insert into INTERCER_DU_DIR (ID_UBI_DIR,ID_MT_UBI,ID_TIP_DIR,DIRECCION,TEL,FAX,ID_PAIS,CODDEPTO,CIUDAD,ESTADO,PRINCIPAL,CIUDAD_DANE,DEPTO_DANE) 
    values (null,$id_mt_ubi,1,'$direccion','$telefono',null,49,'$coddepto',upper('$ciudad'),1,1,null,null) 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                }
            }

            //Se valida para que actualice campo de pnombre y papellido, segun fecha de razon soc si no tiene nombre - 20181121
            //sentencia sql                
            $sql = <<<EOD
update interceros 
set pnombre = substr(razon_soc, 1, instr(razon_soc, ' ') - 1),
    papellido = substr(razon_soc, instr(razon_soc, ' ') + 1)
where
id_mae_ter = $id_mae_ter
and (pnombre is null or papellido is null) 
EOD;
            //ejecuta el sql
            $this->conn->execute($sql);

            $this->logMessage("id_mae_ter :: " . $id_mae_ter);
            $this->custom_logger->info("id_mae_ter :: " . $id_mae_ter);

            $id_mae_ter_ven = $id_mae_ter;


            /*
             * Crear el debito
             */
            $this->custom_logger->info("Crear el debito");
            $id_punto_venta = $request['id_punto_venta'];
//            $fecha_proceso = $request['fecha_proceso'];
            $fecha_proceso = CN_TABLE::fechaSistema();
            //fecha_vence_rec fecha de vencimiento de canon para los debitos - 20130920
            $fecha_vence_rec = $request['fecha_vence_rec'];
            $dias_pago = $request['dias_pago'];
            $valor_bruto = str_replace(",", ".", $request['valor_bruto']);
            $valor_iva = str_replace(",", ".", $request['valor_iva']);
            $valor = $valor_total = str_replace(",", ".", $request['valor_total']);
            $valor_moneda = str_replace(",", ".", $request['valor_total']);
            $trm_debito = 1;
            $username = $usuario;
            $id_tipo_mon = $request['id_tip_mon'];
            $observaciones = $request['observaciones'];
            $cod_bar = $request['cod_bar'];

            $valor_dcto = 0;
            $porcen_dcto = 0;

            if (isset($request['periodo_ini'])) {
                $periodo_ini = $request['periodo_ini'];
                $fecha_vence_rec = "to_date('" . $periodo_ini . "','yyyy-mm-dd') + " . $dias_pago;
            }

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

            if (isset($request['fecha_vence_rec'])) {
                $fecha_vence_rec = "to_date('" . $request['fecha_vence_rec'] . "','yyyy-mm-dd') ";
            }

            //detalle
            $id_producto = $request['id_producto'];
            $cantidad = $request['cantidad'];
            $valor_uni_bruto = str_replace(",", ".", $request['valor_uni_bruto']);
            $valor_uni_iva = str_replace(",", ".", $request['valor_uni_iva']);
            $valor_uni_total = str_replace(",", ".", $request['valor_uni_total']);
            $por_iva = 0;
            if (isset($request['por_iva'])) {
                $por_iva = $request['por_iva'];
            }

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

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

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

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

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


            //sentencia sql ingresar CA_DEBITO
            //to_date('$fecha_proceso','yyyy-mm-dd'), se deja con sysdate - 20190117
            $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,COD_BAR,EMAIL_WEB)
    values (null,$id_anhos,$id_punto_venta,$id_tipo_debito,$sec_debito,$id_mae_ter, 
            trunc(sysdate),$dias_pago,$valor_bruto,$valor_iva,$valor_dcto,$porcen_dcto,$valor_total,$id_mae_ter_ven,
            '$observaciones',$id_tipo_mon,$valor_moneda,$trm_debito,1,null,null,to_date('$periodo_ini','YYYY-MM-DD'),to_date('$periodo_fin','YYYY-MM-DD'),
                '$username', $id_pr_tipo_ingre,$fecha_vence_rec,'$cod_bar','$email')
EOD;

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

            //ultimo registro insertado CA_DEBITO
            $sql = <<<EOD
select
*
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 = $sec_debito 
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);
            //$this->logMessage("SQL DEBITO nueva. " . $sql);

            /*
             * Verifica que sea un registro para insertar las referencias del debito
             * y vienen registros para las referenciass
             */
            if (count($resultado) > 0) {
                $id_debito = $resultado[0]['id_debito'];
            } else {
                //Codigo de error - 20191001
                $codigo_error = 4;
                throw new Exception("Error al obtener id_debito verificar secuencia $sec_debito.");
            }

            /*
             * INICIO ACTUALIZAR SECUENCIA DEBITO
             */
            if (count($result) == 1) {
                $this->logMessage("[webservie_sigm_causacion] 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->logMessage("[webservie_sigm_causacion] SQL de actualizacion secuencia debito: " . $sql);
            } else {
                $this->logMessage("[webservie_sigm_causacion] 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->logMessage("[webservie_sigm_causacion] SQL de creacion secuencia debito: " . $sql);
            }
            /*
             * FIN ACTUALIZAR SECUENCIA DEBITO
             */

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

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

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

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

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

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

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


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

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

                //id del maestro tercero
                $id_mae_ter_log = 1;

                //el username desde qebsafiERP
                $usuario = 'admin';
                if (isset($request['username'])) {
                    if ($request['username'] != '') {
                        $usuario = $request['username'];
                    }
                } elseif (isset($request['username_log'])) {
                    if ($request['username_log'] != '') {
                        $usuario = $request['username_log'];
                    }
                }

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

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

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

                $id_punto_venta_log = $id_punto_venta;

                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter_log, $usuario, $comando, $observacion, $id_punto_venta_log);
            }
            /*
             * FIN variables por defecto para el registro de log
             */

            /*
             * Crear el debito detalle
             */
            $this->custom_logger->info("Crear el debito detalle");

            /*
             * 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_uni_bruto, $valor_uni_iva, 0, 0, $valor_uni_total, '$observaciones', $por_iva ) 
EOD;
            //ejecuta el sql
            $this->conn->execute($sql);
            $this->logMessage("[webservie_sigm_causacion] Se registro debito detalle.");


            /**
             * Crear Referencia 
             */
            $this->custom_logger->info("Crear Referencia");
            $tiene_referencias = false;
            //varialbes de referencias
            $id_referencia1 = '';
            if (isset($request['id_mineral'])) {
                $tiene_referencias = true;
                $id_referencia1 = $request['id_mineral'];

                /**
                 * Validar que el cod_min este correcto y corresponda a un registro de ANM tabla RE_MINERAL - 20160422
                 * Se cambia por la tabla RE_GNADM_MINE_HOMO, para homologar el id que entra por el del mineral del ERP - 20160427
                 * RE_MINERALES_ANNA - 20191203
                 */
                //sentencia sql
                $sql = <<<EOD
select * from RE_MINERALES_ANNA where mineral_id = '$id_referencia1' 
EOD;

                //ejecuta el sql
                $val_cod_min_homo = CN_TABLE::executeSQL($sql);
                if (count($val_cod_min_homo) > 0) {
                    $cod_min_entra = $cod_min = $val_cod_min_homo[0]['id_mineral'];
                } else {
                    $cod_min_entra = $cod_min = 0;
                }

                //sentencia sql
                $sql = <<<EOD
select * from re_mineral where id_mineral = '$cod_min'      
EOD;

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

                if (count($val_cod_min) > 0) {
                    $id_referencia1 = $id_mineral = $val_cod_min[0]['id_mineral'];
                } else {
                    $id_referencia1 = '';
                }
            }
            $id_mineral = $id_referencia1;

            $id_referencia2 = '';
            if (isset($request['codigo_titulo'])) {
                $tiene_referencias = true;
                $id_referencia2 = $request['codigo_titulo'];
            }
            $codigo_titulo = $id_referencia2;

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


            /**
             * Crear Referencia SIGM
             */
            $this->custom_logger->info("Crear Referencia SIGM");

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

            //sentencia sql
            $sql = <<<EOD
Insert into CA_DEBITO_REF_SIGM values ( $id_debito, 1, '$id_etapa', '$anualidad')
EOD;
            //ejecuta el sql
            $this->conn->execute($sql);
            $this->logMessage("[webservie_sigm_causacion] SQL de las referencias SIGM del debito: " . $sql);

            /**
             * Validar si el titulo existe
             */
            $sql = <<<EOD
SELECT
    *
FROM rmn_titulo@CAN.ANM.LOCAL
where
cod_titulo = '$codigo_titulo' 
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);
            //$this->logMessage("SQL DEBITO nueva. " . $sql);

            /*
             * Verifica que sea un registro para insertar las referencias del debito
             */
            if (count($resultado) == 0) {
                //Codigo de error - 20191001
                $codigo_error = 5;
                throw new Exception("El codigo_titulo($codigo_titulo) no existe en el modulo de CANON; favor verificar.");
            }

            /**
             * Validar PIN y datos repetidos
             */
            $sql = <<<EOD
select
*
from CA_DEBITO
where
id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND id_tipo_debito = $id_tipo_debito
AND cod_bar = $cod_bar 
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);
            //$this->logMessage("SQL DEBITO nueva. " . $sql);

            /*
             * Verifica que sea un registro para insertar las referencias del debito
             */
            if (count($resultado) > 1) {
                //Codigo de error - 20191001
                $codigo_error = 6;
                throw new Exception("El PIN($cod_bar) para el $id_anhos del registro de causación ya existe; favor verificar.");
            }


            /*
             * Revalidar secuencia debito creada - 20190911
             */
            $this->custom_logger->info("Revalidar secuencia debito creada");
            //sentencia sql
            $sql = <<<EOD
select
*
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 = $sec_debito 
EOD;

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

            //validar si hay registro de secuencia debito
            if (count($result) > 1) {
                //Codigo de error - 20191001
                $codigo_error = 7;
                throw new Exception("Ya existe la secuencia($sec_debito) para la obligación.");
            }


            /**
             * Crear registro de log
             */
            $sql = <<<EOD
Insert into CA_WEBSEVICE_CAUSACION (ID_WEBSEVICE_CAUSACION,ID_ANHOS,ID_PUNTO_VENTA,ID_PRODUCTO,ID_MAE_TER,FECHA_PROCESO,VALOR,OBSERVACIONES,
ID_TIPO_MON,PERIODO_INI,PERIODO_FIN,COD_BAR,EMAIL_WEB,ID_MINERAL,CODIGO_TITULO,ID_ETAPA,ANUALIDAD,
FECHA_LOG,TERMINO_PROCESO,ID_DEBITO,MOTIVO_ERROR) 

values (null,$id_vigencia,$id_punto_venta,'$id_producto','$id_mae_ter',to_date('$fecha_proceso','YYYY-MM-DD'),'$valor','$observaciones',
'$id_tipo_mon',to_date('$periodo_ini','YYYY-MM-DD'),to_date('$periodo_fin','YYYY-MM-DD'),'$cod_bar','$email_web','$id_mineral','$codigo_titulo','$id_etapa','$anualidad',
sysdate,'1','$id_debito','') 
EOD;
            $this->conn->execute($sql);


            /**
             * COMMIT
             */
            $this->conn->commit();
            $mensaje = 'Proceso terminado exitoso.';
            $this->logMessage("COMMIT " . $mensaje);
            $this->custom_logger->info("COMMIT " . $mensaje);

            $this->status = 0;
            //$this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'mensaje' => $mensaje,
                    'id_debito' => $id_debito,
                    'id_anhos' => $id_vigencia,
                    'sec_debito' => $sec_debito,
                    'servicio' => 'webservie_sigm_causacion',
                    'modulo' => 'CARTERA'
                )
            );


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

            $url = $service_url;
            $url = $url . 'ejecutaInterfacesContables/list.json?id_mod=11&username=websafi&nitocc=800189921&id_username=946';
            //variables del debito
            $id_mae_ter = 946;
            $mov_ejecutado = "Notas-.-Debito";

            $params = array(
                'fecha_proceso' => $fecha_proceso,
                'id_mae_ter' => $id_mae_ter,
                'mov_ejecutado' => $mov_ejecutado,
                'id_movimiento' => $id_debito,
                'tag_portal_web' => '1' //facturas portal web - validar el retorno del json
            );

            if ($service_url != null) {
                CN_TABLE::curlPostAsync($url, $params);
            }

            $this->logMessage("FIN INTERFAZ CONTABLE DEBITO");
        } catch (Exception $e) {

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

            $mensaje = "[webservie_sigm_causacion] ROLLBACK ERROR al Generar la debito. !!!";
            $this->custom_logger->info($mensaje);
            $this->custom_logger->info("state 1");
            $this->custom_logger->info("Code " . $e->getCode());
            $this->custom_logger->info("Message " . $e->getMessage());

            $this->status = 1;
            //$this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'code' => $e->getCode(),
                    'mensaje' => $e->getMessage(),
                    'servicio' => 'webservie_sigm_causacion',
                    'modulo' => 'CARTERA',
                    'codigo_error' => $codigo_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_log = "'Se termino el proceso de webservie_sigm_causacion, se generaron errores en el proceso de creación.'";
            $this->custom_logger->info("[webservie_sigm_causacion] " . $observacion_log . ".\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_log, $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);

            //Crear registro de error
            $sql = <<<EOD
Insert into CA_WEBSEVICE_CAUSACION (ID_WEBSEVICE_CAUSACION,ID_ANHOS,ID_PUNTO_VENTA,ID_PRODUCTO,ID_MAE_TER,FECHA_PROCESO,VALOR,OBSERVACIONES,
ID_TIPO_MON,PERIODO_INI,PERIODO_FIN,COD_BAR,EMAIL_WEB,ID_MINERAL,CODIGO_TITULO,ID_ETAPA,ANUALIDAD,
FECHA_LOG,TERMINO_PROCESO,ID_DEBITO,MOTIVO_ERROR) 

values (null,$id_vigencia,$id_punto_venta,'$id_producto','$id_mae_ter',to_date('$fecha_proceso','YYYY-MM-DD'),'$valor','$observaciones',
'$id_tipo_mon',to_date('$periodo_ini','YYYY-MM-DD'),to_date('$periodo_fin','YYYY-MM-DD'),'$cod_bar','$email_web','$id_mineral','$codigo_titulo','$id_etapa','$anualidad',
sysdate,'0','$id_debito','$error_log') 
EOD;
            $this->conn->execute($sql);

            /**
             * COMMIT
             */
            $this->conn->commit();

            /**
             * Envio de correo de error - 20190911
             */
            $this->custom_logger->info("Envio de correo de error inicio ");

            $url = $service_url . "webservice_envio_correo/list.json";

            $email_destino = sfConfig::get('app_email_destino');

            $recipients = $email_destino . ';' . 'Admin';

            $body = <<<EOD
<br/>
Se envia correo por fallo de webservie_sigm_causacion; Pin ($cod_bar) y Título Minero ($codigo_titulo).                                       
<br/> <br/> 
Error: 
<br/> <br/> 
$error_log
<br/> 
EOD;

            $params = array(
                'user_from' => 'webservice',
                'recipients' => $recipients,
                'asunto' => 'Error webservie_sigm_causacion',
                'body' => $body
            );

            if ($service_url != null) {
                CN_TABLE::curlPostAsync($url, $params);
            }

            $this->custom_logger->info("Envio de correo de error fin");
        }
    }

    /**
     * Executes list action construcción
     *
     * @param sfRequest $request A request object
     */
    public function executeList0(sfWebRequest $request) {

        $this->status = 1;
        $this->list_data = array(
            array(
                'code' => "0",
                'mensaje' => 'Servicio en construcción.',
                'servicio' => 'webservie_sigm_causacion',
                'modulo' => 'CARTERA'
            )
        );
    }

}
