<?php

/**
 * update_rvsp_estado actions.
 *
 * @package    radicacionVirtualCuentas
 * @subpackage update_rvsp_estado
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class update_formato_factura_estadoActions extends sfActions {

    /**
     * 
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---function executeList");
        $this->logMessage("---BEGIN Logging request");

        $status = 0;
        $response = array();
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------* Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        $records = array();

        /**
         * 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 HH24:MI:SS" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        try {


            if ($status == 0) {
                $this->conn->commit();
                $this->status = 0;
                $this->list_data = $response;
                $this->logMessage("[rvsp_update_estado] Exitoso");
            } else {
                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage("[rvsp_update_estado] ERROR!");
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[acta_inicio_estado] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[acta_inicio_estado] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * 
     * tipo_boton
     * 1-Firmado
     * 2-Revisado
     * 3-Autorizado
     * 4-Radicado
     * 5-Rechazado
     * 6-Aprobado
     * 7-Reactivacion
     * 
     * tipo_trans
     * 1-Contratista
     * 4-Financiera
     *
     * @param sfRequest $request A request object
     */
    public function executeUpdate(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---function executeUpdate");
        $this->logMessage("---BEGIN Logging request");

        $status = 0;
        $response = array();
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------* Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        $records = array();

        /**
         * 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 HH24:MI:SS" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        try {

            /*
             * variables por defecto para el registro de log
             */
            $id_tabla = $request['id_formato_factura'];

            /*
             * obtener id maestro tabla
             */
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('RVSP_FORMATO_FACTURA');

            /**
              1	CONSULTAR
              2	ACTUALIZAR
              3	ADICIONAR
              4	ELIMINAR
              5	ANULAR
             */
            $id_ope_bd = 2;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_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 = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }


            //construir observacion
            $observacion_log = "'Se actualizo tabla de RVSP_FORMATO_FACTURA y se ingreso un registro en la tabla RVSP_FORMATO_FACTURA_ESTADO desde la funcionalidad: " . $comando . "'";
            $subject = "";

            /*
             * 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);

            /*
             * Variables de filtro
             */
            $tipo_boton = $request['tipo_boton'];
            $tipo_trans = $request['tipo_trans'];


            //$id_acta_inicio = $request['id_acta_inicio'];
            //$anho_completo = date('Y'); //anho completo cuatro digitos

            $usuario_estado = $request['username'];
            $fecha_estado = CN_TABLE::fechaSistema();

            $observaciones_estado = '';
            if (isset($request['observaciones'])) {
                $observaciones_estado = $request['observaciones'];
            }
            $id_formato_factura = $request['id_formato_factura'];
            /*
             * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
             */
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $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;
                        }
                    }
                }
                if ('jasper_url' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $url_jasper = $value;
                        }
                    }
                }
                $int++;
            }

            //Opcion segun boton
            switch ($tipo_boton) {
                //FIRMADO
                case 1:
                    $this->logMessage("FIRMAR");
                    //validamos que la factura se pueda firmar
                    //Solo es posible firmar una factura donde la suma del valor de sus detalles es igual al valor de la factura
                    //y que posea al menos un detalle registrado
                    $sql = <<<EOD
select 
tab0.id_formato_factura,
tab0.valor_total,
nvl(tab1.valor_detalles,0),
nvl(tab1.cantidad_detalle,0),
case when (tab0.valor_total - nvl(tab1.valor_detalles,0)) = 0 and nvl(tab1.cantidad_detalle,0)>0 then 1 else 0 end as posible_firmar
from rvsp_formato_factura_v tab0
left join (select id_formato_factura,sum(valor) as valor_detalles,count(id_formato_factura) as cantidad_detalle from RVSP_FORMATO_FACTURA_DET group by id_formato_factura)tab1 on tab0.id_formato_factura = tab1.id_formato_factura
where tab0.id_formato_factura =  $id_formato_factura
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if ($records[0]['posible_firmar'] == 0) {
                        $this->logMessage("No es posible firmar el formato factura ID:" . $id_formato_factura);
                        $status = 1;
                        $mensaje = "No es posible Firmar. Se debe agregar el detalle de la factura y la suma del valor de los mismos debe ser igual al valor de la factura.";
                        
                    } else {
                        // Agrgamos Validacion de registro de factura en el cronograma si algun detalle de la factura aparece en un cronograma se envia mensaje de error
                        $sql= <<<EOD
select tab0.id_cen_op,tab0.id_formato_factura,tab1.id_formato_factura_det,tab1.ID_TIPO_SERVICIO, extract(month from tab0.fecha_emision) as mes,
extract(year from tab0.fecha_emision) as anho,tab1.id_mae_ter as empresa_det,tab0.id_mae_ter as empresa_fact
from rvsp_formato_factura tab0
left join rvsp_formato_factura_det tab1 on tab1.id_formato_factura = tab0.id_formato_factura
where tab0.id_formato_factura = $id_formato_factura
EOD;
                        $records = CN_TABLE::executeSQL($sql);
                        $id_cen_op = $records[0]['id_cen_op'];
                        $id_meses = $records[0]['mes'];
                        $id_anhos = $records[0]['anho'];
                        $sql = <<<EOD
select *
from rvsp_cronograma_servicio
where id_cen_op = $id_cen_op and id_meses = $id_meses 
and id_anhos=$id_anhos 
and id_tipo_servicio in (select id_tipo_servicio from rvsp_formato_factura_det where  id_formato_factura = $id_formato_factura)
and id_formato_factura_det is not null                                
EOD;
                        $recaux = CN_TABLE::executeSQL($sql);
                        if (count($recaux) > 0) {
                            $this->logMessage("No es posible firmar el formato factura ID:" . $id_formato_factura);
                            $status = 1;
                            $mensaje = "No es posible Firmar. ya se encuentra registrado cronograma para uno o mas tipo de servicios de la factura en la vigencia de la misma.";
                        } else {
                            // Actualizamos Cronogramas que correspondn a los detalles de factura
                            foreach($records as $registro) {
                                $id_detalle = $registro['id_formato_factura_det'];
                                $id_tipo_servicio = $registro['id_tipo_servicio'];
                                $proveedor_factura = $registro['empresa_fact'];
                                $proveedor_detalle = $registro['empresa_det'];
                                $sql = <<<EOD
update RVSP_CRONOGRAMA_SERVICIO set id_formato_factura_det = $id_detalle
where id_cen_op = $id_cen_op and id_meses = $id_meses and id_anhos = $id_anhos and id_tipo_servicio = $id_tipo_servicio
EOD;
                                $this->conn->execute($sql);
                            }
                            
                            //insertamos el registro en la tabla RVSP_FORMATO_FACTURA_ESTADO
                            $sql = <<<EOD
insert into RVSP_FORMATO_FACTURA_ESTADO(id_formato_factura,id_estado,fecha_log,usuario_log,observacion)
   VALUES ($id_formato_factura,2,SYSDATE,'$usuario_estado','$observaciones_estado')
EOD;
                            $this->conn->execute($sql);
                            //actualizar el estado en la tabla
                            $sql = <<<EOD
update RVSP_FORMATO_FACTURA 
set id_estado = 2
where
id_formato_factura = $id_formato_factura
EOD;
                            $this->conn->execute($sql);

                            /**
                             * Envio correo al apoyo si tiene, sino al supervisor
                             */
                            $this->logMessage("Envio correo");
                            //Consulta datos envio correo
                            //Sql
                            $sql = <<<EOD
select 
  tab0.id_formato_factura,
  tab0.no_cliente,
  tab0.DOCUMENTO_PROVEEDOR as num_doc,
  tab0.NOMBRE_PROVEEDOR,
  --tab0.EMAIL_PROVEEDOR,
  '$correoEnvio' as email_envio,
  --'Observacion: '||tab0.OBS_AUTorizado as mensaje_extra,
  '' as mensaje_extra,
  '' as mensaje_firma,
  'Se realiza la firma de la factura de servicio publico No '|| tab0.no_factura ||' por '|| tab0.documento_firma ||' '|| tab0.nombre_firma || '.' as mensaje,
  --datos de envio
  tab0.documento_firma as num_doc_env,
  1 as id_tipo_doc_env,
  tab0.nombre_firma as razon_social_env,
  tab0.email_firma as correo_env,
  --Datos Supervisor centro de operaciones
  nvl(tab0.documento_supervisor_sede,'') as num_doc_sup,
  1 as id_tipo_doc_sup,
  nvl(tab0.nombre_supervisor_sede,'') as razon_soc_sup,
  nvl(tab0.email_supervisor_sede,'') as correo_sup,
  '' as mensaje_extra_sup,
  tab0.no_factura as no_factura,
  tab0.no_referencia as no_referencia,    
  tab1.servicios as servicios,
  tab2.nom_cen_op as centro_operacion,
  tab3.nombre || ' ' || tab3.apellido as usuario_log                                
from 
rvsp_formato_factura_v tab0 
left join (
select tab0.id_formato_factura, listagg(tab1.descripcion,', ') within group(order by tab1.descripcion) as servicios
from RVSP_FORMATO_FACTURA_DET tab0
left join RVSP_TIPO_SERVICIO tab1 on tab1.ID_TIPO_SERVICIO = tab0.ID_TIPO_SERVICIO
group by tab0.ID_FORMATO_FACTURA    
   )tab1 on tab1.id_formato_factura = tab0.id_formato_factura 
left join CENTRO_OPERACION tab2 on tab2.id_cen_op = tab0.id_cen_op
left join USUARIO tab3 on tab3.username = tab0. usuario_log
where tab0.id_formato_factura = $id_formato_factura 
EOD;
                            //Ejecutar SQL
                            $records = CN_TABLE::executeSQL($sql);

                            $this->logMessage("Envio correo");

                            if (count($records) > 0) {


                                //ENVIAMOS CORREO A terceros
                                //Sql para traer los correos de terceros de la tabla correspondiente
                                $sql = <<<EOD
        SELECT NUM_DOC,
       NOMBRES,
       APELLIDOS,
       ESTADO,
       EMAIL
FROM RVSP_CORREOS_FIRMAR WHERE ESTADO=1
EOD;
                                $this->logMessage('SQL ' . $sql);
                                //Ejecutar SQL
                                $rec = CN_TABLE::executeSQL($sql);

                                if (count($rec) > 0) {
                                    foreach ($rec as $key => $value) {

                                        $report_params = $records[0];
                                        $no_cliente = $records[0]['no_cliente'];
                                        $num_doc = $records[0]['num_doc'];
                                        $nombre_proveedor = $records[0]['nombre_proveedor'];
                                        $no_factura = $records[0]['no_factura'];
                                        $no_referencia = $records[0]['no_referencia'];
                                        $servicios = $records[0]['servicios'];
                                        $centro_operacion = utf8_decode($records[0]['centro_operacion']);
                                        $usuario_log = $records[0]['razon_social_env'];

                                        //Ejemplo de la persona que se envia el correo:
                                        //123;1;pepito perez;correo@gmal.com
                                        $num_doc_env = $value['num_doc'];
                                        $id_tipo_doc_env = 1; //$records[0]['id_tipo_doc_env'];
                                        $razon_social_env = $value['nombres'] . ' ' . $value['apellidos'];
                                        $correo_env = $value['email'];



                                        $datos_usuario = array(
                                            '0' => $num_doc_env . ';' . $id_tipo_doc_env . ';' . $razon_social_env . ';' . $correo_env
                                        );

                                        $subject = "Firmado - Factura de servicios publicos del proveedor:" . $num_doc . " para el cliente:" . $no_cliente;
                                        $report_params['mensaje'] =  <<<EOD

   Se realiza el registro de la Factura $no_factura, $no_referencia de $servicios del proveedor $num_doc $nombre_proveedor del centro de operación $centro_operacion

Debe continuar el proceso de aprobación de la factura.

Este registro se realizó por el usuario $usuario_log                                            
EOD;
                                        $currentUri = '';
                                        $ruta = '';
                                        $adjunto = false;
                                        $progress_key = $request['comando'] . $request['username'];
                                        $array_adjuntos = array();
                                        $entidad_cliente = $entidadCliente;
                                        $entidad_nombre = $entidadNombre;
                                        $addAddress = true;

                                        $this->logMessage("Subject: " . $subject);

                                        CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);
                                    }
                                }
                            }

                            $this->logMessage("FIN Envio correo");

                            //construir observacion
                            $observacion_log = "'firmado factura de sericios publicos del asunto: " . $subject . "'";

                            /*
                             * 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);
                        }
                    }
                    break;
                //AUTORIZADO
                case 3:
                    $this->logMessage("AUTORIZAR");
                    //insertamos el registro en la tabla RVSP_FORMATO_FACTURA_ESTADO
                    $sql = <<<EOD
insert into RVSP_FORMATO_FACTURA_ESTADO(id_formato_factura,id_estado,fecha_log,usuario_log,observacion)
   VALUES ($id_formato_factura,4,SYSDATE,'$usuario_estado','$observaciones_estado')
EOD;
                    $this->conn->execute($sql);
                    //actualizar el estado en la tabla
                    $sql = <<<EOD
update RVSP_FORMATO_FACTURA 
set id_estado = 4
where
id_formato_factura = $id_formato_factura
EOD;
                    $this->conn->execute($sql);

                    /**
                     * Envio correo al apoyo si tiene, sino al supervisor
                     */
                    $this->logMessage("Envio correo");
                    //Consulta datos envio correo
                    //Sql
                    $sql = <<<EOD
select 
  tab0.id_formato_factura,
  tab0.no_cliente,
  tab0.DOCUMENTO_PROVEEDOR as num_doc,
  tab0.NOMBRE_PROVEEDOR,
  --tab0.EMAIL_PROVEEDOR,
  '$correoEnvio' as email_envio,
  'Observacion: '||tab0.OBS_AUTorizado as mensaje_extra,
  --'' as mensaje_extra,
  '' as mensaje_firma,
  'Se realiza la autorización de la factura de servicio publico No '|| tab0.no_factura ||' por '|| tab0.documento_firma ||' '|| tab0.nombre_firma || '.' as mensaje,
  --datos de envio
  tab0.documento_firma as num_doc_env,
  1 as id_tipo_doc_env,
  tab0.nombre_firma as razon_social_env,
  tab0.email_firma as correo_env,
  --Datos Supervisor centro de operaciones
  nvl(tab0.documento_supervisor_sede,'') as num_doc_sup,
  1 as id_tipo_doc_sup,
  nvl(tab0.nombre_supervisor_sede,'') as razon_soc_sup,
  nvl(tab0.email_supervisor_sede,'') as correo_sup,
  '' as mensaje_extra_sup,
  tab0.no_factura as no_factura,
  tab0.no_referencia as no_referencia,    
  tab1.servicios as servicios,
  tab2.nom_cen_op as centro_operacion,
  tab3.nombre || ' ' || tab3.apellido as usuario_log                                
from 
rvsp_formato_factura_v tab0 
left join (
select tab0.id_formato_factura, listagg(tab1.descripcion,', ') within group(order by tab1.descripcion) as servicios
from RVSP_FORMATO_FACTURA_DET tab0
left join RVSP_TIPO_SERVICIO tab1 on tab1.ID_TIPO_SERVICIO = tab0.ID_TIPO_SERVICIO
group by tab0.ID_FORMATO_FACTURA    
   )tab1 on tab1.id_formato_factura = tab0.id_formato_factura 
left join CENTRO_OPERACION tab2 on tab2.id_cen_op = tab0.id_cen_op
left join USUARIO tab3 on tab3.username = tab0. usuario_log 
where tab0.id_formato_factura = $id_formato_factura 
EOD;
                    //Ejecutar SQL
                    $records = CN_TABLE::executeSQL($sql);

                    $this->logMessage("Envio correo");

                    if (count($records) > 0) {

                        //ENVIAMOS CORREO A terceros
                        //Sql para traer los correos de terceros de la tabla correspondiente
                        $sql = <<<EOD
        SELECT NUM_DOC,
       NOMBRES,
       APELLIDOS,
       ESTADO,
       EMAIL
FROM RVSP_CORREOS_AUTORIZAR WHERE ESTADO=1
EOD;
                        $this->logMessage('SQL ' . $sql);
                        //Ejecutar SQL
                        $rec = CN_TABLE::executeSQL($sql);

                        if (count($rec) > 0) {
                            foreach ($rec as $key => $value) {





                                $report_params = $records[0];
                                $no_cliente = $records[0]['no_cliente'];
                                $num_doc = $records[0]['num_doc'];
                                
                                $nombre_proveedor = $records[0]['nombre_proveedor'];
                                $no_factura = $records[0]['no_factura'];
                                $no_referencia = $records[0]['no_referencia'];
                                $servicios = $records[0]['servicios'];
                                $centro_operacion = utf8_decode($records[0]['centro_operacion']);
                                $usuario_log = $records[0]['razon_social_env'];

                                //Ejemplo de la persona que se envia el correo:
                                //123;1;pepito perez;correo@gmal.com
                                $num_doc_env = $value['num_doc'];
                                $id_tipo_doc_env = 1; //$records[0]['id_tipo_doc_env'];
                                $razon_social_env = $value['nombres'] . ' ' . $value['apellidos'];
                                $correo_env = $value['email'];




                                $datos_usuario = array(
                                    '0' => $num_doc_env . ';' . $id_tipo_doc_env . ';' . $razon_social_env . ';' . $correo_env
                                );

                                $subject = "Autorizado - Factura de servicios publicos del proveedor:" . $num_doc . " para el cliente:" . $no_cliente;
                                $report_params['mensaje'] =  <<<EOD

Se realiza la autorización de la Factura $no_factura, $no_referencia de $servicios del proveedor $num_doc $nombre_proveedor del centro de operación $centro_operacion

Debe continuar el proceso de aprobación de la factura.

Este registro se realizó por el usuario $usuario_log                                            
EOD;
                                $currentUri = '';
                                $ruta = '';
                                $adjunto = false;
                                $progress_key = $request['comando'] . $request['username'];
                                $array_adjuntos = array();
                                $entidad_cliente = $entidadCliente;
                                $entidad_nombre = $entidadNombre;
                                $addAddress = true;

                                $this->logMessage("Subject: " . $subject);

                                CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);
                            }
                        }
                    }

                    $this->logMessage("FIN Envio correo");

                    //construir observacion
                    $observacion_log = "'Autorizado factura de sericios publicos del asunto:: " . $subject . "'";

                    /*
                     * 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);

                    break;

                case 4:
                    //RADICADO

                    $this->logMessage("RADICADO");
                    //insertamos el registro en la tabla RVSP_FORMATO_FACTURA_ESTADO
                    $sql = <<<EOD
insert into RVSP_FORMATO_FACTURA_ESTADO(id_formato_factura,id_estado,fecha_log,usuario_log,observacion)
   VALUES ($id_formato_factura,10,SYSDATE,'$usuario_estado','$observaciones_estado')
EOD;
                    $this->conn->execute($sql);
                    //actualizar el estado en la tabla
                    $sql = <<<EOD
update RVSP_FORMATO_FACTURA 
set id_estado = 10
where
id_formato_factura = $id_formato_factura
EOD;
                    $this->conn->execute($sql);


                    //Obtenemos el numero de radicado
                    $sql = <<<EOD
select nvl(max(numero_radicado),0) as consecutivo from RVSP_FORMATO_FACTURA where EXTRACT(YEAR from fecha_log)=EXTRACT(YEAR FROM sysdate)
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    $numero_radicado = $records[0]['consecutivo'] + 1;
                    //radicar como contratista
                    $sql = <<<EOD
update RVSP_FORMATO_FACTURA 
set 
numero_radicado=$numero_radicado
where
id_formato_factura = $id_formato_factura 
EOD;
                    $this->conn->execute($sql);

                    //Obtenemos el numero de radicado que acabamos de crear
                    $sql = <<<EOD
Select NUMERO_RADICADO from RVSP_FORMATO_FACTURA where id_formato_factura = $id_formato_factura 
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {
                        //$response[0] = $records[0];
                    }
                    /**
                     * Envio correo al apoyo si tiene, sino al supervisor
                     */
                    $this->logMessage("Envio correo");
                    //Consulta datos envio correo
                    //Sql
                    $sql = <<<EOD
select 
  tab0.id_formato_factura,
  tab0.no_cliente,
  tab0.no_factura as no_factura,  
  tab0.adjunto as adjunto,    
  tab0.DOCUMENTO_PROVEEDOR as num_doc,
  tab0.NOMBRE_PROVEEDOR,
  --tab0.EMAIL_PROVEEDOR,
  '$correoEnvio' as email_envio,
  --'Observacion: '||tab0.OBS_AUTorizado as mensaje_extra,
  '' as mensaje_extra,
  '' as mensaje_firma,
  'Se realiza el radicado de la factura de servicio publico No '|| tab0.no_factura ||' por '|| tab0.documento_firma ||' '|| tab0.nombre_firma || '.' as mensaje,
  --datos de envio
  tab0.documento_firma as num_doc_env,
  1 as id_tipo_doc_env,
  tab0.nombre_firma as razon_social_env,
  tab0.email_firma as correo_env,
  --Datos Supervisor centro de operaciones
  nvl(tab0.documento_supervisor_sede,'') as num_doc_sup,
  1 as id_tipo_doc_sup,
  nvl(tab0.nombre_supervisor_sede,'') as razon_soc_sup,
  nvl(tab0.email_supervisor_sede,'') as correo_sup,
  '' as mensaje_extra_sup,
  tab0.no_referencia as no_referencia,    
  tab1.servicios as servicios,
  tab2.nom_cen_op as centro_operacion,
  tab3.nombre || ' ' || tab3.apellido as usuario_log                                
from 
rvsp_formato_factura_v tab0 
left join (
select tab0.id_formato_factura, listagg(tab1.descripcion,', ') within group(order by tab1.descripcion) as servicios
from RVSP_FORMATO_FACTURA_DET tab0
left join RVSP_TIPO_SERVICIO tab1 on tab1.ID_TIPO_SERVICIO = tab0.ID_TIPO_SERVICIO
group by tab0.ID_FORMATO_FACTURA    
   )tab1 on tab1.id_formato_factura = tab0.id_formato_factura 
left join CENTRO_OPERACION tab2 on tab2.id_cen_op = tab0.id_cen_op
left join USUARIO tab3 on tab3.username = tab0. usuario_log 
where tab0.id_formato_factura = $id_formato_factura 
EOD;
                    //Ejecutar SQL
                    $records = CN_TABLE::executeSQL($sql);

                    $this->logMessage("Envio correo");

                    if (count($records) > 0) {


                        //ENVIAMOS CORREO A terceros
                        //Sql para traer los correos de terceros de la tabla correspondiente
                        $sql = <<<EOD
        SELECT NUM_DOC,
       NOMBRES,
       APELLIDOS,
       ESTADO,
       EMAIL
FROM RVSP_CORREOS_RADICAR WHERE ESTADO=1
EOD;
                        $this->logMessage('SQL ' . $sql);
                        //Ejecutar SQL
                        $rec = CN_TABLE::executeSQL($sql);

                        if (count($rec) > 0) {
                            foreach ($rec as $key => $value) {

                                $adjunto_nombre = $records[0]['adjunto'];
                                $report_params = $records[0];
                                $no_cliente = $records[0]['no_cliente'];
                                $num_doc = $records[0]['num_doc'];
                                $no_factura = $records[0]['no_factura'];
                                
                                $nombre_proveedor = $records[0]['nombre_proveedor'];
                                $no_referencia = $records[0]['no_referencia'];
                                $servicios = $records[0]['servicios'];
                                $centro_operacion = utf8_decode($records[0]['centro_operacion']);
                                $usuario_log = $records[0]['razon_social_env'];
                                //Ejemplo de la persona que se envia el correo:
                                //123;1;pepito perez;correo@gmal.com
                                $num_doc_env = $value['num_doc'];
                                $id_tipo_doc_env = 1; //$records[0]['id_tipo_doc_env'];
                                $razon_social_env = $value['nombres'] . ' ' . $value['apellidos'];
                                $correo_env = $value['email'];


                                $datos_usuario = array(
                                    '0' => $num_doc_env . ';' . $id_tipo_doc_env . ';' . $razon_social_env . ';' . $correo_env
                                );

                                $subject = "Radicado - Factura de servicios publicos del proveedor:" . $num_doc . " para el cliente:" . $no_cliente;
                                $report_params['mensaje'] =  <<<EOD

Se realizó la radicación del registro de la Factura $no_factura, $no_referencia de $servicios del proveedor $num_doc $nombre_proveedor del centro de operación $centro_operacion

Este registro se realizó por el usuario $usuario_log                                            
EOD;
                                $currentUri = '';
                                $ruta = '';
                                $adjunto = false;
                                $progress_key = $request['comando'] . $request['username'];
                                $array_adjuntos = array();
                                $entidad_cliente = $entidadCliente;
                                $entidad_nombre = $entidadNombre;
                                $addAddress = true;

                                $this->logMessage("Subject: " . $subject);

                                CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);



                                /*
                                  GENERAMOS EL REPORTE DE FACTURACIÓN UNICA MEJOR CONOCIDO COMO CONSTANCIA QUE GENERA EL SISTEMAS
                                 *                          */

                                $nombreArchivo = "factura_unica_" . $id_formato_factura;
                                $nombre_reporte = $nombreArchivo . ".pdf";
                                $this->logMessage("factura_unica :" . $nombreArchivo);
                                $this->logMessage("JASPER:!!" . $url_jasper);
                                //Generamos PDF JASPER
                                $url = $url_jasper;
                                $url = $url . 'const_sup_pago_sp&format=PDF&PARAM_id_mod=25&PARAM_username=sofhouse&PARAM_nitocc=800189921&PARAM_id_username=946';
                                $url = $url . '&PARAM_nombre_reporte=' . str_replace(' ', ':', $nombre_reporte);
                                $url = $url . '&PARAM_tag_adjunto_modulo=true';
                                $url = $url . '&PARAM_id_formato_factura=' . $id_formato_factura . '&PARAM_usuario_log=sofhouse&PARAM_adjunto=report.pdf&PARAM_entidad_cliente=7';


                                $this->logMessage('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
                                //Ejecuta la petición
                                $rta = curl_exec($ch);
                                //Se cierra la conexión
                                curl_close($ch);



                                $this->logMessage('REGRESO');


                                //ENVIAMOS CORREO A terceros
                                //Sql para traer los correos de terceros de la tabla correspondiente

                                if (isset($adjunto_nombre)) {
                                    $uploadDir = sfConfig::get("sf_upload_dir");
                                    $adjunto = true;
                                    $ruta = $uploadDir . '/adj_facturasp/';
                                    $array_adjuntos = array(
                                        $adjunto_nombre => $adjunto_nombre,
                                        $nombre_reporte => $nombre_reporte
                                    );
                                } else {

                                    $uploadDir = sfConfig::get("sf_upload_dir");
                                    $adjunto = true;
                                    $ruta = $uploadDir . '/adj_facturasp/';
                                    $array_adjuntos = array(
                                        $nombre_reporte => $nombre_reporte
                                    );
                                }
                                $this->logMessage(' PREPARO ENVIO');

                                $this->logMessage("Envio a terceros nombre: " . $value['nombres']);
                                if (isset($no_factura)) {
                                    $subject = "Solicitud - registro presupuestal para factura " . $no_factura;
                                    $this->logMessage("Subject: " . $subject);
                                    //$report_params['mensaje'] = "Amablemente solicitamos la expedicion del Registro Presupuestal para la factura de servicios publicos Nro. " . $no_factura . " " . " Verificar sus adjuntos";
                                    $report_params['mensaje'] =  <<<EOD

Se realizó la radicación del registro de la Factura $no_factura, $no_referencia de $servicios del proveedor $num_doc $nombre_proveedor del centro de operación $centro_operacion

Se solicita la expedición del Registro Presupuestal correspondiente.
                                            
Este registro se realizó por el usuario $usuario_log  
    
Se adjunta documento de factura.
EOD;
                                } else {
                                    $subject = "Solicitud - registro presupuestal para factura " . $id_formato_factura;
                                    $this->logMessage("Subject: " . $subject);
                                    //$report_params['mensaje'] = "Amablemente solicitamos la expedicion del Registro Presupuestal para la factura de servicios publicos ID Nro." . $id_formato_factura . " " . " Verificar sus adjuntos";
                                    $report_params['mensaje'] =  <<<EOD

Se realizó la radicación del registro de la Factura $no_factura, $no_referencia de $servicios del proveedor $num_doc $nombre_proveedor del centro de operación $centro_operacion

Se solicita la expedición del Registro Presupuestal correspondiente.
                                            
Este registro se realizó por el usuario $usuario_log  

Se adjunta documento de factura.
EOD;
                                }

                                $datos_usuario = array(
                                    '0' => $value['num_doc'] . ';' . '1' . ';' . $value['nombres'] . ';' . $value['email'] . ';' . '  '
                                );
                                CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);
                            }
                        }
                    }
                    $this->logMessage("FIN Envio correo");

                    //construir observacion
                    $observacion_log = "'Formato de factura radicado del proceso del asunto: " . $subject . "'";

                    /*
                     * 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);


                    break;

                //RECHAZADO
                case 5:
                    $this->logMessage("RECHAZAR");
                    // Limpiamo los registros en cronograma que apunten a la factura
                    $sql = <<<EOD
update RVSP_CRONOGRAMA_SERVICIO set id_formato_factura_det = NULL
where id_formato_factura_det in (select id_formato_factura_det from rvsp_formato_factura_det where id_formato_factura = $id_formato_factura)
EOD;
                    $this->conn->execute($sql);
                    //insertamos el registro en la tabla RVSP_FORMATO_FACTURA_ESTADO
                    $sql = <<<EOD
insert into RVSP_FORMATO_FACTURA_ESTADO(id_formato_factura,id_estado,fecha_log,usuario_log,observacion)
    VALUES($id_formato_factura,9,SYSDATE,'$usuario_estado','$observaciones_estado')
EOD;
                    $this->conn->execute($sql);
                    //actualizar el estado en la tabla
                    $sql = <<<EOD
update RVSP_FORMATO_FACTURA 
set id_estado = 9
where
id_formato_factura = $id_formato_factura
EOD;
                    $this->conn->execute($sql);

                    $this->conn->commit();

                    $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
                    $this->conn->beginTransaction();

                    /**
                     * Envio correo al apoyo si tiene, sino al supervisor
                     */
                    $this->logMessage("Envio correo");
                    //Consulta datos envio correo
                    //Sql
                    $sql = <<<EOD
select 
  tab0.id_formato_factura,
  tab0.no_cliente,
  tab0.DOCUMENTO_PROVEEDOR as num_doc,
  tab0.NOMBRE_PROVEEDOR,
  --tab0.EMAIL_PROVEEDOR,
  '$correoEnvio' as email_envio,
  'Observacion: '||tab0.OBS_rechazado as mensaje_extra,
  --'' as mensaje_extra,
  '' as mensaje_firma,
  'Se rechaza la factura de servicio publico No '|| tab0.no_factura ||' por '|| tab0.documento_firma ||' '|| tab0.nombre_firma || '.' as mensaje,
  --datos de envio
  tab0.documento_firma as num_doc_env,
  1 as id_tipo_doc_env,
  tab0.nombre_firma as razon_social_env,
  tab0.email_firma as correo_env,
  --Datos Supervisor centro de operaciones
  nvl(tab0.documento_supervisor_sede,'') as num_doc_sup,
  1 as id_tipo_doc_sup,
  nvl(tab0.nombre_supervisor_sede,'') as razon_soc_sup,
  nvl(tab0.email_supervisor_sede,'') as correo_sup,
  '' as mensaje_extra_sup
from 
rvsp_formato_factura_v tab0 
where tab0.id_formato_factura = $id_formato_factura 
EOD;
                    //Ejecutar SQL
                    $records = CN_TABLE::executeSQL($sql);

                    $this->logMessage("Envio correo");

                    if (count($records) > 0) {

                        $report_params = $records[0];
                        $no_cliente = $records[0]['no_cliente'];
                        $num_doc = $records[0]['num_doc'];

                        //Ejemplo de la persona que se envia el correo:
                        //123;1;pepito perez;correo@gmal.com
                        $num_doc_env = $records[0]['num_doc_env'];
                        $id_tipo_doc_env = $records[0]['id_tipo_doc_env'];
                        $razon_social_env = $records[0]['razon_social_env'];
                        $correo_env = $records[0]['correo_env'];
                        //DATOS SUPERVISOR -
                        $num_doc_sup = $records[0]['num_doc_sup'];
                        $id_tipo_doc_sup = $records[0]['id_tipo_doc_sup'];
                        $razon_social_sup = $records[0]['razon_social_sup'];
                        $correo_sup = $records[0]['correo_sup'];

                        $datos_usuario = array(
                            '0' => $num_doc_env . ';' . $id_tipo_doc_env . ';' . $razon_social_env . ';' . $correo_env
                        );

                        $subject = "Rechazado - Factura de servicios publicos del proveedor:" . $num_doc . " para el cliente:" . $no_cliente;
                        $currentUri = '';
                        $ruta = '';
                        $adjunto = false;
                        $progress_key = $request['comando'] . $request['username'];
                        $array_adjuntos = array();
                        $entidad_cliente = $entidadCliente;
                        $entidad_nombre = $entidadNombre;
                        $addAddress = true;

                        $this->logMessage("Subject: " . $subject);

                        CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);

                        //ENVIAMOS CORREO A Supervisor - 20180620
                        $mensaje_extra_sup = $records[0]['mensaje_extra_sup'];

                        $datos_usuario = array(
                            '0' => $num_doc_sup . ';' . $id_tipo_doc_sup . ';' . $razon_social_sup . ';' . $correo_sup . ';' . $mensaje_extra_sup
                        );

                        $this->logMessage("Envio supervisor: " . $num_doc_sup);
                        CN_TABLE::envioCorreo($report_params, $datos_usuario, $subject, $currentUri, $ruta, $adjunto, $progress_key, $array_adjuntos, $entidad_cliente, $entidad_nombre, $addAddress);
                    }

                    $this->logMessage("FIN Envio correo");

                    //construir observacion
                    $observacion_log = "'Rechazada factura de servicios publicos asunto: " . $subject . "'";

                    /*
                     * 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);

                    break;

                default:
                    break;
            }


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            if ($status == 0) {
                $this->conn->commit();
                $this->status = 0;
                $this->list_data = $response;
                $this->logMessage("[update_formato_factura_estado] Exitoso");
            } else {
                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage("[update_formato_factura_estado] ERROR!");
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[acta_inicio_estado] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[acta_inicio_estado] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
