diff --git a/examples/5.0testSefazStatus.php b/examples/5.0testSefazStatus.php index f25d4e58..5c33dab6 100755 --- a/examples/5.0testSefazStatus.php +++ b/examples/5.0testSefazStatus.php @@ -38,6 +38,8 @@ $soap = new \NFePHP\NFe\Tests\Common\SoapFake(); $soap->disableCertValidation(true); +$soap->protocol(6); +$soap->httpVersion('1.1'); //intancia a classe tools $tools = new Tools($configJson, Certificate::readPfx($content, 'associacao')); diff --git a/examples/EventoInsucessoEntrega.php b/examples/EventoInsucessoEntrega.php new file mode 100644 index 00000000..d6292526 --- /dev/null +++ b/examples/EventoInsucessoEntrega.php @@ -0,0 +1,75 @@ + "2016-11-03 18:01:21", + "tpAmb" => 2, + "razaosocial" => "SUA RAZAO SOCIAL LTDA", + "cnpj" => "99999999999999", + "siglaUF" => "SP", + "schemes" => "PL_009_V4", + "versao" => '4.00', + "tokenIBPT" => "AAAAAAA", + "CSC" => "GPB0JBWLUR6HWFTVEAS6RJ69GPCROFPBBB8G", + "CSCid" => "000001", + "proxyConf" => [ + "proxyIp" => "", + "proxyPort" => "", + "proxyUser" => "", + "proxyPass" => "" + ] +]; +//monta o config.json +$configJson = json_encode($arr); + +//carrega o conteudo do certificado. +$content = file_get_contents('fixtures/expired_certificate.pfx'); + +try { + //intancia a classe tools + $tools = new Tools($configJson, Certificate::readPfx($content, 'associacao')); + //seta o modelo para 55 + $tools->model('55'); + + $soap = new SoapFake(); + $soap->disableCertValidation(); + $tools->loadSoapClass($soap); + + $std = new \stdClass(); + $std->cancelar = true; //não é um evento de Cancelamento de Insucesso de Entrega + $std->protocolo = '123456789012345'; + $std->chNFe = '35200714403043000122550010000056591412970518'; //chave de 44 digitos da nota do fornecedor + $std->verAplic = '1.2.3'; //versão da aplicação que está gerando o evento + $std->nSeqEvento = 1; //numero sequencial do evento, incrementar ao incluir outros ou remover + $std->data_tentativa = '2024-05-30T13:22:50-03:00'; //data da ultima tentativa de entrega + $std->tentativas = 3; + $std->tipo_motivo = 4; + //Motivo do insucesso: + //1 – Recebedor não encontrado + //2 – Recusa do recebedor + //3 – Endereço inexistente + //4 – Outros (exige informar justificativa) + $std->justificativa = 'Local sem acesso devido a deslizamento de terra'; + $std->latitude = "-23.622600"; + $std->longitude = "-46.424870"; + $std->imagem = 'kakakakakakakakak'; // aqui pode ser colocada uma imagem ou uma string que fará parte do hash + + $response = $tools->sefazInsucessoEntrega($std); + + $fake = NFePHP\NFe\Common\FakePretty::prettyPrint($response); + echo $fake; + +} catch (\Exception $e) { + echo $e->getMessage(); +} diff --git a/schemes/PL_009_V4/EventoCancInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/EventoCancInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..2b67a14b --- /dev/null +++ b/schemes/PL_009_V4/EventoCancInsucessoNFe_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do evento de Cancelamento do Comprovante de Entrega da NFe + + + diff --git a/schemes/PL_009_V4/EventoInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/EventoInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..3ac77c4e --- /dev/null +++ b/schemes/PL_009_V4/EventoInsucessoNFe_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do evento de Insucesso na entrega da NF-e + + + diff --git a/schemes/PL_009_V4/e110192_v1.00.xsd b/schemes/PL_009_V4/e110192_v1.00.xsd new file mode 100644 index 00000000..e422f60a --- /dev/null +++ b/schemes/PL_009_V4/e110192_v1.00.xsd @@ -0,0 +1,107 @@ + + + + + + + Schema XML de validação do evento de Comprovante de Entrega da NF-e + + + + + + + + + + + + + + Versão do Aplicativo do Autor do Evento + + + + + Data e hora do final da tentativa entrega. Formato AAAA-MMDDThh:mm:ssTZD + + + + + + + Número da tentativa de entrega que não teve sucesso + + + + + + + + + + Motivo do insucesso - 1 – Recebedor não encontrado + 2 – Recusa do recebedor + 3 – Endereço inexistente + 4 – Outros (exige informar justificativa) + + + + + + + + + + + + + Justificativa do motivo do insucesso. Informar apenas para tpMotivo=4 + + + + + + + + + + + Latitude do ponto de entrega + + + + + Longitude do ponto de entrega + + + + + Hash (SHA1) no formato Base64 resultante da concatenação: Chave de acesso da NFe + Base64 da imagem capturada da entrega (Exemplo: imagem capturada da assinatura eletrônica, digital do recebedor, foto, etc) + O hashCSRT é o resultado das funções SHA-1 e base64 do token CSRT fornecido pelo fisco + chave de acesso do DF-e. (Implementação em futura NT) +Observação: 28 caracteres são representados no schema como 20 bytes do tipo base64Binary + + + + + + + + + + Data e hora da geração do hash da tentativa de entrega. Formato AAAA-MMDDThh:mm:ssTZD. + + + + + + + + + + + + + + + diff --git a/schemes/PL_009_V4/e110193_v1.00.xsd b/schemes/PL_009_V4/e110193_v1.00.xsd new file mode 100644 index 00000000..86db7e82 --- /dev/null +++ b/schemes/PL_009_V4/e110193_v1.00.xsd @@ -0,0 +1,40 @@ + + + + + + + Schema XML de validação do evento de Cancelamento do Comprovante de Entrega da NF-e + + + + + + + + + + + + + + Versão do Aplicativo do Autor do Evento + + + + + Número do Protocolo de Autorização do Evento da NF-e a que se refere este cancelamento. + + + + + + + + + + + + + + diff --git a/schemes/PL_009_V4/envEventoCancInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/envEventoCancInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..f2f3ee86 --- /dev/null +++ b/schemes/PL_009_V4/envEventoCancInsucessoNFe_v1.00.xsd @@ -0,0 +1,10 @@ + + + + + + + Schema XML de validação do lote de envio do evento de Cancelamento de Insucesso na Entrega da NF-e + + + diff --git a/schemes/PL_009_V4/envEventoInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/envEventoInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..65fb7c43 --- /dev/null +++ b/schemes/PL_009_V4/envEventoInsucessoNFe_v1.00.xsd @@ -0,0 +1,10 @@ + + + + + + + Schema XML de validação do lote de envio do evento de Insucesso na Entrega da NF-e + + + diff --git a/schemes/PL_009_V4/leiauteEventoCancInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/leiauteEventoCancInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..0bde4345 --- /dev/null +++ b/schemes/PL_009_V4/leiauteEventoCancInsucessoNFe_v1.00.xsd @@ -0,0 +1,297 @@ + + + + + + + + Tipo Evento + + + + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Identificação do autor do evento + + + + CNPJ + + + + + CPF + + + + + + Chave de Acesso da NF-e vinculada ao evento + + + + + Data de emissão no formato UTC. AAAA-MM-DDThh:mm:ssTZD + + + + + Tipo do Evento + + + + + + + + + + + + Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial. + + + + + + + + + + + Versão do Tipo do Evento + + + + + + + + + + + + + Identificador da TAG a ser assinada, a regra de formação do Id é: +“ID” + tpEvento + chave da NF-e + nSeqEvento + + + + + + + + + + + + + + + + Tipo Versão do Evento + + + + + + + + + Tipo retorno do Evento + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + Chave de Acesso NF-e vinculada + + + + + Tipo do Evento vinculado + + + + + + + + + + + Descrição do Evento + + + + + + + + + + + Seqüencial do evento + + + + + + + + + + + + Data e Hora de do recebimento do evento ou do registro do evento formato UTC AAAA-MM-DDThh:mm:ssTZD. + + + + + + + + + + + Número do protocolo de registro do evento + + + + + + + + + + + + + + + + + + + Tipo Lote de Envio + + + + + + + + + + + + + + + + + Tipo Versão do EnvEvento + + + + + + + + + Tipo Retorno de Lote de Envio + + + + + + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do òrgao que registrou o Evento + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + + + + + Tipo procEvento + + + + + + + + diff --git a/schemes/PL_009_V4/leiauteEventoInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/leiauteEventoInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..9ab61fe4 --- /dev/null +++ b/schemes/PL_009_V4/leiauteEventoInsucessoNFe_v1.00.xsd @@ -0,0 +1,297 @@ + + + + + + + + Tipo Evento + + + + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Identificação do autor do evento + + + + CNPJ + + + + + CPF + + + + + + Chave de Acesso da NF-e vinculada ao evento + + + + + Data de emissão no formato UTC. AAAA-MM-DDThh:mm:ssTZD + + + + + Tipo do Evento + + + + + + + + + + + + Seqüencial do evento para o mesmo tipo de evento. Para maioria dos eventos será 1, nos casos em que possa existir mais de um evento, como é o caso da carta de correção, o autor do evento deve numerar de forma seqüencial. + + + + + + + + + + + Versão do Tipo do Evento + + + + + + + + + + + + + Identificador da TAG a ser assinada, a regra de formação do Id é: +“ID” + tpEvento + chave da NF-e + nSeqEvento + + + + + + + + + + + + + + + + Tipo Versão do Evento + + + + + + + + + Tipo retorno do Evento + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 91 para identificar o Ambiente Nacional + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + Chave de Acesso NF-e vinculada + + + + + Tipo do Evento vinculado + + + + + + + + + + + Descrição do Evento + + + + + + + + + + + Seqüencial do evento + + + + + + + + + + + + Data e Hora de do recebimento do evento ou do registro do evento formato UTC AAAA-MM-DDThh:mm:ssTZD. + + + + + + + + + + + Número do protocolo de registro do evento + + + + + + + + + + + + + + + + + + + Tipo Lote de Envio + + + + + + + + + + + + + + + + + Tipo Versão do EnvEvento + + + + + + + + + Tipo Retorno de Lote de Envio + + + + + + + + + + + + + Identificação do Ambiente: +1 - Produção +2 - Homologação + + + + + Versão do Aplicativo que recebeu o Evento + + + + + Código do òrgao que registrou o Evento + + + + + Código do status da registro do Evento + + + + + Descrição literal do status do registro do Evento + + + + + + + + + Tipo procEvento + + + + + + + + diff --git a/schemes/PL_009_V4/procEventoCancInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/procEventoCancInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..eb013ba0 --- /dev/null +++ b/schemes/PL_009_V4/procEventoCancInsucessoNFe_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do proc do evento de Cancelamento do Insucesso na Entrega da NFe + + + diff --git a/schemes/PL_009_V4/procEventoInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/procEventoInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..b6834be2 --- /dev/null +++ b/schemes/PL_009_V4/procEventoInsucessoNFe_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de validação do proc Insucesso na Entrega da NFe + + + diff --git a/schemes/PL_009_V4/retEventoCancInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/retEventoCancInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..d832f623 --- /dev/null +++ b/schemes/PL_009_V4/retEventoCancInsucessoNFe_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de Retorno da envio do evento de Insucesso na Entrega da NFe + + + diff --git a/schemes/PL_009_V4/retEventoInsucessoNFe_v1.00.xsd b/schemes/PL_009_V4/retEventoInsucessoNFe_v1.00.xsd new file mode 100644 index 00000000..d832f623 --- /dev/null +++ b/schemes/PL_009_V4/retEventoInsucessoNFe_v1.00.xsd @@ -0,0 +1,9 @@ + + + + + + Schema XML de Retorno da envio do evento de Insucesso na Entrega da NFe + + + diff --git a/src/Tools.php b/src/Tools.php index 65edda6a..642273fa 100755 --- a/src/Tools.php +++ b/src/Tools.php @@ -40,6 +40,10 @@ class Tools extends ToolsCommon public const EVT_PRORROGACAO_2 = 111501; public const EVT_CANCELA_PRORROGACAO_1 = 111502; public const EVT_CANCELA_PRORROGACAO_2 = 111503; + public const EVT_INSUCESSO_ENTREGA = 110192; + public const EVT_CANCELA_INSUCESSO_ENTREGA = 110193; + public const EVT_CONCILIACAO = 110750; + public const EVT_CANCELA_CONCILIACAO = 110751; /** * Request authorization to issue NFe in batch with one or more documents @@ -701,7 +705,6 @@ public function sefazComprovanteEntrega(\stdClass $std): string $dt = new \DateTime('now', new \DateTimeZone($this->timezone)); $dt->setTimezone(new \DateTimeZone($this->timezone)); $datahash = $dt->format('Y-m-d\TH:i:sP'); - //$datahash = date('Y-m-d\TH:i:sP'); $cod = UFList::getCodeByUF($this->config->siglaUF); $cancelar = !empty($std->cancelar) ? $std->cancelar : false; if (!$cancelar) { @@ -734,6 +737,65 @@ public function sefazComprovanteEntrega(\stdClass $std): string ); } + /** + * Request event of delivery failure or cancellation of registered delivery failure event + * @param \stdClass $std + * @return string + * @throws \Exception + */ + public function sefazInsucessoEntrega(\stdClass $std): string + { + if (empty($std->verAplic) && !empty($this->verAplic)) { + $std->verAplic = $this->verAplic; + } + $tpEvento = self::EVT_INSUCESSO_ENTREGA; + $cod = UFList::getCodeByUF($this->config->siglaUF); + $tagAdic = "{$cod}" + . "{$std->verAplic}"; + if (!$std->cancelar) { + $tagAdic .= "{$std->data_tentativa}"; + + $n = null; + if (!empty($std->tentativas) && is_numeric($std->tentativas)) { + $n = (int)$std->tentativas; + } + if (!empty($n)) { + $tagAdic .= "{$n}"; + } + + $tagAdic .= "{$std->tipo_motivo}"; + $justificativa = null; + if ($std->tipo_motivo == 4) { + $justificativa = Strings::replaceUnacceptableCharacters(substr(trim($std->justificativa), 0, 250)); + } + if (!empty($justificativa)) { + $tagAdic .= "{$justificativa}"; + } + + if (!empty($std->latitude) && !empty($std->longitude)) { + $tagAdic .= "{$std->latitude}" + . "{$std->longitude}"; + } + $hash = base64_encode(sha1($std->chNFe . $std->imagem, true)); + + $dt = new \DateTime('now', new \DateTimeZone($this->timezone)); + $dt->setTimezone(new \DateTimeZone($this->timezone)); + $datahash = $dt->format('Y-m-d\TH:i:sP'); + $tagAdic .= "{$hash}" + . "{$datahash}"; + } else { + $tpEvento = self::EVT_CANCELA_INSUCESSO_ENTREGA; + $tagAdic .= "{$std->protocolo}"; + } + return $this->sefazEvento( + 'AN', + $std->chNFe, + $tpEvento, + $std->nSeqEvento, + $tagAdic + ); + } + /** * Send event to SEFAZ in batch * @param string $uf @@ -937,6 +999,8 @@ public function sefazEvento( self::EVT_CANCELA_PRORROGACAO_1 => ['versao' => '1.00', 'nome' => 'envRemIndus'], self::EVT_CANCELA_PRORROGACAO_2 => ['versao' => '1.00', 'nome' => 'envRemIndus'], self::EVT_EPEC => ['versao' => '1.00', 'nome' => 'envEPEC'], + self::EVT_INSUCESSO_ENTREGA => ['versao' => '1.00', 'nome' => 'envEventoInsucessoNFe'], + self::EVT_CANCELA_INSUCESSO_ENTREGA => ['versao' => '1.00', 'nome' => 'envEventoCancInsucessoNFe'], ]; $verEvento = $this->urlVersion; if (!empty($eventos[$tpEvento])) { @@ -970,6 +1034,7 @@ public function sefazEvento( . "$tpEvento" . "$nSeqEvento" . "$verEvento" + //em alguns casos haverá um verAplic nesta posição ??? ver xsd conciliação . "" . "$descEvento" . "$tagAdic" @@ -1221,6 +1286,14 @@ private function tpEv(int $tpEvento): \stdClass $std->alias = 'EvAtorInteressado'; $std->desc = 'Ator interessado na NF-e'; break; + case self::EVT_INSUCESSO_ENTREGA: + $std->alias = 'EventoInsucessoNFe'; + $std->desc = 'Insucesso na Entrega da NF-e'; + break; + case self::EVT_CANCELA_INSUCESSO_ENTREGA: + $std->alias = 'EventoCancInsucessoNFe'; + $std->desc = 'Cancelamento Insucesso na Entrega da NF-e'; + break; default: $msg = "O código do tipo de evento informado não corresponde a " . "nenhum evento estabelecido.";