<?php

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

/**
 * webanm_solit_vac actions.
 *
 * @package    nomina
 * @subpackage webanm_solit_vac
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webanm_solit_vacActions 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') . '/webanm_solit_vac.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));
        $this->custom_logger->info("[webanm_solit_vac] Servicio executeList webanm_solit_vac.\n");
        $this->custom_logger->info("---BEGIN Logging request--- (Revisar log proceso_completo.log)");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->custom_logger->info("[webanm_solit_vac] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[webanm_solit_vac] request[$key] = $value");
        }
        $this->custom_logger->info("---END Logging request");
        
        /**
         * Se agrega validacion para variables RAW, no deben enviar cabecera/json segun postman - 20211123::LAVILA
         */
        // 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);
        if($strlen_json > 0){
            $this->custom_logger->info("---BEGIN Logging request RAW");   
            
            $this->custom_logger->info("[webanm_solit_vac] strlen = $strlen_json\n");
            $this->custom_logger->info("[webanm_solit_vac] 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("[webanm_solit_vac] request[$key] = $value\n");
            }
            $this->custom_logger->info("---END Logging request RAW");        
        }

        /*
         * 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 = ' order by
tab0.num_doc, 
tab0.fecha_registro ';
        }

        $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';
        /*
         * obtener id maestro tabla
         */
        $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_NOVEDAD_VAC_SOLIT');
        /**
          1	CONSULTAR
          2	ACTUALIZAR
          3	ADICIONAR
          4	ELIMINAR
          5	ANULAR
         */
        $id_ope_bd = 1;
        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $id_mae_ter = $request['id_username'];
            }
        }
        //username
        $username = 'admin';
        if (isset($request['username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $username = $request['username'];
            }
        }
        //comando de la funcionalidad
        $comando = 'webanm_solit_vac';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        //construir observacion
        $observacion_log = "'Llamado a envio de consulta de solicitudes de vacaciones: " . $comando . "'";

        //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("[webanm_solit_vac] " . $observacion_log . ".\n");
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion_log);

            // Variables de retorno
            $resultado = array();


            /**
             * Verificar acceso a servicio por LDAP - 2021
             */
            //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 = '';
            $param_oblig_datos = explode(';', $param_oblig);

            /* foreach ($param_oblig_datos as $value) {
              if (!isset($request[$value])) {
              $this->parameters = false;
              $parametros = $parametros . ';' . $value;
              }
              if (isset($request[$value])) {
              $this->parameters = true;
              break;
              }
              } */

            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
            $wherenum_doc = ' ';
            if (isset($request['num_doc'])) {
                $wherenum_doc = " AND tab0.num_doc = '" . $request['num_doc'] . "'";
            }
            $wherenum_doc_jefe = ' ';
            if (isset($request['num_doc_jefe'])) {
                $wherenum_doc_jefe = " AND tab0.num_doc_jefe = '" . $request['num_doc_jefe'] . "'";
            }
            $whereid_tipo_doc = ' ';
            if (isset($request['id_tipo_doc'])) {
                $whereid_tipo_doc = " AND tab0.id_tipo_doc = '" . $request['id_tipo_doc'] . "'";
            }
            $wheresexo = ' ';
            if (isset($request['sexo'])) {
                $wheresexo = " AND tab0.sexo = '" . $request['sexo'] . "'";
            }
            $whereid_cen_op = ' ';
            if (isset($request['id_cen_op'])) {
                $whereid_cen_op = " AND tab0.id_cen_op = '" . $request['id_cen_op'] . "'";
            }
            $whereid_ea = ' ';
            if (isset($request['id_ea'])) {
                $whereid_ea = " AND tab0.id_ea = '" . $request['id_ea'] . "'";
            }
            $whereid_periodo = ' ';
            if (isset($request['id_periodo'])) {
                $whereid_periodo = " AND tab0.id_periodo = '" . $request['id_periodo'] . "'";
            }
            $whereid_anhos = ' ';
            if (isset($request['id_anhos'])) {
                $whereid_anhos = " AND tab0.id_anhos = '" . $request['id_anhos'] . "'";
            }
            $whereid_meses = ' ';
            if (isset($request['id_meses'])) {
                $whereid_meses = " AND tab0.id_meses = '" . $request['id_meses'] . "'";
            }
            $whereestado_general = ' ';
            if (isset($request['estado_general'])) {
                $whereestado_general = " AND tab0.estado_general = '" . $request['estado_general'] . "'";
            }



            /**
             * Consulta debitos segun filtros de entrada y parametrizacion - 20190912
             */
            $consulta_sql = <<<EOD
select
tab0.tipo_documento,
tab0.num_doc,
tab0.apellido_nombre,
tab0.genero,
tab0.centro_operacion,
tab0.dependencia,

tab0.id_novedad_vac_solit,
tab0.fecha_registro as fecha_registro_solit,
tab0.fecha_ini as fecha_ini_solit,
tab0.fecha_fin as fecha_fin_solit,
tab0.desc_estado_general,
tab0.fecha_estado_general,
tab0.NUM_DIAS_VAC,
tab0.NUM_DIAS_HAB,
tab0.periodo,
tab0.observaciones,
tab0.num_doc_jefe,
tab0.jefe,
                    
tab0.id_tipo_doc,
tab0.sexo,
tab0.id_cen_op,
tab0.id_ea,
tab0.id_periodo,
tab0.id_anhos,
tab0.id_meses,
tab0.estado_general

from (

    SELECT DISTINCT  
    tab0.id_novedad_vac_solit as id_novedad_vac_solit, tab0.id_tipo_doc as id_tipo_doc, tab0.num_doc as num_doc, 
    tab0.id_causa_vacac as id_causa_vacac, 
    to_char(tab0.fecha_per_cau, 'YYYY-MM-DD') as fecha_per_cau, to_char(tab0.fecha_ini, 'YYYY-MM-DD') as fecha_ini, 
    to_char(tab0.fecha_fin, 'YYYY-MM-DD') as fecha_fin, tab0.num_dias_vac as num_dias_vac, tab0.num_dias_hab as num_dias_hab, 
    tab0.observaciones as observaciones, tab0.id_jefe as id_jefe, tab0.id_periodo as id_periodo, to_char(tab0.fecha_registro, 'YYYY-MM-DD') as fecha_registro, 
    tab0.estado as estado, to_char(tab0.fecha_estado, 'YYYY-MM-DD HH:MI AM') as fecha_estado, tab0.usuario_estado as usuario_estado, tab0.obser_estado as obser_estado, 
    tab0.aprobado as aprobado, to_char(tab0.fecha_aprobado, 'YYYY-MM-DD') as fecha_aprobado, tab0.obser_aprobado as obser_aprobado, tab0.estado_general as estado_general, 
    tab0.desc_estado_general as desc_estado_general, tab0.usuario_estado_general as usuario_estado_general, tab0.obs_estado_general as obs_estado_general, 
    to_char(tab0.fecha_estado_general, 'YYYY-MM-DD') as fecha_estado_general, tab0.solicitud_anul as solicitud_anul, 
    to_char(tab0.fecha_solicitud_anul, 'YYYY-MM-DD') as fecha_solicitud_anul, tab0.solicitud_anul_obs as solicitud_anul_obs, tab0.cancelado as cancelado, 
    tab0.anulado as anulado, to_char(tab0.fecha_anulado, 'YYYY-MM-DD') as fecha_anulado, tab0.anulado_obs as anulado_obs, 
    
    tab2.tipo_documento,
    tab2.sexo,
    tab2.genero,
    tab2.nombre_completo as nombre_completo, 
    tab2.nombre_apellido as nombre_apellido, 
    tab2.apellido_nombre as apellido_nombre, 
    
    tab3.codigo as codigo, tab3.descripcion as descripcion, tab3.codigo||' - '||tab3.descripcion as completo_tipvac, 
    tab4.id_meses as id_meses, tab4.id_anhos as id_anhos, tab4.periodo as periodo, tab5.descripcion as descripcion_periodo, 
    to_char(tab6.fecha_ini, 'YYYY-MM-DD') as fecha_ini_causa, to_char(tab6.fecha_fin, 'YYYY-MM-DD') as fecha_fin_causa, tab6.dias_disfrutados as dias_disfrutados_causa, 
    tab6.saldos_dias as saldo_dias_causa, tab7.razon_soc as jefe, tab7.num_doc as num_doc_jefe ,
    
    tab8.id_cen_op,
    tab8.id_ea,
    cen.descripcion as centro_operacion,
    area.descripcion as  dependencia
    
    FROM NO_NOVEDAD_VAC_SOLIT_V tab0 
    
    LEFT JOIN NO_NOVEDAD_VAC tab1 ON tab0.id_novedad_vac = tab1.id_novedad_vac 
    LEFT JOIN NO_DATOS_FUNCIONARIO_V tab2 ON tab0.id_tipo_doc = tab2.id_tipo_doc AND tab0.num_doc = tab2.num_doc 
    LEFT JOIN NO_TIPO_NOV_VAC tab3 ON tab1.id_tipo_nov_vac = tab3.id_tipo_nov_vac 
    LEFT JOIN NO_PERIODO_V tab4 ON tab0.id_periodo = tab4.id_periodo 
    LEFT JOIN NO_TIPO_PERIODO tab5 ON tab4.id_tipo_periodo = tab5.id_tipo_periodo 
    LEFT JOIN NO_CAUSA_VACAC tab6 ON tab1.id_causa_vacac = tab6.id_causa_vacac 
    LEFT JOIN INTERCEROS_V tab7 ON tab0.id_jefe = tab7.id_mae_ter 
    
    LEFT JOIN no_estado_func_v tab8 ON tab0.id_tipo_doc = tab8.id_tipo_doc AND tab0.num_doc = tab8.num_doc  AND tab0.id_periodo = tab8.periodo   
    left join centro_operacion_v cen on cen.id_cen_op = tab8.id_cen_op
    left join area area on area.id_area = tab8.id_ea
    
    
    WHERE  
    tab0.id_novedad_vac_solit != '-1' 
    AND tab0.estado IN (0,1) 

)tab0  

WHERE
1 != 0    
$wherenum_doc
$wherenum_doc_jefe   
$whereid_tipo_doc
$wheresexo
$whereid_cen_op
$whereid_ea
$whereid_periodo    
$whereid_anhos
$whereid_meses                    
$whereestado_general   
EOD;


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

$sortBy    

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


            /*
             * INICIO variables por defecto para el registro de log
             */ {
                //obtiene el valor para su identificador unico
                $id_tabla = 'null';

                //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 = 'webanm_solit_vac';

                /*
                 * Construir observacion
                 */
                $observacion = "'Se consulto filtro : " . $id_tabla . " desde la funcionalidad: " . $comando . "'";

                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion_log);
            }
            /*
             * FIN variables por defecto para el registro de log
             */


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

            $this->status = 0;
            //$this->totalRows = $total_record_count;
            $this->totalRows = count($resultado);
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($resultado);
            $this->list_data = $resultado;
        } catch (Exception $e) {
            //rollback de todas las transacciones en caso de que ocurra algun error
            $this->conn->rollback();

            $mensaje = "[webanm_solit_vac] ROLLBACK ERROR al Generar la consulta de solicitudes de vacaciones. !!!";
            $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' => 'webanm_solit_vac',
                    'modulo' => 'NOMINA',
                    '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 webanm_solit_vac, se generaron errores en el proceso de consulta.'";
            $this->custom_logger->info("[webanm_solit_vac] " . $observacion_log . ".\n");
            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion_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' => 'webanm_solit_vac',
                'modulo' => 'NOMINA'
            )
        );
    }

}
