<?php

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

/**
 * Creado: 20191023
 * http://soporte13.sofhouse.net/canon/web/api_dev.php/api/webservice_actualizacion_persona/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
 * webservice_actualizacion_persona actions.
 *
 * @package    canon
 * @subpackage webservice_actualizacion_persona
 * @author     Dany Ortega
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webservice_actualizacion_personaActions 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("[webservice_actualizacion_persona] Servicio executeList webservice_actualizacion_persona.\n");
        $this->custom_logger->info("---BEGIN Logging request--- (Revisar log proceso_completo.log)");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->custom_logger->info("[webservice_actualizacion_persona] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[webservice_actualizacion_persona] 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;
        /* Variables y constantes para Log */

        /* Fin Variables y constantes para Log */

        $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
        //el username desde qebsafiERP
        $usuario = 1;
        $usuario_ws = 'admin';
        //comando que identifica la funcionalidad
        $comando = 'webservice_actualizacion_persona';
        $success_txt = "";
        //Obtenemos la HOra actual de la BD
        $sql = <<<EOD
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') as fecha from dual
EOD;
        //ejecuta el sql
        $this->conn->execute($sql);
        $result = CN_TABLE::executeSQL($sql);
        $fecha_log_ini = $result[0]['fecha']; //Establecemos fechaHora de Inicio de consumo del servicio
        $this->custom_logger->info("HORA INICIO:" . $fecha_log_ini);
        $cliente = !isset($request['cliente']) ? 'ANNA' : $request['cliente']; //Cliente que utiliza el servicio
        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('RMN_PERSONA');

        //  1- CONSULTAR, 2- ACTUALIZAR, 3 - ADICIONAR, 4 - ELIMINAR, 5 - ANULAR
        $id_ope_bd = 2;
        //id del maestro tercero
        $id_mae_ter_log = 1;
        $comando = 'webservice_actualizacion_persona';
        //construir observacion
        $observacion_log = "'Se ingreso a actualizar persona desde servicio web webservice_actualizacion_persona'";
        $error_log = '';

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

        //PARAMETROS Y VARIABLES
        /**
         * Variables obligatorias y Opcionales
         */
        $correo = !isset($request['correo']) ? 'null' : $request['correo'];
        $correo_alt = !isset($request['correo_alt']) ? 'null' : $request['correo_alt'];
        $id_persona = !isset($request['id_persona']) ? 'null' : $request['id_persona'];
        $nombre = !isset($request['nombre']) ? 'null' : $request['nombre'];
        $num_doc = !isset($request['num_doc']) ? 'null' : $request['num_doc'];
        $primer_apellido = !isset($request['primer_apellido']) ? 'null' : $request['primer_apellido'];
        $segundo_apellido = !isset($request['segundo_apellido']) ? 'null' : $request['segundo_apellido'];
        $raz_soc = !isset($request['raz_soc']) ? 'null' : $request['raz_soc'];
        $celular = !isset($request['celular']) ? 'null' : $request['celular'];
        $telefono = !isset($request['telefono']) ? 'null' : $request['telefono'];
        $id_tipo_terceros = !isset($request['id_tipo_terceros']) ? 'null' : $request['id_tipo_terceros'];

        //Obtenemos todos los parametros
        //Declaramos variable para almacenar parametros obtenidos en un arreglo
        $json_parametros = array();
        $parameters = 'clave_web;usuario_web;cliente;correo;correo_alt;id_persona;nombre;num_doc;primer_apellido;segundo_apellido;raz_soc;celular;telefono;id_tipo_terceros';
        $param_oblig = 'correo;id_persona;'
                . 'nombre;num_doc;primer_apellido;segundo_apellido;raz_soc;celular;telefono;id_tipo_terceros';
        $campostype = 'var;num;'
                . 'var;var;var;var;var;var;var;num';
        $valand = $this->valCAMP($param_oblig, $campostype, $request); 
        $parametros_datos = explode(';', $parameters);
       
        // $this->custom_logger->info("[webservice_actualizacion_persona] ID_PERSONA" . $id_persona . ".\n");
        
       
            
             //Recorremos cada una de las variables y almacenamos en json parametros
        foreach ($parametros_datos as $value) {
            if (isset($request[$value])) {
                $json_parametros[$value] = $request[$value];
            }
        }
        
        /**
         * Inicio del proceso
         */
        try {
            if($valand!='false'){
                $id_persona='null';
                $id_tipo_terceros='null'; 
                $codigo_error = 3;
                throw new Exception( " CAMPOS Numericos: $valand");
                
            }

            // Registro de consulta en tabla de log
            $this->custom_logger->info("[webservice_actualizacion_persona] " . $observacion_log . ".\n");

            $id_tabla = $id_persona;
            CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, "1", $comando, $observacion_log);
            // 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.");
                }

                //Obtenemos datos de validacion de usuario
                //Estos datos deben venir encriptados en base64
                $usuario_web = $request['usuario_web'];
                $clave_web = $request['clave_web'];
                //Desencriptamos los datos de Usuario y contraseña
                $usuario_web = base64_decode($usuario_web);
                $clave_web = base64_decode($clave_web);
                $usuario_ws = $usuario_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 = 'correo;id_persona;nombre;num_doc;primer_apellido;segundo_apellido;raz_soc;celular;telefono;id_tipo_terceros';
            $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.");
            }

            //sentencia sql
            $sql = <<<EOD
SELECT
    *
FROM rmn_tipo_terceros
where
id_tipo_terceros = $id_tipo_terceros 
EOD;
            //ejecuta el sql
            $resultado = CN_TABLE::executeSQL($sql);

            if (count($resultado) <= 0) {
                //Codigo de error - 20191001
                $codigo_error = 25;
                throw new Exception("No existe tipo_tercero $id_tipo_terceros.");
            }

            /*
             * Verificar tercero por num_doc, sino lo crea
             */
            //sentencia sql
            $sql = <<<EOD
SELECT * 
FROM RMN_PERSONA 
WHERE ID_persona= $id_persona 
EOD;
            //ejecuta el sql
            $this->conn->execute($sql);
            $resultado_ter = CN_TABLE::executeSQL($sql);

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

                /*
                 * RMN_PERSONA :: CORREO, 
                  CORREO_ALT,
                  ID_PERSONA,
                  NOMBRE,
                  NUM_DOC,
                  PRIMER_APELLIDO,
                  SEGUNDO_APELLIDO,
                  RAZ_SOC,
                  CELULAR,
                  TELEFONO
                 */
                //agregamos comillas a variables opcionales de texto
                if ($correo_alt != 'null') {
                    $correo_alt = "'$correo_alt'";
                }

                $sql = <<<EOD
INSERT INTO RMN_PERSONA (CORREO, CORREO_ALT,
ID_PERSONA, NOMBRE, NUM_DOC,PRIMER_APELLIDO, SEGUNDO_APELLIDO,RAZ_SOC, CELULAR, TELEFONO,ID_TIPO_TERCEROS
) VALUES (
'$correo',$correo_alt, $id_persona, '$nombre', '$num_doc',
'$primer_apellido', '$segundo_apellido', '$raz_soc',
'$celular', '$telefono','$id_tipo_terceros');
EOD;
                $this->conn->execute($sql);

                //obtiene el valor para su identificador unico
                $id_tabla = $id_persona;
                //3 - indica operacion de adicionar de registro
                $id_ope_bd = 3;
                /*
                 * Construir observacion
                 */
                $observacion = "'Se adiciono id_persona : " . $id_tabla . " desde la funcionalidad: " . $comando . "'";
                $success_txt = "Se adiciono id_persona : " . $id_tabla;

                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $comando, $observacion);
            } else {//ACTUALIZAMOS RMN PERSONA EXISTENTE
                /* RMN_PERSONA :: CORREO, 
                  CORREO_ALT,
                  ID_PERSONA,
                  NOMBRE,
                  NUM_DOC,
                  PRIMER_APELLIDO,
                  SEGUNDO_APELLIDO,
                  RAZ_SOC,
                  CELULAR,
                  TELEFONO
                 */
                //agregamos comillas a variables opcionales de texto
                if ($correo_alt != 'null') {
                    $correo_alt = "'$correo_alt'";
                }
                $sql = <<<EOD
UPDATE RMN_PERSONA SET
CORREO = '$correo'
, CORREO_ALT = $correo_alt
, NOMBRE = '$nombre'
, NUM_DOC = '$num_doc'
, PRIMER_APELLIDO = '$primer_apellido'
, SEGUNDO_APELLIDO = '$segundo_apellido'
, RAZ_SOC = '$raz_soc'
, CELULAR = '$celular'
, TELEFONO = '$telefono'
, ID_TIPO_TERCEROS = '$id_tipo_terceros'
WHERE ID_PERSONA = $id_persona
EOD;
                $this->conn->execute($sql);

                //obtiene el valor para su identificador unico
                $id_tabla = $id_persona;
                //3 - indica operacion de adicionar de registro
                $id_ope_bd = 2;
                /*
                 * Construir observacion
                 */
                $observacion = "'Se Actualizo id_persona : " . $id_tabla . " desde la funcionalidad: " . $comando . "'";
                $success_txt = "Se Actualizo id_persona : " . $id_tabla;
                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $comando, $observacion);
            }

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

            $this->status = 0;
            //$this->mensajeError = $mensaje;
            $respuesta = array(
                'mensaje' => $mensaje,
                'servicio' => 'webservice_actualizacion_persona',
                'modulo' => 'CANON'
            );
            $this->list_data = array($respuesta);
        } catch (Exception $e) {

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

            $mensaje = "[webservice_actualizacion_persona] ROLLBACK ERROR al actualizar persona. !!!";
            $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;
            $respuesta = array(
                'code' => $e->getCode(),
                'mensaje' => $e->getMessage(),
                'servicio' => 'webservice_actualizacion_persona',
                'modulo' => 'CANON',
                'codigo_error' => $codigo_error
            );
            $this->list_data = array($respuesta);

            /*
             * 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 webservice_actualizacion_persona, se generaron errores en el proceso de creación.'";
            $usuario = 1;
            $this->custom_logger->info("[webservice_actualizacion_persona] " . $observacion_log . ".\n");

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

            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $comando, 'null');

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

            /**
             * 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 webservice_actualizacion_persona; ID PERSONA().                                       
<br/> <br/> 
Error: 
<br/> <br/> 
$error_log
<br/> 
EOD;

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

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

            $this->custom_logger->info("Envio de correo de error fin");
        }
        /**
         * Crear registro de WebServicelog
         */
        $this->custom_logger->info("Inicio crear registro en el webservices_log");
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();
        $parametros = json_encode($json_parametros);
        $respuesta = json_encode($respuesta);
        $termino_proceso = $this->status == 1 ? "0" : "1";
        CN_TABLE::registroWebservicesLog($usuario_ws, $cliente, $comando, $fecha_log_ini, $parametros, $respuesta, $termino_proceso, $error_log);
        $this->conn->commit();
        $this->custom_logger->info("Fin crear registro en el webservices_log");
    }

    /**
     * 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' => 'webservice_actualizacion_persona',
                'modulo' => 'CANON'
            )
        );
    }
    
    
       /**
     * Validador de campos numericos
     * @campval Tipos de campos
     * @param type $param_oblig
     * @param sfWebRequest $request
     * @return string
     */
    public function valCAMP($param_oblig,$campval, sfWebRequest $request){
        $param_oblig_datos = explode(';', $param_oblig);
        $param_faltantes = 'false';
        $campval_type= explode(';', $campval);
        $cont=0;
        foreach ($param_oblig_datos as $value){
            
            if($campval_type[$cont]=='num'){
                
                if(CN_TABLE::validarNumeroFormat($request[$value])==false){
                    if ($param_faltantes == 'false') {
                        $param_faltantes = '';
                    }
                    $param_faltantes = $param_faltantes ." ". $value.", ";
                }
                
                
            }
            /*
             if($campval_type[$cont]=='date'){
                
                if(CN_TABLE::validarStringDateFormat($request[$value])==false){
                    if ($param_faltantes == 'false') {
                        $param_faltantes = '';
                    }
                    
                    $param_faltantes = $param_faltantes ." CAMPOS de fecha debe tener formato yyyy-mm-dd: ". $value.",";
                }
                
            } */
            
            $cont++;
            
        }
        
        return $param_faltantes;
        
        
    }
    
    
    /**
     * 
     * @param type $param_oblig
     * @param sfWebRequest $request
     * @return string
     */
    public function validarCAMPOS($param_oblig, sfWebRequest $request) {

        $param_oblig_datos = explode(';', $param_oblig);
        $param_faltantes = 'false';

        foreach ($param_oblig_datos as $value) {
            if (!isset($request[$value])) {
                if ($param_faltantes == 'false') {
                    $param_faltantes = '';
                }
                $param_faltantes = $param_faltantes ." " . $value.",";
            } elseif ($request[$value] == null || $request[$value] == 'null' || $request[$value] == '') {
                if ($param_faltantes == 'false') {
                    $param_faltantes = '';
                }
                $param_faltantes = $param_faltantes . " " . $value.",";
            }
        }

        return $param_faltantes;
    }

}
