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.";