<?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);
require_once 'plugins/facturacion_base/extras/fbase_controller.php';
require_once 'plugins/factelect/controller/FirmaXades/FirmaElectronicaNativa.php';

class factelect_reten extends fbase_controller
{

    public $agente;
    public $almacenes;
    public $articulo;
    public $buscar_lineas;
    public $proveedor;
    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 $nombreprov;      //  nombre del proveedor a realizarse el xml
public $errordatprov;        // 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 proveedor
public $cifnif;             // numero de identificacion del proveedor tomado de tabla proveedor
public $correodestino;
public $correodefault;
public $errormail;

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

    protected function private_core()
    {
     $this->agente = new agente();
     $this->factura = new factura_proveedor();
     $factclave = new factura_proveedor();
     //$this->retencion = new retencompra();

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

            parent::private_core();
            // esta direccion electronica se utlizara en cso de no tener una el proveedor
            $this->correodefault = FS_MAILDEFA;

            $factclave = new factura_proveedor();
            $this->factclave = $factclave->get($_GET['id']);
            $this->nombreprov = $this->factclave->nombre;                       // nombre proveedor
            $codprov = $this->factclave->codproveedor;                          // codigo del proveedor
            $this->estadosrirt = $this->factclave->estadosrirt;                 // esto del documento en el SRI

            $proveedor1     = new proveedor();
            $this->codprov = $proveedor1->get($codprov);
            $this->correodestino = $this->codprov->email;                       // email del proveedor
            $tipoidfiscal = $this->codprov->tipoidfiscal;                       // cedula=cedula RUC=RUC  CONSUMIDOR FINAL
            $this->cifnif = $this->codprov->cifnif;                             // numero del documento de identificacion
            $digicifnif   = strlen($this->cifnif);

        //$this->agente = new agente();
        $this->almacenes = new almacen();
        //$this->factura = new factura_proveedor();
        $this->serie = new serie();

            $this->errormail=0;
                                             

            if ($tipoidfiscal=='RUC')
            {    
                $this->idfiscal = '04';
                //if ($digicifnif !== 13) $this->errordatprov .= "Error NO es un RUC ";   
            }
            // numero de documento
            if ($tipoidfiscal=='Cedula')
            {    
                $this->idfiscal = '05';
                //if ($digicifnif !== 13) $this->errordatprov .= "Error NO es un RUC ";   
            }


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

         //     
      // descargar RIDE de factura
      if( isset($_GET['archiaprNo']) )  
      {
            $this->archNoAuto = $_GET['archiaprNo'];
            $this->ride_factura_noauto();    
      }

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

      // LOS MENSAJES SE MUESTRAN BIEN EJECUTANDO SOLO  $this->valida_sri(); 
      //$this->new_message("Generar  100 : ".$_GET['id']);
      if( isset($_GET['codigo']) )  
      {
            if (!filter_var($this->correodestino, FILTER_VALIDATE_EMAIL)) { 
                $this->errormail=1;
             }
            //$this->new_message("Generar  100 : ".$_GET['codigo']);
            if ($this->estadosrirt <> 'ENVIADO' ) {
                if ($this->estadosrirt <> 'AUTORIZADO') {
                    $this->genera_xml();
                }
            }



       }   
          
      }
      if( isset($_GET['clv']) )
      {
         $this->clv =  $_GET['clv'];
         $this->clave    = $this->clv;
         $this->nombarch = $this->clv."-RET.xml";
         $this->where2est =  " where idfactura = '" . $_GET['id']."'"  ;
         
            if ($this->estadosrirt == 'ENVIADO' ) $this->new_message("Esta factura ya fue ENVIADA ");
            if ($this->estadosrirt == 'AUTORIZADO') $this->new_message("Esta factura ya fue AUTORIZADA ");
            if ($this->estadosrirt == 'NEGADO') $this->new_message("Esta factura fue NEGADA ");
            if ($this->estadosrirt == 'GENERADO' ) $this->valida_sri();
                    
      }
      // envio de mail
      if( isset($_GET['clvaut']) )
        {

        
        if (!filter_var($this->correodestino, FILTER_VALIDATE_EMAIL)) 
        { 
            $this->errormail=2;
            $this->new_message("Error e-mail : ". $this->correodestino. "  Se enviará al :".$this->correodefault); 
            $this->correodestino = $this->correodefault;
        }

        $this->clvaut =  $_GET['clvaut'];
        $this->clave    = $this->clvaut;
        $this->archAutorizado =  $this->clvaut."-RA.xml";
        $this->mail_factura();

        }

        ///////////// private core ////////////


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

        $this->offset = 0;
        if (isset($_GET['offset'])) {
            $this->offset = intval($_GET['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('compras_fac_order', $this->order, time() + FS_COOKIES_EXPIRE);
        } else if (isset($_COOKIE['compras_fac_order'])) {
            $this->order = $_COOKIE['compras_fac_order'];
        }

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

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

            $linea = new linea_factura_proveedor();
            $this->resultados = $linea->all_from_articulo($_GET['ref'], $this->offset);
        } else {
            $this->share_extension();
            $this->proveedor = FALSE;
            $this->codagente = '';
            $this->codalmacen = '';
            $this->codserie = '';
            $this->desde = '';
            $this->estado = '';
            $this->hasta = '';
            $this->num_resultados = '';
            $this->total_resultados = array();
            $this->total_resultados_txt = '';

            if (isset($_GET['delete'])) {
                $this->delete_factura();
            } else {
                if (!isset($_GET['mostrar']) && ( $this->query != '' || isset($_REQUEST['codagente']) || isset($_REQUEST['codproveedor']) || isset($_REQUEST['codserie']))) {
                    /**
                     * si obtenermos un codagente, un codproveedor 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['codproveedor']) && $_REQUEST['codproveedor'] != '') {
                    $pro0 = new proveedor();
                    $this->proveedor = $pro0->get($_REQUEST['codproveedor']);
                }

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

                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 ($this->order == 'fecha DESC') {
                $order2 = ', hora DESC, numero DESC';
            } else if ($this->order == 'fecha ASC') {
                $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 url($busqueda = FALSE)
    {
        if ($busqueda) {
            $codproveedor = '';
            if ($this->proveedor) {
                $codproveedor = $this->proveedor->codproveedor;
            }

            $url = parent::url() . "&mostrar=" . $this->mostrar
                . "&query=" . $this->query
                . "&codserie=" . $this->codserie
                . "&codagente=" . $this->codagente
                . "&codalmacen=" . $this->codalmacen
                . "&codproveedor=" . $codproveedor
                . "&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/compras_lineas_facturas';

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

        $this->lineas = $linea->search($this->buscar_lineas);
    }

    private function share_extension()
    {
        /// añadimos las extensiones para proveedores, agentes y artículos
        $extensiones = array(
            array(
                'name' => 'facturas_proveedor',
                'page_from' => __CLASS__,
                'page_to' => 'compras_proveedor',
                '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 proveedor',
                '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 proveedor',
                '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('facturasprov', 'idfactura', 'WHERE pagada = false');
    }

    private function total_registros()
    {
        return $this->fbase_sql_total('facturasprov', '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/RETgenerados/'; 
        $directorio=opendir($ruta100);
        //recoger los  datos
        $datos=array();
        while ($archivo = readdir($directorio)) 
        { 
          if(($archivo != '.')&&($archivo != '..'))
          {
             
             //$this->new_message( "archivo a guardar ".$archivo."  tamaño :".strlen($archivo));
           
             if (strlen($archivo)==57) 
             {
                $datos[]=substr($archivo,-18,8);    // $ARCHIVO tiene el nombre completo.XML 
                //this->new_message("archi ".$archivo);
                //$id = substr($archivo,-18,8);     
             }
          } 
        }       


        $this->resultados = array();
        $this->num_resultados = 0;
        $sql = " FROM facturasprov ";
        $where = 'WHERE idfactura in (select idfactura from retencompras) and anulada = false ';
        $sql1="";
        if ($this->query) {
            $query = $this->agente->no_html(mb_strtolower($this->query, 'UTF8'));
            //$sql .= $where;
            if (is_numeric($query)) {
                $sql1 = " AND (clavesrirt LIKE '%" . $query . "%' OR codigo LIKE '%" . $query . "%' OR numproveedor LIKE '%" . $query . "%' "
                    . "OR nombre LIKE '%" . $query . "%' OR cifnif LIKE '" . $query . "%')";
            } else {
                $sql1= " AND (lower(codigo) LIKE '%" . $query . "%' OR lower(numproveedor) LIKE '%" . $query . "%' "
                    . "OR lower(cifnif) LIKE '" . $query . "%' "
                    . "OR lower(nombre) LIKE '%" . str_replace(' ', '%', $query) . "%')";
            }
            //$where = ' AND ';
        }

        $sql .= $where.$sql1 ;     //. "and anulada = false"; //anuladas como facturas previo al proceso de factura electronica
        //$where = ' AND ';

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

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

        if ($this->proveedor) {
            $sql .=  " and codproveedor = " . $this->agente->var2str($this->proveedor->codproveedor);
            $where = ' AND ';
        }

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

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

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

        if ($this->estado == 'generadas') {
            $cadena_idfac= implode(",", $datos);
            $sql .=  " and estadosrirt= 'GENERADO' and idfactura in (".$cadena_idfac.")" ; 
            $where = ' AND ';
        } else if ($this->estado == 'singenerar') {
            $sql .= " and estadosrirt is null ";
            $where = ' AND ';  
        } else if ($this->estado == 'firmadas') {
            $sql .= " and estadosrirt= 'FIRMADO' ";
            $where = ' AND ';
        } else if ($this->estado == 'aprobadas') {
            $sql .= " and estadosrirt= 'AUTORIZADO' ";
            $where = ' AND ';
        } else if ($this->estado == 'negadas') {
            $sql .= " and estadosrirt= 'NEGADO' ";
            $where = ' AND ';
        }

       // $this->new_message("sql ".$sql);

        $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_proveedor($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/RETgenerados/';
                foreach ($data2 as $d) {
                    $this->total_resultados[] = array(
                        'coddivisa' => $d['coddivisa'],
                        'total' => floatval($d['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, 0 - $linea->cantidad, TRUE, $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'
            ),
            '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/RETgenerados/'; 
        $tipcomp      = '07';         // Comprobante de retencion
        $tipoEmi      =  1;
        $serie1       = '001';
        $serie2       = '099';        

        if(FS_AMBIENTE==FALSE) $tipambiente  = 1;            //  tipo de ambiente 1-> pruebas   2 -> produccion   
        if(FS_AMBIENTE==TRUE)  $tipambiente  = 2;           // tipo de ambiente 1-> pruebas   2 -> produccion
   
       $where1='';
       $where3='';
     //$this->new_message("get ALMACEN  ". $this->codalmacen);

     $this->codalmacen = 'xyd_' ;  

     if($this->codprov->tipoidfiscal == "RUC" && strlen($this->cifnif) !== 13) $this->errordatprov .= "No es un RUC valido";

      if($this->codprov->tipoidfiscal == "CEDULA" && strlen($this->cifnif) !== 10) $this->errordatprov .= "No es una CEDULA valida";

     if( $this->errordatprov == '' )
      {

         $where1 .= "almacen = '".$this->codalmacen. "'";
         $where2 = " where idfactura = '" . $_GET['id']."'"  ;
         

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

        // datos del almacen o empresa  
         //$data_alm = $this->db->select("SELECT codalmacen, contacto, nombre, direccion FROM almacenes WHERE codalmacen = '".$this->codalmacen."';");
       
         if ($this->codalmacen == 'xyd_')
         {
             $data_alm = $this->db->select("SELECT administrador , nombre, direccion, cifnif FROM empresa WHERE id=1 ;");
             //$this->new_message(" ENTRO AQUI ");
         }else
         {
             $data_alm = $this->db->select("SELECT codalmacen, contacto cifnif, nombre, direccion FROM almacenes WHERE codalmacen = '".$this->codalmacen."';");
         }


    
        if (is_array($data_alm))
        {
          foreach($data_alm 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 ALMACEN");
          }

       // datos generales de factura 
       if( isset($_GET['idfactura']) )
        {
          $codigo = $_GET['idfactura'];
        }
       if (is_array($data_fac))
       {
           foreach($data_fac as $fac)
             {
                $idfactura     = ($fac['idfactura']);   
                $codprov       = ($fac['codproveedor']);   
                $codigo        = ($fac['id']);   
                $cifnif        = $this->cifnif;                    // ($fac['cifnif']);               
                $direccionprov  = ($fac['direccion']);     
                $fecha         = ($fac['fecha']);
                $nombreprov    = ($fac['nombre']); 
                $netofac       = ($fac['neto']);
                $totaliva      = ($fac['totaliva']);
                $total         = ($fac['total']);
                $netosindto    = ($fac['netosindto']);
                $numretant     = ($fac['numret']);
                $serie1         = ($fac['codalmacen']);
                $descuento     = number_format($netosindto-$netofac,2,".","");
               $where3 = " where idfactura = '" . $idfactura."'"  ;

             }
        }
        else 
        {
            $this->new_message("no hay datos");
        }  

        if (FS_VARACTIVIDAD){          // si es true tiene varias actividades
            
       }else{                         // una sola actividad
            $serie1 = '001';
       }


        $data_numret = $this->db->select("SELECT max(numret) as nret
                                        FROM retencompras;" ); //".$where3.";"); 
        
        if($data_numret)       // siempre debe entrar no puede haber una venta que no tenga impuestos 
        {
            foreach($data_numret as $d) {
                $secuen = $d['nret'];
                $this->new_message("numero dentro : ".$secuen);
            }
        }else{
            $secuen = 0;
        }

        if ($numretant > 0) {
           $secuen = $numretant;
        }else{
            $secuen++;
        }

        // encuentra la fecha de emision de la retencion 
        $data_fecharet = $this->db->select("SELECT * FROM retencompras ".$where3." and (estado is null or estado = '')  group by idfactura ;"); 
        if($data_fecharet)       // siempre debe entrar no puede haber una venta que no tenga impuestos 
        {
            foreach($data_fecharet as $d) {
                $fechaRet = $d['fecha'];
            }
        }

        $diaf          = substr($fecha, 8, 2); 
        $mesf          = substr($fecha, 5, 2); 
        $anof          = substr($fecha, 0, 4); 
        $fecfacturacion     = $diaf."/".$mesf."/".$anof;

        $this->new_message('cal secuencia '.$secuen."  anterior ".$numretant." fecha ret ".$fechaRet);

        $tipIdenComp=$this->idfiscal ;  // se debe buscar el tipo de identificacion del proveedor 05 -> cedula

          // clave
        $dia          = substr($fechaRet, 8, 2); 
        $mes          = substr($fechaRet, 5, 2); 
        $ano          = substr($fechaRet, 0, 4); 
        $numruc       = $contacto;    // numero RUC del ALMACEN
        $secuencial   =  str_pad($secuen, 9, "0", STR_PAD_LEFT); 
        $codigof      =  substr(str_pad($idfactura, 8, "0", STR_PAD_LEFT),-8);
       
        $clavefac     = $dia.$mes.$ano.$tipcomp.$rucalmacen.$tipambiente.$serie1.$serie2.$secuencial.$codigof.$tipoEmi;
        $fechafac     = $dia."/".$mes."/".$ano;
        $fecfiscal    = $mes."/".$ano;
        $this->new_message("clave ".$clavefac."   secuen ".$secuen );
        $dv = $this->valida_dv($clavefac,""); //'');
        $this->clave=$dv;       
        //$this->new_message("digito verificador  ".$dv."  sql -> ".$where3);
        $data_linfac = $this->db->select("SELECT * FROM retencompras ".$where3." and estado = '';"); 
        $data_liniva = $this->db->select("SELECT * FROM lineasivafactprov ".$where3.";"); 
        $data_direc = $this->db->select("SELECT direccion FROM dirproveedores where codproveedor =".$codprov." and direccionppal = '1';"); 
        

        if($data_direc)       // siempre debe entrar no puede haber una venta que no tenga impuestos iva 
        {
            foreach($data_direc as $d) {
                $direccionprov = $d['direccion'];
                //$this->new_message("direccion: ".$direccion."  sql "."SELECT direccion FROM  ".$where3." and direccionppal = '1';");
            }
        }

        /// numero de identificacion de la retencion 
        
        
        
  ///*      

         //ambiente 1-> pruebas / codDoc  01-> factura
        $this->template = false;
        /// creamos el xml 
        $agentereten = 1;
        $cadena_xml = "<?xml version='1.0' encoding='UTF-8'?>
        <comprobanteRetencion id='comprobante' version='1.0.0'>
        <infoTributaria>
        <ambiente>".$tipambiente."</ambiente>
        <tipoEmision>".$tipoEmi."</tipoEmision>
        <razonSocial>".$nombre."</razonSocial>
        <nombreComercial>".$nombre."</nombreComercial>
        <ruc>".$rucalmacen."</ruc>
        <claveAcceso>".$dv."</claveAcceso>
        <codDoc>".$tipcomp."</codDoc>
        <estab>".$serie1."</estab>
        <ptoEmi>".$serie2."</ptoEmi>
        <secuencial>".$secuencial."</secuencial>
        <dirMatriz>".$direccionalma."</dirMatriz>
        <agenteRetencion>".$agentereten."</agenteRetencion>
        </infoTributaria>
        </comprobanteRetencion>\n";
        $archivo_xml = simplexml_load_string($cadena_xml);
        // informacion de impuestos


        $data_linfac = $this->db->select("SELECT  CASE WHEN tiporeten = 'IVA' then 2
                                            WHEN  tiporeten = 'RENTA' then 1
                                            ELSE 0
                                        END AS codigo,                                
                                        codigoret as codigoRetencion,
                                        basereten as baseImponible,
                                        porcreten as porcentajeRetener,
                                        importe as valorRetenido,
                                        CASE WHEN coddocsustento = 'COMPRA' then '01'
                                            WHEN  coddocsustento = 'TARJECREDITO' then '05'
                                            WHEN  coddocsustento = 'RENDFINANCIE' then '06'
                                            WHEN  coddocsustento = 'FONDOSFINANC' then '07'
                                            ELSE '0' 
                                        END AS codDocSustento,
                                        docreten as numDocSustento,"
                                        ."'".$fecfacturacion."' as fechaEmisionDocSustento "
                                        ." FROM retencompras ".$where3." and estado = '';");
                                        
                                        
        $direccionalma = "-".$direccionalma." ";
        $aux0 = $archivo_xml->addChild('infoCompRetencion');
        $aux00 = $aux0->addChild('fechaEmision',$fechafac );
        $aux00 = $aux0->addChild('dirEstablecimiento',$direccionalma);
        //$aux00 = $aux0->addChild('contribuyenteEspecial','SI');
        $aux00 = $aux0->addChild('obligadoContabilidad','SI');
        $aux00 = $aux0->addChild('tipoIdentificacionSujetoRetenido',$tipIdenComp);
        $aux00 = $aux0->addChild('razonSocialSujetoRetenido',$nombreprov);
        $aux00 = $aux0->addChild('identificacionSujetoRetenido',$cifnif);
        $aux00 = $aux0->addChild('periodoFiscal',$fecfiscal);
            
        //$aux00 = $aux0->addChild('totalSinImpuestos',$neto);
        //$aux00 = $aux0->addChild('totalSinImpuestos',number_format($netofac,2,".",""));
        //$aux00 = $aux0->addChild('totalDescuento',$descuento);

        if($data_linfac)       // siempre debe entrar no puede haber una venta que no tenga impuestos iva 
        {
            $aux10 = $archivo_xml->addChild('impuestos');
            foreach($data_linfac as $d)
            {
                $aux1 = $aux10->addChild('impuesto');
                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,".","")); 
                          $aux1->addChild($i, $value);
                      
                  }
              }
        }else
        {
              $aux0 = $archivo_xml->addChild('no_hay');
        }
            $aux0 = $archivo_xml->addChild('infoAdicional');
            $auxif = $aux0->addChild('campoAdicional', "Regimen General");
            $auxif->addAttribute('nombre', 'regimen');
            /*$auxif = $aux0->addChild('campoAdicional', 'RESOL.NRO.NAC-DNCRASC20-00000001');
            $auxif->addAttribute('nombre', 'AGENTE DE RETENCION');*/
            if ($this->correodestino){
                $auxif = $aux0->addChild('campoAdicional', $this->correodestino);
                $auxif->addAttribute('nombre', 'Mail');
            }else{
                $auxif = $aux0->addChild('campoAdicional', $this->correodefault);
                $auxif->addAttribute('nombre', 'Mail');
            }  

   
          $this->nombarch="$dv"."-RET.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."'");

          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->new_message("secuen  ".$secuen);
          $sqlret = "UPDATE retencompras SET numret =". $secuen." ".$where2." and (estado is null or estado = '');";
          $this->db->exec($sqlret);
          $this->factclave->numret      = $secuen;     
          $this->factclave->clavesrirt  =  $dv;
          $this->factclave->estadosrirt = "GENERADO";
          $this->factclave->save();
//*/                    //$this->new_message("Archivo Creado y clave guardada : ".$_GET['id'].chr(10)." Arch:".$this->nombarch );
  
      } else 
          {  

          $this->new_error_msg($this->errordatprov );
          }
     }
   
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:
            $result = "{$baseVal}{$separator}0";
            break;
        case 1:
            $result = "{$baseVal}{$separator}1";
            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/RETgenerados/'.$this->nombarch,
        'file_signed'   =>'plugins/factelect/controller/src_sri/RETfirmados/'.$this->clave."-RF".".xml",        
        'file_autorized'=>'plugins/factelect/controller/src_sri/RETautorizados/'.$this->clave."-RA".".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
        $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->estadosrirt = "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->estadosrirt = "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->estadosrirt = "AUTORIZADO";
            $this->factclave->save();
                }
        
        if($echo) {
            $this->new_message("EL PROCESO FINALIZO SATISFACTORIAMENTE"); 
            //echo '<br/><b>EN Systems SRI, termino correctamente!.</b>';
            $this->archAutorizado = $this->clave."-RA".".xml";
            $sqlret = "UPDATE retencompras SET estado = 'ENVIADO'".$this->where2est." and estado = '';";
            $this->db->exec($sqlret);
            $this->ride_factura();

            //

           }
        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());  
        //echo '<br/><b>ERROR AL EJECUTAR EL SCRIPT</b><br/>';
        //echo '<b>Excepción Capturada[</b> ',  $e->getMessage(), "]\n";  
      
        $this->factclave->estadosrirt = "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/RETautorizados/'.$this->archAutorizado;
    $logo_path=$ruta.'/src_sri/logo/logo_l.jpg';

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) { 
    $this->new_error_msg("Excepción Capturada ".  $e->getMessage() );  
}
}


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/RETgenerados/'.$this->archNoAuto;
    $logo_path=$ruta.'/src_sri/logo/logo_l.jpg';

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) { 
    $this->new_error_msg("Excepción Capturada ".  $e->getMessage() );  
}
}



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/RETautorizados/'.$this->archAutorizado;
    echo $this->correodestino."   nombre ".$this->nombreprov;
    $destinatari = array(
        'to'     => $this->correodestino,
        'to_name'=> $this->nombreprov
    );
    $logo_path=$ruta.'/src_sri/logo/logo_l.gif';
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->estadosrirt = "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");
    $this->new_message($e->getMessage(). "... o el archivo NO EXISTE");
} 
}   
}

