<?php

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

/**
 * webanm_novedad_nom actions.
 * 
 * Construir un Webservice con información de funcionarios: Exponer la información
  correspondiente a las ausencias de funcionarios, derivada de las novedades de nómina.
 * 
  a) Cuando cualquiera de estas novedades se cancele antes de la fecha de su terminación
  programada, se reporta una novedad con la palabra CANCELADA.
  b) CANCELADA: con la novedad cancelada, van al LDAP y borrar la programación de fechas
  de inactivación.
  c) Las novedades que se reportan de un mismo funcionario no se pueden solapar, es decir
  no pueden cruzar con el rango de fechas de otra
 *
 * @package    nomina
 * @subpackage webanm_novedad_nom
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webanm_novedad_nomActions 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_novedad_websafi.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));
        $this->custom_logger->info("[webanm_novedad_nom] Servicio executeList webanm_novedad_nom.\n");
        $this->custom_logger->info("---BEGIN Logging request--- (Revisar log webanm_novedad_websafi.log)");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->custom_logger->info("[webanm_novedad_nom] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[webanm_novedad_nom] 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 = ' order by
tab0.id_tipo_nov_nom, 
tab0.num_doc, 
tab0.fecha_inicial ';
        }

        $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_NOMBRAMIENTO');
        /**
          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_novedad_nom';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        //construir observacion
        $observacion_log = "'Llamado a envio de consulta de novedades nomina websafi: " . $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_novedad_nom] " . $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'] . "'";
            }
            $wherenusername = ' ';
            if (isset($request['username'])) {
                $wherenusername = " AND tab0.username = '" . $request['username'] . "'";
            }
            $whereid_tipo_nov_nom = ' ';
            if (isset($request['id_tipo_nov_nom'])) {
                $whereid_tipo_nov_nom = " AND tab0.id_tipo_nov_nom = '" . $request['id_tipo_nov_nom'] . "'";
            }

            /**
             * Consulta debitos segun filtros de entrada y parametrizacion
             * NOVEDADES FUNCIONARIOS:
              1-Retiro: Fecha desde
              2-Vacaciones
              3-Vacaciones – Cancelada por Vacaciones interrumpidas o aplazadas
              4-Otras ausencias
              5-Otras ausencias – Cancelada
             * 
             * Validaciones complementarias:Las otras ausencias se van a generar desde las siguientes novedades:
              Incapacidades y licencias
              Permisos o ausentismos superiores a 1 día
              Comisiones otra entidad.
             * Validacion de fechas segun novedad, ultimo mes, o segun fechas novedad - 20211118::LAVILA
             * Incidente #25162, Se realiza cambios para la novedades de vac y kardex que tome segun fecha actual - 20220222::LAVILA
             */
            $consulta_sql = <<<EOD
select
tab0.tipo_documento,
tab0.num_doc,
tab0.apellido_nombre,
tab0.username,
tab0.email,
tab0.id_tipo_nov_nom, 
case 
when tab0.id_tipo_nov_nom = 1 then 'Retiro'
when tab0.id_tipo_nov_nom = 2 then 'Vacaciones'
when tab0.id_tipo_nov_nom = 3 then 'Vacaciones interrumpidas o aplazadas'
when tab0.id_tipo_nov_nom = 4 then 'Otras ausencias'
when tab0.id_tipo_nov_nom = 5 then 'Otras ausencias – Cancelada'
else ''
end tipo_novedad, 
tab0.fecha_inicial, 
tab0.fecha_final

from (
    
    select distinct 
    dat.tipo_documento as tipo_documento,
    nov.num_doc,
    dat.apellido_nombre as apellido_nombre,
    usu.username,
    usu.email as email,
    1 as id_tipo_nov_nom, 
    nov.fecha_terminacion as fecha_inicial, 
    null as fecha_final 
    
    from no_novedad_personal nov
    
    left join no_datos_funcionario_v dat
    on dat.id_tipo_doc = nov.id_tipo_doc
    and dat.num_doc = nov.num_doc
    
    left join no_novedades tipno
    on tipno.id_novedad = nov.id_novedad
    
    join no_nombramiento_v nom
    on nov.id_tipo_doc = nom.id_tipo_doc
    and nov.num_doc = nom.num_doc
    
    left join usuario usu
    on usu.num_doc = nov.num_doc
    
    where
    tipno.id_tipo_novedad = 2
    and nov.estado = 1
    and nom.estado = 0
    and nov.fecha_terminacion >= nom.fecha_ingreso
    and nov.fecha_terminacion >= ADD_MONTHS(last_day(sysdate), -1)
    
    union
    
    select distinct 
    dat.tipo_documento as tipo_documento,
    nov.num_doc,
    dat.apellido_nombre as apellido_nombre,
    usu.username,
    usu.email as email,
    case when tipno.operador = 1 then 2 else 3 end as id_tipo_nov_nom, 
    nov.fecha_ini as fecha_inicial, 
    nov.fecha_fin as fecha_final 
    
    from no_novedad_vac nov
    
    left join no_datos_funcionario_v dat
    on dat.id_tipo_doc = nov.id_tipo_doc
    and dat.num_doc = nov.num_doc
    
    left join no_tipo_nov_vac tipno
    on tipno.id_tipo_nov_vac = nov.id_tipo_nov_vac
    
    left join usuario usu
    on usu.num_doc = nov.num_doc
    
    where
    /*nov.fecha_ini >= ADD_MONTHS(last_day(sysdate), -2)
    or
    nov.fecha_fin >= ADD_MONTHS(last_day(sysdate), -2)*/
    trunc(sysdate) between nov.fecha_ini and nov.fecha_fin 
    
    union
    
    select distinct 
    dat.tipo_documento as tipo_documento,
    nov.num_doc,
    dat.apellido_nombre as apellido_nombre,
    usu.username,
    usu.email as email,
    case when nov.estado = 1 then 4 else 5 end as id_tipo_nov_nom, 
    nov.fecha_ini as fecha_inicial, 
    nov.fecha_fin as fecha_final 
    
    from no_novedad_kardex nov
    
    left join no_datos_funcionario_v dat
    on dat.id_tipo_doc = nov.id_tipo_doc
    and dat.num_doc = nov.num_doc
    
    left join no_tip_nov_ka tipno
    on tipno.id_tip_nov_ka = nov.id_tip_nov_ka
    
    left join usuario usu
    on usu.num_doc = nov.num_doc
    
    where
    ( tipno.afecta_antigu = 1 or tipno.causa_liquidacion = 1 or tipno.tiempo_remunerado = 1 )
    and nov.num_dias > 1
    and
    /*(
    nov.fecha_ini >= ADD_MONTHS(last_day(sysdate), -2)
    or
    nov.fecha_fin >= ADD_MONTHS(last_day(sysdate), -2)
    )*/
    trunc(sysdate) between nov.fecha_ini and nov.fecha_fin 

)tab0  

WHERE
1 != 0   
$wherenum_doc
$wherenusername   
$whereid_tipo_nov_nom
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_novedad_nom';

                /*
                 * Construir observacion
                 */
                $observacion = "'Se consulto por 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_novedad_nom] ROLLBACK ERROR al Generar la consulta de novedades nomina websafi. !!!";
            $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_novedad_nom',
                    '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_novedad_nom, se generaron errores en el proceso de consulta.'";
            $this->custom_logger->info("[webanm_novedad_nom] " . $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_novedad_nom',
                'modulo' => 'NOMINA'
            )
        );
    }

}
