<?php

/**
 * Link: http://localhost/nomina/web/api_dev.php/api/envio_alertas/list.json
 * 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, solo por aqui no en el CRON
        $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:
             * tenga 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;
            $datos_usuario = array();
            foreach ($correos_emailAlerta as $correos_value) {
                $num_doc = 'nomina ' . $i;
                $id_tipo_doc = '';
                $razon_social = '';
                $correo = $correos_value;
                $mensaje_extra = '';
                $datos_usuario["$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);
            }


            /*
             * Envio de nombramientos por terminar - 20201222::LAVILA
             * Correo electronico a TH con 30 dias anticipacion
             */
            $sql = <<<EOD
select
clapla.codigo as codigo_clapla,
clapla.descripcion as descripcion_clapla,
tab0.*,
tab1.nombre_apellido,
tab1.nombre_completo,
tab2.centro,tab2.area,tab2.naturaleza,
rh_dp.codigo,
tab2.componente,
tab3.nombre,
tab4.id_anhos,tab4.id_meses,
tab5.descripcion,
tab2.asignacion_basica AS ASIGNA_BASICA2,

tabact.codigo as codigo_actual,
tabact.componente as componente_actual,
tabact.naturaleza as naturaleza_actual

from no_nombramiento tab0

left join no_datos_funcionario_v tab1 ON tab1.id_tipo_doc = tab0.id_tipo_doc and tab1.num_doc = tab0.num_doc

left join NO_DP_V tab2 ON tab2.id_dp = tab0.id_dp

left join rh_dp rh_dp ON tab2.id_dp = rh_dp.id_dp

left join RH_SA_NIV2 tab3 ON tab3.id_sa_niv2 = tab0.id_sa_niv2

left join NO_PERIODO tab4 ON tab4.id_periodo = tab0.id_periodo

left join NO_TIPO_PERIODO tab5 ON tab5.id_tipo_periodo = tab4.id_tipo_periodo

left join no_clase_planta clapla on clapla.id_clase_planta = tab0.id_clase_planta

left join (
    select distinct tab.* from(
        SELECT
        tab0.*,
        ROW_NUMBER() OVER (
        partition by tab0.num_doc
            ORDER BY tab0.num_doc, tab0.id_anhos desc, tab0.id_meses desc 
        ) AS rn
        from no_estado_func tab0
        join no_periodo per on per.id_periodo = tab0.periodo
        where 
        per.id_tipo_periodo = 1
    ) tab
    where  tab.rn = 1
)cargoact
ON cargoact.id_tipo_doc = tab0.id_tipo_doc and cargoact.num_doc = tab0.num_doc

left join NO_DP_V tabact ON tabact.id_dp = cargoact.id_dp


where 
tab0.fecha_termina BETWEEN trunc(sysdate)+35 AND trunc(sysdate)+35
and tab0.estado = 1

ORDER BY 
tab3.nombre, 
tab0.id_tipo_doc, 
tab0.num_doc, 
tab0.fecha_ingreso 
EOD;
            //ejecuta el sql
            $array_alertas = CN_TABLE::executeSQL($sql);

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

            foreach ($array_alertas as $value) {

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

                $codigo = $value['codigo_actual'];
                $naturaleza = $value['naturaleza_actual'];
                $nombre_completo = $value['nombre_completo'];
                $fecha_ingreso = substr($value['fecha_ingreso'], 0, 10);
                $fecha_termina = substr($value['fecha_termina'], 0, 10);
                $descripcion_clapla = $value['descripcion_clapla'];

                $mens = <<<EOD
<br/>                         
* Cargo actual(No. $codigo), $componente de naturaleza $naturaleza.<br/> 
  Funcionario: $nombre_completo<br/> 
  Fecha Ingreso: $fecha_ingreso<br/> 
  Fecha Terminación: $fecha_termina<br/> 
  Clase Planta: $descripcion_clapla<br/>     
<br/>                         
EOD;

                $mensaje_extra .= $mens;
            }

            /**
             * Datos correo
             */
            $subject = "Nomina - Nombramientos por finalizar por fecha termina de los contratos";

            $mensaje = <<<EOD
Se envia alerta de nombramientos por terminar segun fecha en la vigencia de los contratos, favor verificar:<br/> 
<br/> 
$mensaje_extra                    
EOD;
            $report_params['mensaje'] = $mensaje;

            $correos_emailAlerta = explode(";", $emailAlerta);
            $i = 0;
            $datos_usuario = array();
            foreach ($correos_emailAlerta as $correos_value) {
                $num_doc = 'nomina ' . $i;
                $id_tipo_doc = '';
                $razon_social = '';
                $correo = $correos_value;
                $mensaje_extra = '';
                $datos_usuario["$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 fecha termina.");
                CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);
            }



            /**
             * Incidente #20914, Alerta 70 años - 20220927::LAVILA
              La alerta se genera en 2 fechas:
              - 15 días hábiles anterior a la fecha de cumpleaños
              - 10 días hábiles anterior a la fecha de cumpleaños
             */
            $sql = <<<EOD
SELECT
dat.num_doc,
dat.nombre_apellido,
dat.nombre_completo,
nov.fecha_ingreso,
dat.fecha_nace,

TRUNC(MONTHS_BETWEEN(SYSDATE, dat.fecha_nace)/12) as edad,
(dat.fecha_nace + interval '70' year) as fechacum,
TRUNC( (dat.fecha_nace + interval '70' year) - sysdate ) as dias_completos,
DIAS_HABILES_CANT( to_char(sysdate,'yyyy-mm-dd'), to_char((dat.fecha_nace + interval '70' year),'yyyy-mm-dd')) as dias

FROM no_datos_funcionario_v dat

join no_nombramiento_v nov
on nov.num_doc = dat.num_doc
and nov.id_tipo_doc = dat.id_tipo_doc

where
nov.estado = 1
and TRUNC(MONTHS_BETWEEN(SYSDATE, dat.fecha_nace)/12) >= 69

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

            /**
             * Recorrer alarmas
             */
            $this->custom_logger->info("[envio_alertas] Recorrer funcionarios fecha nace");
            $mensaje_extra = '';
            $tag_nace = false;

            foreach ($array_alertas as $value) {

                $dias = $value['dias'];
                //dias dias 15 y 10 antes de cumple
                if ($dias == 15 || $dias == 10) {
                    
                    $tag_nace = true;

                    $nombre_completo = $value['nombre_completo'];
                    $fecha_ingreso = substr($value['fecha_ingreso'], 0, 10);
                    $fecha_nace = substr($value['fecha_nace'], 0, 10);

                    $this->custom_logger->info("Envio Funcionario fecha: " . $nombre_completo);

                    $mens = <<<EOD
<br/>                         
* Funcionario: $nombre_completo<br/> 
  Fecha Ingreso: $fecha_ingreso<br/> 
  Fecha Nacimiento: $fecha_nace<br/>    
<br/>                         
EOD;

                    $mensaje_extra .= $mens;
                }
            }

            /**
             * Datos correo
             */
            $subject = utf8_decode("Nomina - Alerta 70 años de edad");

            $mensaje = <<<EOD
Se envia alerta de funcioarios que están por cumplir 70 años de edad, lo anterior como recordatorio para que se adelanten los trámites administrativos para el retiro, favor verificar:<br/> 
<br/> 
$mensaje_extra                    
EOD;
            $report_params['mensaje'] = $mensaje;

            $correos_emailAlerta = explode(";", $emailAlerta);
            $i = 0;
            $datos_usuario = array();
            foreach ($correos_emailAlerta as $correos_value) {
                $num_doc = 'nomina ' . $i;
                $id_tipo_doc = '';
                $razon_social = '';
                $correo = $correos_value;
                $mensaje_extra = '';
                $datos_usuario["$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 ($tag_nace) {
                $this->custom_logger->info("Envio Alerta 70 años.");
                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
                )
            );
        }
    }

}
