From 1bfe9a7605658cdb892620d64c52833681a56115 Mon Sep 17 00:00:00 2001 From: robmachado Date: Tue, 11 Jun 2024 17:09:42 -0300 Subject: [PATCH] =?UTF-8?q?Apenas=20o=20arquivo=20md=20relativo=20a=20oper?= =?UTF-8?q?a=C3=A7=C3=A3o=20em=20contingencia=20SVC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Contingency.md | 77 ++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/docs/Contingency.md b/docs/Contingency.md index e655680e..9f4601af 100755 --- a/docs/Contingency.md +++ b/docs/Contingency.md @@ -22,7 +22,7 @@ Nesse caso o xml da NFe deve indicar na propriedade <tpEmis> o valor 5 > Devemos considerar também a necessidade adicional de controle dessas notas e posterior envio à SEFAZ autorizadora quando o sistema estiver novamente on-line. > Outro motivo é a possibilidade de a NFe ser reprovada após o processo posterior de envio a SEFAZ autorizadora, com isso o transporte e recebimento da mercadoria se torna uma operação "ilegal" e sujeita a punições. -> Se for usar esse método melhore o sistema emissão com muitas validações, para garantir que erros sejam identificados antes de geração do ducumento, para evitar problemas posteriores e multas. +> Se for usar esse método melhore o sistema emissão com muitas validações, para garantir que erros sejam identificados antes de geração do documento, para evitar problemas posteriores e multas. ## SVC-AN (tpEmis = 6) *Apenas NFe (modelo 55)* @@ -34,9 +34,9 @@ Nesse caso o xml da NFe deve indicar na propriedade <tpEmis> o valor 6 Este sistema de contingência é o **melhor de todos** e permite que as notas sejam emitidas com poucas alterações e sem a necessidade de reenvio posterior. Nesse modo as notas enviadas serão sincronizadas automaticamente pelos orgãos autorizadores sem a necessidade que qualquer outra ação pelo emitente. Este serviço atende: AC, AL, AP, CE, DF, ES, MG, PA, PB, PI, RJ, RN, RO, RR, RS, SC, SE, SP, TO -> Este é o caso de uso da classe Contingency da nossa biblioteca, inclusive NFe emitidas em modo normal será automaticamente ajustadas para o ambiente de contingência e novamente assinadas quando contingencia SVCAN estiver ativada na class Tools. +> Este é o caso de uso da classe Contingency da nossa biblioteca, inclusive NFe emitida em modo normal será automaticamente ajustada para o ambiente de contingência e novamente assinada quando contingencia SVCAN estiver ativada na class Tools. -> IMPORTANTE: este processo irá alterar a chave da NFe, e portanto deverá ser regravada em sua base de dados (com a chave nova gerada pelo processo de envio). +> IMPORTANTE: este processo **irá alterar a chave da NFe**, e portanto deverá ser **regravada em sua base de dados** (com a chave nova gerada pelo processo de envio). **Uso: SEFAZ OFFLINE, mas emitente com acesso à internet, e sistema de contigência SVCAN ativado pela SEFAZ autorizadora do seu estado.** @@ -50,9 +50,9 @@ Nesse caso o xml da NFe deve indicar na propriedade <tpEmis> o valor 7 Este sistema de contingência é o **melhor de todos** e permite que as notas sejam emitidas com poucas altereções e sem a necessidade de reenvio posterior. Nesse modo as notas enviadas serão sincronizadas automaticamente pelos orgãos autorizadores sem a necessidade que qualquer outra ação pelo emitente. Este serviço atende: AM, BA, GO, MA, MS, MT, PE, PR -> Este é o caso de uso da classe Contingency da nossa biblioteca, inclusive NFe emitidas em modo normal será automaticamente ajustadas para o ambiente de contingência e novamente assinadas quando contingencia SVCAN estiver ativada na class Tools. +> Este é o caso de uso da classe Contingency da nossa biblioteca, inclusive NFe emitida em modo normal será automaticamente ajustada para o ambiente de contingência e novamente assinada quando contingencia SVCRS estiver ativada na class Tools. -> IMPORTANTE: este processo irá alterar a chave da NFe, e portanto deverá ser regravada em sua base de dados (com a chave nova gerada pelo processo de envio). +> IMPORTANTE: este processo irá **alterar a chave da NFe**, e portanto deverá ser **regravada em sua base de dados** (com a chave nova gerada pelo processo de envio). **Uso: SEFAZ OFFLINE, mas emitente com acesso à internet, e sistema de contigência SVCRS ativado pela SEFAZ autorizadora do seu estado.** @@ -67,10 +67,13 @@ Nesse caso o xml da NFCe deve indicar na propriedade <tpEmis> o valor 9 > *IMPORTANTE*: Esse modo de contingência serve exclusivamente para as notas modelo 65 e não podem ser usadas em notas modelo 55. -> Todos os estados permitem a emissão de NFCe em modo OFFLINE, exceto SP, onde é obrigátorio o uso do SAT@ecf ou da emissão por EPEC NFCe +> Todos os estados permitem a emissão de NFCe em modo OFFLINE, exceto SP, onde é obrigátorio o uso do SAT@ecf ou da emissão por EPEC NFCe. -**Uso: Sem acesso a internet ou com a SEFAZ offline.** +> Outro problema com essas NFCe-OFFLINE é a possibilidade de a NFe ser reprovada após o processo posterior de envio a SEFAZ autorizadora, com isso o transporte e recebimento da mercadoria se torna uma operação "ilegal" e sujeita a punições. +> Se for usar esse método melhore o sistema emissão com muitas validações, para garantir que erros sejam identificados antes de geração do documento, para evitar problemas posteriores e multas. +> Mas em caso de erro detectado pela SEFAZ pode corrigir a mesma NFCe, assinar novamente e enviar dentro do prazo estabelecido, mas o documento impresso originalmente estará diferente da versão final e em principio deverá ser substituido com o consumidor. +**Uso: Sem acesso a internet ou com a SEFAZ offline.** ## EPEC (tpEmis = 4) *NFe e NFCe* @@ -78,42 +81,42 @@ Evento Prévio da Emissão em Contingência Nesse caso o xml da NFe deve indicar na propriedade <tpEmis> o valor 4 -Este é o processo mais complexo e "arriscado" entre todos os modos de contigência. +Este é o processo **mais complexo e "arriscado"** entre todos os modos de contigência. São dois tipos diferentes mas que seguem basicamente as mesmas regras estruturas e condições, apenas são direcionados para webservices diferentes. -Em ambos os casos são criados eventos EPEC Evento Prévio de Emissão em Contingência, para emitir em EPEC devem ser observados os seguintes passos: +Em ambos os casos são criados eventos EPEC Evento Prévio de Emissão em Contingência, e para emitir em EPEC devem ser observados os seguintes passos: 1. criar a NFe ou a NFCe já marcada em contignência EPEC com **tpEmis = 4**, **dhCont = data hora de entrada em contingência** e **xJust = justificativa** 2. criar e enviar o evento EPEC pelos métodos da classe Tools, sendo: - - $tools->sefazEPEC($xml, $verAplic) para NFe (mod 55) - - $tools->sefazEpecNfce($xml, $verAplic) para NFCe (mod 65) -3. verificar se o evento foi autorizado, se sim protocolar, se não tratar o erro até ser autorizado -4. usar o xml e os dados do EPEC autorizado para imprimir o DANFE ou DANFCE -5. enviar o xml assim que a SEFAZ autorizadora retornar a operção normal + - $tools->sefazEPEC($xml, $verAplic) para NFe (mod 55) + - $tools->sefazEpecNfce($xml, $verAplic) para NFCe (mod 65) +3. verificar se o evento foi autorizado, se sim protocolar, se não tratar o erro até o evento ser autorizado +4. usar o xml da NFe/NFCe e os dados do EPEC autorizado para imprimir o DANFE ou DANFCE +5. enviar o xml assim que a SEFAZ autorizadora retornar a operação normal ### EPEC NFe (mod 55) -Este processo envia o EPEC para o ambiente nacional +Este processo envia o EPEC para o ambiente nacional da NFe. ### EPEC NFCe (mod 65) -Este processo envia o EPEC para o webservice de registro de EPEC especifico para NFCe exclusivamente no estado de São Paulo. +Este processo envia o EPEC para o webservice de registro de EPEC especifico para NFCe, exclusivamente no estado de São Paulo. -> NOTA: não existe EPEC para NFCe em outros estados, neles deve ser usado a contingência OFFLINE +> NOTA: não existe EPEC para NFCe em outros estados, neles deve ser usada a contingência OFFLINE Este modo de contingência é diferente dos demais por que na verdade irá enviar um evento especifico para o webservices de Registro de Eventos do Ambiente Nacional. Normalmente usa-se esse tipo de contingência em caso da SEFAZ autorizadora estar fora do ar, bem como o Serviço Virtual de Contingência também, e isso é uma situação muito rara de ocorrer. -**Uso: SEFAZ OFF e SVC OFF mas emitente com acesso à internet.** +> IMPORTANTE: a emissão de um evento EPEC cria a pendência do envio de uma nota que seja autorizada ou denegada dentro do limite de 7 dias para que seja vinculada ao EPEC, caso contrario, se algum evento EPEC não for vinculado ao uma NFe/NFCe, o emitente ficará **bloqueado e não mais porderá enviar eventos EPEC**. -# [Esclarecimentos sobre TIMEOUT](TimeOut.md) +**Uso: NFe SEFAZ OFF e SVC OFF mas emitente com acesso à internet.** +**Uso: NFCe SEFAZ-SP OFF e EPEC-NFCe-SP ativo e emitente com acesso à internet.** -# Class Factories\Contingency +# [Esclarecimentos sobre TIMEOUT](TimeOut.md) -## USAGE -**Habilitando o modo de contingência** +## USO A classe Contingency somente será usada para envio de NFe (mod 55) para as contigências SVC-AN ou SVC-RS, que são substitutos diretos à emissão normal. @@ -126,9 +129,9 @@ Os demais tipos de contingência como: Como deve ser feito o processo no seu sistema: -1. ao entrar em contingência, sempre verifique se a mesma está ativa para o seu estado -2. ative o modo de contingência e grave o json retornado em um cache ou pbase de dados, para habilitar seu uso continuo -3. ao enviar uma NFe (mod 55), sempre verifique esse json no cache ou na base de dados e o recarregue em Contingency::class +1. ao entrar em contingência SVCAN ou SVCRS, sempre verifique se o webservice de contingência está ativo para o seu estado; +2. ative o modo de contingência e grave o json retornado em um cache ou base de dados, para habilitar seu uso continuo; +3. ao enviar uma NFe (mod 55), sempre verifique esse json no cache ou na base de dados, e o recarregue em Contingency::class 4. injete a Contingency::class na classe principal Tools::class ```php @@ -142,7 +145,7 @@ if (!empty($json_contingencia_do_cache)) { $tools = new Tools($configJson, $cert, $cont); $tools->model(55); ``` -5. ou carregue a proriedade publica da classe $tools->contingency +5. ou carregue diretamente a proriedade publica da classe $tools->contingency ```php $cert = Certificate::readPfx(file_get_contents('certificado.pfx'), 'senha'); //recarrega a contingencia que foi enteriormente ativada e gravada em cache @@ -156,6 +159,8 @@ $tools->contingency = $cont; $tools->model(55); ``` +## Habilitando o modo de contingência + ```php use NFePHP\NFe\Factories\Contingency; @@ -170,6 +175,7 @@ $status = $contingency->activate($acronym, $motive, $type); ``` $status irá conter uma string JSON ENCODED, com as informações sobre a condição de contingência. +Como mostrado abaixo: ```json { @@ -179,8 +185,12 @@ $status irá conter uma string JSON ENCODED, com as informações sobre a condi "tpEmis":6 } ``` -Essa string deverá ser arquivada, em disco ou em base de dados para uso posterior, até que o modo de contingencia seja desabilitado. -Ou seja, a cada vez que carregar a classe Tools deverá ser passada a classe contingency, ou será considerado que o ambiente é normal. Exemplo: + +Essa string deverá ser mantida, em disco, cache ou em base de dados para uso posterior, até que o modo de contingencia seja desabilitado. +Ou seja, a cada vez que carregar a classe Tools deverá ser passada a classe Contingency, ou será considerado que o ambiente está normal. + +Exemplo: + ```php $status_contingencia = '{ "motive":"SEFAZ fora do AR", @@ -194,12 +204,13 @@ $tools->contingency = $contingency; ``` **Desabilitando o modo de contingência** -```php -use NFePHP\NFe\Factories\Contingency; +Você pode simplesmente apagar o registro anterior da string json da contigência ou desativa-la como indicado abaixo, e gravar onde estava registrada a anterior. + +```php //onde $status é a string json obtida quando entrou em modo de contingência. $contingency = new Contingency($status); -$status = $contingency->deactivate(); +$status = $contingency->deactivate(); ///grave o retorno no cache ou na base de dados ``` $status irá conter dados padrões em condições normais. @@ -219,7 +230,7 @@ Essa string deverá ser arquivada, em disco ou em base de dados para uso posteri public $type; @var string -> Tipo da contingência SVCAN, SVCRS +> Tipo da contingência apenas SVCAN, SVCRS public $motive; @@ -241,7 +252,7 @@ public $tpEmis; > Codigo numerico que representa os tipos de contingência acima indicados. Esse codigo fará parte na montagem as NFe no campo <tpEmis>. -## Methods +## Métodos Construtor, caso seja passado o parametro, uma string JSON, a condição de contingência contida nessa string será registrada na classe. Caso nada seja passado a classe irá considerar condição de emissão normal.