<?php

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

/**
 * webanm_novedad_cont actions.
 * 
 * Construir un Webservice con información de contratistas: Exponer la información correspondiente
  a las ausencias de Contratistas, derivada de las novedades registradas durante la ejecución del
  contrato.
 * 
  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_cont
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class webanm_novedad_contActions 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_cont] Servicio executeList webanm_novedad_cont.\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_cont] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[webanm_novedad_cont] 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_cont';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        //construir observacion
        $observacion_log = "'Llamado a envio de consulta de novedades contrato 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_cont] " . $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'] . "'";
            }

            /**
             * Se toma de RVC, no de CO - 20211118
             * Consulta debitos segun filtros de entrada y parametrizacion
             * NOVEDADES CONTRATISTAS:
              Cancelación: Fecha desde Cesion
              Suspensión:
              Terminación anticipada: Fecha desde, tipo 3 terminacion
             
              1 Cesión - Cancelada
              2 Terminación anticipada - Cancelada
              3 Suspensión
              4 Terminación contrato
             * 
             * Cuando cualquiera de estas novedades se cancele antes de la fecha de su terminación
              programada, se reporta una novedad con la palabra CANCELADA, en el campo tipo de
              novedad.
             * Validacion de fechas segun novedad, ultimo mes, o segun fechas novedad - 20211118::LAVILA
             * DATOS FUENTE CONTRATISTAS:

              RVC_NOVEDAD_CESION:

              NOVEDAD DE INGRESO:
              FECHA:   FECHA DE LA NOVEDAD
              ID_CONTRATISTA_NEW

              NOVEDAD DE RETIRO:
              TIPO NOVEDAD : CANCELADA
              FECHA:   FECHA DE LA NOVEDAD
              ID_CONTRATISTA_OLD

              RVC_NOVEDAD_PRORR_TERMI
              TERMINACION ANTICIPADA DE CONTRATO:
              TOMAR UNICAMENTE:  ID_TIPO_NOVEDAD_CONT=3

              TIPO NOVEDAD : CANCELADA
              FECHA
              ID_CONTRATISTA


              RVC_NOVEDAD_SUSPENSION

              NOVEDAD DE SUSPENSION
              TIPO NOVEDAD: SUSPENSIÓN
              FECHA_INI
              FECHA_FIN
              ID_CONTRATISTA

              RVC_CONTRATO
              UNICAMENTE:  ESTADO=1
              TIPO DE NOVEDAD: TERMINACION CONTRATO
              FECHA_FIN
              ID_CONTRATISTA
             * 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 'Cesión - Cancelada'
when tab0.id_tipo_nov_nom = 2 then 'Terminación anticipada - Cancelada'
when tab0.id_tipo_nov_nom = 3 then 'Suspensión'
when tab0.id_tipo_nov_nom = 4 then 'Terminación contrato'
else ''
end tipo_novedad, 
tab0.fecha_inicial, 
tab0.fecha_final

from (

    select distinct
    tip.descripcion as tipo_documento,
    contra.num_doc as num_doc,
    contra.razon_social as apellido_nombre,
    usu.username,
    usu.email as email,
    1 as id_tipo_nov_nom, 
    nov.fecha_cesion as fecha_inicial, 
    null as fecha_final 

    from rvc_novedad_cesion nov

    left join rvc_contratista contra
    on contra.id_contratista = nov.id_contratista_old

    left join TIPO_DOCUMENTO tip
    on tip.ID_TIPO_DOC = contra.ID_TIPO_DOC

    left join usuario usu
    on usu.num_doc = contra.num_doc

    where
    nov.fecha_cesion >= ADD_MONTHS(last_day(sysdate), -1)
                    
    union
                    
    select distinct
    tip.descripcion as tipo_documento,
    contra.num_doc as num_doc,
    contra.razon_social as apellido_nombre,
    usu.username,
    usu.email as email,
    2 as id_tipo_nov_nom, 
    nov.fecha as fecha_inicial, 
    null as fecha_final 

    from rvc_novedad_prorr_termi nov

    left join rvc_contratista contra
    on contra.id_contratista = nov.id_contratista

    left join TIPO_DOCUMENTO tip
    on tip.ID_TIPO_DOC = contra.ID_TIPO_DOC

    left join usuario usu
    on usu.num_doc = contra.num_doc

    where
    nov.id_tipo_novedad_cont = 3
    and nov.fecha >= ADD_MONTHS(last_day(sysdate), -1)     
                    
    union
                    
    select distinct
    tip.descripcion as tipo_documento,
    contra.num_doc as num_doc,
    contra.razon_social as apellido_nombre,
    usu.username,
    usu.email as email,
    3 as id_tipo_nov_nom, 
    nov.fecha_ini as fecha_inicial, 
    nov.fecha_fin as fecha_final 

    from rvc_novedad_suspension nov

    left join rvc_contratista contra
    on contra.id_contratista = nov.id_contratista

    left join TIPO_DOCUMENTO tip
    on tip.ID_TIPO_DOC = contra.ID_TIPO_DOC

    left join usuario usu
    on usu.num_doc = contra.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
    tip.descripcion as tipo_documento,
    contra.num_doc as num_doc,
    contra.razon_social as apellido_nombre,
    usu.username,
    usu.email as email,
    4 as id_tipo_nov_nom, 
    nov.fecha_fin as fecha_inicial, 
    null as fecha_final 

    from rvc_contrato nov

    left join rvc_contratista contra
    on contra.id_contratista = nov.id_contratista

    left join TIPO_DOCUMENTO tip
    on tip.ID_TIPO_DOC = contra.ID_TIPO_DOC

    left join usuario usu
    on usu.num_doc = contra.num_doc

    where
    nov.estado = 1
    /*and nov.fecha_fin >= ADD_MONTHS(last_day(sysdate), -2)
    and nov.fecha_fin <= ADD_MONTHS(last_day(sysdate), 2)*/
    and 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_cont';

                /*
                 * 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_cont] ROLLBACK ERROR al Generar la consulta de novedades contrato 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_cont',
                    '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_cont, se generaron errores en el proceso de consulta.'";
            $this->custom_logger->info("[webanm_novedad_cont] " . $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_cont',
                'modulo' => 'NOMINA'
            )
        );
    }

}
