Ajuda no cancelamento e carta de correcao.

118 views
Skip to first unread message

Implemente Tecnologia

unread,
May 21, 2021, 4:23:57 PM5/21/21
to NFePHP
Oi, boa tarde. Estou começando a desenvolver a NFe usando  sped-nfe. Usando a documentação resolvi tudo ate agora, já enviei a nota, consultei status e tudo. só que to com duas dificuldades. Estou com tudo atualizado via composer.

1) envio de carta de correção:
seguindo a documentação da pagina  sped-nfe/CartaCorrecao.md at master · nfephp-org/sped-nfe (github.com) criei uma rotina para pegar o certificado :

obs : $conf é a tabela de configuração, $cert e a tabela com o certificado e PegaCampo e uma rotina que pega um campo de uma tabela usando filtro. a rotina ficou assim:

function CarregaCertificado($conn, $configuracao){
    $conf          = new Tnfe_configuracao;
    $conf->Conexao = $conn;
    $conf->Carrega($configuracao,'');

    $cert          = new Tfiscal_certificado;
    $cert->Conexao = $conn;
    $cert->Carrega($conf->CERTIFICADO,"");

    $config    = [ 
                    "atualizacao" => date('Y-m-d h:i:s'),
                    "tpAmb"       => (int) substr($conf->HAMBIENTE,0,1),
                    "razaosocial" => PegaCampo($conn, 'servidor.empresa', 'razao_social', 'codigo', $_SESSION['SSempresa']),
                    "cnpj"        => trim(str_replace("/", "", str_replace(".", "", str_replace("-", "", PegaCampo($conn, 'servidor.empresa', 'cnpj', 'codigo', $_SESSION['SSempresa']))))),
                    "ie"          => trim(str_replace(".", "", str_replace("-", "", PegaCampo($conn, 'servidor.empresa', 'ie', 'codigo', $_SESSION['SSempresa'])))),
                    "siglaUF"     => PegaCampo($conn, 'servidor.empresa', 'uf',           'codigo', $_SESSION['SSempresa']),
                    "schemes"     => "PL_009_V4",
                    "versao"      => $conf->VERSAO,
                    "tokenIBPT"   => "", //"AAAAAAA",
                    "CSC"         => $cert->NFCE_CSC,
                    "CSCid"       => $cert->NFCE_IDCSC,
                    "aProxyConf"  => [
                                       "proxyIp"   => "",
                                       "proxyPort" => "",
                                       "proxyUser" => "",
                                       "proxyPass" => ""
                                     ]
                  ];
    $configJson  = json_encode($config); 
    $content     = file_get_contents(__DIR__."/../UP".$_SESSION['SSchave_cnpj']."/".$cert->ARQUIVO);
    $tools       = new Tools($configJson, Certificate::readPfx($content, $cert->SENHA));
    return       $tools;
}


essa rotina ta funcionando tudo certinho, pois uso ela pra enviar a nfe, consultar status tudo. ai a rotina que eu to usando pra enviar a carta de correção é essa :

function EnviaCartaDeCorrecao($conn, $cartaCodigo, $nfeCodigo, $motivo){
    $tools = CarregaCertificado($conn, PegaCampo($conn, 'nfe','nfe_configuracao','codigo',$nfeCodigo));
    $tools->model(PegaCampo($conn, 'nfe','modelo','codigo',$nfeCodigo));
    $chave      = PegaCampo($conn, 'nfe','cnf','codigo',$nfeCodigo);
    $xCorrecao  = $motivo;
    $nSeqEvento = $cartaCodigo;
    $response   = $tools->sefazCCe($chave, $xCorrecao, $nSeqEvento);
    $stdCl      = new Standardize($response);
    $std        = $stdCl->toStd();

    $carta          = new Tnfe_carta_correcao;
    $carta->Conexao = $conn;
    $carta->Carrega($cartaCodigo, '');

    //verifique se o evento foi processado
    if ($std->cStat != 128) {
      throw new Exception('Erro ao enviar carta de correcao - '.$std->cStat.' - '.$std->xMotivo);  
    } else {
        $cStat = $std->retEvento->infEvento->cStat;
        if ($cStat == '135' || $cStat == '136') {
            //SUCESSO PROTOCOLAR A SOLICITA??O ANTES DE GUARDAR
            $xml        = Complements::toAuthorize($tools->lastRequest, $response);
            $carta->XML = $xml;
            echo $std->cStat.' - '.$std->xMotivo;
        } else {
            //houve alguma falha no evento 
            throw new Exception('Erro ao enviar carta de correcao - '.$std->cStat.' - '.$std->xMotivo);  
        }
    } 
    $carta->CSTAT   = $std->cStat;
    $carta->RETORNO = $std->xMotivo;
    $carta->Edita($cartaCodigo, '');
}


o retorno que ta dando sempre é : status 215 - Rejeição: Falha no esquema XML

2) o cancelamento to usando :
function CancelaNFE($conn, $cancelamentoCod, $nfeCodigo, $justificativa){
  $tools = CarregaCertificado($conn, PegaCampo($conn, 'nfe','nfe_configuracao','codigo',$nfeCodigo));
  $tools->model(PegaCampo($conn, 'nfe','modelo','codigo',$nfeCodigo));

  $chave    = PegaCampo($conn, 'nfe', 'cnf',       'codigo', $nfeCodigo);
  $nProt    = PegaCampo($conn, 'nfe', 'protocolo', 'codigo', $nfeCodigo);
  $response = $tools->sefazCancela($chave, $justificativa, $nProt);
  $stdCl    = new Standardize($response);
  $std      = $stdCl->toStd();

  $cn          = new Tnfe_cancelamento;
  $cn->Conexao = $conn;
  $cn->Carrega($cancelamentoCod, '');

  //verifique se o evento foi processado
  if ($std->cStat != 128) {
      //houve alguma falha e o evento nao foi processado
      throw new Exception('Erro ao enviar carta de correcao - '.$std->cStat.' - '.$std->xMotivo);  
  } else {
      $cStat = $std->retEvento->infEvento->cStat;
      if ($cStat == '101' || $cStat == '135' || $cStat == '155') {
          //SUCESSO PROTOCOLAR A SOLICITA��O ANTES DE GUARDAR
          $xml     = Complements::toAuthorize($tools->lastRequest, $response);
          $cn->XML = $xml;
          echo $std->cStat.' - '.$std->xMotivo;
          //Editando a nfe para a situacao de cancelada
          EditaRegistroUnico($conn, 'nfe', 'situacao', 'CANCELADO', 'codigo = '.$nfeCodigo);
      } else {
          //houve alguma falha no evento 
          throw new Exception('Erro ao enviar carta de correcao - '.$std->cStat.' - '.$std->xMotivo);  
      }
  } 
  $cn->CSTAT   = $std->cStat;
  $cn->RETORNO = $std->xMotivo;
  $cn->Edita($cancelamentoCod, '');
}

também esta dando Rejeição: Falha no esquema XML.
alguém pode me indicar onde eu to falhando?

Implemente Tecnologia

unread,
May 23, 2021, 11:35:03 AM5/23/21
to NFePHP
Minha pergunta ficou complexa e muito complicada, mas debugando aqui descobri que a data passada esta com 5 horas adiantada em todos os eventos que eu crio. seja carta de correção ou cancelamento. ele pega minha região certo : américa/recife mas ele bota a data muito la pra frente.
no caso eu estava enviando as 10:48 e a tag estava assim :  <dhEvento>2021-05-23T15:48:35+02:00</dhEvento>

Implemente Tecnologia

unread,
May 23, 2021, 7:46:27 PM5/23/21
to NFePHP
tentei passar $tools->setEnvironmentTimeZone('PE');
mas mesmo assim não rolou sempre vai com 5 horas a mais.

Eng Helder Ferreira.

unread,
May 24, 2021, 7:44:50 AM5/24/21
to nfe...@googlegroups.com
E quando voce envia a nota a data esta indo correta ?
Se esta indo correta tente descobrir a diferença entre enviar a NFe e corrigir
Helder

--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Para Sair do Grupo: nfephp+un...@googlegroups.com
Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositórios: https://github.com/nfephp-org
---
Você recebeu essa mensagem porque está inscrito no grupo "NFePHP" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nfephp+un...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/nfephp/92423769-f3a6-477b-ae54-1599dafa15e9n%40googlegroups.com.

Implemente Tecnologia

unread,
May 24, 2021, 10:41:48 AM5/24/21
to NFePHP
quando eu envio a nota esta indo correra.
so quando eu envio algum evento (cancelamento, carta de correção e etc).
ele vai com 5 horas a mais. ai da erro de  Falha no esquema XML o resto pelo que eu vi ta tudo correto.

Implemente Tecnologia

unread,
May 27, 2021, 1:34:25 PM5/27/21
to NFePHP
o xml que esta gerando no evento é :
<evento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00"><infEvento Id="ID1101112621053722775200010855001000001652103518825601"><cOrgao>26</cOrgao><tpAmb>2</tpAmb><CNPJ>12090530000157</CNPJ><chNFe>26210537227752000108550010000016521035188256</chNFe><dhEvento>2021-05-27T19:15:28+02:00</dhEvento><tpEvento>110111</tpEvento><nSeqEvento>1</nSeqEvento><verEvento>1.00</verEvento><detEvento versao="1.00"><descEvento>Cancelamento</descEvento><nProt>126210000183172</nProt><xJust>TESTE DE TESTE DE TESTE DE TESTE DE TESTE DE TESDE</xJust></detEvento></infEvento></evento>

como eu disse esta com 5 horas adiantado.
o config gerado (coloquei xxxxx no cnpj e no ide do cliente so pra postar aqui, no config normal esta com os dados certos:

"{"atualizacao":"2021-05-27 07:31:41","tpAmb":2,"razaosocial":"RJ ALVES INFORMATICA","cnpj":"xxxxxxxxxx","ie":"xxxxxxxxxxx","siglaUF":"PE","schemes":"PL_009_V4","versao":"4.00","tokenIBPT":"","CSC":null,"CSCid":null,"aProxyConf":{"proxyIp":"","proxyPort":"","proxyUser":"","proxyPass":""}}"

nao sei pq ta saindo com 5 horas a mais. :(

cper...@gmail.com

unread,
May 27, 2021, 1:36:12 PM5/27/21
to NFePHP
filho, isso nao tem haver com o nfephp, tem haver com o timezone que esta configurado no seu PHP, pesquise sobre isso e configure corretamente seu servidor que ira funcionar.

Implemente Tecnologia

unread,
May 27, 2021, 2:56:08 PM5/27/21
to NFePHP
já configurei. tanto que a nfe vai. a inutilização vai. tudo vai. menos eventos. 
e eu verifico o timezone antes de enviar.
já tentei ate isso :  $tools->setEnvironmentTimeZone('PE'); do próprio componente.
antes de chamar a rotina ainda forço chamando o date_default_timezone_set('America/Recife');
e mesmo assim. quando eu chamo a rotina de cancelamento que ela chama a rotina  $this->sefazEvento($uf, $chave, self::EVT_CANCELA, $nSeqEvento, $tagAdic);
a data e hora sempre vai com +5 horas de antecedência.
:(


Implemente Tecnologia

unread,
May 30, 2021, 1:36:57 PM5/30/21
to NFePHP
Descobri qual era a bronca e realmente estava vinculado ao timezone, um dos outros programadores tinha alterado uma funcao que mudava o timezone na classe chamava as rotinas pra testar outra coisa, por isso fiz uma função que pega o timezone correto pela uf da empresa que esta cadastrada. Agora sempre chamo essa function antes de chamar qualquer coisa da NFE. como achei útil e vai que alguém precise ta aqui : 

$conn : conexão com o banco de dados (pdo)
PegaCampo : rotina que cria uma query e retorna o valor do campo com o filtro passado

function SetaTimeZone($conn){
    $tzUF = PegaCampo($conn, 'servidor.empresa', 'uf', 'codigo', $_SESSION['SSempresa']);
    switch ($tzUF){
        case 'AC' : date_default_timezone_set('America/Rio_branco'); break;
        case 'AL' : date_default_timezone_set('America/Maceio'); break;
        case 'AP' : date_default_timezone_set('America/Belem'); break;
        case 'AM' : date_default_timezone_set('America/Manaus'); break;
        case 'BA' : date_default_timezone_set('America/Bahia'); break;
        case 'CE' : date_default_timezone_set('America/Fortaleza'); break;
        case 'DF' : date_default_timezone_set('America/Sao_Paulo'); break;    
        case 'ES' : date_default_timezone_set('America/Sao_Paulo'); break;
        case 'GO' : date_default_timezone_set('America/Sao_Paulo'); break;    
        case 'MA' : date_default_timezone_set('America/Fortaleza'); break;
        case 'MT' : date_default_timezone_set('America/Cuiaba'); break; 
        case 'MS' : date_default_timezone_set('America/Campo_Grande'); break;
        case 'MG' : date_default_timezone_set('America/Sao_Paulo'); break;
        case 'PR' : date_default_timezone_set('America/Sao_Paulo'); break;
        case 'PB' : date_default_timezone_set('America/Fortaleza'); break;
        case 'PA' : date_default_timezone_set('America/Belem'); break;
        case 'PE' : date_default_timezone_set('America/Recife'); break;
        case 'PI' : date_default_timezone_set('America/Fortaleza'); break;
        case 'RJ' : date_default_timezone_set('America/Sao_Paulo'); break;    
        case 'RN' : date_default_timezone_set('America/Fortaleza'); break;
        case 'RS' : date_default_timezone_set('America/Sao_Paulo'); break;
        case 'RO' : date_default_timezone_set('America/Porto_Velho'); break;
        case 'RR' : date_default_timezone_set('America/Boa_Vista'); break;
        case 'SC' : date_default_timezone_set('America/Sao_Paulo'); break;
        case 'SE' : date_default_timezone_set('America/Maceio'); break;
        case 'SP' : date_default_timezone_set('America/Sao_Paulo'); break;
        case 'TO' : date_default_timezone_set('America/Araguaia'); break;
    }
}


Reply all
Reply to author
Forward
0 new messages