<?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_verificar/list.json?id_debito=14897&usuario_web=pruebassh&clave_web=Temporal2019
 * webservie_sigm_verificar actions.
 *
 * @package    cartera
 * @subpackage webservie_sigm_verificar
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webservie_sigm_verificarActions 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_verificar] Servicio executeList webservie_sigm_verificar.\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_verificar] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[webservie_sigm_verificar] request[$key] = $value");
        }
        $this->custom_logger->info("---END Logging request");

        /*
         * Paginacion
         */
        if (isset($request['_startRow'])) {
            $rowStart = $request['_startRow'];
        } else {
            $rowStart = 0;
        }

        if (isset($request['_endRow'])) {
            $rowEnd = $request['_endRow'];
        } else {
            $rowEnd = 10000;
        }

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = ' ';
        }

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

        //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_debito = '';
        $sec_debito = '';
        $estado_pagado = '';

        //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 = 1;
        //id del maestro tercero
        $id_mae_ter_log = 1;
        $usuario = 'admin';
        $comando = 'webservie_sigm_verificar';
        //construir observacion
        $observacion_log = "'Se ingreso a verificar debito desde servicio web sigm verificar'";

        //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_verificar] " . $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.");
                }
            }


            /*
             * Verificar parametros - 20190911
             */
            $param_oblig = 'id_debito';
            $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 los parámetros($parametros) obligatorios verificar.");
            }


            /**
             * Variables obligatorias
             */
            //varialbes de referencias
            $id_debito = $request['id_debito'];

            /**
             * Validar si el titulo existe
             */
            $consulta_sql = <<<EOD
SELECT
id_debito,
sec_debito,
estado,
cancelado as estado_pagado
FROM ca_debito_vencimientos
where
id_debito = $id_debito  
EOD;
            /*
             * Sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            /*           $sql = <<<EOD
              select count(*) as count from (

              $consulta_sql

              )
              EOD;


              $total_record_count = CN_TABLE::executeSQL($sql);
              $total_record_count = $total_record_count[0]["count"];
             */

            //obtener el listado de recaudos
            $sql = <<<EOD
                    
$consulta_sql

$sortBy    

EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql, true);

            /*
             * Verifica que sea un registro para insertar las referencias del debito
             */
            if (count($resultado) == 0) {
                //Codigo de error - 20191001
                $codigo_error = 8;
                throw new Exception("No se encontro registro con el id_debito($id_debito) no existe en el modulo de CARTERA; favor verificar.");
            }

            $estado = $resultado[0]['estado'];

            if (!$estado) {
                //Codigo de error - 20191001
                $codigo_error = 9;
                throw new Exception("El id_debito($id_debito) esta anulado o reversado, por lo tanto ya no permite el pago en el modulo de CARTERA; favor verificar.");
            }

            $sec_debito = $resultado[0]['sec_debito'];
            $estado_pagado = $resultado[0]['estado_pagado'];


            /*
             * 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 = 1;

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

                /*
                 * Construir observacion
                 */
                $observacion = "'Se verifico id_debito : " . $id_debito . " 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 registro de log
             */
            $sql = <<<EOD
Insert into CA_WEBSEVICE_VERIFICAR (ID_WEBSEVICE_VERIFICAR,ID_DEBITO,FECHA_LOG,TERMINO_PROCESO,
    SEC_DEBITO,ESTADO_PAGADO,MOTIVO_ERROR) 
values (null,'$id_debito',sysdate,'1',
    '$sec_debito','$estado_pagado','')  
EOD;
            $this->conn->execute($sql);


            /**
             * COMMIT
             */
            $this->conn->commit();
            $mensaje = 'Proceso terminado exitoso de verificación.';
            $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,
                    'estado_pagado' => $estado_pagado,
                    'servicio' => 'webservie_sigm_verificar',
                    'modulo' => 'CARTERA'
                )
            );
        } catch (Exception $e) {

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

            $mensaje = "[webservie_sigm_verificar] ROLLBACK ERROR al Generar verificación del 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_verificar',
                    '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 = 1;
            $observacion_log = "'Se termino el proceso de webservie_sigm_verificar, se generaron errores en el proceso de verificación.'";
            $this->custom_logger->info("[webservie_sigm_verificar] " . $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_VERIFICAR (ID_WEBSEVICE_VERIFICAR,ID_DEBITO,FECHA_LOG,TERMINO_PROCESO,
    SEC_DEBITO,ESTADO_PAGADO,MOTIVO_ERROR) 
values (null,'$id_debito',sysdate,'0',
    '$sec_debito','$estado_pagado','$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_verificar; id_debito ($id_debito).                                       
<br/> <br/> 
Error: 
<br/> <br/> 
$error_log
<br/> 
EOD;

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

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

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

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

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

}
