<?php

/**
 * webcyc_factura_pos actions.
 *
 * @package    cartera
 * @subpackage webcyc_factura_pos
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webcyc_factura_posActions 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') . '/webcyc.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));
        $this->custom_logger->info("[webcyc_factura_pos] Servicio executeList webcyc_factura_pos.\n");

        $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_local' == $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 = '';

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

        //Variables de registro 
        $num_doc = '';
        $id_anhos = '';
        $id_mae_ter = '';
        $tipo_responsabilidad = '';
        $fecha_facturacion = '';
        $valor_bruto = 0;
        $valor_iva = 0;
        $valor_total = 0;
        $id_caja = '';
        $sesion_caja = '';
        $cajero = '';
        $observaciones = '';
        $productos = '';
        $cantidades = '';
        $valores_uni_bruto = '';
        $valores_uni_iva = '';
        $valores_uni_total = '';
        $id_ts_pc_fp = '';
        $id_bn = '';
        $id_cb = '';
        $num_doc_sop = '';
        $fecha_doc_sop = '';
        $fecha_log = '';
        $termino_proceso = '';
        $id_factura = '';
        $motivo_error = '';
        $sec_factura = '';
        $referencia = '';
        //movimiento
        $aplica_inventario = false;
        $id_movimientos_con = 0;
        $id_vigencia_mov = 0;
        $id_cen_op_mov = 0;
        $id_tipo_movimiento = 3;
        $request['id_tipo_movimiento'] = $id_tipo_movimiento; //mov salida
        $id_mae_ter_inv = 0;
        $id_tipo_almacenamiento = 0;
        $id_espacio = 0;
        $id_ts_td = 0;

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

        //  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 = 'webcyc_factura_pos';
        //construir observacion
        $observacion_log = "'Se ingreso a generar factura pos desde servicio webcyc_factura_pos'";

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



        /**
         * Inicio del proceso
         */
        try {
            $this->custom_logger->info("---BEGIN Logging request--- (Revisar log api_dev.log)");

            // Takes raw data from the request
            $json = file_get_contents('php://input');
            if ($json === false) {
                //Codigo de error 
                $codigo_error = 27;
                throw new Exception("Error al consultar el file_get_contents del llamado.");
            }
            $strlen_json = strlen($json);
            $this->custom_logger->info("[webcyc_factura_pos] strlen = $strlen_json\n");
            $this->custom_logger->info("[webcyc_factura_pos] json = $json\n");
            $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
            // Converts it into a PHP object
            $request = $data = json_decode($json, true);
            if ($data === false or $data == NULL) {
                //Codigo de error 
                $codigo_error = 28;
                throw new Exception("Error al codificar el JSON a un array, verificar estructura.");
            }
            foreach ($request as $key => $value) {
                $this->custom_logger->info("[webcyc_factura_pos] request[$key] = $value\n");
            }
            $this->custom_logger->info("---END Logging request");


            // Registro de consulta en tabla de log
            $this->custom_logger->info("[webcyc_factura_pos] " . $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.");
                }

                //Se decodifica la clave - 20200924
                $usuario_web = base64_decode($request['usuario_web']);
                $clave_web = base64_decode($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.");
                }
            }

            /*
             * Verificar parametros - 20190911
             */
            $param_oblig = 'num_doc;id_tipo_doc;id_nat_jur;id_tip_ter;razon_soc;pnombre_snombre_papellido_sapellido;direccion;coddepto;ciudad;email;tipo_responsabilidad;id_punto_venta;valor_bruto;valor_iva;valor_total;productos;id_ts_pc_fp;id_bn;id_cb;num_doc_sop;fecha_doc_sop';
            $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'];

            /**
             * Tipo Responsabilidad - 20200806
             */
            if (isset($request['tipo_responsabilidad'])) {
                $tipo_responsabilidad = $request['tipo_responsabilidad'];
            }

            /**
             * Variables de la factura
             */
            /*
             * CA_FACTURA_POS
              ID_PUNTO_VENTA
              ID_CAJA
              SEC_FACTURA
              ID_MAE_TER
              FECHA_FACTURACION
              VALOR_BRUTO
              VALOR_IVA
              VALOR_TOTAL
              CAJERO
              OBSERVACIONES
             */
            $id_punto_venta = $request['id_punto_venta'];
            $valor_bruto = str_replace(",", ".", $request['valor_bruto']);
            $valor_iva = str_replace(",", ".", $request['valor_iva']);
            $valor_total = str_replace(",", ".", $request['valor_total']);
            $observaciones = 'VENTAS PORTAL WEB';
            if (isset($request['observaciones'])) {
                $observaciones = $request['observaciones'];
            }

            /*
             * CA_FACTURA_PROD
              ID_PRODUCTO
              CANTIDAD
              VALOR_UNI_BRUTO
              VALOR_UNI_IVA
              VALOR_UNI_TOTAL
              REFERENCIA
             */
            $productos = (array) $request['productos'];
            $total_productos = 0;
            foreach ($productos as $value_prod) {
                $total_productos += str_replace(",", ".", $value_prod['valor_uni_total']);
            }
            $this->custom_logger->info("total_productos------------------" . $total_productos);

            /*
             * CA_FACTURA_PAGO
              ID_TS_PC_FP
              VALOR
              ID_BN
              ID_CB
              OFICINA
              NUM_DOC
              FECHA_DOC
             */
            $id_ts_pc_fp = $request['id_ts_pc_fp'];
            $valor = str_replace(",", ".", $request['valor_total']);
            $id_bn = $request['id_bn'];
            $id_cb = $request['id_cb'];
            $oficina = 'VENTAS PORTAL WEB';
            if (isset($request['oficina'])) {
                $oficina = $request['oficina'];
            }
            $num_doc_sop = $request['num_doc_sop'];
            $fecha_doc_sop = $request['fecha_doc_sop'];


            /*
             * 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("[webcyc_factura_pos] 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
                 * Se valida comilla simple del nombre 20200903::LAVILA
                 */
                $razon_soc_text = str_replace("'", "'|| chr(39) ||'", $razon_soc);
                //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_text'),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);

            //verificar persona para el digito de verificacion - 20191223
            if ($num_doc >= 800000000 && $num_doc <= 999999999) {
                //sentencia sql                
                $sql = <<<EOD
update interceros 
set dv = digito_verificacion('$num_doc')
where
id_mae_ter = $id_mae_ter
and dv 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);

            /**
             * Tipo Responsabilidad, generar registro del tercero - 20200806
             */
            if (isset($request['tipo_responsabilidad']) && $request['tipo_responsabilidad'] != null) {
                $this->logMessage("tipo_responsabilidad :: " . $tipo_responsabilidad);
                $this->custom_logger->info("tipo_responsabilidad :: " . $tipo_responsabilidad);

                /**
                 * validar INTERCER_DT
                 */
                //sentencia sql
                $sql = <<<EOD
select * from INTERCER_DT where id_mae_ter = $id_mae_ter   
EOD;
                //ejecuta el sql
                $resultado_dt = CN_TABLE::executeSQL($sql);
                if (count($resultado_dt) > 0) {
                    $id_inf_tri = $resultado_dt[0]['id_inf_tri'];
                } else {

                    //sentencia sql                
                    $sql = <<<EOD
INSERT INTO INTERCER_DT (ID_INF_TRI,ID_MAE_TER,CIIU_PRIN,CIIU_SEC,CIIU_TER,CIIU_CUA,PATH_RUP,PATH_DOC) 
    VALUES (null,'$id_mae_ter',NULL,NULL,NULL,NULL,NULL,NULL) 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    //sentencia sql
                    $sql = <<<EOD
select * from INTERCER_DT where id_mae_ter = $id_mae_ter   
EOD;
                    //ejecuta el sql
                    $resultado_dt = CN_TABLE::executeSQL($sql);
                    if (count($resultado_dt) > 0) {
                        $id_inf_tri = $resultado_dt[0]['id_inf_tri'];
                    }
                }

                //divide por caracter ;
                $tipo_responsabilidades = explode(';', $tipo_responsabilidad);

                foreach ($tipo_responsabilidades as $value_tipo) {

                    //verifica codigo del tipo
                    //sentencia sql
                    $sql = <<<EOD
SELECT
    *
FROM ts_reg_tri
where
codigo_dian = '$value_tipo'   
EOD;
                    //ejecuta el sql
                    $resultado_reg = CN_TABLE::executeSQL($sql);
                    if (count($resultado_reg) > 0) {

                        $id_reg_tri = $resultado_reg[0]['id_reg_tri'];

                        //verifica res_tri
                        //sentencia sql
                        $sql = <<<EOD
SELECT
    *
FROM ts_res_tri
where
id_inf_tri = $id_inf_tri
and id_reg_tri = $id_reg_tri  
EOD;
                        //ejecuta el sql
                        $resultado_res = CN_TABLE::executeSQL($sql);
                        if (count($resultado_res) <= 0) {

                            //sentencia sql                
                            $sql = <<<EOD
Insert into TS_RES_TRI (ID_RES_TRI,AUTORETENEDOR,ID_REG_TRI,ID_TIP_RES,ID_INF_TRI) 
    values (null,(case when '$value_tipo' = 'O-15' then 1 else 0 end),'$id_reg_tri','1','$id_inf_tri')
EOD;
                            //ejecuta el sql
                            $this->conn->execute($sql);
                        }
                    }
                }
            }//fin tipo responsabilidad


            /*
             * Validar valor total de la factura
             */
            if ($valor_total != $total_productos) {
                //Codigo de error - 20200810
                $codigo_error = 10;
                throw new Exception("EL valor de la factura($valor_total) no coincide con el total de los productos($total_productos).");
            }

            $this->logMessage("Validar valor total de la factura");

            /**
             * Validar num_doc_sop de la forma de pago
             * Validar estado de la factura - 20170705
             */
            //sentencia sql
            $sql = <<<EOD
select 
mov.id_movimientos_con,
mov.id_vigencia,
mov.id_cen_op,
mov.id_tipo_movimiento,
pag.* 

from ca_factura_pago pag

left join ca_factura_pos pos
on pos.id_factura = pag.id_factura

left join ca_factura_pos_movimientos_con mov
on pag.id_factura = mov.id_factura

where 
pos.estado = 1
and pag.id_ts_pc_fp = $id_ts_pc_fp and pag.num_doc = '$num_doc_sop'   
EOD;
            //ejecuta el sql
            //$this->conn->execute($sql);
            $resultado_fp = CN_TABLE::executeSQL($sql);

            if (count($resultado_fp) > 0) {

                $mensaje = "El numero $num_doc_sop del registro del pago, para la forma de pago seleccionada ya existe; favor verirficar.";

                $this->logMessage($mensaje);
                $this->custom_logger->info($mensaje);

                //Codigo de error - 20200810
                $codigo_error = 6;
                throw new Exception("El No.Doc Soporte($num_doc_sop) para el $id_anhos del registro de causación ya existe; favor verificar.");
            }

            $this->logMessage("Validar num_doc_sop de la forma de pago");

            /*
             * CA_FACTURA_POS
             */
            //$id_punto_venta = 102;
            //sentencia sql
            $sql = <<<EOD
select * from ca_consecutivo_caja where id_punto_venta = $id_punto_venta   
EOD;
            //ejecuta el sql
            //$this->conn->execute($sql);
            $resultado_punt = CN_TABLE::executeSQL($sql);

            $id_caja = $resultado_punt[0]['id_caja'];
            $sec_factura = $resultado_punt[0]['consec_fac'] + 1;
            $sesion_caja = $resultado_punt[0]['sesion_caja'];

            //Actualiza el consecutivo, este se vuelve a modificar al insertar la factura_pos - 20160223      
            $sql = <<<EOD
update ca_consecutivo_caja set consec_fac = $sec_factura 
where id_punto_venta = $id_punto_venta and id_caja = $id_caja 
EOD;
            //ejecuta el sql
            $this->conn->execute($sql);

            //sentencia sql
            $sql = <<<EOD
select 
id_estado_caja, 
id_punto_venta
id_caja,
fecha_estado,
sesion,
cajero,
estado as estado_num
from ca_estado_caja 
where id_punto_venta = $id_punto_venta and id_caja = $id_caja                                 
order by fecha_estado desc, sesion desc   
EOD;
            //ejecuta el sql
            //$this->conn->execute($sql);
            $resultado_est = CN_TABLE::executeSQL($sql);

            if (count($resultado_est) <= 0 || $resultado_est[0]['estado_num'] == 0) {
                //Codigo de error - 20200810
                $codigo_error = 27;
                //throw new Exception("Por favor verificar el estado de la caja, debe estar en estado cerrada.");
            }


            $id_estado_caja = $resultado_est[0]['id_estado_caja'];
            $cajero = $resultado_est[0]['cajero'];

            //sentencia sql
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD HH24:MI:SS" 
EOD;

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


            /*
             * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
             */
            $id_ope_bd = 3;
            //construir observacion
            $observacion = "'Se van a registrar detalles de la factura en CA_LOG_FACTURA'";
            $this->custom_logger->info("[webcyc_factura_pos] " . $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);


            /**
             * Incidente #3702 - 20160617
             * Si la fecha de soporte no es en el mes de proceso, se coloca la fecha de proceso, sysdate,
             * se coloca en las observaciones la fecha de soporte - 20160721
             * Se cambia para que tome la fecha actual ya que en ABACO si quedan con el registro actual, y asi no tener diferencia ( and 1!=1 )- 200190829
             */
            //sentencia sql                
            $sql = <<<EOD
Insert into CA_FACTURA_POS (ID_FACTURA,ID_ANHOS,ID_PUNTO_VENTA,ID_CAJA,SEC_FACTURA,ID_MAE_TER,
    FECHA_FACTURACION,VALOR_BRUTO,VALOR_IVA,VALOR_TOTAL,CAJERO,OBSERVACIONES,ESTADO,FECHA_ANU,MOTIVO_ANU,ID_ESTADO_CAJA,VALOR_RETEN,EMAIL_WEB,TIPO_RESPONSABILIDAD) 
    values (null,to_char(sysdate,'yyyy'),$id_punto_venta,$id_caja,$sec_factura,$id_mae_ter,
        (select case when to_char(to_date('$fecha_doc_sop','yyyy-mm-dd'),'mm') = to_char(sysdate,'mm') 
            and to_char(to_date('$fecha_doc_sop','yyyy-mm-dd'),'yyyy') = to_char(sysdate,'yyyy') and 1!=1  
                then to_date('$fecha_doc_sop','yyyy-mm-dd') else sysdate end as fecha from dual),
            $valor_bruto,$valor_iva,$valor_total,$cajero,
                case when to_char(to_date('$fecha_doc_sop','yyyy-mm-dd'),'mm') = to_char(sysdate,'mm') 
            and to_char(to_date('$fecha_doc_sop','yyyy-mm-dd'),'yyyy') = to_char(sysdate,'yyyy') 
                then '$observaciones' else '$observaciones, Se reprocesa al mes actual de proceso fecha de soporte: $fecha_doc_sop' end ,1,null,null,$id_estado_caja,
                    0,'$email','$tipo_responsabilidad') 
EOD;
            //ejecuta el sql
            $this->conn->execute($sql);

            //sentencia sql
            /*
             * Se adiciona filtro de sec_factura, 
             * para traer el registro que corresponde a al factura ingresada anteriormente - 20160223
             */
            $sql = <<<EOD
select * from ca_factura_pos
where id_punto_venta = $id_punto_venta and id_caja = $id_caja 
    and id_mae_ter = $id_mae_ter and sec_factura = $sec_factura
order by fecha_facturacion desc    
EOD;
            //ejecuta el sql
            //$this->conn->execute($sql);
            $resultado_facpos = CN_TABLE::executeSQL($sql);

            $id_factura = $resultado_facpos[0]['id_factura'];
            $this->custom_logger->info("id_factura::" . $id_factura);


            //sentencia sql
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;

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


            /*
             * CA_FACTURA_PROD
             */
            /*
             * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
             */
            $id_ope_bd = 3;
            //construir observacion
            $observacion = "'Registro del producto en CA_FACTURA_PROD, id_factura::$id_factura'";
            $this->custom_logger->info("[webcyc_factura_pos] " . $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);


            //validar array de productos
            if (count($productos) > 0) {

                foreach ($productos as $value_prod) {

                    $id_producto = $value_prod['id_producto'];
                    $cantidad = $value_prod['cantidad'];
                    $valor_uni_bruto = str_replace(",", ".", $value_prod['valor_uni_bruto']);
                    $valor_uni_iva = str_replace(",", ".", $value_prod['valor_uni_iva']);
                    $valor_uni_total = str_replace(",", ".", $value_prod['valor_uni_total']);

                    //sentencia sql                
                    $sql = <<<EOD
Insert into CA_FACTURA_PROD (ID_FACTURA_PROD,ID_FACTURA,ID_PRODUCTO,CANTIDAD,VALOR_UNI_BRUTO,VALOR_UNI_IVA,VALOR_UNI_TOTAL,REFERENCIA) 
    values (null,$id_factura,$id_producto,$cantidad,$valor_uni_bruto,$valor_uni_iva,$valor_uni_total,'$referencia') 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                }
            } else {
                //Codigo de error - 20191001
                $codigo_error = 35;
                throw new Exception('No se encontro productos verificar datos.');
            }


            $this->custom_logger->info("Termino CA_FACTURA_PROD");

            /*
             * CA_FACTURA_PAGO
             */
            /*
             * Registro de consulta en tabla de log 1 - CONSULTAR, 2 - ACTUALIZAR, 3 - ADICIONAR, 4	- ELIMINAR, 5 - ANULAR
             */
            $id_ope_bd = 3;
            //construir observacion
            $observacion = "'Registro del pago en CA_FACTURA_PAGO, id_factura::$id_factura'";
            $this->custom_logger->info("[webcyc_factura_pos] " . $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 agrega tipo de tramforma de pago en la oficina - 20160617
             */
            if ($id_ts_pc_fp == 21) {
                $oficina = $oficina . ' - PSE';
            } elseif ($id_ts_pc_fp == 22) {
                $oficina = $oficina . ' - CODIGO BARRAS';
            }

            //sentencia sql                
            $sql = <<<EOD
Insert into CA_FACTURA_PAGO (ID_FACTURA_PAGO,ID_FACTURA,ID_TS_PC_FP,VALOR,ID_BN,ID_CB,OFICINA,NUM_DOC,FECHA_DOC) 
    values (null,$id_factura,$id_ts_pc_fp,$valor,'$id_bn','$id_cb','$oficina','$num_doc_sop',to_date('$fecha_doc_sop','yyyy-mm-dd')) 
EOD;
            //ejecuta el sql
            $this->conn->execute($sql);

            $this->custom_logger->info("Termino CA_FACTURA_PAGO");

            /*
             * Revalidar secuencia debito creada - 20190911
             */
            $this->custom_logger->info("Revalidar secuencia factura creada");
            //sentencia sql
            $sql = <<<EOD
select
*
from CA_FACTURA_POS
where
id_anhos = $id_anhos
AND id_punto_venta = $id_punto_venta
AND sec_factura = $sec_factura 
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_factura) para la obligación.");
            }


            /**
             * Crear Movimiento Inventario - 20210127
             * Si aplica inventario - 20150715
             */
            $sql = <<<EOD
select 
ter.num_doc as num_doc_inv,
ter.razon_soc,
es.descripcion as espacio,
ta.descripcion as tipo_almacenamiento,
co.prefijo,
co.nom_cen_op,
pv.* 
from ca_punto_venta pv

left join centro_operacion co
on pv.id_cen_op = co.id_cen_op

left join in_tipo_almacenamiento ta
on ta.id_tipo_almacenamiento = pv.id_tipo_almacenamiento

left join in_espacio es
on pv.id_espacio = es.id_espacio

left join interceros_v ter
on ter.id_mae_ter = pv.id_mae_ter

where 
pv.id_punto_venta = $id_punto_venta   
EOD;
            //ejecuta el sql
            $resultado_pv = CN_TABLE::executeSQL($sql);

            if (count($resultado_pv) > 0 && $resultado_pv[0]['aplica_inventario']) {

                $this->logMessage("Si aplica inventario.");
                $aplica_inventario = true;

                $id_cen_op_mov = $resultado_pv[0]['id_cen_op'];
                $id_concepto_movimiento = $resultado_pv[0]['id_concepto_movimiento'];
                $id_username = $id_mae_ter_inv = $resultado_pv[0]['id_mae_ter'];
                $id_tipo_almacenamiento = $resultado_pv[0]['id_tipo_almacenamiento'];
                $id_espacio = $resultado_pv[0]['id_espacio'];
                $id_ts_td = $resultado_pv[0]['id_ts_td'];
                $num_doc_inv = $resultado_pv[0]['num_doc_inv'];
                $razon_soc = $resultado_pv[0]['razon_soc'];
                $espacio = $resultado_pv[0]['espacio'];
                $tipo_almacenamiento = $resultado_pv[0]['tipo_almacenamiento'];
                $prefijo = $resultado_pv[0]['prefijo'];
                $nom_cen_op = $resultado_pv[0]['nom_cen_op'];
            }


            /**
             * Crea registros en inventario - 20150716
             */
            if ($aplica_inventario) {
                $this->custom_logger->info("Crea registros en inventario");
                $id_movimientos_con = 1;


                /**
                 * Si aplica estante el cen_op - 20160830
                 */
                $sql = <<<EOD
select * from centro_operacion 
where id_cen_op = $id_cen_op and aplica_estante = 1 
EOD;
                //ejecuta el sql
                $resultado_apli = CN_TABLE::executeSQL($sql);

                $aplica_estante = false;
                if (count($resultado_apli) > 0) {
                    $aplica_estante = true;
                }


                /*
                 * Obtener el consecutivo del movimiento
                 */
                $sql = <<<EOD
select 
* 
from in_table_vig_seq
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op_mov
and nom_entidad = 'IN_MOVIMIENTOS_CON'   
EOD;
                //ejecuta el sql
                $resultado_seg = CN_TABLE::executeSQL($sql);

                if (count($resultado_seg) > 0) {
                    $this->custom_logger->info("Si hay secuencia.");
                    $id_movimientos_con = $resultado_seg[0]['seq'] + 1;
                } else {
                    //sentencia sql                
                    $sql = <<<EOD
Insert into IN_TABLE_VIG_SEQ (NOM_ENTIDAD,ID_CEN_OP,ID_VIGENCIA,SEQ,ID_TIPO_MOVIMIENTO) 
    values ('IN_MOVIMIENTOS_CON', $id_cen_op_mov, $id_anhos, $id_movimientos_con, $id_tipo_movimiento)   
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                }

                //valida el iva
                $tiene_iva = 0;
                if ($valor_iva > 0) {
                    $tiene_iva = 1;
                }


                /**
                 * Crear Cabecera del movimiento - 20150716
                 */
                //sentencia sql                
                $sql = <<<EOD
Insert into IN_MOVIMIENTOS_CON (ID_MOVIMIENTOS_CON,ID_VIGENCIA,ID_CEN_OP,ID_TIPO_MOVIMIENTO,
    ID_CONCEPTO_MOVIMIENTO,NUM_DOC,ID_TS_TD,FECHA_DOC,ID_MAE_TER_INI,ID_MAE_TER_FIN,
        ID_ESPACIO_INI,ID_ESPACIO_FIN,ID_TIPO_ALMACENAMIENTO_INI,ID_TIPO_ALMACENAMIENTO_FIN,
            ANULADO,FECHA_ANU,MOTIVO_ANU,ID_USUARIO_ANU,ESTADO,OBSERVACIONES,ID_CEN_OP_FIN,
                FECHA_MOV,VALOR_FACTURA,VALOR_AJUSTE,ID_USUARIO,TIENE_IVA,FECHA_MOV_TIME) 
values ( $id_movimientos_con, $id_anhos, $id_cen_op_mov, $id_tipo_movimiento, $id_concepto_movimiento, '$sec_factura', $id_ts_td, to_date(sysdate,'yyyy-mm-dd'),
    $id_mae_ter_inv, $id_mae_ter, $id_espacio, null, $id_tipo_almacenamiento, null,
        0, null, null, null, 1, '$observaciones', $id_cen_op_mov,
            to_date(sysdate,'yyyy-mm-dd'), 0, 0, $id_username, $tiene_iva, null)  
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);

                /*
                 * Actualizar la seq del movimiento
                 */
                //sentencia sql                
                $sql = <<<EOD
update in_table_vig_seq set seq = $id_movimientos_con
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op_mov
and nom_entidad = 'IN_MOVIMIENTOS_CON'   
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);



                /**
                 * Crear Detalle del movimiento - 20150716
                 */
                $id_det_mov_con = 1;
                /*
                 * Obtener el consecutivo del detalle del movimiento
                 */
                $sql = <<<EOD
select 
* 
from in_table_vig_seq
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op_mov
and nom_entidad = 'IN_DET_MOV_CON'   
EOD;
                //ejecuta el sql
                $resultado_seg = CN_TABLE::executeSQL($sql);

                if (count($resultado_seg) > 0) {
                    $this->logMessage("Si hay secuencia.");
                    $id_det_mov_con = $resultado_seg[0]['seq'] + 1;
                } else {
                    //sentencia sql                
                    $sql = <<<EOD
Insert into IN_TABLE_VIG_SEQ (NOM_ENTIDAD,ID_CEN_OP,ID_VIGENCIA,SEQ,ID_TIPO_MOVIMIENTO) 
    values ('IN_DET_MOV_CON', $id_cen_op_mov, $id_anhos, $id_det_mov_con, $id_tipo_movimiento)   
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                }

                //trae los productos
                $sql = <<<EOD
select 
--fac.id_factura_prod,
fac.id_factura,
fac.id_producto,
pro.codigo,
sum(fac.cantidad) as cantidad,
sum(fac.valor_uni_bruto) as valor_uni_bruto,
sum(fac.valor_uni_iva) as valor_uni_iva,
sum(fac.valor_uni_total) as valor_uni_total,
max(fac.referencia) as referencia
from ca_factura_prod fac
join ca_producto pro on pro.id_producto = fac.id_producto
where 
fac.id_factura = $id_factura 
group by
fac.id_factura,
fac.id_producto,
pro.codigo
order by
fac.id_producto    
EOD;
                //ejecuta el sql
                $resultado_prod = CN_TABLE::executeSQL($sql);
                /*
                 * For de productos
                 */
                foreach ($resultado_prod as $value) {

                    $id_producto = $value['id_producto'];
                    $codigo_elemento = $value['codigo'];
                    $cantidad = $value['cantidad'];


                    //verifica cantidad de elementos
                    $sql = <<<EOD
select 
inv.* 
from in_inventario_con inv
where 
inv.id_cen_op = $id_cen_op_mov
and inv.id_espacio = $id_espacio
and  inv.id_mae_ter = $id_mae_ter_inv
and inv.id_tipo_almacenamiento = $id_tipo_almacenamiento

and (inv.id_linea, inv.id_clase, inv.id_catalogo) in ( 
    select 
    invle.id_linea, invle.id_clase, invle.id_catalogo
    from in_codigo_elemento_v invle
    where 
    invle.codigo_elemento = '$codigo_elemento'
)   
EOD;
                    //ejecuta el sql
                    $resultado_cod = CN_TABLE::executeSQL($sql);

                    if (count($resultado_cod) > 0) {

                        $id_inventario_con = $resultado_cod[0]['id_inventario_con'];
                        $id_linea = $resultado_cod[0]['id_linea'];
                        $id_clase = $resultado_cod[0]['id_clase'];
                        $id_catalogo = $resultado_cod[0]['id_catalogo'];
                        $valor_promedio = $resultado_cod[0]['valor_promedio'];

                        $saldo = $resultado_cod[0]['saldo'];
                        //cantidad mayor al saldo de inventario, no genera registros
                        if ($cantidad > $saldo) {
                            $this->custom_logger->info("Validar cantidad de productos::" . $codigo_elemento);
                        } else {

                            $saldo = $saldo - $cantidad;

                            /**
                             * Crea el detalle
                             */
                            //sentencia sql                
                            $sql = <<<EOD
Insert into IN_DET_MOV_CON (ID_DET_MOV_CON,ID_MOVIMIENTOS_CON,ID_VIGENCIA,ID_INVENTARIO_CON,
    VALOR_UNITARIO,ANULADO,ESTADO,ID_CATALOGO,ID_CLASE,ID_LINEA,ID_CEN_OP,CANTIDAD,ID_TIPO_MOVIMIENTO,
        SALDO,VALOR_PROMEDIO,VALOR_PROMEDIO_ANT,ID_INVENTARIO_CON_FIN,SALDO_FIN) 
values ( $id_det_mov_con, $id_movimientos_con, $id_anhos, $id_inventario_con,
    $valor_promedio, 0, 1, $id_catalogo, $id_clase, $id_linea, $id_cen_op_mov, $cantidad, $id_tipo_movimiento,
        $saldo, $valor_promedio, $valor_promedio, null, 0)  
EOD;
                            //ejecuta el sql
                            $this->conn->execute($sql);

                            //Aumenta consecutivo del detalle del movimiento                                        
                            $id_det_mov_con = $id_det_mov_con + 1;
                        }
                    }
                }

                /*
                 * Actualizar la seq del detalle del movimiento
                 * Se resta uno ya que siempre, despues de insertar un registro aumenta en 1
                 */
                //sentencia sql                
                $sql = <<<EOD
update in_table_vig_seq set seq = $id_det_mov_con - 1
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op_mov
and nom_entidad = 'IN_DET_MOV_CON'   
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);


                /**
                 * Relacion de la factua y el inventario - 20160215
                 */
                //sentencia sql                
                $sql = <<<EOD
Insert into CA_FACTURA_POS_MOVIMIENTOS_CON (ID_FACTURA,ID_MOVIMIENTOS_CON,ID_VIGENCIA,ID_CEN_OP,ID_TIPO_MOVIMIENTO) 
    values ($id_factura,$id_movimientos_con,$id_anhos,$id_cen_op_mov,$id_tipo_movimiento) 
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);


                /**
                 * COMMIT
                 */
                //throw new Exception("Prueba COMMIT");
                $this->conn->commit();

                /**
                 * Descontar cantidad en inventario, llamar cierre en inventario - 20160215
                 * LLave: 
                  $num_movimiento_id = $request['id_movimientos_con'];
                  $id_tipo_movimiento = $request['id_tipo_movimiento'];
                  $id_vig = $request['id_vigencia'];
                  $id_cen_op = $request['id_cen_op'];
                 */
                $this->custom_logger->info("Descontar cantidad en inventario, llamar cierre en inventario");


                //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 ('service_url_inventario' == $routeName) {
                        foreach ($routeData as $key => $value) {
                            //echo $value . "\n";
                            if ($key == 'value') {
                                $service_url = $value;
                            }
                        }
                    }
                    $int++;
                }

                //$url = sfConfig::get('app-gwt_jasper_url');
                //echo $url;
                //$ch = curl_init("http://www.sofhouse.net/");
                //&PARAM_comando=pos_imprimir_factura&PARAM_envio_correo=true&PARAM_mensaje_log=1");
                $url = $service_url;
                $url = $url . 'cierre_salida_con/add.json?id_mod=17&username=websafi&nitocc=800189921&id_username=946&entidad_cliente=' . $entidad_cliente . '&id_cen_op_log=' . $id_cen_op_mov . '&comando=in_movi_consumo';

                //variables del credito
                $url = $url . '&id_movimientos_con=' . $id_movimientos_con;
                $url = $url . '&id_tipo_movimiento=' . $id_tipo_movimiento;
                $url = $url . '&id_vigencia=' . $id_anhos;
                $url = $url . '&id_cen_op=' . $id_cen_op_mov;
                /*
                 * Se coloca una variable mov_pos, para determinar si el cierre es po mov_pos para que no ejecute elecho del return  - 20160215
                 */
                $url = $url . '&mov_pos=' . 1;

                //Si aplica estante - 20160830
                if ($aplica_estante) {
                    $url = $url . '&aplica_estante=true';
                }

                //echo $url;
                //die ();

                $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'] == 1) {
//                                $mensajeError = "Error :: Al generar el movimiento de bancos, se debe anular la factura.";
//                                $this->status = 1;
//                                $this->list_data = array();
//                                $this->mensajeError = $mensajeError;
//                                $this->logMessage("[CREDITO_COMPLETO] " . $mensajeError);
//                            } else {
//                                $this->logMessage("[CREDITO_COMPLETO] Genero movimiento de bancos.");
//                            }

                $mensaje_inv = "[webcyc_factura_pos] Termino Movimiento INVENTARIO.";
                $this->custom_logger->info($mensaje_inv);


                $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
                $this->conn->beginTransaction();
            } else {
                $this->custom_logger->info("No aplica inventario.");
            }//Fin de mov inventario



            /*
             * Crear registro de error
             */
            $sql = <<<EOD
INSERT INTO CA_WEB_FACTURA_POS (ID_WEB_FACTURA_POS,ID_ANHOS,ID_PUNTO_VENTA,ID_MAE_TER,TIPO_RESPONSABILIDAD,
    FECHA_FACTURACION,VALOR_BRUTO,VALOR_IVA,VALOR_TOTAL,ID_CAJA,CONSEC_FAC,SESION_CAJA,CAJERO,OBSERVACIONES,
        PRODUCTOS,CANTIDADES,VALORES_UNI_BRUTO,VALORES_UNI_IVA,VALORES_UNI_TOTAL,
            ID_TS_PC_FP,ID_BN,ID_CB,NUM_DOC_SOP,FECHA_DOC_SOP,FECHA_LOG,
                TERMINO_PROCESO,ID_FACTURA,MOTIVO_ERROR) 
VALUES (null,'$id_anhos',$id_punto_venta,'$id_mae_ter','$tipo_responsabilidad',
    TO_DATE('$fecha_facturacion','YYYY-MM-DD'),'$valor_bruto','$valor_iva','$valor_total','$id_caja','$sec_factura','$sesion_caja','$cajero','$observaciones',
        '$productos','$cantidades','$valores_uni_bruto','$valores_uni_iva','$valores_uni_total',
            '$id_ts_pc_fp','$id_bn','$id_cb','$num_doc_sop',TO_DATE('$fecha_doc_sop','YYYY-MM-DD'),sysdate,
                '1','$id_factura','') 
EOD;
            $this->conn->execute($sql);

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

            /**
             * Respuesta servicio
             */
            $this->status = 0;
            //$this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'mensaje' => $mensaje,
                    'id_factura' => $id_factura,
                    'id_anhos' => $id_vigencia,
                    'sec_factura' => $sec_factura,
                    'servicio' => 'webcyc_factura_pos',
                    'modulo' => 'CARTERA',
                    'id_movimientos_con' => $id_movimientos_con,
                    'id_vigencia' => $id_vigencia_mov,
                    'id_cen_op' => $id_cen_op_mov,
                    'id_tipo_movimiento' => $id_tipo_movimiento
                )
            );
        } catch (Exception $e) {

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

            $mensaje = "[webcyc_factura_pos] ROLLBACK ERROR al Generar la factura. !!!";
            $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' => 'webcyc_factura_pos',
                    '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 webcyc_factura_pos, se generaron errores en el proceso de creación.'";
            $this->custom_logger->info("[webcyc_factura_pos] " . $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_WEB_FACTURA_POS (ID_WEB_FACTURA_POS,ID_ANHOS,ID_PUNTO_VENTA,ID_MAE_TER,TIPO_RESPONSABILIDAD,
    FECHA_FACTURACION,VALOR_BRUTO,VALOR_IVA,VALOR_TOTAL,ID_CAJA,CONSEC_FAC,SESION_CAJA,CAJERO,OBSERVACIONES,
        PRODUCTOS,CANTIDADES,VALORES_UNI_BRUTO,VALORES_UNI_IVA,VALORES_UNI_TOTAL,
            ID_TS_PC_FP,ID_BN,ID_CB,NUM_DOC_SOP,FECHA_DOC_SOP,FECHA_LOG,
                TERMINO_PROCESO,ID_FACTURA,MOTIVO_ERROR) 
VALUES (null,'$id_anhos',$id_punto_venta,'$id_mae_ter','$tipo_responsabilidad',
    TO_DATE('$fecha_facturacion','YYYY-MM-DD'),'$valor_bruto','$valor_iva','$valor_total','$id_caja','$sec_factura','$sesion_caja','$cajero','$observaciones',
        '$productos','$cantidades','$valores_uni_bruto','$valores_uni_iva','$valores_uni_total',
            '$id_ts_pc_fp','$id_bn','$id_cb','$num_doc_sop',TO_DATE('$fecha_doc_sop','YYYY-MM-DD'),sysdate,
                '0','$id_factura','$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';

            //Varios pagos para n debitos - 20200731::LAVILA
            $body = <<<EOD
<br/>
Se envia correo por fallo de webcyc_factura_pos; num_doc_sop($num_doc_sop) de fecha($fecha_doc_sop) y valor_total($valor_total).                                       
<br/> <br/> 
Error: 
<br/> <br/> 
$error_log
<br/> 
EOD;

            $params = array(
                'user_from' => 'webservice',
                'recipients' => $recipients,
                'asunto' => 'Error webcyc_factura_pos',
                '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' => 'webcyc_factura_pos',
                'modulo' => 'CARTERA'
            )
        );
    }

}
