<?php
require_once(dirname(__FILE__) . '/../../../../../plugins/bhLDAPAuthPlugin/lib/adLDAP.php');
/**
 * consulta_sigestion actions.
 *
 * @package    contratacion
 * @subpackage consulta_sigestion
 * @author     Manuel Enrique Paredes Lopez
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
require_once 'HTMLPurifier.auto.php';
require 'HTMLPurifier.autoload.php';
class consulta_sigestionActions extends sfActions {

    /**
     * Executes list action
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {
        
        //Obtenemos todos los parametros
        //Declaramos variable para almacenar parametros obtenidos en un arreglo
        $json_parametros = array();
               
        $logPath = sfConfig::get('sf_log_dir') . '/webservice_consulta_sigestion.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));
        $this->custom_logger->info("[webservice_actualizacion_dominio] Servicio executeList webservice_consulta_sisgestion.\n");
                $this->custom_logger->info("---BEGIN Logging request--- (Revisar petición)");
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
             $this->custom_logger->info("[webservice_consulta_sisgestion] request[$key] = $value\n");
            if (isset($value)) {
                $json_parametros[$key] = $value;
            }
        }
        $this->logMessage("--------------------------------------------------*  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
              $this->custom_logger->info("[webservice_consulta_sisgestion] request[$key] = $value\n");
            if (isset($value)) {
                $json_parametros[$key] = $value;
            }
        }
        $this->custom_logger->info("---END Logging request");
        
     
        
        
        
        
        //Abrir nueva conexion con la Base de Datos
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();
        
        
        
        try {
            
            
                 $config = HTMLPurifier_Config::createDefault();
        $config->set('CSS.AllowedProperties', array());
        $config->set( 'HTML.ForbiddenElements', array('font','div','span','br','p','b') );
        $purifier = new HTMLPurifier($config);
            
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

        $int = 0;
        $entidad_cliente = "";
        foreach ($array as $routeName => $routeData) {

            if ('entidad_cliente' == $routeName) {
                foreach ($routeData as $key => $value) {
                    if ($key == 'value') {
                        $entidad_cliente = $value;
                    }
                }
            }
            $int++;
        }
        $id_ope_bd=1;
            $id_usuario = '1';
            $comando = 'webservice_consulta_sisgestion';
            $id_tabla = 'null';           
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('CO_CONTRATO');
            $username = !isset($request['usuario_web']) ? 'admin' : base64_decode($request['usuario_web']); //nombre de usuario
        
        
        if($entidad_cliente!=2&&$entidad_cliente!=3){
            
            
            //REGISTRO EN LOG INDICANDO QUE LA ENTIDAD ES INCORRECTA
            
            $codigo_error=0;
            
            
            
             $observacion_log = "'Entidad incorrecta solo disponible para anm y sgr. CODIGO: 0'";
                    
                    CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario,$username, $comando, $observacion_log);
            
            
             $mensaje = 'Entidad incorrecta solo disponible para anm y sgr. CODIGO: 0';
                    $this->list_data = array(
                        array(
                            'codigo_error' => $codigo_error,
                            'mensaje' => $mensaje,
                            'servicio' => 'webservice_consulta_sisgestion',
                            'modulo' => 'CONTRATACIÓN'
                        )
                    );
                    /* LOG WEBSERVICE LOG */
                    
                    
                    $this->conn->commit();


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

            $result = CN_TABLE::executeSQL($sql);
            $fecha_log_ini = $result[0]['fecha']; //Establecemos fechaHora de Inicio de consumo del servicio
            $this->custom_logger->info("[webservice_consulta_sisgestion]HORA INICIO:" . $fecha_log_ini);

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

            $observacion_log = "--Se ingreso a webservice_consulta_sisgestion--";

            $this->custom_logger->info("[webservice_consulta_sisgestion] " . $observacion_log . ".\n");
            
            
            
            
            
            
            /**
             * Verificar acceso a servicio por LDAP - 20191022
             */
            
            
            
            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);

                 $usuario_web = $request['usuario_web'];
                $clave_web = $request['clave_web'];

                if (!isset($usuario_web) || !isset($clave_web)) {
                    //Codigo de error - 20191001
                    $codigo_error = 1;
                    $error_log = 'Falta los parámetros de acceso obligatorios verificar. CODIGO: ' . $codigo_error;
                    $observacion_log = "'Falta los parametros de acceso obligatorios verificar. CODIGO:1'";
                    CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario,$username, $comando, $observacion_log);

                    $this->status == 0;
                    $mensaje = 'Falta los parámetros de acceso obligatorios verificar. CODIGO: 1';
                    $this->list_data = array(
                        array(
                            'codigo_error' => $codigo_error,
                            'mensaje' => $mensaje,
                            'servicio' => 'webservice_consulta_sisgestion',
                            'modulo' => 'CONTRATACIÓN'
                        )
                    );
                    
                    $this->conn->commit();
                    
                    return;
                    //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);
                $authUser = $adldap->authenticate($usuario_web, $clave_web);

                if ($authUser != true) {
                    //Codigo de error - 20191001
                    $codigo_error = 2;
                    $observacion_log = "'La autenticación de usuario($usuario_web) para el servicio web fallo; favor verificar. CODIGO: $codigo_error'";
                    CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario,$username, $comando, $observacion_log);

                    $mensaje = 'La autenticación de usuario('.$usuario_web.') para el servicio web fallo; favor verificar. CODIGO:2';
                    $this->list_data = array(
                        array(
                            'codigo_error' => $codigo_error,
                            'mensaje' => $mensaje,
                            'servicio' => 'webservice_consulta_sisgestion',
                            'modulo' => 'CONTRATACIÓN'
                        )
                    );

                    $this->conn->commit();
                    return;
                    //throw new Exception("La autenticación de usuario($usuario_web) para el servicio web fallo; favor verificar.");
                }
            }

            $observacion_log = "--Autenticado exitoso--sigue";
            
            
              /*
         * Paginacion
         */
        if (isset($request['_startRow'])) {
            $rowStart = $request['_startRow'];
        } else {
            $rowStart = 0;
        }

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

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

                
                
        
            
             $whereNumDoc = '';
        if(isset($request['num_doc'])){
            
            if(CN_TABLE::validarNumeroFormat($request['num_doc'])==false){
                $this->errorFormatoNumerico($request, $this->conn,'num_doc');
                
                
                return;
                
            }else{
                
                $whereNumDoc = 'AND tab0.documento_contratista ='.$request['num_doc'];
                
                
            }
            
            
            
        }
        
        $whereCodigoPaa = '';
        if(isset($request['codigopaa'])){
            
            if(CN_TABLE::validarNumeroFormat($request['codigopaa'])==false){
                
                $this->errorFormatoNumerico($request, $this->conn,'codigopaa');
                return;
            }else{
                
                $whereCodigoPaa = 'AND tab0.codigopaa ='.$request['codigopaa'];
                
            }
            
            
            
            
        }
        
        $whereAnho='';
        if(isset($request['anho'])){
            
            if(CN_TABLE::validarNumeroFormat($request['anho'])==false){
                $this->errorFormatoNumerico($request, $this->conn,'anho');
                return;
            } else {
                $whereAnho = 'AND tab0.id_anhos ='.$request['anho'];
            }
            
            
            
        }
        
        
        $whereNoContrato='';
        if(isset($request['no_contrato'])){
            
            if(CN_TABLE::validarNumeroFormat($request['no_contrato'])==false){
                $this->errorFormatoNumerico($request, $this->conn,'no_contrato');
                return;
                
                
            }else{
                
                $whereNoContrato='AND tab0.no_contrato ='.$request['no_contrato'];
                
            }
            
            
            
        }
        
        $whereDependencia='';
        if(isset($request['dependencia'])){
            
            if(CN_TABLE::validarNumeroFormat($request['dependencia'])==false){
                $this->errorFormatoNumerico($request, $this->conn,'dependencia');
                return;
                
                
            }else{
                
                $whereDependencia='AND tab0.area_sisgestion ='.$request['dependencia'];
                
            }
            
            
            
        }
        
        
        
        
        

            /*
             * 
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

select tab0.*

from(

   SELECT
  tab2.codigopaa as codigopaa,
  tab3.nombre_razon as nombre_contratista,
  tab3.num_doc as documento_contratista,
    tab0.id_contrato as id_contrato,  
        tab2.id_estudios_previos as id_estudios_previos,
  tab0.id_anhos as id_anhos,                    
  tab0.no_contrato as no_contrato,
  tab0.id_anhos as anho_contrato,
  /*FALTA ORIGEN DE CONTRATO*/
  tab0.valor,
  tab0.plazo,
  tab0.fecha_contrato,
  tab0.objeto,       
  tab4.area_sisgestion,    
  tab5.fecha_inicio,
  tab5.fecha_terminacion,    
  case when tab0.fuente_financiamiento like 'NACION' then 'ANM' else 'SGR' end AS sgranm
  FROM co_contrato_v tab0
    LEFT JOIN co_seleccion_ep tab1
  ON tab1.id_seleccion_ep = tab0.id_seleccion_ep
    LEFT JOIN co_estudios_previos tab2
  ON tab2.id_estudios_previos = tab1.id_estudios_previos
  LEFT JOIN co_contratista tab3 
  ON tab3.id_contratista=tab0.id_contratista
  LEFT JOIN AREA tab4 
    ON tab4.id_area=tab2.id_area  
  LEFT JOIN CO_LEGALIZA_CONTRATO tab5
      ON tab5.id_contrato=tab0.id_contrato

)tab0

where 
1=1     
    $whereNumDoc
    $whereCodigoPaa
    $whereAnho
    $whereNoContrato
    $whereDependencia                    

$sortBy   
                    
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);
            
            
            $final = array();
            $total=array();
            $cont=0;
            $cont_a=0;
            $cont_b=0;
            
            foreach ($resultado as $value){
                
               $response=array();
                
                
                
                
                $id_contrato=$value['id_contrato'];
             $sql = <<<EOD
        SELECT 
       tab1.rp as no_rp,
       tab1.fecha as fecha_rp,
       tab1.valor as valor
FROM CO_LEGALIZA_CONTRATO tab0
    JOIN RPS_V tab1 ON tab0.id_rp=tab1.rp 
       WHERE 1=1
        and tab0.id_contrato=$id_contrato         
EOD;
   
                $valores_rp = CN_TABLE::executeSQL($sql);
                $record_rp=array();
                if(count($valores_rp)>0){
                    foreach ($valores_rp as $valu){
                    
                     $record_rp[$cont_a]= array(
                            'numero_rp' =>$valu['no_rp'],
                            'fecha_rp' =>$valu['fecha_rp'],
                            'valor' =>$valu['valor']
                            
                        );
                    $cont_a++;
                    }
                }
                
                
                
                $id_estudios_previos = $value['id_estudios_previos'];
                
                
                
                      $sql = <<<EOD
        SELECT 
       tab0.ID_CDP as no_cdp,
       tab0.VALOR as valor,
       case when tab0.SGR=1 then 'SGR' else 'ANM' end AS entidad
FROM CO_CDPS_EP tab0
    WHERE 1=1 AND tab0.id_estudios_previos=$id_estudios_previos
EOD;
   
                $valores_cdps = CN_TABLE::executeSQL($sql);
                $record_cdps=array();
                
                if(count($valores_cdps)>0){
                    foreach ($valores_cdps as  $val){
                    
                      $record_cdps[$cont_b]= array(
                            'numero_cdp' =>$val['no_cdp'],
                            'valor' =>$val['valor'],
                            'entidad' =>$val['entidad']
                            
                        );
                     
                     
                     $cont_b++;
                    }
                }
                 
                    
               
               
                    $plazo = $purifier->purify($value['plazo']);
                    $objeto = $purifier->purify($value['objeto']);
                    $final[$cont]= array(
                            'codigopaa' =>$value['codigopaa'],
                            'dependencia' =>$value['area_sisgestion'],
                            'nombre_contratista' =>$value['nombre_contratista'],
                            'documento_contratista' =>$value['documento_contratista'],
                            'id_contrato'=>$value['id_contrato'],
                            'id_estudios_previos'=>$value['id_estudios_previos'],
                            'id_anhos'=>$value['id_anhos'],
                            'no_contrato'=>$value['no_contrato'],
                            'anho_contrato'=>$value['anho_contrato'],
                            'valor'=>$value['valor'],
                            'plazo'=>$plazo,
                            'fecha_contrato'=>$value['fecha_contrato'],
                            'fecha_inicio'=>$value['fecha_inicio'],
                            'fecha_terminacion'=>$value['fecha_terminacion'],
                            'objeto'=>$objeto,
                            'sgranm'=>$value['sgranm']
                            
                        );     
                    $final[$cont]['rp_sig_']=$record_rp;
                    $final[$cont]['cdps_sig_']=$record_cdps;
                   
                    $cont++;
            }
            
            
            
            

            $this->totalRows = count($final);
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($final);
            $this->list_data = $final;
            
            $observacion_log = "'Consulta exitosa....'";
                    CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario,$username, $comando, $observacion_log);
            
            $this->custom_logger->info("[webservice_consulta_sisgestion] Consulta exitosa. " );
            $this->conn->commit();
        } catch (Exception $ex) {
             //rollback de todas las transacciones en caso de que ocurra algun error
            
            
            $observacion_log = "'EXCEPCIÓN: => ".$ex->getMessage()."'";
            $this->conn->rollback();
            
            
             /**
             * Abrir nueva conexion con la Base de Datos
             */
            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();
            
            $id_ope_bd=1;
            $id_usuario = '1';
            $comando = 'webservice_consulta_sisgestion';
            $id_tabla = 'null';           
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('CO_CONTRATO');
            
            
            $codigo_error = 4;
            
            $username = !isset($request['usuario_web']) ? 'admin' : base64_decode($request['usuario_web']); //nombre de usuario
            CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario,$username, $comando, $observacion_log);

            $mensaje = "EXCEPCIÓN: => ".$ex->getMessage();
                    $this->list_data = array(
                        array(
                            'codigo_error' => $codigo_error,
                            'mensaje' => $mensaje,
                            'servicio' => 'webservice_consulta_sisgestion',
                            'modulo' => 'CONTRATACIÓN'
                        )
                    );
            
            
            
            
            
            
             $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array(
                        array(
                            'codigo_error' => $codigo_error,
                            'mensaje' => $mensaje,
                            'servicio' => 'webservice_consulta_sisgestion',
                            'modulo' => 'CONTRATACIÓN'
                        )
                    );
            $this->custom_logger->info("ERROR[webservice_consulta_sisgestion] [MENSAJE] ".$mensaje );
            
            /**
            * COMMIT
            */
            $this->conn->commit();
            
        }
        
       
    }
    
    public function errorFormatoNumerico(sfWebRequest $request, $conn,$campo){
        
        
         $id_ope_bd=1;
            $id_usuario = '1';
            $comando = 'webservice_consulta_sisgestion';
            $id_tabla = 'null';           
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('CO_CONTRATO');
            
            $username = !isset($request['usuario_web']) ? 'admin' : base64_decode($request['usuario_web']); //nombre de usuario
        
         $codigo_error = 3;
                    $observacion_log = "'Los filtros no cumplen el formato correcto detalle: ".$campo."'";
                    CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario,$username, $comando, $observacion_log);

                    $mensaje = "Los filtros no cumplen el formato correcto detalle: ".$campo.", CODIGO 3";
                    $this->list_data = array(
                        array(
                            'codigo_error' => $codigo_error,
                            'mensaje' => $mensaje,
                            'servicio' => 'webservice_consulta_sisgestion',
                            'modulo' => 'CONTRATACIÓN'
                        )
                    );
                    
                    $this->conn->commit();
    }
    
    
    
    
   
    
    
    

}
