<?php

/**
 * Creado: 20190712
 * envio_notificacion actions.
 * 
 * Link: http://soporte14.sofhouse.net/canon/web/api_dev.php/api/envio_notificacion/list.json?id_alarma=5
 *
 * @package    canon
 * @subpackage envio_notificacion
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class envio_notificacionActions extends sfActions {

    /**
     * Executes index 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 {

            $email_envio = sfConfig::get('app_email_envio');
            $this->logMessage("email_envio: " . $email_envio);

            $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++;
            }

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

            $array_adjuntos = array();

            $sql = <<<EOD
SELECT tab0.dia_sistema||' de '||tab0.mes_sistema||' del '||anho_sistema AS FECHA_SISTEMA
   from(
    select LPAD(to_char(sysdate,'dd'),2,'0') as dia_sistema,
    trim(initcap(to_char(sysdate,'MONTH','nls_date_language=spanish'))) as mes_sistema,
    TO_CHAR(sysdate,'yyyy') as anho_sistema
    from dual
)tab0
EOD;

            $records = CN_TABLE::executeSQL($sql);
            $fecha_creacion = $records[0]['fecha_sistema'];

            /**
             * 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 notificacion
             */
            $this->custom_logger->info("[envio_notificacion] Recorrer notificacion");

            foreach ($array_alarmas as $value_alarmas) {

                $id_alarma = $value_alarmas['id_alarma'];
                $array_jasper['id_alarma'] = $id_alarma;
                $comando = $value_alarmas['comando'];

                switch ($id_alarma):
                    //5- Monitoreo automático sobre incumplimiento en anualidades completas,  
                    //si se identifica que no ingresó el registro de recaudo (NC) pagando la ND 
                    //de anualidad, se debe generar la notificación al profesional asignado.
                    case '5':

                        //Debitos de anualidades de canon, sin cancelar el vencimiento
                        $consulta_sql = <<<EOD
SELECT distinct 
deb.id_debito,
deb.sec_debito,
deb.id_anhos as vig_rec,
deb.id_mae_ter,
deb.fecha_proceso,
deb.valor_total,
deb.observaciones,
deb.periodo_ini,
deb.periodo_fin,
ref.id_referencia2 as cod_titulo,

tit.id_titulo,
tit.num_doc_profesional,
tit.razon_soc_profesional,
tit.email_profesional,
prof.id_profesional,
prof.id_usuario

FROM ca_debito_vencimientos@WEBSAFI.ANM.LOCAL deb

left join ca_debito_ref@WEBSAFI.ANM.LOCAL ref
on deb.id_debito = ref.id_debito
    
left join (
    select
    aut.*,
    row_number() over (
        partition by aut.cod_titulo
        order by aut.cod_titulo, aut.estado desc, aut.id_titulo desc
    ) as rn
    from ca_titulo_rmn_v aut
)tit
on tit.cod_titulo = ref.id_referencia2
and tit.rn = 1

left join ca_profesional_v prof
on prof.id_profesional = tit.id_profesional

where
deb.estado = 1
and deb.cancelado = 0
and deb.id_debito  in (SELECT id_debito FROM ca_recibo_debito)
and prof.id_profesional is not null
--and deb.ID_DEBITO = 153034

order by
deb.sec_debito    
EOD;
                        //ejecuta el sql
                        $array_debitos = CN_TABLE::executeSQL($consulta_sql);

                        foreach ($array_debitos as $value_debitos) {

                            $sec_debito = $value_debitos['sec_debito'];
                            $vig_rec = $value_debitos['vig_rec'];
                            $cod_titulo = $value_debitos['cod_titulo'];
                            $razon_soc_profesional = $value_debitos['razon_soc_profesional'];
                            $email_profesional = $value_debitos['email_profesional'];
                            $num_doc_profesional = $value_debitos['num_doc_profesional'];
                            $id_titulo = $value_debitos['id_titulo'];
                            $id_usuario = $value_debitos['id_usuario'];
                            $id_titular = null;

                            $this->logMessage("Notificacion sec_debito: " . $sec_debito);
                            //$email_profesional = "lavila@sofhouse.net";
                            $email_profesional = "websafi@anm.gov.co";

                            //ENVIO CORREO
                            $subject = "Notificacion incumplimiento en titulo: $cod_titulo";
                            $recipients = array(
                                array(
                                    'email' => $email_profesional,
                                    'name' => $num_doc_profesional
                                )
                            );
                            $ccRecipients = array(
                                array(
                                    'email' => $email_envio,
                                    'name' => 'Canon Websafi'
                                )
                            );

                            //cuerpo del mensaje
                            //$fecha_creacion = CN_TABLE::fechaSistema();
                            $body = <<<EOD
<html><body> 
<br/>
Bogotá, $fecha_creacion
<br/>
<br/><br/>
Por medio de la presente se notifica incumplimiento en anualidad completa; Titulo: $cod_titulo, Nota Débito: $sec_debito-$vig_rec.</br>
<br></br>
Profesional asignado: $num_doc_profesional-$razon_soc_profesional</br>
<br></br>
</body></html>
EOD;

                            $this->logMessage("Mensaje Correo: " . $body);
                            CN_TABLE::sendMail($recipients, $ccRecipients, $subject, $body, $array_adjuntos, true, $id_alarma, $id_titulo, $id_usuario, $id_titular);
                        }

                        break;
                    //6- Monitoreo 15 dias posteriores a la fecha de vencimiento de la obligacion
                    case '6':

                        //Debitos 15 dias posteriores a la fecha de vencimiento sin cancelar
                        //Toma primero el correo nuevo de notificacion del titular - 20190723
                        $consulta_sql = <<<EOD
SELECT distinct 
deb.id_debito,
deb.sec_debito,
deb.id_anhos as vig_rec,
deb.id_mae_ter,
deb.fecha_proceso,
deb.valor_total,
deb.observaciones,
deb.periodo_ini,
deb.periodo_fin,
ref.id_referencia2 as cod_titulo,

tit.id_titulo,
tit.num_doc_profesional,
tit.razon_soc_profesional,
tit.email_profesional,
prof.id_profesional,
prof.id_usuario,

per.id_titular,
per.num_doc as num_doc_titular,
per.raz_soc as razon_soc_titular,
nvl (nvl(nvl(per.correo_notif,per.correo),per.correo_alt), '$email_envio') as email_titular

FROM ca_debito_vencimientos@WEBSAFI.ANM.LOCAL deb

left join ca_debito_ref@WEBSAFI.ANM.LOCAL ref
on deb.id_debito = ref.id_debito
    
left join (
    select
    aut.*,
    row_number() over (
        partition by aut.cod_titulo
        order by aut.cod_titulo, aut.estado desc, aut.id_titulo desc
    ) as rn
    from ca_titulo_rmn_v aut
)tit
on tit.cod_titulo = ref.id_referencia2
and tit.rn = 1

left join ca_profesional_v prof
on prof.id_profesional = tit.id_profesional

left join rmn_titulo_persona_mv per
on per.id_titulo = tit.id_titulo

where
deb.estado = 1
and deb.cancelado = 0
and deb.id_debito  in (SELECT id_debito FROM ca_recibo_debito)
and per.id_rol_titulo = 26
and deb.periodo_ini + 15 = trunc(sysdate) 
--and deb.ID_DEBITO = 153034

order by
deb.sec_debito    
EOD;
                        //ejecuta el sql
                        $array_debitos = CN_TABLE::executeSQL($consulta_sql);

                        foreach ($array_debitos as $value_debitos) {

                            $sec_debito = $value_debitos['sec_debito'];
                            $vig_rec = $value_debitos['vig_rec'];
                            $cod_titulo = $value_debitos['cod_titulo'];
                            $razon_soc_titular = $value_debitos['razon_soc_titular'];
                            $email_titular = $value_debitos['email_titular'];
                            $num_doc_titular = $value_debitos['num_doc_titular'];
                            $id_titulo = $value_debitos['id_titulo'];
                            $id_usuario = null;
                            $id_titular = $value_debitos['id_titular'];
                            $observaciones = $value_debitos['observaciones'];
                            $valor_total = $value_debitos['valor_total'];

                            $this->logMessage("Notificacion sec_debito: " . $sec_debito);
                            //$email_titular = "lavila@sofhouse.net";
                            $email_titular = "websafi@anm.gov.co";

                            //ENVIO CORREO
                            $subject = "Notificacion titular en titulo: $cod_titulo";
                            $recipients = array(
                                array(
                                    'email' => $email_titular,
                                    'name' => $num_doc_titular
                                )
                            );
                            $ccRecipients = array(
                                array(
                                    'email' => $email_envio,
                                    'name' => 'Canon Websafi'
                                )
                            );

                            //cuerpo del mensaje
                            //$fecha_creacion = CN_TABLE::fechaSistema();
                            $body = <<<EOD
<html><body> 
<br/>
Bogotá, D.C., $fecha_creacion
<br/> 
<br/> 
<br/>
Señor (a) (es):
<br/><br/>
Titular de Titulo Minero $cod_titulo
<br/>
<br/>
<br/>
Asunto: Recordatorio de pago - Canon Superficiario
<br/>
<br/> 
<br/> 
<br/>
Reciba un cordial saludo.
<br/><br/>
Por medio de la presente se notifica incumplimiento de 15 dias posteriores a la fecha de vencimiento sin cancelar en anualidad completa; Titulo: $cod_titulo, Nota Débito: $sec_debito-$vig_rec por valor completo de anualidad de la suma de $ $valor_total; el valor de interes se calcula de acuerdo al día de pago.</br>
<br></br>
Titular Minero: $num_doc_titular-$razon_soc_titular</br>
<br></br>
Observaciones ND: $observaciones</br>
<br></br>
<br/>
<p align="justify">El pago de la obligación económica señalada la podrá efectuar de manera electrónica ingresando a nuestra página 
web <a href="https://tramites.anm.gov.co/Portal/pages/canon/terminosCondiciones.jsf">www.anm.gov.co</a> en la siguiente ruta: servicios en línea / "Tramites en línea - ventanilla única" / <b>Pago 
de canon superficiario (<a href="https://tramites.anm.gov.co/Portal/pages/canon/terminosCondiciones.jsf">clic aquí</a>)</b>. En esta opción deberá diligenciar todos los campos de carácter 
obligatorio, posteriormente descargue el recibo con código de barras para presentarlo en cualquier oficina 
de Banco de Bogotá a nivel nacional u optar por la opción de pagos mediante sistema PSE.</p>
<br/>
<p align="justify">Con gusto estaremos prestos en atenderle en caso de que requiera aclaraciones sobre el particular o información 
adicional; para lo cual podrá comunicarse en Bogotá con la línea telefónica 2201999 a la Ext. 5018 ó al 
correo electrónico <a href="mailto:canonenlinea@anm.gov.co">canonenlinea@anm.gov.co</a>.</p>
<br/>                                    
<br/>
<p align="center">Bogotá D.C., Avenida Calle 26 No. 59 - 51 Pisos 8, 9 y 10. Teléfono: (571) 2201999</p>
<br/>
<p align="center">Web: http//:www.anm.gov.co</p>
<br/>                                     
</body></html>
EOD;

                            $this->logMessage("Mensaje Correo: " . $body);
                            CN_TABLE::sendMail($recipients, $ccRecipients, $subject, $body, $array_adjuntos, true, $id_alarma, $id_titulo, $id_usuario, $id_titular);
                        }

                        break;
                endswitch;
            }

            $this->list_data = array(
                array(
                    'mensaje' => "Termino Correctamente."
                )
            );
            $this->conn->commit();
        } catch (Exception $e) {

            //rollback de todas las transacciones en caso de que ocurra algun error
            $this->conn->rollback();

            $mensaje = "[envio_notificacion] 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(),
                    'Line' => $e->getLine(),
                    '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_notificacion] 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_notificacion] Ejecuta llamado ");
        $this->custom_logger->info("[envio_notificacion] 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_notificacion] " . $mensajeError);
        } else {
            $this->logMessage("[envio_notificacion] Genero envio de correos.");
        }
    }

}
