<?php
require_once 'connect.php';
require_once 'inc/messages.php';
require_once 'inc/usuario.php'; 

/* 08/06/2017 Remoção do POO de banco, na nuvem retorna erros
$values[] = $nr_nota;
$result = _prepareAndQuery($sql, $values); 
*/

class NfeCode {
  private $nr_nota = 0;
  private $nr_nota_nfe = 1;
  private $id_unidade  = 1;
  private $ds_serie    = 1; // 1 Nfe Normal, 110 Nfe Devolução === Finalidade da Nfe = 4
  private $tipo_ambiente=2; // 1 Produção,  2 homologacao
  private $path_nfephp  = './api/nfephp';

  // 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'];
	$this->id_unidade = $usuario['unidade'];
   }

  // método para alteração do número da nota;
  function setNrNota($p_nr_nota){
    $this->nr_nota = $p_nr_nota;
  }

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

  // Parametro do Ambiente de 1 Produção ou 2 Homologação
  function getAmbiente(){
    $sql = "select ds_valor as tpAmb from erpc_parametros where ds_parametro='P_TIPO_AMBIENTE_SEFAZ'";
    $p_result = $this->getSQL($sql);

    if(count($p_result)!=0){
      $this->tipo_ambiente = $p_result[0]['tpAmb'];
    }
    return $this->tipo_ambiente;
  }

  //Parametro do Path da API nfephp
  function getPathNFEPHP(){
    $sql = "select ds_valor as ds_path from erpc_parametros where ds_parametro='P_PATH_NFEPHP'";
    $p_result = $this->getSQL($sql);

    if(count($p_result)!=0){
      $this->path_nfephp = $p_result[0]['ds_path'];
    }
    return $this->path_nfephp;
  }

  // métodos abaixo para retorno de dados
  // retorna as informações do emitente
  function getEmitente() {
    $sql    = "select * from vw_erpc_nfecode_geraxml_emitente where nr_documento=$this->nr_nota";
    $result = $this->getSQL($sql);
    return $result;
  }

  // retorna o numero da próxima
  function getProximaNfe(){ 
    //$sql   = "select ifnull(max((cast(ds_numnf as decimal)) + 1), 1) as proxnfe from erpc_documentos_saida where  ds_modelo = 55 and ds_serie=$this->ds_serie and id_unidade=$this->id_unidade";
    $sql   = "SELECT cast(ds_numnf as decimal) + 1 as proxnfe FROM erpc_documentos_saida WHERE ds_modelo = 55 and (cd_status_nfe in (100, 101)) and ds_serie=$this->ds_serie and id_unidade=$this->id_unidade ORDER BY ID DESC LIMIT 1;";
    $result= $this->getSQL($sql);
    return $result[0]['proxnfe'];
  }

  //

  // retorna as informações do NotaFiscal
  function getDocumento() {
    $sql   = "select * from vw_erpc_nfecode_geraxml_documento where nr_documento=$this->nr_nota";
    $result= $this->getSQL($sql);

    // se número da Nfe em erpc_documentos_saida for nullo, resgatar a próxima
    if($result[0]['nr_nota']==''){
       // seta o número da NFE conforme o GET obtido
       $this->nr_nota_nfe = $this->getProximaNfe(); // $result[0]['proxnfe'];

       $result[0]['nr_nota'] = $this->nr_nota_nfe;
       $result[0]['nNF']     = $this->nr_nota_nfe;
    }else{
      $this->nr_nota_nfe  = $result[0]['nNF'];
    }
    return $result;
  }

  // retorna as informações do cliente
  function getCliente() {
    $sql   = "select * from vw_erpc_nfecode_geraxml_cliente where nr_documento=$this->nr_nota";
    $result= $this->getSQL($sql);
    return $result;
  }

  // retorna os produtos da nota fiscal
  function getProdutos() {
    $sql = "select * from vw_erpc_nfecode_geraxml_produtos where nr_documento=$this->nr_nota";
    $result= $this->getSQL($sql);
    return $result;
  }

  /* Retorna o Valor Aproximado dos Tributos */
  function getTributos(){
    $sql = "select s.id
            , sum(i.nr_quantidade * i.vl_unitario - i.vl_desconto_produto) as vl_total
            , sum(i.nr_quantidade * i.vl_unitario - i.vl_desconto_produto) * nr_perc_nacional / 100 as vl_nacional
            , sum(i.nr_quantidade * i.vl_unitario - i.vl_desconto_produto) * nr_perc_estadual / 100 as vl_estadual
            , sum(i.nr_quantidade * i.vl_unitario - i.vl_desconto_produto) * nr_perc_municipal / 100 as vl_municipal
        from erpc_documentos_saida s
        join erpc_pedidos_documentos_saida p on s.id = p.id_documento_saida
        join erpc_pedidos_itens_liberados  i on p.id_pedido_liberados = i.id_pedido_venda_liberado
        join erpc_produtos     pr on i.id_produto = pr.id
        left join erpc_tributos_ncm n
               on pr.ds_ncm = n.ds_ncm
        	  and ifnull(pr.ds_especie_tipi, '') = ifnull(n.ds_ex_tipi, '')
        group by s.id
        having s.id = $this->nr_nota";
        $result= $this->getSQL($sql);
        return $result;
  }

  function getPagamentos(){
   $sql = "select * from vw_erpc_nfecode_geraxml_pagamentos where nr_documento = $this->nr_nota";
        $result= $this->getSQL($sql);
        return $result; 

  }

  /* Retorna os dados da Transportadora / Veículos */
  function getTransporte(){
   $sql = "select * from vw_erpc_nfecode_geraxml_transporte 
           where  nr_documento = $this->nr_nota";
        $result= $this->getSQL($sql);
        return $result; 
  }

  function getVolumes(){
    $sql = "select * from vw_erpc_nfecode_geraxml_volumes 
           where  nr_documento = $this->nr_nota";
        $result= $this->getSQL($sql);
        return $result; 
  } 

  function getDadosCancelaNfe(){
    /* Status 100, Autorizado o uso da NFE */
    $sql = "select ds_chave, ds_recibo_sefaz from erpc_documentos_saida
            where  ds_modelo  = 55
             and cd_status_nfe= 100
             and id = $this->nr_nota";
    $result = $this->getSQL($sql);
    return $result;
  }

  // atualiza o objeto passado no bd
  function bd_includeStatus($p_id_status, $ds_chave, $ds_path, $msg_erro, $st_status, $p_xml = '') {
    global $conexao;
    global $nr_nota;
    $ok = false;
    // grava o status da gravação no BD para prosseguir com as operaçoes
    // $sql = "insert into erpc_documentos_saida_status( id_documento, id_status, ds_chave, ds_link, ds_erro, st_status, dh_atualizacao, id_usuario) values( $nr_nota, $p_id_status, '{$ds_chave}', '$ds_path', '$msg_erro', $st_status, now(), 1)";
    $sql = "update erpc_documentos_saida set id_status_transmissao = $p_id_status,
            ds_chave = '{$ds_chave}',
            ds_xml   = '$ds_path'  ,
            id_status_xml_interno =$st_status ,
            ds_status_proc = '" . substr($msg_erro, 1, -500) . "'
            , ds_numnf = $this->nr_nota_nfe";

    /* Se Informado o XML, grava no Banco */
    if($p_xml!=''){
      $xmlToBD = chr(34) . addslashes( $p_xml) . chr(34);
      $sql    .= ", ds_xml='$xmlToBD'";
    }

      $sql .= " where id = $this->nr_nota";

    /*
    addMessage($msg_erro);
    echo "<br>$sql";
    */

    if($sql!=""){
      $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
      $ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
    }

  if ($ok !== false) {
      addMessage('Atualizado com sucesso');
    }/*else{
      addError($sql);
    }*/
    return $ok;
  }

  // método para atualizar o número do recibo
  function bd_updateRecibo($p_resp){
    global $conexao;
    global $nr_nota;
    $ok = false;

    $bStat  = $p_resp['bStat'];
    $cStat  = $p_resp['cStat'];
    $xMotivo= $p_resp['xMotivo'];
    $nRec   = $p_resp['nRec'];

    $sql = "update erpc_documentos_saida set id_status_transmissao=3, cd_status_nfe='$cStat', ds_status_nfe='$xMotivo', ds_recibo_sefaz='$nRec' where id=$this->nr_nota";
    // echo "<br>$sql";
    // exit;

    if($sql!=""){
      $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
      $ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
    }
    return $ok;
  }

  function bd_updateStatusSefaz($p_resp){
    global $conexao;
    global $nr_nota;
    $ok = false;
  	$ds_status_proc = '';

  	// percorre o array de status de processamento na Sefaz
  	foreach($p_resp as $key => $value){
  		$ds_status_proc .= "$value;";
  	}

      $sql = "update erpc_documentos_saida set ds_status_proc=" . chr(34) . htmlspecialchars($ds_status_proc) . chr(34) .  " where id=$nr_nota";
      if($sql!=""){
        $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
        $ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
      }
      return $ok;
  }

  // Status de Processamento Interno
  function bd_updateStatusProc($p_xml, $p_msg){
    global $conexao;
    $ok = false;
  	$ds_status_proc = '';

  	// percorre o array de status de processamento na Sefaz
  	foreach($p_msg as $key => $value){
  		$ds_status_proc .= "$value;";
  	}

    if($p_xml==""){
      $p_xml='2';
    }

    $ok = false;
    $sql = 'update erpc_documentos_saida set id_status_xml_interno=?, ds_status_proc=? where id=?';
    //$values = array($tabela_preco['id']);
    $values = array($p_xml, $ds_status_proc, $this->nr_nota);

    /*
    echo "<pre>";
    print_r($values);
    echo "</pre>";*/

    $ok = _prepareAndExecute($sql, $values);

    return $ok;
  }
}

$NfeCode = new NfeCode;
?>
