<?php
/*
 * This file is part of facturacion_base
 * Copyright (C) 2013-2017  Carlos Garcia Gomez  neorazorx@gmail.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
ini_set('max_execution_time', 300);
set_time_limit(0);
require_once 'plugins/facturacion_base/extras/fbase_controller.php';
require_once 'plugins/factelect/controller/FirmaXades/FirmaElectronicaNativa.php';
require_once 'plugins/facturacion_base/controller/tpv_recambios.php';

//include 'plugins/ChromePhp/ChromePhp.php';
//ChromePhp::log('Hello console!');
//ChromePhp::log($_SERVER);
//ChromePhp::warn('something went wrong!');

class factelect extends fbase_controller
{

    public $agente;
    public $almacenes;
    public $articulo;
    public $buscar_lineas;
    public $cliente;
    public $codagente;
    public $codalmacen;
    public $codgrupo;
    public $codpago;
    public $codserie;
    public $desde;
    public $estado;
    public $factura;
    public $forma_pago;
    public $grupo;
    public $hasta;
    public $huecos;
    public $lineas;
    public $mostrar;
    public $num_resultados;
    public $offset;
    public $order;
    public $resultados;
    public $serie;
    public $total_resultados;
    public $total_resultados_comision;
    public $total_resultados_txt;
    // facturacion electronica

    public $clave;
    public $nombarch;
    public $MEN1;
    public $mensajebien;
    public $mensajemal;
    public $clv;
    public $data_alm;
    public $factclave;          // ARRAY de la factura a procesar electronicamente
    public $archAutorizado;    // nombre del archivo autorizado por el SRI
    public $nombrecliente;     //  nombre del cliente a realizarse el xml
    public $errordatcli;        // errores de datos antes de generar xml
    public $idfiscal;          // tipo de identificacion fiscal 05= cedula, 04= RUC etc....
    public $mail;               // email tomado de la tabla de clientes
    public $cifnif;             // numero de identificacion del cliente tomado de tabla clientes
    public $correodestino;
    public $correodefault;
    public $dirarchFG;
    public $numdigi;
    public $reticket;
    public $terminal;

    public function __construct()
    {
        parent::__construct('factelect', 'Fact. Electronica', 'Formularios EC');
    }

    protected function private_core()
    {


    $this->share_extensions();

    if( isset($_GET['reticket']) )
      {
        $factimpre = $_GET['reticket'];
        //ChromePhp::log('valor retiket');
        //$this->new_message('reimpresion '.$_GET['reticket']);
      }

     if( isset($_GET['enviarmails'])){
       $this->new_message('enviando Mails '.$_GET['enviarmails']); 
       $this->envio_mail_grupo();
     }

    if( isset($_GET['id']) )
      {

            parent::private_core();
            // esta direccion electronica se utlizara en cso de no tener una el cliente
            $this->correodefault = FS_MAILDEFA;
            $this->empresa = new empresa();
            $factclave = new factura_cliente();
            $factura = new factura_cliente();
            $this->factclave = $factclave->get($_GET['id']);
            $this->nombrecliente = $this->factclave->nombrecliente;      // nombre cliente
            $codcli = $this->factclave->codcliente;                         // codigo del cliente
            
            $cliente1     = new cliente();
            $this->codcli = $cliente1->get($codcli);
            $this->correodestino = $this->codcli->email;                    // email del cliente
            $tipoidfiscal = $this->codcli->tipoidfiscal;                  // cedula=cedula RUC=RUC  CONSUMIDOR FINAL
            $this->cifnif = $this->codcli->cifnif;                        // numero del documento de identificacion
            $digicifnif   = strlen($this->cifnif);
            $this->numdigi= $digicifnif;
            $this->estadosri = $this->factclave->estadosri;

            if(isset($_GET['archianula'])){
                $this->archianula = $_GET['archianula'];
            if($this->archianula > 0){
                //$this->new_error_msg("sql "."select * from fs_logs where detalle like "."%ERROR AL EJECUTAR EL SCRIPT%"
                //.$this->archianula."%");
                $consulta = $this->db->select("select * from fs_logs where detalle like '"."%ERROR AL EJECUTAR EL SCRIPT%"
                .$this->archianula."%'");
                foreach ($consulta as $k) {
                    $this->new_error_msg($k['detalle']);
                }
            }
            }


//-----   impresion de tikets 
/*            $this->agente = $this->user->get_agente();
            //$this->new_message('antes del if ');

            if ($this->agente) {
                //$this->new_message('dentro del if ');
                
                //var_dump($this->agente);
                $this->caja = FALSE;
                $this->terminal = FALSE;
                $caja = new caja();
                $terminal0 = new terminal_caja();
                foreach ($caja->all_by_agente($this->agente->codagente) as $cj) {
                    if ($cj->abierta()) {
                        $this->caja = $cj;
                        $this->terminal = $terminal0->get($cj->fs_id);
                        break;
                    }
                }
                if ($this->caja) {
                    //var_dump($this->caja);
                    $terx = $this->terminal->id;
                    
                    if (isset($_GET['reticket'])) {
                            //$this->new_message('1-Caja.'.$this->factclave->idfactura);
                            $this->imprimir_observaciones = FALSE;
                            $this->imprimir_descripciones = FALSE;
                            $this->terminal->imprimir_ticket($this->factclave, $this->empresa, $this->imprimir_descripciones, $this->imprimir_observaciones);
                            $this->terminal->save();


                            $this->factclave->estadosri = "GENERADO";
                            $this->factclave->save();

                    }
                } else {
                    
                }
            } else {
                $this->new_error_msg('No tienes un <a href="' . $this->user->url() . '">agente asociado</a>
               a tu usuario, y por tanto no puedes hacer tickets.');
            }
*/
//----    fin impresion de tikets  



            $this->errormail=0;

            
            if ($tipoidfiscal=='Cedula' and $this->cifnif <> '9999999999999' ) 
            {
                $this->idfiscal = '05';
                if ($digicifnif !==10) $this->errordatcli .= "Error numero en CEDULA ".$this->cifnif. " ".$digicifnif;
            }
            if ($tipoidfiscal=='RUC')
            {    
                $this->idfiscal = '04';
                if ($digicifnif !== 13) $this->errordatcli .= "Error numero en RUC ";   
            }
            if ($tipoidfiscal=='CF')  
            {     
                $this->idfiscal = '07';
                if ($digicifnif !==13) $this->errordatcli .= "Error numero en CONSUMIDOR FINAL ";
            }
            if ($tipoidfiscal=='Pasaporte') 
            {
                $this->idfiscal = '06';
                if ($digicifnif > 13) $this->errordatcli .= "Error numero en PASAPORTE ";
            }
            if ($tipoidfiscal=='CedExterior') 
            {
                $this->idfiscal = '08';            
                if ($digicifnif >13) $this->errordatcli .= "Error numero en CEDULA DE EXTRANJERO ";
            }

                              // numero de documento



        if( isset($_GET['codalmacen']) )
        {
            $this->codalmacen = $_GET['codalmacen'];
        }

         //     

         // LOS MENSAJES SE MUESTRAN BIEN EJECUTANDO SOLO  $this->valida_sri(); 
            //$this->new_message("Generar  100 : ".$_GET['id']);


      if( isset($_GET['archiaprNo']) )  
      {
            $this->archNoAuto = $_GET['archiaprNo'];
            $this->ride_factura_noauto();    
      }


      if( isset($_GET['archiapr']) )  
      {
            $this->archAutorizado = $_GET['archiapr'];
            $this->ride_factura();    
      }

      if( isset($_GET['codigo']) )  
      {
            if (!filter_var($this->correodestino, FILTER_VALIDATE_EMAIL)) { 
                $this->errormail=1;
             }
            //$this->new_message("Generar  100 : ".$_GET['codigo']);
            if ($this->estadosri <> 'ENVIADO' ) {
                if ($this->estadosri <> 'AUTORIZADO') {
                    
                    $this->genera_xml();  
                }
            }
       }   
          
      }
      if( isset($_GET['clv']) or (strlen($this->clv) == 49 and  $this->estadosri == "GENERADO"))
      {
         if(strlen($this->clv) == 49){

         }else{
            $this->clv =  $_GET['clv'];
         }
         $this->clave    = $this->clv;
         $this->nombarch = $this->clv."-ORG.xml";

            if ($this->estadosri == 'ENVIADO' ) $this->new_message("Esta factura ya fue ENVIADA al comprador");
            if ($this->estadosri == 'AUTORIZADO') $this->new_message("Esta factura ya fue AUTORIZADA al comprador");
            if ($this->estadosri == 'NEGADO') $this->new_message("Esta factura fue NEGADA al comprador");
            if ($this->estadosri == 'GENERADO' ) $this->valida_sri();  
    
            $this->new_error_msg("datos ".$this->clave." == ". $this->estadosri);
        // para pruebas 
        // $this->archAutorizado = "0910201801040090462900110010010000349240003638416-A.xml";
        //$this->ride_factura();
                    
      }
      
      // envio de mail  clvmail

       if (isset($_GET['clvmail'])) {
          $this->clave = $_GET['clvmail'];
       }
       if (isset($_GET['estadomail'])) {
          $this->estadosri = $_GET['estadomail'];
       }
      if( isset($_GET['clvaut']) or ($this->clave == 49 and  $this->estadosri == "AUTORIZADO") )
        {
            
        
        if (!filter_var($this->correodestino, FILTER_VALIDATE_EMAIL)) 
        { 
            $this->errormail=2;
            $this->new_error_msg("Error e-mail : ". $this->correodestino. "  Se enviará al :".$this->correodefault); 
            $this->correodestino = $this->correodefault;
        }
        if(strlen($this->clave) == 49){
            $this->clvaut = $this->clave;
        }else{
            $this->clvaut =  $_GET['clvaut'];
            $this->clave    = $this->clvaut;
        }
        
        $this->archAutorizado =  $this->clvaut."-A.xml";
        $this->mail_factura();   

        }

        ///////////// private core ////////////
        $this->agente = new agente();
        $this->almacenes = new almacen();
        $this->factura = new factura_cliente();
        $this->forma_pago = new forma_pago();
        $this->grupo = new grupo_clientes();
        $this->huecos = array();
        $this->serie = new serie();
        $this->mostrar = 'todo'; 


        if (isset($_GET['mostrar'])) {
            $this->mostrar = $_GET['mostrar'];
            setcookie('ventas_fac_mostrar', $this->mostrar, time() + FS_COOKIES_EXPIRE);
        } else if (isset($_COOKIE['ventas_fac_mostrar'])) {
            $this->mostrar = $_COOKIE['ventas_fac_mostrar'];
        }

        $this->offset = 0;
        if (isset($_REQUEST['offset'])) {
            $this->offset = intval($_REQUEST['offset']);
        }

        $this->order = 'fecha DESC';
        if (isset($_GET['order'])) {
            $orden_l = $this->orden();
            if (isset($orden_l[$_GET['order']])) {
                $this->order = $orden_l[$_GET['order']]['orden'];
            }

            setcookie('ventas_fac_order', $this->order, time() + FS_COOKIES_EXPIRE);
        } else if (isset($_COOKIE['ventas_fac_order'])) {
            $this->order = $_COOKIE['ventas_fac_order'];
        }

        if (isset($_POST['buscar_lineas'])) {
            $this->buscar_lineas();
        } else if (isset($_REQUEST['buscar_cliente'])) {
            $this->fbase_buscar_cliente($_REQUEST['buscar_cliente']);
        } else if (isset($_GET['ref'])) {
            //$this->template = 'extension/ventas_facturas_articulo';

            $articulo = new articulo();
            $this->articulo = $articulo->get($_GET['ref']);

            $linea = new linea_factura_cliente();
            $this->resultados = $linea->all_from_articulo($_GET['ref'], $this->offset);
        } else {
            $this->share_extension();
            $this->huecos = $this->factura->huecos();
            $this->cliente = FALSE;
            $this->codagente = '';
            $this->codalmacen = '';
            $this->codgrupo = '';
            $this->codpago = '';
            $this->codserie = '';
            $this->desde = '';
            $this->estado = '';
            $this->hasta = '';
            $this->num_resultados = '';
            $this->total_resultados = array();
            $this->total_resultados_comision = 0;
            $this->total_resultados_txt = '';
            //$this->dirarch = '';
            $this->dirarch = 'plugins/factelect/controller/src_sri/generados/';
            if (isset($_GET['delete'])) {
                $this->delete_factura();
            } else {
                if (!isset($_GET['mostrar']) && ( $this->query != '' || isset($_REQUEST['codagente']) || isset($_REQUEST['codcliente']) || isset($_REQUEST['codserie']))) {
                    /**
                     * si obtenermos un codagente, un codcliente o un codserie pasamos direcatemente
                     * a la pestaña de búsqueda, a menos que tengamos un mostrar, que
                     * entonces nos indica donde tenemos que estar.
                     */
                    $this->mostrar = 'buscar';
                }

                if (isset($_REQUEST['codcliente']) && $_REQUEST['codcliente'] != '') {
                    $cli0 = new cliente();
                    $this->cliente = $cli0->get($_REQUEST['codcliente']);
                }

                if (isset($_REQUEST['codagente'])) {
                    $this->codagente = $_REQUEST['codagente'];
                }

                if (isset($_REQUEST['codalmacen'])) {
                    $this->codalmacen = $_REQUEST['codalmacen'];
                }

                if (isset($_REQUEST['codgrupo'])) {
                    $this->codgrupo = $_REQUEST['codgrupo'];
                }

                if (isset($_REQUEST['codpago'])) {
                    $this->codpago = $_REQUEST['codpago'];
                }

                if (isset($_REQUEST['codserie'])) {
                    $this->codserie = $_REQUEST['codserie'];
                }

                if (isset($_REQUEST['desde'])) {
                    $this->desde = $_REQUEST['desde'];
                    $this->hasta = $_REQUEST['hasta'];
                    $this->estado = $_REQUEST['estado'];
                }
            }

            /// añadimos segundo nivel de ordenación
            $order2 = '';
            if (substr($this->order, -4) == 'DESC') {
                $order2 = ', hora DESC, numero DESC';
            } else {
                $order2 = ', hora ASC, numero ASC';
            }

            if ($this->mostrar == 'sinpagar') {
                $this->resultados = $this->factura->all_sin_pagar($this->offset, FS_ITEM_LIMIT, $this->order . $order2);

                if ($this->offset == 0) {
                    /// calculamos el total, pero desglosando por divisa
                    $this->total_resultados = array();
                    $this->total_resultados_txt = 'Suma total de esta página:';
                    
                    foreach ($this->resultados as $fac) {
                        if (!isset($this->total_resultados[$fac->coddivisa])) {
                            $this->total_resultados[$fac->coddivisa] = array(
                                'coddivisa' => $fac->coddivisa,
                                'total' => 0
                            );
                        }

                        $this->total_resultados[$fac->coddivisa]['total'] += $fac->total;
                    }
                }
            } else if ($this->mostrar == 'buscar') {
                $this->buscar($order2);
            } else {
                $this->resultados = $this->factura->all($this->offset, FS_ITEM_LIMIT, $this->order . $order2);
            }
        }
    }

    public function urlimp()
    {
        return "index.php?page=tpv_recambios&id=";
    }   

    private function share_extensions()
    {
        $fsext = new fs_extension();
        $fsext->name = 'api_remote_printer';
        $fsext->from = __CLASS__;
        $fsext->type = 'api';
        $fsext->text = 'remote_printer';
        $fsext->save();
    }



    public function url($busqueda = FALSE)
    {
        if ($busqueda) {
            $codcliente = '';
            if ($this->cliente) {
                $codcliente = $this->cliente->codcliente;
            }

            $url = parent::url() . "&mostrar=" . $this->mostrar
                . "&query=" . $this->query
                . "&codagente=" . $this->codagente
                . "&codalmacen=" . $this->codalmacen
                . "&codcliente=" . $codcliente
                . "&codgrupo=" . $this->codgrupo
                . "&codpago=" . $this->codpago
                . "&codserie=" . $this->codserie
                . "&desde=" . $this->desde
                . "&estado=" . $this->estado
                . "&hasta=" . $this->hasta;

            return $url;
        }

        return parent::url();
    }

    public function paginas()
    {
        if ($this->mostrar == 'sinpagar') {
            $total = $this->total_sinpagar();
        } else if ($this->mostrar == 'buscar') {
            $total = $this->num_resultados;
        } else {
            $total = $this->total_registros();
        }

        return $this->fbase_paginas($this->url(TRUE), $total, $this->offset);
    }

    public function buscar_lineas()
    {
        /// cambiamos la plantilla HTML
        $this->template = 'ajax/ventas_lineas_facturas';

        $this->buscar_lineas = $_POST['buscar_lineas'];
        $linea = new linea_factura_cliente();

        if (isset($_POST['codcliente'])) {
            $this->lineas = $linea->search_from_cliente2($_POST['codcliente'], $this->buscar_lineas, $_POST['buscar_lineas_o']);
        } else {
            $this->lineas = $linea->search($this->buscar_lineas);
        }
    }

    private function share_extension()
    {
        /// añadimos las extensiones para clientes, agentes y artículos
        $extensiones = array(
            array(
                'name' => 'facturas_cliente',
                'page_from' => __CLASS__,
                'page_to' => 'ventas_cliente',
                'type' => 'button',
                'text' => '<span class="glyphicon glyphicon-list" aria-hidden="true"></span> &nbsp; Facturas',
                'params' => ''
            ),
            array(
                'name' => 'facturas_agente',
                'page_from' => __CLASS__,
                'page_to' => 'admin_agente',
                'type' => 'button',
                'text' => '<span class="glyphicon glyphicon-list" aria-hidden="true"></span> &nbsp; Facturas de cliente',
                'params' => ''
            ),
            array(
                'name' => 'facturas_articulo',
                'page_from' => __CLASS__,
                'page_to' => 'ventas_articulo',
                'type' => 'tab_button',
                'text' => '<span class="glyphicon glyphicon-list" aria-hidden="true"></span> &nbsp; Facturas de cliente',
                'params' => ''
            ),
        );
        foreach ($extensiones as $ext) {
            $fsext0 = new fs_extension($ext);
            if (!$fsext0->save()) {
                $this->new_error_msg('Imposible guardar los datos de la extensión ' . $ext['name'] . '.');
            }
        }
    }

    public function total_sinpagar()
    {
        return $this->fbase_sql_total('facturascli', 'idfactura', 'WHERE pagada = false');
    }

    private function total_registros()
    {
        return $this->fbase_sql_total('facturascli', 'idfactura');
    }

    private function buscar($order2)   // Entra desde la primera vez que entra en la pantalla
    {

        // busca y lista los archivos en el directorio que generados clave=49 -ORG Y EXT XML   
        $ruta100 = 'plugins/factelect/controller/src_sri/generados/'; 
        $directorio=opendir($ruta100);
        //recoger los  datos
        $datos=array();
        while ($archivo = readdir($directorio)) 
        { 
          if(($archivo != '.')&&($archivo != '..'))
          {
             
             //echo "archivo a guardar ".$archivo."  tamaño :".strlen($archivo);
           
             if (strlen($archivo)==57) 
             {
                $datos[]=substr($archivo,-18,8);    // $ARCHIVO tiene el nombre completo.XML 
                //$id = substr($archivo,-18,8);     
             }
          } 
        }       

        $this->resultados = array();
        $this->num_resultados = 0;
        $sql = " FROM facturascli ";
        $where = 'WHERE ';

        if ($this->query) {
            $query = $this->agente->no_html(mb_strtolower($this->query, 'UTF8'));
            $sql .= $where;
            if (is_numeric($query)) {
                $sql .= "(clavesri LIKE '%" . $query . "%' OR codigo LIKE '%" . $query . "%' OR numero2 LIKE '%" . $query . "%' "
                    . "OR observaciones LIKE '%" . $query . "%' OR cifnif LIKE '" . $query . "%')";
            } else {
                $sql .= "(lower(codigo) LIKE '%" . $query . "%' OR lower(numero2) LIKE '%" . $query . "%' "
                    . "OR lower(cifnif) LIKE '" . $query . "%' "
                    . "OR lower(observaciones) LIKE '%" . str_replace(' ', '%', $query) . "%')";
            }
            $where = ' AND ';
        }
        $sql .= $where . " anulada = false and idfacturarect is null "; //anuladas como facturas previo al proceso de factura electronica
        $where = ' AND ';

        if ($this->cliente) {
            $sql .= $where . "codcliente = " . $this->agente->var2str($this->cliente->codcliente);
            $where = ' AND ';
        }

        if ($this->codagente != '') {
            $sql .= $where . "codagente = " . $this->agente->var2str($this->codagente);
            $where = ' AND ';
        }

        if ($this->codalmacen != '') {
            $sql .= $where . "codalmacen = " . $this->agente->var2str($this->codalmacen);
            $where = ' AND ';
        }

        if ($this->codgrupo != '') {
            $sql .= $where . "codcliente IN (SELECT codcliente FROM clientes WHERE codgrupo = " . $this->agente->var2str($this->codgrupo) . ")";
            $where = ' AND ';
        }

        if ($this->codpago != '') {
            $sql .= $where . "codpago = " . $this->agente->var2str($this->codpago);
            $where = ' AND ';
        }

        if ($this->codserie != '') {
            $sql .= $where . "codserie = " . $this->agente->var2str($this->codserie);
            $where = ' AND ';
        }

        if ($this->desde) {
            $sql .= $where . "fecha >= " . $this->agente->var2str($this->desde);
            $where = ' AND ';
        }

        if ($this->hasta) {
            $sql .= $where . "fecha <= " . $this->agente->var2str($this->hasta);
            $where = ' AND ';
        }

        if ($this->estado == 'generadas') {
            $cadena_idfac= implode(",", $datos);
            $sql .= $where . "estadosri= 'GENERADO' ";
            if($cadena_idfac<>''){
                $sql .= " and numero in (".$cadena_idfac.")" ; 
            }
            $where = ' AND ';
        } else if ($this->estado == 'imprimir') {
            $sql .= $where . "estadosri= 'IMPRIMIR'";
            $where = ' AND ';              
        } else if ($this->estado == 'singenerar') {
            $sql .= $where . " (estadosri is null or estadosri = '') ";
            $where = ' AND ';    
        } else if ($this->estado == 'firmadas') {
            $sql .= $where . "estadosri= 'FIRMADO'  or estadosri= 'VALIDADO' ";
            $where = ' AND ';

        } else if ($this->estado == 'aprobadas') {
            $sql .= $where . "estadosri= 'AUTORIZADO' ";
            $where = ' AND ';
        } else if ($this->estado == 'negadas') {
            $sql .= $where . "estadosri= 'NEGADO' ";
            $where = ' AND ';
        } else if ($this->estado == 'enviadas') {
            $sql .= $where . "estadosri= 'ENVIADO' ";
            $where = ' AND ';
        }
// $this->new_error_msg("SQL JOHN antes ".$sql."  VARIABLE GLOBAL ".FS_JOHN);
        $data = $this->db->select("SELECT COUNT(idfactura) as total" . $sql);
        if ($data) {
            $this->num_resultados = intval($data[0]['total']);

            $data2 = $this->db->select_limit("SELECT *" . $sql . " ORDER BY " . $this->order . $order2, FS_ITEM_LIMIT, $this->offset);
            if ($data2) {
                foreach ($data2 as $d) {
                    $this->resultados[] = new factura_cliente($d);
                    //print_r($this->resultados);
                    //echo "</br>";
                    //$this->new_error_msg("SQL JOHN ".$sql);
                }
            }

            $data2 = $this->db->select("SELECT coddivisa,SUM(total) as total" . $sql . " GROUP BY coddivisa");
            if ($data2) {
                $this->total_resultados_txt = 'Suma total de los resultados:';
                $this->dirarch = 'plugins/factelect/controller/src_sri/generados/';
                foreach ($data2 as $d) {
                    $this->total_resultados[] = array(
                        'coddivisa' => $d['coddivisa'],
                        'total' => floatval($d['total'])
                    );
                }
            }

            if ($this->codagente !== '') {
                /// calculamos la comisión del empleado
                $data2 = $this->db->select("SELECT SUM(neto*porcomision/100) as total" . $sql);
                if ($data2) {
                    $this->total_resultados_comision = floatval($data2[0]['total']);
                }
            }
        }
    }

    private function delete_factura()
    {
        $fact = $this->factura->get($_GET['delete']);
        if ($fact) {
            /// obtenemos las líneas de la factura antes de eliminar
            $lineas = $fact->get_lineas();

            if ($fact->delete()) {
                if (!$fact->anulada) {
                    /// Restauramos el stock
                    $art0 = new articulo();
                    foreach ($lineas as $linea) {
                        /// si la línea pertenece a un albarán no descontamos stock
                        if (is_null($linea->idalbaran)) {
                            $articulo = $art0->get($linea->referencia);
                            if ($articulo) {
                                $articulo->sum_stock($fact->codalmacen, $linea->cantidad, FALSE, $linea->codcombinacion);
                            }
                        }
                    }
                }

                /// ¿Esta factura es rectificativa de otra?
                if ($fact->idfacturarect) {
                    $original = $this->factura->get($fact->idfacturarect);
                    if ($original) {
                        $original->anulada = FALSE;
                        $original->save();
                    }
                }

                $this->clean_last_changes();
            } else {
                $this->new_error_msg("¡Imposible eliminar la factura!");
            }
        } else {
            $this->new_error_msg("Factura no encontrada.");
        }
    }

    public function orden()
    {
        return array(
            'fecha_desc' => array(
                'icono' => '<span class="glyphicon glyphicon-sort-by-attributes-alt" aria-hidden="true"></span>',
                'texto' => 'Fecha',
                'orden' => 'fecha DESC'
            ),
            'fecha_asc' => array(
                'icono' => '<span class="glyphicon glyphicon-sort-by-attributes" aria-hidden="true"></span>',
                'texto' => 'Fecha',
                'orden' => 'fecha ASC'
            ),
            'vencimiento_desc' => array(
                'icono' => '<span class="glyphicon glyphicon-sort-by-attributes-alt" aria-hidden="true"></span>',
                'texto' => 'Vencimiento',
                'orden' => 'vencimiento DESC'
            ),
            'vencimiento_asc' => array(
                'icono' => '<span class="glyphicon glyphicon-sort-by-attributes" aria-hidden="true"></span>',
                'texto' => 'Vencimiento',
                'orden' => 'vencimiento ASC'
            ),
            'codigo_desc' => array(
                'icono' => '<span class="glyphicon glyphicon-sort-by-attributes-alt" aria-hidden="true"></span>',
                'texto' => 'Código',
                'orden' => 'codigo DESC'
            ),
            'codigo_asc' => array(
                'icono' => '<span class="glyphicon glyphicon-sort-by-attributes" aria-hidden="true"></span>',
                'texto' => 'Código',
                'orden' => 'codigo ASC'
            ),
            'total_desc' => array(
                'icono' => '<span class="glyphicon glyphicon-sort-by-attributes-alt" aria-hidden="true"></span>',
                'texto' => 'Total',
                'orden' => 'total DESC'
            )
        );
    }




    private function genera_xml()
      {
        $ruta100        = 'plugins/factelect/controller/src_sri/generados/'; 
        $tipcomp        = '01';        // factura
        $docclave       = "numfact";       
        $serie1          = '001';              // lleva la actividad
        $serie11        ='';
        $serie2          = '099';   
        $tipoEmi        = 1;
        if(FS_AMBIENTE==FALSE) $tipambiente  = 1;            //  tipo de ambiente 1-> pruebas   2 -> produccion   
        if(FS_AMBIENTE==TRUE)  $tipambiente  = 2;          

       $where1='';
       $where3='';
     $this->codalmacen = 'xyd_' ;  
     //$this->new_message("GET ALMACEN  ". $this->codalmacen);
                    
     if( $this->codalmacen == '' ) $this->codalmacen == 'xyd_' ; //$this->errordatcli .= "No eligio un ALMACEN";

     if(   $this->errordatcli == '' )
      {
        // $this->codalmacen = $_GET['x'];
         //$this->new_message("SI HAY ALMACEN ". $this->codalmacen);
         $where1 .= "almacen = '".$this->codalmacen. "'";
         $where2 = " where idfactura = '" . $_GET['id']."'"  ;

         // datos generales de la factura
         $data_fac1 = "SELECT * FROM facturascli ".$where2;
         
         $data_fac      =   $this->db->select("SELECT * FROM facturascli ".$where2.";");
         $contacto      =   '';
         $desctotlin    =   0;
         $nombre        =   '';

        // datos del almacen o empresa  

         //$this->codalmacen = 'xyd_';
         if ($this->codalmacen == 'xyd_')
         {
             $data_emp = $this->db->select("SELECT administrador , nombre, direccion, cifnif FROM empresa WHERE id=1 ;");
           
         }else
         {
             $this->errordatcli == 'Datos de Empresa no existen';
         }




//        $this->new_message(" ALMACEN CODIGO ".$numfact1);

        if (is_array($data_emp))
        {
          foreach($data_emp as $alm)
           {
              $rucalmacen = ($alm['cifnif']);   
              $nombre = ($alm['nombre']);   
              $direccionalma = ($alm['direccion']);   
             //$this->new_message("datos almacen ". $contacto."  nombre ".$nombre); 
           }
        }else 
          {
           $this->new_message("no hay datos EMPRESA");
          }
        //$this->new_message(" ALMACEN ".$rucalmacen);
        //$this->new_message(" NOMBRE ALMA ".$nombre);
          
       // datos generales de factura 
       if( isset($_GET['idfactura']) )
        {
          $codigo = $_GET['idfactura'];
        }
       if (is_array($data_fac))
       {
       foreach($data_fac as $fac)
         {
            $idfactura     = ($fac['idfactura']);   
            $codigo        = ($fac['codigo']);   
            $cifnif        = $this->cifnif;                    // ($fac['cifnif']);               
            $direccioncli  = ($fac['direccion']);     
            $fecha         = ($fac['fecha']);
            $nombrecliente = ($fac['nombrecliente']); 
            $netofac       = ($fac['neto']);
            $totaliva      = ($fac['totaliva']);
            $total         = ($fac['total']);
            $netosindto    = ($fac['netosindto']);
            $codpago       = ($fac['codpago']);
            $numncanterior = ($fac['numfact']); 
            $serie1        = ($fac['codalmacen']); 

            $descuento     = number_format($netosindto-$netofac,2,".","");
           //$this->new_message("datos factura ". $idfactura."  nombre ".$nombrecliente. "  cifnif ".$cifnif . "  direccion ".$direccioncli."  fecha ". $fecha); 
           $where3 = " where idfactura = '" . $idfactura."'"  ;
            switch ($codpago) {
                    case "CONT":
                        $forpago = "01";
                        break;
                    case "SISFIN":
                        $forpago = "20";
                        break;
                    case "TARJETA":
                        $forpago = "16";
                        break;
                    case "TARJETACRE":
                        $forpago = "19";
                        break;
                    default:
                        $forpago = "01";
                        break;
                }           
           
         }
        }
        else 
          {
           $this->new_message("no hay datos");
          }  

        if ($this->idfiscal != '08') {
          if ($this->numdigi < 10  ) {
                $this->idfiscal = '07';
           }

            if ($this->numdigi > 10  and  $this->numdigi < 13) {
                $this->idfiscal = '07';
           }

            if ($this->cifnif == '9999999999999' or $this->cifnif == '' or $this->cifnif == '0') {
                $this->idfiscal = '07';
           }
        }
         
        $tipIdenComp = $this->idfiscal ;  // tipo de identificacion del comprador
        // control de varias actividades
       if (FS_VARACTIVIDAD){          // si es true tiene varias actividades
            $sqlestable = $this->db->select("select * from almacenes where codalmacen='".$serie1."';");
            if($sqlestable) 
                foreach ($sqlestable as $k) {
                    $serie11   = $k['establecimiento'];
                    $direcalma = $k['direccion'];
                    $this->new_error_msg('direccion del almacen '.$direcalma."  serie ".$serie11);

                }
       }else{                         // una sola actividad
            $serie1 = '001';
       }

          $this->clave = clave_documentos($this->db,$idfactura, $tipambiente,$docclave,$tipcomp,$serie11);
          $dv = $this->clave;
          $numfact1 = substr($dv,30,-10);
          $this->new_message($dv." nf ".$numfact1."   serie ". $serie11);
          
          // clave
          $dia          = substr($fecha, 8, 2); 
          $mes          = substr($fecha, 5, 2); 
          $ano          = substr($fecha, 0, 4); 
          
          $numruc       = $contacto;    // numero RUC del ALMACEN
          


          $secuencial   =  substr(str_pad($numfact1, 9, "0", STR_PAD_LEFT), -9); 
          $codigof      =  substr(str_pad($codigo, 8, "0", STR_PAD_LEFT),-8);
          
          //$clavefac     = $dia.$mes.$ano.$tipcomp.$rucalmacen.$tipambiente.$serie.$secuencial.$codigof.$tipoEmi;
          $fechafac     = $dia."/".$mes."/".$ano;
         // $this->new_message("clave 2 ".$clavefac);

          $data_linfac = $this->db->select("SELECT * FROM lineasfacturascli ".$where3.";"); 

          $data_liniva = $this->db->select("SELECT * FROM lineasivafactcli ".$where3.";"); 

         /// lineas de la factura clientes   ()
          if (is_array($data_linfac))
          {
           foreach($data_linfac as $lfac)
             {
                $cantidad     = ($lfac['cantidad']);   
                $descripcion  = ($lfac['descripcion']);   
                $iva          = ($lfac['iva']);
                $pvpunitario  = ($lfac['pvpunitario']);
                $pvptotal     = ($lfac['pvptotal']);
                $pvpsindto    = ($lfac['pvpsindto']);
               //$this->new_message("linea productos dato 1 ". $cantidad." dato 2 ". $descripcion." dato 3 ". $iva." dato 4  ". $pvpunitario." dato 5 ". $pvptotal." dato 6 ". $pvpsindto); 
             }
          }
          else 
              {
             $this->new_message("No hay datos");
              }

         ////   lineas de iva
          if (is_array($data_liniva))
          {
           foreach($data_liniva as $liva)
            {
                $iva = ($liva['iva']);   
                $neto = ($liva['neto']);   
                $totaliva  = ($liva['totaliva']);
                $totallinea = ($liva['totallinea']);
               //$this->new_message("linea IVA dato 1->". $iva." dato 2->". $neto." dato 3->". $totaliva." dato-> 4 ". $totallinea); 
            }
          }
          else 
              {
             $this->new_message("No hay datos");
              }

              // calculo del descuento 
            $data_totdeslin = $this->db->select("SELECT sum(pvpsindto-pvptotal) as descuent
                                              FROM lineasfacturascli ".$where3." group by idfactura;");
         


           if (is_array($data_totdeslin))
          {
           foreach($data_totdeslin as $ldesc)
            {
                $desctotlin = ($ldesc['descuent']);   
            }
          }
          
          
          $descuento = number_format($desctotlin,2,".","");          // sumatoria de la tabla lineasfacturascli
          
//*

            //ambiente 1-> pruebas / codDoc  01-> factura
            $agentereten = 1;
            $this->template = false;
            /// creamos el xml 
            $cadena_xml = "<?xml version='1.0' encoding='UTF-8'?>
            <factura id='comprobante' version='1.1.0'>
              <infoTributaria>
                <ambiente>".$tipambiente."</ambiente>
                <tipoEmision>1</tipoEmision>
                <razonSocial>".$nombre."</razonSocial>
                <nombreComercial>".$nombre."</nombreComercial>
                <ruc>".$rucalmacen."</ruc>
                <claveAcceso>".$dv."</claveAcceso>
                <codDoc>".$tipcomp."</codDoc>
                <estab>".$serie11."</estab>
                <ptoEmi>".$serie2."</ptoEmi>
                <secuencial>".$secuencial."</secuencial>
                <dirMatriz>".$direccionalma."</dirMatriz>
              </infoTributaria>
            </factura>\n";
      
            $archivo_xml = simplexml_load_string($cadena_xml);
 
            // informacion de impuestos
            $data_liniva = $this->db->select("SELECT 
                                        2 as codigo,
                                        CASE WHEN iva = 12 then 2
                                             WHEN iva = 0 then 0
                                             WHEN iva = 14 then 3
                                             WHEN iva = 15 then 4
                                             WHEN iva = 5 then 5
                                         ELSE 0
                                         END AS codigoPorcentaje,
                                         0 as descuentoAdicional,
                                         neto as baseImponible,  
                                         totaliva as valor    
                                         FROM lineasivafactcli ".$where3.";"); 

            $aux0 = $archivo_xml->addChild('infoFactura');
            $aux00 = $aux0->addChild('fechaEmision',$fechafac);
            
            $aux00 = $aux0->addChild('dirEstablecimiento',$direcalma);
            $aux00 = $aux0->addChild('obligadoContabilidad','NO');
            $aux00 = $aux0->addChild('tipoIdentificacionComprador',$tipIdenComp);
            if ($tipIdenComp == '07'){
                $aux00 = $aux0->addChild('razonSocialComprador',"Consumidor Final");
                $aux00 = $aux0->addChild('identificacionComprador',"9999999999999");
                
            }else{
                $aux00 = $aux0->addChild('razonSocialComprador',$this->nombrecliente);    
                $aux00 = $aux0->addChild('identificacionComprador',$cifnif);
                
            }
            // si tiene direccion se reporta
            if ($direccioncli) $aux00 = $aux0->addChild('direccionComprador',$direccioncli);
            
            //$aux00 = $aux0->addChild('totalSinImpuestos',$neto);
            $aux00 = $aux0->addChild('totalSinImpuestos',number_format($netofac,2,".",""));
            $aux00 = $aux0->addChild('totalDescuento',$descuento);

            if($data_liniva)       // siempre debe entrar no puede haber una venta que no tenga impuestos iva 
            {
              $aux10 = $aux0->addChild('totalConImpuestos');
              foreach($data_liniva as $d)
              {
                $aux1 = $aux10->addChild('totalImpuesto');
                foreach($d as $i => $value)
                  {
                    if( is_null($value) )
                      $aux1->addChild($i, 'NULL');
                    else if($value == 't')
                      $aux1->addChild($i, 'TRUE');
                    else if($value == 'f')
                        $aux1->addChild($i, 'FALSE');

                    else 
                      if ($i=='codigo'){
                         $aux1->addChild($i, $value);
                       }
                      if ($i=='codigoPorcentaje'){
                         $aux1->addChild($i, $value); 
                      }   
                      if ($i !=='codigo' and  $i !=='codigoPorcentaje')
                         $aux1->addChild($i, number_format($value,2,".","")); 
                       
                  }

              }
            }else{
                    $aux0 = $archivo_xml->addChild('no_hay');
                 }  
            $aux10 = $aux0->addChild('propina',0);
            $aux10 = $aux0->addChild('importeTotal',$total);
            $aux10 = $aux0->addChild('moneda','DOLAR');
            $aux10 = $aux0->addChild('pagos');
            $aux1 = $aux10->addChild('pago');
            $aux1->addChild('formaPago',$forpago);
            $aux1->addChild('total',$total);
            $aux1->addChild('plazo',0);
            $aux1->addChild('unidadTiempo','dias');
            /// fin de infofactura
            //$aux20 = $archivo_xml->addChild('detalles');
            //$aux21 = $aux20->addChild('detalle',0);

            //$aux0 = $archivo_xml->addChild('detalles');
            //$aux21 = $aux0->addChild('detalle',0);

           // creacion de tabs para detalle de FACTURA
            $data_linfac = $this->db->select("SELECT referencia as codigoPrincipal,
                                                    descripcion as descripcion,
                                                    cantidad as cantidad,
                                                    pvpunitario as precioUnitario,
                                                    pvpsindto-pvptotal as descuento,
                                                    pvptotal as precioTotalSinImpuesto,
                                                    2 as codigo,
                                                    CASE WHEN iva = 12 then 2
                                                         WHEN iva = 0 then 0
                                                         WHEN iva = 14 then 3
                                                         WHEN iva = 15 then 4
                                                         WHEN iva = 15 then 4
                                                     ELSE 0
                                                     END AS codigoPorcentaje,
                                                     iva as tarifa,
                                                     pvptotal as baseImponible,
                                                     pvptotal * (iva/100) as valor

                                              FROM lineasfacturascli ".$where3.";");

           if($data_linfac)       // siempre debe entrar no puede haber una venta que no tenga impuestos iva 
            {
              //$aux30 = $aux0->addChild('detalles');
              $aux0 = $archivo_xml->addChild('detalles');
              foreach($data_linfac as $d)
              {
                //$aux1 = $aux30->addChild('detalle');
                $aux1 = $aux0->addChild('detalle');
                foreach($d as $i => $value)
                  {
                    if( is_null($value) )
                      $aux1->addChild($i, 'NULL');
                    else if($value == 't')
                      $aux1->addChild($i, 'TRUE');
                    else if($value == 'f')
                        $aux1->addChild($i, 'FALSE');
                    else if($i == 'codigoPrincipal')
                          {
                             $aux1->addChild($i, $value);
                          } 
                    else if($i == 'descripcion')
                          {
                             $aux1->addChild($i, eliminar_simbolos($value));
                          } 
                    else if($i == 'precioUnitario')
                          {
                             $aux1->addChild($i, number_format($value,4,".",""));                      
                          }   
                          
                    else if($i == 'codigo')
                          {
                             $aux2 = $aux1->addChild('impuestos');
                             $aux21 = $aux2->addChild('impuesto');
                             //$aux21->addChild($i, ($value));      
                             $aux21->addChild($i,$value);                  
                          }  
                    else if($i == 'codigoPorcentaje')
                          {
                             //$aux2 = $aux1->addChild('impuestos');
                             $aux21->addChild($i, $value);
                          }  
      
                    else if($i == 'tarifa')
                          {
                             $aux21->addChild($i,number_format($value,2,".",""));                  
                          }  
                    else if($i == 'baseImponible')
                          {
                             $aux21->addChild($i, number_format($value,2,".",""));  
                          }  
                    else if($i == 'valor')
                          {
                             $aux21->addChild($i, number_format($value,2,".",""));                      
                          }               
                    else {
                      $aux1->addChild($i, number_format($value,2,".",""));
                        }
                  }
              }
            }else{
                    $aux0 = $archivo_xml->addChild('no_hay');
                 }

            $aux0 = $archivo_xml->addChild('infoAdicional');
            $auxif = $aux0->addChild('campoAdicional', "G E N E R A L");
            $auxif->addAttribute('nombre', 'regimen');

            if ($this->correodestino){
                $auxif = $aux0->addChild('campoAdicional', $this->correodestino);
                $auxif->addAttribute('nombre', 'Mail cliente');
            }else{
                $auxif = $aux0->addChild('campoAdicional', $this->correodefault);
                $auxif->addAttribute('nombre', 'Mail default');
            }                 
                 
                 
          $this->nombarch="$dv"."-ORG.xml";

          //$glob_string =  realpath($ruta100).  "tab_aux_sri_ats1.xml";
          header("content-type: application/xml; charset=UTF-8");

          header("Content-Disposition: attachment; filename='".$this->nombarch."'");

          $x = file_put_contents($ruta100.$this->nombarch,$archivo_xml->asXML());
          //echo $archivo_xml->asXML();
          // actualiza la base de datos con la clave SRI
          //$this->factclave = $factclave->get($_GET['id']);
  //*/
          $this->factclave->clavesri = $dv;

          $this->factclave->numfact = $numfact1;
          $this->factclave->estadosri = "GENERADO";   
          //esta linea es para cuando necesitamos que se imprima el tiket con la clave
          //$this->factclave->estadosri = "IMPRIMIR";  
          $this->factclave->save();
          $this->clv  = $dv;
          $this->estadosri = $this->factclave->estadosri;
          $this->new_message("Archivo Creado y clave guardada : ".$_GET['id'].chr(10)." Arch:".$this->nombarch );
 // */
      } else 
          {  

          $this->new_error_msg($this->errordatcli );
          }
     }

   
function valida_dv($baseVal = "", $separator = '-')
{
    $result = "";
    $weight = [ 2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7,
                2, 3, 4, 5, 6, 7  
            ];
    /* For convenience, reverse the string and work left to right. */
    $reversedBseVal = strrev($baseVal);
    for ($i=0, $sum=0; $i < strlen($reversedBseVal); $i++) {
        /* Calculate product and accumulate. */
        $sum += substr($reversedBseVal, $i, 1) * $weight[$i];
    }
    /* Determine check digit, and concatenate to base value. */
    $remainder = $sum % 11;
    switch ($remainder) {
        case 0:
        case 1:
            $result = "{$baseVal}{$separator}0";
            break;
        default:
            $checkDigit = 11 - $remainder;
            $result = "{$baseVal}{$separator}{$checkDigit}";
            break;
    }
    return $result;
}


    public function valida_sri()
    {

    $echo = true; // solo para ver los procesos

    // Este config es opcional, se puede manejar los argumentos directo de cada funcion
    //$this->new_message("clave  ".$this->clave."nombre archivo ".$this->nombarch);
    // la clave de acceso es necesaria para la autorizacion
    $config=array(
        'access_key'    =>$this->clave, 
        'pass_p12'      =>FS_PASPSRI,
        'file_p12'      =>'plugins/factelect/controller/src_sri/'.FS_ELECSIGNA,    
        'file_to_sign'  =>'plugins/factelect/controller/src_sri/generados/'.$this->nombarch,
        'file_signed'   =>'plugins/factelect/controller/src_sri/firmados/'.$this->clave."-F".".xml",        
        'file_autorized'=>'plugins/factelect/controller/src_sri/autorizados/'.$this->clave."-A".".xml"
    );
    // NOTA: las funciones estan seccionadas por procesos, osea se debe llevar control del estado del documento,
    // Ejemplo: si se envio pero quedo pendiente la autorizacion solo se tendria que volver a autorizar, etc.
    try{
        if($echo) $this->new_message("INICIANDO PROCESO DE AUTORIZACION CON EL SRI......"); 
        // echo '<h2>EJEMPLO CON PHP PURO [EN Systems]</h2><br/><b>EN Systems SRI, Iniciando...</b><br/><br/>';
        
        $signer=new FirmaElectronica($config); // Instancio la clase
        // Arg1 true=Links Online, false= Links Offline 
        // Arg2 true=Produccion, false=development o pruebas
        $signer->setAmbiente(false,FS_AMBIENTE); // IMPORTANTE: setear el metodo a usar y el ambiente, por default viene ONLINE y PRODUCTION
        /* FIRMADO DEL XML */ 
        //NOTA: sendToSign(); usa el WS de firmado gratuito de EN Systems
        if(!$signer->isKeyActive())
            if(!$signer->setKey($config['file_p12'],$config['pass_p12'])) 
            //if(!$signer->setKey($config['file_p12'],$config['pass_p12'])) 
                throw new Exception("No se pudo leer la firma digital "); // error al firmar       
        $signatured = $signer->signXml(); // no lleva argumentos, xq ya los cogio del config
        if($signatured==false) {
            throw new Exception($signatured['message']); // error al firmar
        }

        if($echo) {
            $this->new_message("Firma:          EXITOSO -- Clave Generada: ".$this->clave);
        //echo 'XML Signature-> <b>Correctamente</b>!</br>';
            $this->factclave->estadosri = "FIRMADO";
            $this->factclave->save();
            }
        
        /* VALIDACION XML CON XSD */    
        //NOTA: Funciona con cualquier documento electronico mientras el XSD exista en la ruta, con el nombre de acuerdo al formato
        $xsd_validation = $signer->validaXml(); // no lleva argumentos, xq ya los cogio del config
        if($xsd_validation['success']==false)
            throw new Exception($xsd_validation['message']); // error validando xsd
        if($echo) {
            $this->new_message("XSD Validacion:     EXITOSA"); 
          //echo 'XSD Validation-> <b>Correctamente</b>!</br>';
            $this->factclave->estadosri = "VALIDADO";
            $this->factclave->save();
        }

        /* ENVIO AL SRI */
        $sri_send = $signer->sendToSri(); // no lleva argumentos, xq ya los cogio del config
        if($sri_send['success']==false)
            throw new Exception($sri_send['message'].(isset($sri_send['informacionAdicional'])?' - '.$sri_send['informacionAdicional']:'')); // error envio SRI
        if($echo) $this->new_message("ENVIO SRI:          EXITOSO"); 
          //echo 'SRI Sending ----> <b>Correctamente</b>!</br>';
        
        /* AUTORIZACION DEL SRI */
        $sri_aut = $signer->autorizarSri(); // no lleva argumentos, xq ya los cogio del config
        if($sri_aut['success']==false)
            throw new Exception($sri_aut['message'].(isset($sri_aut['informacionAdicional'])?' - '.$sri_aut['informacionAdicional']:'')); // error autorizacion SRI
        if($echo) {
            $this->new_message("Autorizacion SRI:   EXITOSO"); 
          //echo "SRI Autorizat. --> <b>Correctamente</b> [Aut.Num.:<u>{$sri_aut['numeroAutorizacion']} </u>]!</br>";
            $this->factclave->estadosri = "AUTORIZADO";
            $this->factclave->save();
            $this->clvaut = $this->clave;
            $this->estadosri = $this->factclave->estadosri;            
                }
        
        if($echo) {
            $this->new_message("EL PROCESO FINALIZO SATISFACTORIAMENTE"); 
            //echo '<br/><b>EN Systems SRI, termino correctamente!.</b>';
            $this->archAutorizado = $this->clave."-A".".xml";
 
            //echo "arch 1 ".$this->archAutorizado;
            $this->ride_factura();
header('Location: index.php?page=factelect&clvmail='.$this->clvaut.'&estadomail='.$this->estadosri);

           }
        else{
            header("Content-Type: application/xml; charset=utf-8");
            echo $sri_aut['xml'];
        }
    }catch (Exception $e) { 
        $this->new_error_msg("ERROR AL EJECUTAR EL SCRIPT ->". $e->getMessage()." factura: ".$this->factclave->codigo);  
        //echo '<br/><b>ERROR AL EJECUTAR EL SCRIPT</b><br/>';
        //echo '<b>Excepción Capturada[</b> ',  $e->getMessage(), "]\n";  
        $this->factclave->estadosri = "NEGADO";
        $this->factclave->save();

        }
    }
//}
public function ride_factura()
{
/** 
* Copyright (c)2018 - EN Systems Apps
* @abstract Envia un mail con un xml y pdf adjunto
* @author Erik Niebla
* @mail ep_niebla@hotmail.com, ep.niebla@gmail.com
* @version 1.0
* Fecha de creación  2018-02-27
* http://ensystems.ddns.net
*/    
require_once(dirname(__file__)."/RideSRI/RideSRI.php");
$ruta = dirname(__file__);
$echo = true; // solo para ver los procesos

// Muestro una Factura
//$file_autorized = $ruta.'/src_ejemplos/fact_A.xml';
//echo "ruta : ".$ruta.$this->archAutorizado;
    $file_autorized = $ruta.'/src_sri/autorizados/'.$this->archAutorizado;
    //$logo_path=$ruta.'/src_sri/logo/logo_l.gif';
    if($this->codgrupo == 'NAT'){
        $logo_path=$ruta.'/src_sri/logo/logo_NAT.png';    
    }else{
        $logo_path=$ruta.'/src_sri/logo/logo_ALL.png';
    }
try{    
    
    $ride = new RideSRI();
    // Arg1 ruta a archivo fisico xml
    // Arg2 logo ride
    // Arg3 I=Visualizar, D=Descargar
    // Arg4 true=online, false=offline 
    $result = $ride->createRide($file_autorized, $logo_path, 'D', false); // Instancio la clase, y muestro el ride
    
}catch (Exception $e) { 
    echo '<br/><b>ERROR AL EJECUTAR EL SCRIPT</b><br/>';
    echo '<b>Excepción Capturada[</b> ',  $e->getMessage(), "]\n";  
}
}

public function ride_factura_noauto()
{
/** 
* Copyright (c)2018 - EN Systems Apps
* @abstract Envia un mail con un xml y pdf adjunto
* @author Erik Niebla
* @mail ep_niebla@hotmail.com, ep.niebla@gmail.com
* @version 1.0
* Fecha de creación  2018-02-27
* http://ensystems.ddns.net
*/    
require_once(dirname(__file__)."/RideSRI/RideSRI.php");
$ruta = dirname(__file__);
$echo = true; // solo para ver los procesos

// Muestro una Factura
//$file_autorized = $ruta.'/src_ejemplos/fact_A.xml';
//echo "ruta : ".$ruta.$this->archAutorizado;
    $file_autorized = $ruta.'/src_sri/generados/'.$this->archNoAuto;
    //$logo_path=$ruta.'/src_sri/logo/logo_l.gif';
    if($this->codgrupo == 'NAT'){
        $logo_path=$ruta.'/src_sri/logo/logo_NAT.png';    
    }else{
        $logo_path=$ruta.'/src_sri/logo/logo_ALL.png';
    }
try{    
    
    $ride = new RideSRI();
    // Arg1 ruta a archivo fisico xml
    // Arg2 logo ride
    // Arg3 I=Visualizar, D=Descargar
    // Arg4 true=online, false=offline 
    $result = $ride->createRide($file_autorized, $logo_path, 'D', false); // Instancio la clase, y muestro el ride
    
}catch (Exception $e) { 
    echo '<br/><b>ERROR AL EJECUTAR EL SCRIPT</b><br/>';
    echo '<b>Excepción Capturada[</b> ',  $e->getMessage(), "]\n";  
}
}

public function mail_factura()
{
require_once(dirname(__file__)."/RideSRI/MailNotification.php");
$ruta = dirname(__file__);
$echo = true; // solo para ver los procesos

//echo " paso 1";
// En este ejemplo uso variables q psaso a las funciones
    $file_autorized = $ruta.'/src_sri/autorizados/'.$this->archAutorizado;
    echo $this->correodestino."   nombre ".$this->nombrecliente;
    $destinatari = array(
        'to'     => $this->correodestino,
        'to_name'=> $this->nombrecliente
    );
    //$logo_path=$ruta.'/src_sri/logo/logo.png';
    if($this->codgrupo == 'NAT'){
        $logo_path=$ruta.'/src_sri/logo/logo_NAT.png';
    }else{
        $logo_path=$ruta.'/src_sri/logo/logo_ALL.png';
    }
try{
    //if($echo) $this->new_message("Iniciando ".  $this->correodestino."  ruta ".$ruta."  archivo ".$this->archAutorizado);   //echo 'EJEMPLO MAIL NOTIFICATION [EN Systems]EN Systems SRI, Iniciando...';
    
    $mailer = new MailNotification();
    // Arg1 ruta a archivo fisico xml
    // Arg2 destinatario
    // Arg3 destinatario copia //opcional
    // Arg4 logo ride //opcional
    // Arg5 true=online, false=offline //NOTA: se podria crear un xml autorizado simulado para offline, OJO REVISAR
    $result = $mailer->sendMailDoc($file_autorized,$destinatari,null,$logo_path,false); // Instancio la clase, y envio el mail
    
    if($echo) $this->new_message("Resultado ".$result['message']);   //echo '<br/><b>'.$result['message'].'</b>';
      $this->factclave->estadosri = "ENVIADO";  
      $this->factclave->save();
    
}catch (Exception $e) { 
    //echo '<br/><b>ERROR AL EJECUTAR EL SCRIPT</b><br/>';
    //echo '<b>Excepción Capturada[</b> ',  $e->getMessage(), "]\n";  
    $this->new_message("Resultado: ERROR AL EJECUTAR EL SCRIPT".$e->getMessage()." factura: ".$this->factclave->codigo);
    //$this->new_message($e->getMessage());
} 


}   

public function envio_mail_grupo()
{
      
    $sql_mails = $this->db->select("SELECT *, (select email from clientes where codcliente = facturascli.codcliente) mail   from facturascli where estadosri = 'AUTORIZADO'");
    $this->correodefault = FS_MAILDEFA;


  if( $sql_mails )
    {
        foreach ($sql_mails as $mail) {
            //sleep(7);

            $factclave = new factura_cliente();
            $idfact = $mail['idfactura'];
            $this->factclave = $factclave->get($idfact);
            $this->correodestino = $mail['mail'];
            if (!filter_var($mail['mail'], FILTER_VALIDATE_EMAIL)) 
            { 
                $errormail="Error en mail  ". $mail['mail']. "  Se enviará al :".$this->correodefault;
                //$this->new_message("Error e-mail : ". $mail['mail']. "  Se enviará al :".$this->correodefault." Hora: ".date("h:i:sa")); 
                $this->correodestino = $this->correodefault;
            }
                
                $this->new_message($errormail."  Factura:  ".$mail['codigo']." Correo: ".$mail['mail']." Hora: ".date("h:i:sa"));
                $this->clvaut =  $mail['clavesri'];
                $this->clave    = $this->clvaut;
                $this->archAutorizado =  $this->clvaut."-A.xml";
                $this->mail_factura();  
            
        }
    }
}

}




