<?php

/**
 * envio_alertas actions.
 *
 * @package    nomina
 * @subpackage envio_alertas
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class envio_alertasActions 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') . '/alertas.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));
        $this->custom_logger->info("---BEGIN Logging request--- (Revisar log alertas.log)");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->custom_logger->info("[envio_alertas] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[envio_alertas] request[$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();

        //formato de envio
        $format = 'PDF';
        $array_jasper = array();

        try {

            /*
             * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
             */
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');
            $entidadCliente = '';
            $entidadNombre = '';
            $correoEnvio = '';

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('entidad_cliente' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $entidadCliente = $value;
                        }
                    }
                }
                if ('entidad_nombre' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $entidadNombre = $value;
                        }
                    }
                }
                if ('correoEnvio' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $correoEnvio = $value;
                        }
                    }
                }
                $int++;
            }

            $emailAlerta = sfConfig::get('app_emailAlerta');


            /**
             * Traer todos los cargos que apliquen:
             * temga tiempo de vacante mayor a 0
             * tenga dias de vacancia el cargo
             * supere los dias - 20191125
             */
            $sql = <<<EOD
select
tab0.*

from(

    select
    tab0.*,
    
    case when tab0.funcionario is null
        then trunc(sysdate) - nvl( tab0.fecha_ultm_nov, nvl((case when tab0.fecha_ini_nov > tab0.fecha_ultm_nom then tab0.fecha_ini_nov else tab0.fecha_ultm_nom end), tab0.fecha_ini_per) )
    else 0 end as dias_ultm_nov,
    
    to_char( nvl( tab0.fecha_ultm_nov, nvl((case when tab0.fecha_ini_nov > tab0.fecha_ultm_nom then tab0.fecha_ini_nov else tab0.fecha_ultm_nom end), tab0.fecha_ini_per) ) ,'dd/mm/yyyy') as fecha_vacante,
    
    case when tab0.funcionario is null and tab0.tipo_vacante  is not null then 1
    when tab0.tag_tipo_nombramiento = 1 and tab0.titular is not null and tab0.num_doc_enc is null then 1
    else 0 end as tag_tipo_vacante
    
    from(
    
        select
    
        tab0.id_ea,tab0.id_cen_op,tab0.id_dp,tab0.id_nat_em,tab0.id_nat_emp,
        tab0.id_den_emp,tab5.id_planta_p,tab0.codigo, tab0.componente, tab0.naturaleza, tab0.centro, tab0.area,
        tab0.funcionario, tab1.nombre_apellido as nom_func, tab1.email,
    
        case when tab0.tipnombra='ENCARGO' then tab0.tipnombra else tab4.nombre end as tipo_nombra,
    
        case when (select count(*) from no_novedad_personal
        where id_tipo_doc = 1 and num_doc = tab0.funcionario and estado = 1 and id_novedad = 3
        and sysdate between fecha_inicial and fecha_terminacion) > 0 then 'ENCARGO' else tab4.nombre end as tipo_nombramiento,
    
        case when (select count(*) from no_novedad_personal
        where id_tipo_doc = 1 and num_doc = tab0.funcionario and estado = 1 and id_novedad in (3,7)
        and sysdate between fecha_inicial and fecha_terminacion) > 0 then 1 else 0 end as tag_tipo_nombramiento,
    
        tab0.titular, nvl(tab2.nombre_apellido,'Sin Titular') as nom_tit, tab0.asignacion_basica,
        tab0.num_doc_enc,
        tab0.nombre_apellido_enc,
    
        case
            when tab0.titular is null and tab0.id_nat_em = 1 then 'VACANTE DEFINITIVA LN'
            when tab0.titular is null then 'VACANTE DEFINITIVA'
            when tab0.num_doc_enc is not null and tab0.id_nat_em != 1 then 'VACANTE TEMPORAL'
            when (select count(per.id_novedad_personal) from no_novedad_personal per
            join no_novedades nov on nov.id_novedad = per.id_novedad
            where per.id_tipo_doc = 1 and per.num_doc = tab0.funcionario and per.estado = 1
            and nov.id_tipo_novedad = 3
            and sysdate between per.fecha_inicial and per.fecha_terminacion) > 0 then 'VACANTE TEMPORAL'
        else '' end as tipo_vacante,
    
        tab0.estado,
        tab0.tiempo_vacante,
    
        (select min(no_periodo.fecha_ini) from no_periodo) as fecha_ini_per,
        ( select max(nov.fecha_terminacion) from no_novedad_personal nov join no_novedades novs on novs.id_novedad = nov.id_novedad
            where novs.id_tipo_novedad in (2,4) and nov.estado = 1
            and nov.id_dp_fin = tab0.id_dp ) as fecha_ultm_nov,
        ( select max(nov.fecha_inicial) from no_novedad_personal nov join no_novedades novs on novs.id_novedad = nov.id_novedad
            where novs.id_tipo_novedad in (1,3) and nov.estado in ( 1,0 )
            and nov.id_dp_ini = tab0.id_dp ) as fecha_ini_nov,
        ( select max(nom.fecha_ingreso) from no_nombramiento nom
            where nom.id_dp = tab0.id_dp ) as fecha_ultm_nom
    
        from(
    
            select
            tab0.id_ea,tab0.id_cen_op,tab0.id_dp,tab0.id_nat_em,tab0.id_nat_emp,
            tab0.id_den_emp, tab0.codigo, tab0.componente, tab0.naturaleza, tab0.centro, tab0.area,
            case when tab0.encargado is not null then tab0.encargado else tab0.titular end as funcionario,
            case when tab0.encargado is not null then 'ENCARGO' else 'NOMBRAMIENTO' end as tipnombra,
            tab0.titular as titular, tab0.asignacion_basica,
            tab0.num_doc_enc,
            tab0.nombre_apellido_enc,
            tab0.estado,
            tab0.tiempo_vacante
    
            from no_dp_v tab0
    
        )tab0
    
        left join no_datos_funcionario_v tab1 on tab1.num_doc = tab0.funcionario
    
        left join no_datos_funcionario_v tab2 on tab2.num_doc = tab0.titular
    
        left join no_nombramiento_v tab3 on tab3.num_doc = tab0.funcionario
    
        left join rh_sa_niv2 tab4 on tab4.id_sa_niv2 = tab3.id_sa_niv2
    
        left join rh_ap_den_emp tab5 on tab5.id_den_emp = tab0.id_den_emp
    
    )tab0
    where 1=1

)tab0

where
tab0.tiempo_vacante != 0
and tab0.dias_ultm_nov > 0 
and tab0.dias_ultm_nov > tab0.tiempo_vacante

order by
tab0.codigo 
EOD;
            //ejecuta el sql
            $array_alertas = CN_TABLE::executeSQL($sql);

            /**
             * Recorrer alarmas
             */
            $this->custom_logger->info("[envio_alertas] Recorrer cargos");
            $mensaje_extra = '';

            foreach ($array_alertas as $value) {

                $componente = $value['componente'];
                $this->custom_logger->info("Envio Cargo: " . $componente);

                $naturaleza = $value['naturaleza'];
                $area = $value['area'];
                $asignacion_basica = $value['asignacion_basica'];
                $tipo_vacante = $value['tipo_vacante'];
                $tiempo_vacante = $value['tiempo_vacante'];
                $fecha_vacante = $value['fecha_vacante'];
                $dias_ultm_nov = $value['dias_ultm_nov'];

                $mens = <<<EOD
<br/>                         
* Cargo $componente de naturaleza $naturaleza.<br/> 
  Tipo de vacante: $tipo_vacante<br/> 
  Tiempo de vacante: $tiempo_vacante<br/> 
  Fecha vacante: $fecha_vacante<br/> 
  Dias vacantes: $dias_ultm_nov<br/>     
<br/>                         
EOD;

                $mensaje_extra .= $mens;
            }

            /**
             * Datos correo
             */
            $subject = "Nomina - Limite de tiempo de cargos vacantes";

            $mensaje = <<<EOD
Se envia alerta de cargos que superan el tiempo de vacante parametrizado, favor verificar:<br/> 
<br/> 
$mensaje_extra                    
EOD;
            $report_params['mensaje'] = $mensaje;

            $correos_emailAlerta = explode(";", $emailAlerta);
            $i = 0;
            foreach ($correos_emailAlerta as $correos_value) {
                $num_doc = 'nomina ' . $i;
                $id_tipo_doc = '';
                $razon_social = '';
                $correo = $correos_value;
                $mensaje_extra = '';
                $datos_usuario = array(
                    $i => $num_doc . ';' . $id_tipo_doc . ';' . $razon_social . ';' . $correo . ';' . $mensaje_extra
                );
                $i++;
            }

            //PARAMETROS STANDART
            $report_params['email_envio'] = $correoEnvio;
            $currentUri = '';
            $ruta = '';
            $adjunto = false;
            $progress_key = 'envio_alertas';
            $array_adjuntos = array();
            $entidad_cliente = $entidadCliente;
            $entidad_nombre = $entidadNombre;
            $addAddress = true;

            /**
             * Envio de correo
             */
            if (count($array_alertas) > 0) {
                $this->custom_logger->info("Envio Alerta.");
                CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);
            }

            /**
             * COMMIT de las transacciones
             */
            $this->custom_logger->info("[envio_alertas] COMMIT de las transacciones");
            $this->list_data = array();
            $this->conn->commit();
        } catch (Exception $e) {
            //rollback de todas las transacciones en caso de que ocurra algun error
            $this->conn->rollback();

            $mensaje = "[envio_alertas] ROLLBACK ERROR al Generar envio de alertas. !!!";
            $this->custom_logger->info($mensaje);
            $this->custom_logger->info("state 2");
            $this->custom_logger->info("Code " . $e->getCode());
            $this->custom_logger->info("Message " . $e->getMessage());

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        }
    }

}
