<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once 'api/nfephp/bootstrap.php'; 
require_once 'nfecode_class.php';
require_once 'messages.php';

use NFePHP\NFe\ToolsNFe;

class NfeCancelar {
  private $tipo_ambiente = '2';

  private $nr_nota = 0;
  private $ds_mensagem= '';
  private $st_nfe     = false;
  private $st_enviado = false;

  /* Informações Obrigatórios para Cancelamento da Nfe */
  private $ds_chave   = ''; // Chave da Nfe a ser cancelada 35160907494091000108550010000000121000000120
  private $ds_recibo  = ''; // Recibo da Nfe a ser cancelada  351000104191688
  private $ar_resposta= array(); // Retorno da Sefaz

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

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

  function __construct() {

    $this->NfeCode = new NfeCode();
    $this->tipo_ambiente = $this->NfeCode->getAmbiente();

    $this->nfe = new ToolsNFe('api/nfephp/config/config.json');
    $this->nfe->setModelo('55');
   }

   /* Função principal de Retorno e Mensagens para o PHP */
   function cancelarNfe(){
    $this->getInfoNfe();
    if($this->st_nfe==true){
       $this->ar_resposta = $this->setEnviarSolicitacao();
    }else{
      addError($this->ds_mensagem);
    }

    /* Atualiza o Status da Nota Fiscal para Cancelado */
    if($this->st_enviado==true){
      $cStat = "103";
      $xMotivo="Lote Enviado com Sucesso!";

      /*
      echo "<pre>";
      print_r($this->ar_resposta);
      echo "</pre>";
      exit;
      
        if(isset($this->ar_resposta['evento'][0])){
          $evento = $this->ar_resposta['evento'][0];
          $cStat  = $evento['cStat'];
          
          $ar_cancela = array("101", "135", "155");

          if(in_array($cStat, $ar_cancela)){
            $cStat="101";
            $xMotivo= $evento['xMotivo'];
            $nProt  = $evento['nProt'];
          }
        }
      */
      
      if($cStat=="103"){
        addMessage("Soliticação enviada com sucesso para Nfe! $this->ds_chave");  
      }elseif ($cStat=="101") {
        addMessage("Nfe ! $this->ds_chave cancelada com sucesso!");
      }
      
      // Atualiza o Status para Lote Enviado com Sucesso!
      $sql = "update erpc_documentos_saida set id_status_transmissao = 4,
                     cd_status_nfe='$cStat', ds_status_nfe='$xMotivo'
              where  id = $this->nr_nota";

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

   /* Valida se o Documetno a ser cancelado é uma nota fiscal autorizada */
   private function getInfoNfe(){
     $this->NfeCode->nr_nota = $this->nr_nota;

     $dados = $this->NfeCode->getDadosCancelaNfe();

     /* Se não encontrou dados exibe mensagem */
     if(Count($dados)==0){
        $this->ds_mensagem = "Não foi possível cancelar a Nfe Solicitada, Verifique o Status do Processamento: Nro Doc $this->nr_nota";
     }else{
       $this->ds_chave = $dados[0]['ds_chave'];
       $this->ds_recibo= $dados[0]['ds_recibo_sefaz'];
       $this->st_nfe = true;
     }
     return $this->st_nfe;
   }

   /* Envia a Sefaz os Dados de Cancelamento */
   private function setEnviarSolicitacao(){
     $aResposta = array();
     $chave = $this->ds_chave;
     $nProt = $this->ds_recibo;
     $tipo_ambiente = $this->tipo_ambiente;

     /* Faz Tratamento de erro, em caso de comunicação */
    try{

       $xJust = 'Cancelamento Solicitado pelo emitente';
       $retorno = $this->nfe->sefazCancela($chave, $tipo_ambiente, $xJust, $nProt, $aResposta);

       $this->ar_resposta = $aResposta;

       file_put_contents("xml/$chave-nfe_cancela.txt", serialize($retorno));
       
       /*
       echo "<br>Ambiente: $this->tipo_ambiente";
       echo "<pre>";
       // echo htmlspecialchars($this->nfe->soapDebug);
       print_r($aResposta);
       echo "</pre>";       
       exit;
      */
       $this->st_enviado = true;
     }catch (Exception $e) {
       // echo 'Exceção capturada: ',  $e->getMessage(), "\n";
       $p_error = 'Houve um erro ao enviarSolicitacao : ' . $e->getMessage() ;
       addError($p_error);
    }
     // $this->ar_resposta = $aResposta;
     return $this->st_enviado;
   }

}

/*
use NFePHP\NFe\ToolsNFe;

$nfe = new ToolsNFe('../../config/config.json');
$nfe->setModelo('55');


$aResposta = array();
$chave = '35160907494091000108550010000000121000000120';
// $nProt = '135150000408219';
$nProt = '351000104191688';

$tipo_ambiente = '2';
$xJust = 'Teste de cancelamento em ambiente de homologação';
$retorno = $nfe->sefazCancela($chave, $tipo_ambiente, $xJust, $nProt, $aResposta);

echo '<br><br><PRE>';
echo htmlspecialchars($nfe->soapDebug);
echo '</PRE><br>2:<BR>';
print_r($aResposta);
echo "<br>";
*/
?>
