<?php
require_once 'inc/usuario.php';
// require_once 'documento_saida_class.php';
// require_once 'pedidos_venda_rapida.php';
require_once 'liberar_pedidos_ecommerce.php';
require_once 'nfecode_xml_POO.php';

date_default_timezone_set('America/Sao_Paulo');

if(!isset($_SESSION)) {
  session_start();
}

class EcommerceNfe {
  /* Campos de Liberação dos Pedidos */
  private $ar_pedidos = array();
  private $ds_modelo  = 55;
  private $id_doc_sai = 0; 
  private $st_status  = false;
  private $ds_mensagem= array();
  public $LiberarEcommerce;

  /* Campos para Emissão da Nfe */
  private $chave= "";
  private $st_sefaz = array();   // varáveis de retorno de status;

  // métodos mágicos get e set
  public function __set($atrib, $value){
    $this->$atrib = $value;
  }

  public function __get($atrib){
    return $this->$atrib;
  }

  function __construct() {
    $usuario = getLoggedUser();
    $this->id_usuario = $usuario['id'];

    // Liberação imediata do pedido de venda
    $this->LiberarEcommerce = new LiberarEcommerce();


   }

  function setSaida($campo, $valor){
    $this->LiberarEcommerce->$campo = $valor;
  }

  function getSQL($consulta){
  global $conexao;

    $ar_retorno = array();
    $resultado = mysqli_query($conexao, $consulta) or die ($erro = mysqli_error($conexao));
    	if (mysqli_num_rows($resultado)>0) {
          while ($registro = mysqli_fetch_assoc($resultado)){
            array_push($ar_retorno, $registro);
          }
    }
    return $ar_retorno;
  }

  /* Classe principal para faturar diferetamente um pedido */
  function ecoFaturar($p_pedidos = null){
    $fl_sefaz = false;
    if($p_pedidos!=null){
      $this->ar_pedidos = $p_pedidos;
    }

    $ok = $this->ecoLiberarPedidos();

    if($ok==true){
      $st_sefaz = $this->ecoComunicarSefaz();
    }

    if(count($st_sefaz)>0){
      // $ds_link = 'erpc_nfecode_danfe.php?id=' . base64_encode($this->id_doc_sai);
      $fl_sefaz=true;
    }

    $ds_link = 'erpc_monitoramento_nfe_list.php';

    // Retorno ao solicitante do Link
    $r_array = array(
      'fl_sefaz'   => $fl_sefaz,
      'ds_link'    => $ds_link,
      'ds_mensagem'=> $this->ds_mensagem,
      'st_sefaz'   => $st_sefaz
    );

    return $r_array;
  }

  /* Faz a Liberação do Pedidos para novo Array */
  function ecoLiberarPedidos(){
    try{

      /* passa um array com o número do pedido incluído */
      $this->LiberarEcommerce->setPedidos($this->ar_pedidos);
      $this->LiberarEcommerce->setAllPedidos();
      $this->LiberarEcommerce->setAllFaturar($this->ds_modelo);

      /* retorna o array com a ID do Pedido Liberado */
      $this->ar_liberados= $this->LiberarEcommerce->getPedidos();

      $this->id_doc_sai  = $this->LiberarEcommerce->getNumeroDocumentoSaida();

      /*
      echo "<pre>";
      print_r($this->ar_liberados);
      echo "</pre>";
      */
      return true;
    }catch (Exception $e) {
      $msg = array('LiberarPedidos' => 'Houve um erro LiberarPedidos : ' . $e->getMessage());
      array_push($this->ds_mensagem, $msg);
      return false;
    }
  }



  function ecoComunicarSefaz(){

    $NfeCodeXml = new NfeCodeXml();

    $r_bd = $NfeCodeXml->getDados($this->id_doc_sai);

    $set_envia=false;    // Permissão para enviar o XML a Sefaz
    $set_msg  = array(); // Array com as mensagens
    $get_Envio=false;    // Retorno da Sefaz do envio

    if(!$r_bd==true){
      foreach ($set_msg as $key => $value) {
        addError($value);
      }
    }else{
      // array_push($set_msg, "nfe_id:$ok");

      $ok = $NfeCodeXml->nfe_GeraXml();

      array_push($set_msg, "nfe_GeraXml:$ok");
      if($ok==true){
        $ok  = $NfeCodeXml->nfe_AssinaXml();
        // $ret = $NfeCodeXml->nfe_ValidaXml();
        $ret = true;

        // retorno =1, arquivo validado com sucesso!
        if(count($ret)>1){
          $get_erro = "nfe_ValidaXml:0";
        }else{
          $get_erro = "nfe_ValidaXml:1";
          $setEnvia= true;
        }
        // acrescenta mensagem de status;
        array_push($set_msg, $get_erro);

        // varre o array incluindo erros, ou ultimo status;
        if(is_array($ret)){
          foreach ($ret as $key => $value) {
            array_push($set_msg, $value . '');
          }
        }

        // enviar arquivo para a Sefaz
        if($setEnvia==true){
      	$get_Envio = $NfeCodeXml->nfe_EnviaXml();
      	$get_bStat = "nfe_EnviaXml:" . $get_Envio['bStat'];
      	array_push($set_msg, $get_bStat);

      	// Acrescenta motivo de erro em Caso,bStat = 0
      	if(!$get_bStat=="1"){
      		$get_xMot = '';
      		foreach($get_Envio as $key => $value){
      			if(!is_array($key)){
      			$get_xMot = "<br>nfe_EnviaXml_Detail:$key = > $value";
      			array_push($set_msg, $get_bStat);
      			}
      		}
      	}
       }
      }
    }

    /*
    echo "<pre>";
    print_r($set_msg);
    echo "</pre>";
    echo "<br>setEnvia=$setEnvia";
    */

    if(count($set_msg)>0){
      $NfeCodeXml->NfeCode->bd_updateStatusProc($setEnvia, $set_msg);
    }

    return $get_Envio;
  }


}
