<?php

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

            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                if ('jasper_url' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        if ($key == 'value') {
                            $service_url = $value;
                        }
                    }
                }
                $int++;
            }

            //username
            if (isset($request["username"])) {
                $array_jasper["username"] = $request["username"];
            }
            //username_log
            if (isset($request["username_log"])) {
                $array_jasper["username_log"] = $request["username_log"];
            }

            //id_alarma
            $whereAlarma = "";
            if (isset($request["id_alarma"])) {
                $id_alarma = $request["id_alarma"];
                $whereAlarma = 'and alar.id_alarma = ' . $id_alarma;
            }

            //Filtro enlace - Usuario - 20170725
            $whereUsuario = "";
            if (isset($request["id_usuario"])) {
                $id_usuario = $request["id_usuario"];
                $whereUsuario = 'and usu.id_usuario = ' . $id_usuario;
            }

            /**
             * Traer todas las alarmas activas
             */
            $sql = <<<EOD
select 
alar.id_alarma,
alar.id_tipo_alarma,
alar.numero,
alar.descripcion,
alar.orden,
alar.estado,
alar.comando 
from ca_alarma alar
join ca_tipo_alarma tipalar
on tipalar.id_tipo_alarma = alar.id_tipo_alarma
where
tipalar.estado = 1
and alar.estado = 1
$whereAlarma                    
order by
alar.orden 
EOD;
            //ejecuta el sql
            $array_alarmas = CN_TABLE::executeSQL($sql);

            /**
             * Recorrer alarmas
             */
            $this->custom_logger->info("[envio_alarmas] Recorrer alarmas");
            $tag_dias_ejecutar = true;
            foreach ($array_alarmas as $value_alarmas) {

                $id_alarma = $value_alarmas['id_alarma'];
                $array_jasper['id_alarma'] = $id_alarma;
                /*
                 * Array de variables_jasper
                 */
                //$comando = 'alarma1_canones_proxi_vence';
                $comando = $value_alarmas['comando'];

                switch ($id_alarma):
                    //Alarma 1 Alarma Canones Proximos a Causarse
                    case '1':

                        $format = 'XLS'; //Cambio formato Incidente #5021 - 20170613
                        $this->custom_logger->info("[envio_alarmas] Alarma 1");

                        //Configuracion para CRON
                        if (intval(date('m')) <= 10) {
                            $array_jasper['id_meses'] = intval(date('m')) + 2;
                            $array_jasper['id_anhos'] = date('Y');
                        } else if (intval(date('m')) == 11) {
                            $array_jasper['id_meses'] = 1;
                            $array_jasper['id_anhos'] = date('Y') + 1;
                        } else {
                            $array_jasper['id_meses'] = 2;
                            $array_jasper['id_anhos'] = date('Y') + 1;
                        }

                        //Configuracion desde funcionalidad por demanda
                        if (isset($request['fecha_inicio_anu']) && isset($request['fecha_fin_anu'])) {
                            $tag_dias_ejecutar = false;
                            $array_jasper['fecha_inicio_anu'] = $request['fecha_inicio_anu'];
                            $array_jasper['fecha_fin_anu'] = $request['fecha_fin_anu'];
                        } elseif (isset($request['id_meses']) && isset($request['id_anhos'])) {
                            $tag_dias_ejecutar = false;
                            $array_jasper["id_anhos"] = $request["id_anhos"];
                            $array_jasper["id_meses"] = $request["id_meses"];
                        }

                        break;
                    //Alarma 2 Alarma Canones Proximos a Causarse Sin Gestion
                    case '2':

                        $format = 'XLS'; //Cambio formato Incidente #5021 - 20170613
                        $this->custom_logger->info("[envio_alarmas] Alarma 2");

                        //Configuracion para CRON
                        if (intval(date('m')) <= 11) {
                            $array_jasper['id_meses'] = intval(date('m')) + 1;
                            $array_jasper['id_anhos'] = date('Y');
                        } else {
                            $array_jasper['id_meses'] = 1;
                            $array_jasper['id_anhos'] = date('Y') + 1;
                        }
                        $array_jasper["sin_gestion"] = "true";

                        //Configuracion desde funcionalidad por demanda
                        if (isset($request['fecha_inicio_anu']) && isset($request['fecha_fin_anu'])) {
                            $tag_dias_ejecutar = false;
                            $array_jasper['fecha_inicio_anu'] = $request['fecha_inicio_anu'];
                            $array_jasper['fecha_fin_anu'] = $request['fecha_fin_anu'];
                        } elseif (isset($request['id_meses']) && isset($request['id_anhos'])) {
                            $tag_dias_ejecutar = false;
                            $array_jasper["id_anhos"] = $request["id_anhos"];
                            $array_jasper["id_meses"] = $request["id_meses"];
                        }
                        if (isset($request["sin_gestion"])) {
                            $array_jasper["sin_gestion"] = $request["sin_gestion"];
                            $tag_dias_ejecutar = false;
                        }

                        break;
                    //Alarma 3 Planillas Autogeneradas
                    case '3':
                        $this->custom_logger->info("[envio_alarmas] Alarma 3");

                        //Configuracion para CRON
                        if (intval(date('m')) <= 11) {
                            $array_jasper['id_meses_auto'] = intval(date('m')) + 1;
                            $array_jasper['id_vigencia_auto'] = date('Y');
                        } else {
                            $array_jasper['id_meses_auto'] = 1;
                            $array_jasper['id_vigencia_auto'] = date('Y') + 1;
                        }

                        //Configuracion desde funcionalidad por demanda
                        if (isset($request["id_meses_auto"])) {
                            $array_jasper["id_meses_auto"] = $request["id_meses_auto"];
                            $tag_dias_ejecutar = false;
                        }
                        if (isset($request["id_vigencia_auto"])) {
                            $array_jasper["id_vigencia_auto"] = $request["id_vigencia_auto"];
                            $tag_dias_ejecutar = false;
                        }
                        //Ejecutar planillas automaticas
                        exec('java -Did_anhos=' . $array_jasper["id_vigencia_auto"] . ' -Did_meses=' . $array_jasper["id_meses_auto"]
                                . ' -jar ../scripts/scriptella.jar '
                                . '../scripts/scripts/LIQUIDACIONES_AUTOMATICAS.xml >> ../scripts/log/`date`LIQUIDACIONES_AUTOMATICAS.log  2>&1', $out, $err);

                        exec('/scripts/scripts/liquidaciones/exe');

                        break;
                    //Alarma 4 Canones en Mora
                    case '4':
                        $this->custom_logger->info("[envio_alarmas] Alarma 4");

                        //Configuracion para CRON
                        if (intval(date('m')) >= 2) {
                            $array_jasper['id_meses'] = intval(date('m')) - 1;
                            $array_jasper['id_anhos'] = date('Y');
                        } else {
                            $array_jasper['id_meses'] = 12;
                            $array_jasper['id_anhos'] = date('Y') - 1;
                        }
                        $array_jasper["sin_pago"] = "true";

                        //Configuracion desde funcionalidad por demanda
                        if (isset($request["id_meses"])) {
                            $array_jasper["id_meses"] = $request["id_meses"];
                            $tag_dias_ejecutar = false;
                        }
                        if (isset($request["id_anhos"])) {
                            $array_jasper["id_anhos"] = $request["id_anhos"];
                            $tag_dias_ejecutar = false;
                        }
                        if (!isset($request["sin_pago"])) {
                            $array_jasper["sin_pago"] = $request["sin_pago"];
                            $tag_dias_ejecutar = false;
                        }

                        break;

                endswitch;

                //Datos de configuracion - 20170629
                $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

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


                /**
                 * Traer todas las alarmas activas
                 * Para perfil enlace envia el usuario para el informe - 20170629
                 */
                $sql = <<<EOD
select distinct 
admalar.id_administra_alarma,
admalar.id_alarma,
admalar.id_perfil,
admalar.correo_electronico,
admalar.dias_ejecutar,
per.nombre,
case when admalar.id_perfil = $perfilEnlace then usu.id_usuario else 0 end as id_usuario,
usu.username,
nvl(usu.email, admalar.correo_electronico) as email,
nvl(usu.documento,'000') as documento,
replace(nvl(usu.nombre,'Sin Especificar'), ' ', '%20' ) as usuario

from ca_administra_alarma admalar

left join ca_perfil per
on per.id_perfil = admalar.id_perfil
left join ca_usuario_perfil  usuper
on usuper.id_perfil = per.id_perfil
left join ca_usuario usu
on usuper.id_usuario = usu.id_usuario

where
admalar.id_alarma = $id_alarma
and per.estado = 1    
$whereUsuario    

order by
admalar.id_administra_alarma,
nvl(usu.documento,'000')   
EOD;
                //ejecuta el sql
                $array_adm = CN_TABLE::executeSQL($sql);
                $this->custom_logger->info("[envio_alarmas] Traer todas las alarmas activas");

                /**
                 * Recorrer todos los usuarios
                 */
                $array_jasper['datos_usuario'] = '';
                $tag_sep = '';
                foreach ($array_adm as $value_adm) {

                    $array_dias = explode(',', $value_adm['dias_ejecutar']);

                    //verifica si son para dias de ejecucion cron, dia actual
                    //$array_jasper['datos_usuario'] = '000;lavila@sofhouse.net;lavila';
                    if ($tag_dias_ejecutar) {
                        $this->custom_logger->info("[envio_alarmas] Parametriza con tag_dias_ejecutar");

                        $dia = date('d'); //dia con dos digitos
                        //Devuelve TRUE si needle se encuentra en el array, FALSE de lo contrario.
                        if (in_array($dia, $array_dias)) {
                            $array_jasper['datos_usuario'] .= $tag_sep . $value_adm['documento'] . ';' . $value_adm['email'] . ';' . $value_adm['usuario'] . ';' . $value_adm['id_usuario'];
                        }
                    } else {
                        $this->custom_logger->info("[envio_alarmas] Parametriza sin tag_dias_ejecutar");
                        $array_jasper['datos_usuario'] .= $tag_sep . $value_adm['documento'] . ';' . $value_adm['email'] . ';' . $value_adm['usuario'] . ';' . $value_adm['id_usuario'];
                    }
                    $tag_sep = '/';
                }

                //Mensaje, se quitan espacios ya que genera errores en el envio curl - 20170613
                if (isset($request["mensaje"])) {
                    $array_jasper['mensaje'] = str_replace(" ", ".,.", $request["mensaje"]);
                }


                /**
                 * Llamado Jasper
                 */
                if ($array_jasper['datos_usuario'] != '' && $array_jasper['datos_usuario'] != null) {
                    $this->llamadoJasper($service_url, $comando, $format, $array_jasper);
                }
            }

            $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_alarmas] ROLLBACK ERROR al Generar envio de correos. !!!";
            $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
                )
            );
        }
    }

    /**
     * Metodo para llamado Jasper y envio de correo
     * @param type $service_url
     * @param type $comando
     * @param type $format
     * @param type $array_jasper
     */
    public function llamadoJasper($service_url, $comando, $format, $array_jasper) {


        $url = $service_url;
        $url = $url . $comando . '&format=' . $format;

        //variables del informe
        foreach ($array_jasper as $key => $value) {
            $url = $url . '&PARAM_' . $key . '=' . $value;
        }

        //Para envio por correo
        $url = $url . '&PARAM_envio_correo=1';

        $this->custom_logger->info("[envio_alarmas] Url::" . $url);
        $ch = curl_init($url);

        //Parametros de retorno en cURL
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification

        $rta = curl_exec($ch);
        $this->custom_logger->info("[envio_alarmas] Ejecuta llamado ");
        $this->custom_logger->info("[envio_alarmas] Parametriza sin tag_dias_ejecutar");
        curl_close($ch);

        $arrayRespuesta = json_decode($rta, true);
        //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
        if ($arrayRespuesta['response']['status'] == 1) {
            $mensajeError = "Error :: Al generar envio de correos.";
            $this->status = 1;
            $this->list_data = array();
            $this->mensajeError = $mensajeError;
            $this->logMessage("[envio_alarmas] " . $mensajeError);
        } else {
            $this->logMessage("[envio_alarmas] Genero envio de correos.");
        }
    }

}
