<?php

require_once(dirname(__FILE__) . '/../../../../../plugins/bhLDAPAuthPlugin/lib/adLDAP.php');
/**
 * consulta_sigestion actions.
 * 
 * Link pruebas:
 * http://10.0.100.218/contratacion/web/api_dev.php/api/consulta_sigestion/list.json?usuario_web=c29maG91c2U=&clave_web=QWdlbmNpYTIwMTM=&codigopaa=030015020
 *
 * @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 consulta_sigestion.\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("[consulta_sigestion] 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("[consulta_sigestion] 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 = 'consulta_sigestion';
            $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' => 'consulta_sigestion',
                        '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("[consulta_sigestion]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 consulta_sigestion--";

            $this->custom_logger->info("[consulta_sigestion] " . $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' => 'consulta_sigestion',
                            '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' => 'consulta_sigestion',
                            '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 = 7500;
            }

            //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 = '';
            $whereCodigoPaaJoin = '';
            if (isset($request['codigopaa'])) {

                if (CN_TABLE::validarNumeroFormat($request['codigopaa']) == false) {

                    $this->errorFormatoNumerico($request, $this->conn, 'codigopaa');
                    return;
                } else {

                    $whereCodigoPaa = 'AND codeps.codigopaa =' . $request['codigopaa'];
                    $whereCodigoPaaJoin = '
left join co_codigopaa_ep codeps
on codeps.id_estudios_previos = tab0.id_estudios_previos';
                }
            }

            $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'];
                }
            }

            $whereAnhoContrato = '';
            if (isset($request['anho_contrato'])) {

                if (CN_TABLE::validarNumeroFormat($request['anho_contrato']) == false) {
                    $this->errorFormatoNumerico($request, $this->conn, 'anho_contrato');
                    return;
                } else {
                    $whereAnho = 'AND tab0.anho_contrato =' . $request['anho_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
             * Se valida que tome solo un registro de CO_LEGALIZA_CONTRATO - 20200506::LAVILA
             * Se separa codigo lineapaa - 20201106
             * Solo contratos legalizados - 20201118::LAVILA
             */
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

select 

tab0.*

from(

    SELECT
    tab2.tipobolsa as tipobolsa,
    linpaa.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,
    tab2.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 as fecha_inicio, 
    tab5.fecha_terminacion as 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_codigopaa_ep linpaa
    on linpaa.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 (
         select
         id_contrato,
         min(fecha_inicio) as fecha_inicio, 
         max(fecha_terminacion) as fecha_terminacion
         from CO_LEGALIZA_CONTRATO
         group by
         id_contrato
     ) tab5
       ON tab5.id_contrato=tab0.id_contrato

)tab0

$whereCodigoPaaJoin

where 
1 = 1     
and tab0.id_estudios_previos is not null 
$whereNumDoc
$whereCodigoPaa
$whereAnho
$whereNoContrato
$whereAnhoContrato                    
$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;
            $cont_c = 0;

            // Se agregan campos nuevos de cdp_ep segun sigestion - 20200528::LAVILA
            foreach ($resultado as $value) {

                $id_estudios_previos = $value['id_estudios_previos'];

                $response = array();

                /**
                 * LineasPAA - 20200911
                 */
                //Se agrega order
                $sql = <<<EOD
SELECT
id_estudios_previos,
codigopaa,
tipobolsa,
mesinicio,
valorvigencia,
codigosunspsc

FROM co_codigopaa_ep

where
id_estudios_previos = $id_estudios_previos  
    
order by                        
codigopaa                        
EOD;

                $valores_linea = CN_TABLE::executeSQL($sql);
                $record_linea = array();

                if (count($valores_linea) > 0) {
                    foreach ($valores_linea as $val) {
                        $this->custom_logger->info($cont_c . "[codigopaa] " . $val['codigopaa'] . ".\n");

                        $record_linea[$cont_c] = array(
                            'codigopaa' => $val['codigopaa'],
                            'tipobolsa' => $val['tipobolsa'],
                            'mesinicio' => $val['mesinicio'],
                            'valorvigencia' => $val['valorvigencia'],
                            'codigosunspsc' => $val['codigosunspsc']
                        );


                        $cont_c++;
                    }
                }



                /**
                 * Consulta de CDP 
                 */
                //Se agrega order
                $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,
tab0.NUMERO_SOLICITUD,
TO_char(tab0.FECHA_CDP, 'YYYY-MM-DD"T"HH24:MI:SS') as FECHA_CDP,
tab0.RUBRO                        
                        
FROM CO_CDPS_EP tab0
                        
WHERE 
1=1 
AND tab0.id_estudios_previos = $id_estudios_previos

order by
tab0.sgr,
tab0.ID_CDP  
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_solicitud' => $val['numero_solicitud'],
                            'numero_cdp' => $val['no_cdp'],
                            'fecha_cdp' => $val['fecha_cdp'],
                            'rubro' => $val['rubro'],
                            'valor' => $val['valor'],
                            'entidad' => $val['entidad']
                        );


                        $cont_b++;
                    }
                }


                /**
                 * Consulta de RPs
                 */
                $id_contrato = $value['id_contrato'];

                //Se agrega no_cdp para retornar en la consulta - 20200424::LAVILA
                $sql = <<<EOD
select distinct

tab0.*

from(

    select 
    
    tab1.rp as no_rp,
    tab1.fecha as fecha_rp,
    tab1.valor as valor,
    tab1.cdp as no_cdp, 
    tab1.sgr,
    case when tab1.sgr=1 then 'SGR' else 'ANM' end as entidad,
    cdp.numero_solicitud,
    TO_char(cdp.FECHA_CDP, 'YYYY-MM-DD"T"HH24:MI:SS') as FECHA_CDP,
    cdp.rubro
                            
    from co_legaliza_contrato tab0
    
    left join co_contrato_v cont
    on cont.id_contrato = tab0.id_contrato
    
    left join co_seleccion_ep sel
    on sel.id_seleccion_ep = cont.id_seleccion_ep
                            
    join rps_contrato_v tab1 
    on tab0.id_rp = tab1.rp 
    and tab0.vigencia_rp = tab1.vigencia 
    and tab0.rp_sgr = tab1.sgr
    
    left join co_cdps_ep cdp
    on cdp.id_cdp = tab1.cdp
    and cdp.sgr = tab1.sgr
    and cdp.id_estudios_previos = sel.id_estudios_previos
    
                            
    where 
    1=1
    and tab0.id_contrato = $id_contrato 

)tab0

order by
tab0.sgr,
tab0.no_rp      
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_rp' => $valu['valor'],
                            'numero_solicitud' => $valu['numero_solicitud'],
                            'numero_cdp' => $valu['no_cdp'],
                            'fecha_cdp' => $valu['fecha_cdp'],
                            'rubro' => $valu['rubro'],
                            'entidad' => $valu['entidad']
                        );
                        $cont_a++;
                    }
                }


                $plazo = $purifier->purify($value['plazo']);
                $objeto = $purifier->purify($value['objeto']);
                $final[$cont] = array(
                    'tipobolsa' => $value['tipobolsa'],
                    '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]['cdps_sig_'] = $record_cdps;
                $final[$cont]['rp_sig_'] = $record_rp;
                //$final[$cont]['lineas_sig_'] = $record_linea;//Se omite por separacion de lineapaa - 20201106

                $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("[consulta_sigestion] 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 = 'consulta_sigestion';
            $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' => 'consulta_sigestion',
                    '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' => 'consulta_sigestion',
                    'modulo' => 'CONTRATACIÓN'
                )
            );
            $this->custom_logger->info("ERROR[consulta_sigestion] [MENSAJE] " . $mensaje);

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

    public function errorFormatoNumerico(sfWebRequest $request, $conn, $campo) {


        $id_ope_bd = 1;
        $id_usuario = '1';
        $comando = 'consulta_sigestion';
        $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' => 'consulta_sigestion',
                'modulo' => 'CONTRATACIÓN'
            )
        );

        $this->conn->commit();
    }

}
