diff --git a/examples/5.0testSefazCadastro.php b/examples/5.0testSefazCadastro.php
index 4f75079a..609057c6 100755
--- a/examples/5.0testSefazCadastro.php
+++ b/examples/5.0testSefazCadastro.php
@@ -8,8 +8,8 @@
use NFePHP\Common\Soap\SoapCurl;
//tanto o config.json como o certificado.pfx podem estar
-//armazenados em uma base de dados, então não é necessário
-///trabalhar com arquivos, este script abaixo serve apenas como
+//armazenados em uma base de dados, então não é necessário
+///trabalhar com arquivos, este script abaixo serve apenas como
//exemplo durante a fase de desenvolvimento e testes.
$arr = [
"atualizacao" => "2016-11-03 18:01:21",
@@ -27,21 +27,24 @@
"proxyPort" => "",
"proxyUser" => "",
"proxyPass" => ""
- ]
+ ]
];
//monta o config.json
$configJson = json_encode($arr);
//carrega o conteudo do certificado.
-$content = file_get_contents('expired_certificate.pfx');
+$content = file_get_contents('fixtures/expired_certificate.pfx');
+$soap = new \NFePHP\Common\Soap\SoapFake();
+$soap->disableCertValidation(true);
$tools = new Tools($configJson, Certificate::readPfx($content, 'associacao'));
+$tools->loadSoapClass($soap);
-//Somente para modelo 55, o modelo 65 evidentemente não possue
+//Somente para modelo 55, o modelo 65 evidentemente não possue
//esse tipo de serviço
$tools->model('55');
-//coloque a UF e escolha entre
+//coloque a UF e escolha entre
//CNPJ
//IE
//CPF
@@ -53,6 +56,6 @@
$cpf = '';
$response = $tools->sefazCadastro($uf, $cnpj, $iest, $cpf);
-header('Content-type: text/xml; charset=UTF-8');
-echo $response;
+echo \NFePHP\NFe\Common\FakePretty::prettyPrint($response);
+
diff --git a/examples/5.0testSefazCancela.php b/examples/5.0testSefazCancela.php
index 549b79b9..f5aa7ee8 100755
--- a/examples/5.0testSefazCancela.php
+++ b/examples/5.0testSefazCancela.php
@@ -9,15 +9,15 @@
use NFePHP\NFe\Complements;
//tanto o config.json como o certificado.pfx podem estar
-//armazenados em uma base de dados, então não é necessário
-///trabalhar com arquivos, este script abaixo serve apenas como
+//armazenados em uma base de dados, então não é necessário
+///trabalhar com arquivos, este script abaixo serve apenas como
//exemplo durante a fase de desenvolvimento e testes.
$arr = [
"atualizacao" => "2016-11-03 18:01:21",
"tpAmb" => 2,
"razaosocial" => "SUA RAZAO SOCIAL LTDA",
"cnpj" => "99999999999999",
- "siglaUF" => "SP",
+ "siglaUF" => "MG",
"schemes" => "PL_009_V4",
"versao" => '4.00',
"tokenIBPT" => "AAAAAAA",
@@ -28,26 +28,34 @@
"proxyPort" => "",
"proxyUser" => "",
"proxyPass" => ""
- ]
+ ]
];
//monta o config.json
$configJson = json_encode($arr);
//carrega o conteudo do certificado.
-$content = file_get_contents('expired_certificate.pfx');
+$content = file_get_contents('fixtures/expired_certificate.pfx');
try {
+ $soap = new \NFePHP\Common\Soap\SoapFake();
+ $soap->disableCertValidation(true);
+
+
$tools = new Tools($configJson, Certificate::readPfx($content, 'associacao'));
+ $tools->loadSoapClass($soap);
$tools->model('55');
-
- $chave = '35170399999999999999550010000000301000000300';
+
+ $chave = '31170399999999999999550010000000301000000300';
$xJust = 'Desistencia do comprador no momento da retirada';
$nProt = '135170001136476';
$response = $tools->sefazCancela($chave, $xJust, $nProt);
-
+
+ echo \NFePHP\NFe\Common\FakePretty::prettyPrint($response);
+
+ /*
//você pode padronizar os dados de retorno atraves da classe abaixo
//de forma a facilitar a extração dos dados do XML
- //NOTA: mas lembre-se que esse XML muitas vezes será necessário,
+ //NOTA: mas lembre-se que esse XML muitas vezes será necessário,
// quando houver a necessidade de protocolos
$stdCl = new Standardize($response);
//nesse caso $std irá conter uma representação em stdClass do XML retornado
@@ -56,7 +64,7 @@
$arr = $stdCl->toArray();
//nesse caso o $json irá conter uma representação em JSON do XML retornado
$json = $stdCl->toJson();
-
+
//verifique se o evento foi processado
if ($std->cStat != 128) {
//houve alguma falha e o evento não foi processado
@@ -68,10 +76,10 @@
$xml = Complements::toAuthorize($tools->lastRequest, $response);
//grave o XML protocolado e prossiga com outras tarefas de seu aplicativo
} else {
- //houve alguma falha no evento
+ //houve alguma falha no evento
//TRATAR
}
- }
+ }*/
} catch (\Exception $e) {
echo $e->getMessage();
//TRATAR
diff --git a/fake/fakeSefazConcilicacao.php b/fake/fakeSefazConcilicacao.php
new file mode 100644
index 00000000..435b03b9
--- /dev/null
+++ b/fake/fakeSefazConcilicacao.php
@@ -0,0 +1,127 @@
+ "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" => ""
+ ]
+ ];
+ $configJson = json_encode($arr);
+ $soap = new SoapFake();
+ $soap->disableCertValidation(true);
+
+ $content = file_get_contents('expired_certificate.pfx');
+ $tools = new Tools($configJson, Certificate::readPfx($content, 'associacao'));
+ $tools->model('55');
+ $tools->setVerAplic('5.1.34');
+ $tools->loadSoapClass($soap);
+
+ $std = new \stdClass();
+ //$std->verAplic = '1.2.3'; //opcional se declarado anteriormente - versão da aplicação que está gerando o evento
+ $std->nSeqEvento = 1;
+ $std->chNFe = '12345678901234567890123456789012345678901234'; //chave de 44 digitos da nota do fornecedor
+ $std->detPag[0] = new \stdClass();
+ $std->detPag[0]->indPag = null; //opcional 0-Pagamento à Vista; 1-Pagamento à Prazo
+ $std->detPag[0]->tPag = '04'; //Obrigatório forma de pagamento
+ // '01' => 'Dinheiro',
+ // '02' => 'Cheque',
+ // '03' => 'Cartão de Crédito',
+ // '04' => 'Cartão de Débito',
+ // '05' => 'Cartão da Loja',
+ // '10' => 'Vale Alimentação',
+ // '11' => 'Vale Refeição',
+ // '12' => 'Vale Presente',
+ // '13' => 'Vale Combustível',
+ // '14' => 'Duplicata Mercantil',
+ // '15' => 'Boleto',
+ // '16' => 'Depósito Bancário',
+ // '17' => 'PIX Dinâmico',
+ // '18' => 'Transferência bancária, Carteira Digital',
+ // '19' => 'Programa fidelidade, Cashback, Créd Virt',
+ // '20' => 'PIX Estático',
+ // '21' => 'Crédito em Loja',
+ // '22' => 'Pagamento Eletrônico não Informado - Falha de hardware',
+ // '90' => 'Sem pagamento',
+ // '99' => 'Outros'
+ $std->detPag[0]->xPag = null; //opcional de 2 a 50 caracteres, usar quando tPag == 99
+ $std->detPag[0]->vPag = 102.34; //Obrigatório valor pago
+ $std->detPag[0]->dPag = '2024-07-30'; //Obrigatório data do pagamento
+
+ //grupo OPCIONAL de informações sobre envolvidos no pagamento
+ $std->detPag[0]->CNPJPag = '12345678901234'; //opcional, caso seja informado a UFPag também deverá ser informada
+ // CNPJ transacional do pagamento - Preencher informando o CNPJ do estabelecimento onde o pagamento foi
+ // processado/transacionado/recebido quando a emissão do documento fiscal ocorrer em estabelecimento distinto
+ $std->detPag[0]->UFPag = 'SP'; //opcional, caso seja informado a CNPJPag também deverá ser informada
+ // UF do CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido
+ $std->detPag[0]->CNPJIF = '11111111111111'; //opcinal
+ //CNPJ da instituição financeira, de pagamento, adquirente ou subadquirente.
+ $std->detPag[0]->tBand = '20'; //opcional Bandeira da operadora de cartão
+ //01 Visa
+ //02 Mastercard
+ //03 American Express
+ //04 Sorocred
+ //05 Diners Club
+ //06 Elo
+ //07 Hipercard
+ //08 Aura
+ //09 Cabal
+ //10 Alelo
+ //11 Banes Card
+ //12 CalCard
+ //13 Credz
+ //14 Discover
+ //15 GoodCard
+ //16 GreenCard
+ //17 Hiper
+ //18 JcB
+ //19 Mais
+ //20 MaxVan
+ //21 Policard
+ //22 RedeCompras
+ //23 Sodexo
+ //24 ValeCard
+ //25 Verocheque
+ //26 VR
+ //27 Ticket
+ //99 Outros
+ $std->detPag[0]->cAut = 'a23232-49329fed'; //opcional Número de autorização da operação com cartões, PIX, boletos e outros
+ // pagamentos eletrônicos
+
+ //grupo OPCIONAL de informações sobre o
+ $std->detPag[0]->CNPJReceb = '09876543210987';//opcional CNPJ do estab. benefic. do pag., se informado informar também a UFReceb
+ $std->detPag[0]->UFReceb = 'CE'; //opcional se informado informar também a CNPJReceb
+
+ $std->cancelar = false; //permite cancelar um registro de conciliação financeira anterior
+
+ //para cancelar
+ //$std->cancela = true;
+ //$std->protocolo = '750123456789012';
+
+ $response = $tools->sefazConciliacao($std);
+
+ echo FakePretty::prettyPrint($response);
+} catch (\Exception $e) {
+ echo $e->getMessage();
+}
diff --git a/schemes/PL_009_V4/EventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/EventoCancEConf_v1.00.xsd
new file mode 100644
index 00000000..662ea235
--- /dev/null
+++ b/schemes/PL_009_V4/EventoCancEConf_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/EventoEConf_v1.00.xsd b/schemes/PL_009_V4/EventoEConf_v1.00.xsd
new file mode 100644
index 00000000..713a60fa
--- /dev/null
+++ b/schemes/PL_009_V4/EventoEConf_v1.00.xsd
@@ -0,0 +1,9 @@
+
+
+
+
+
+ Schema XML de validação do evento de Conciliação Financeira
+
+
+
diff --git a/schemes/PL_009_V4/e110750_v1.00.xsd b/schemes/PL_009_V4/e110750_v1.00.xsd
new file mode 100644
index 00000000..3633a856
--- /dev/null
+++ b/schemes/PL_009_V4/e110750_v1.00.xsd
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+ Schema XML de validação do evento de Conciliação Financeira – ECONF
+
+
+
+
+
+
+
+
+
+
+
+
+ Versão do Aplicativo do Autor do Evento
+
+
+
+
+ Grupo de detalhamento da forma de pagamento.
+
+
+
+
+
+ Indicador da Forma de Pagamento:0-Pagamento à Vista;1-Pagamento à Prazo;
+
+
+
+
+
+
+
+
+
+
+
+ Forma de Pagamento:
+
+
+
+
+
+
+
+
+
+
+ Descrição do Meio de Pagamento
+
+
+
+
+
+
+
+
+
+
+ Valor do Pagamento. Esta tag poderá ser omitida quando a tag tPag=90 (Sem Pagamento), caso contrário deverá ser preenchida.
+
+
+
+
+ Data do Pagamento
+
+
+
+
+
+ CNPJ transacional do pagamento - Preencher informando o CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido quando a emissão do documento fiscal ocorrer em estabelecimento distinto
+
+
+
+
+ UF do CNPJ do estabelecimento onde o pagamento foi processado/transacionado/recebido.
+
+
+
+
+ CNPJ da instituição financeira, de pagamento, adquirente ou subadquirente.
+
+
+
+
+ Bandeira da operadora de cartão
+
+
+
+
+
+
+
+
+
+
+ Número de autorização da operação com cartões, PIX, boletos e outros pagamentos eletrônicos
+
+
+
+
+
+
+
+
+
+
+
+
+ Informar o CNPJ do estabelecimento beneficiário do pagamento
+
+
+
+
+ UF do CNPJ do estabelecimento beneficiário do pagamento..
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/schemes/PL_009_V4/e110751_v1.00.xsd b/schemes/PL_009_V4/e110751_v1.00.xsd
new file mode 100644
index 00000000..7543784a
--- /dev/null
+++ b/schemes/PL_009_V4/e110751_v1.00.xsd
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ 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/envEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/envEventoCancEConf_v1.00.xsd
new file mode 100644
index 00000000..bb050869
--- /dev/null
+++ b/schemes/PL_009_V4/envEventoCancEConf_v1.00.xsd
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Schema XML de validação do lote de envio do evento de Cancelamento de Conciliação Financeira
+
+
+
diff --git a/schemes/PL_009_V4/envEventoEConf_v1.00.xsd b/schemes/PL_009_V4/envEventoEConf_v1.00.xsd
new file mode 100644
index 00000000..f4e5a28a
--- /dev/null
+++ b/schemes/PL_009_V4/envEventoEConf_v1.00.xsd
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Schema XML de validação do lote de envio do evento de Conciliação Financeira
+
+
+
diff --git a/schemes/PL_009_V4/leiauteEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/leiauteEventoCancEConf_v1.00.xsd
new file mode 100644
index 00000000..710d25de
--- /dev/null
+++ b/schemes/PL_009_V4/leiauteEventoCancEConf_v1.00.xsd
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+ Tipo Evento
+
+
+
+
+
+
+
+ Código do órgão de recepção do Evento. Utilizar a Tabela do IBGE extendida, utilizar 90 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 90 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/leiauteEventoEConf_v1.00.xsd b/schemes/PL_009_V4/leiauteEventoEConf_v1.00.xsd
new file mode 100644
index 00000000..fe9d449d
--- /dev/null
+++ b/schemes/PL_009_V4/leiauteEventoEConf_v1.00.xsd
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+ 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/procEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/procEventoCancEConf_v1.00.xsd
new file mode 100644
index 00000000..df783064
--- /dev/null
+++ b/schemes/PL_009_V4/procEventoCancEConf_v1.00.xsd
@@ -0,0 +1,9 @@
+
+
+
+
+
+ Schema XML de validação do proc do evento de Cancelamento de Conciliação financeira
+
+
+
diff --git a/schemes/PL_009_V4/procEventoEConf_v1.00.xsd b/schemes/PL_009_V4/procEventoEConf_v1.00.xsd
new file mode 100644
index 00000000..d2607121
--- /dev/null
+++ b/schemes/PL_009_V4/procEventoEConf_v1.00.xsd
@@ -0,0 +1,9 @@
+
+
+
+
+
+ Schema XML de validação do proc do Evento de Conciliação Financeira
+
+
+
diff --git a/schemes/PL_009_V4/retEventoCancEConf_v1.00.xsd b/schemes/PL_009_V4/retEventoCancEConf_v1.00.xsd
new file mode 100644
index 00000000..88791095
--- /dev/null
+++ b/schemes/PL_009_V4/retEventoCancEConf_v1.00.xsd
@@ -0,0 +1,9 @@
+
+
+
+
+
+ Schema XML de Retorno da envio do evento de Cancelamento de Conciliação Financeira
+
+
+
diff --git a/schemes/PL_009_V4/retEventoEConf_v1.00.xsd b/schemes/PL_009_V4/retEventoEConf_v1.00.xsd
new file mode 100644
index 00000000..83b7352f
--- /dev/null
+++ b/schemes/PL_009_V4/retEventoEConf_v1.00.xsd
@@ -0,0 +1,9 @@
+
+
+
+
+
+ Schema XML de Retorno da envio do evento de Conciliação Financeira
+
+
+
diff --git a/src/Tools.php b/src/Tools.php
index dc3aac15..96ab0d38 100755
--- a/src/Tools.php
+++ b/src/Tools.php
@@ -16,6 +16,7 @@
namespace NFePHP\NFe;
+use NFePHP\Common\DOMImproved;
use NFePHP\Common\Strings;
use NFePHP\Common\Signer;
use NFePHP\Common\UFList;
@@ -843,6 +844,47 @@ public function sefazInsucessoEntrega(
);
}
+ /**
+ * Request event of financial reconciliation
+ * @param \stdClass $std
+ * @param \DateTimeInterface|null $dhEvento
+ * @param string|null $lote
+ * @return string
+ * @throws \DOMException
+ */
+ public function sefazConciliacao(
+ \stdClass $std,
+ ?\DateTimeInterface $dhEvento = null,
+ ?string $lote = null
+ ): string {
+ if (empty($std->verAplic) && !empty($this->verAplic)) {
+ $std->verAplic = $this->verAplic;
+ }
+ $tpEvento = self::EVT_CONCILIACAO;
+ $cod = UFList::getCodeByUF($this->config->siglaUF);
+ $tagAdic = "{$std->verAplic}";
+ if (!empty($std->detPag) && is_array($std->detPag)) {
+ foreach ($std->detPag as $pag) {
+ $tagAdic .= $this->tagdetPag($pag);
+ }
+ }
+ //cancela um evento anterior de conciliação financeira
+ if ($std->cancela) {
+ $tpEvento = self::EVT_CANCELA_CONCILIACAO;
+ $tagAdic = "{$std->verAplic}"
+ . "{$std->protocolo}";
+ }
+ return $this->sefazEvento(
+ 'AN',
+ $std->chNFe,
+ $tpEvento,
+ $std->nSeqEvento,
+ $tagAdic,
+ $dhEvento,
+ $lote
+ );
+ }
+
/**
* Send event to SEFAZ in batch
* @param string $uf
@@ -1059,6 +1101,8 @@ public function sefazEvento(
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'],
+ self::EVT_CONCILIACAO => ['versao' => '1.00', 'nome' => 'envEventoEConf'],
+ self::EVT_CANCELA_CONCILIACAO => ['versao' => '1.00', 'nome' => 'envEventoCancEConf'],
];
$verEvento = $this->urlVersion;
if (!empty($eventos[$tpEvento])) {
@@ -1357,6 +1401,14 @@ private function tpEv(int $tpEvento): \stdClass
$std->alias = 'EventoCancInsucessoNFe';
$std->desc = 'Cancelamento Insucesso na Entrega da NF-e';
break;
+ case self::EVT_CONCILIACAO:
+ $std->alias = 'EventoEConf';
+ $std->desc = 'ECONF';
+ break;
+ case self::EVT_CANCELA_CONCILIACAO:
+ $std->alias = 'EventoCancEConf';
+ $std->desc = 'Cancelamento Conciliação Financeira';
+ break;
default:
$msg = "O código do tipo de evento informado não corresponde a "
. "nenhum evento estabelecido.";
@@ -1364,4 +1416,95 @@ private function tpEv(int $tpEvento): \stdClass
}
return $std;
}
+
+ /**
+ * Cria detPag para Consciliação financeira
+ * @param \stdClass $pag
+ * @return false|string
+ * @throws \DOMException
+ */
+ private function tagdetPag(\stdClass $pag)
+ {
+ $dom = new DOMImproved('1.0', 'UTF-8');
+ $dom->preserveWhiteSpace = false;
+ $dom->formatOutput = false;
+ $node = $dom->createElement('detPag');
+ $dom->addChild(
+ $node,
+ "indPag",
+ $pag->indPag ?? null,
+ false
+ );
+ $dom->addChild(
+ $node,
+ "tPag",
+ $pag->tPag ?? '',
+ true
+ );
+ $dom->addChild(
+ $node,
+ "xPag",
+ !empty($pag->xPag) ? Strings::replaceUnacceptableCharacters($pag->xPag) : null,
+ false
+ );
+ $dom->addChild(
+ $node,
+ "vPag",
+ number_format($pag->vPag, 2, '.', ''),
+ true
+ );
+ $dom->addChild(
+ $node,
+ "dPag",
+ $pag->dPag ?? '',
+ true
+ );
+ if (!empty($pag->CNPJPag) && !empty($pag->UFPag)) {
+ $dom->addChild(
+ $node,
+ "CNPJPag",
+ $pag->CNPJPag,
+ true
+ );
+ $dom->addChild(
+ $node,
+ "UFPag",
+ $pag->UFPag,
+ true
+ );
+ $dom->addChild(
+ $node,
+ "CNPJIF",
+ $pag->CNPJIF ?? null,
+ false
+ );
+ }
+ $dom->addChild(
+ $node,
+ "tBand",
+ $pag->tBand ?? null,
+ false
+ );
+ $dom->addChild(
+ $node,
+ "cAut",
+ $pag->cAut ?? null,
+ false
+ );
+ if (!empty($pag->CNPJReceb) && !empty($pag->UFReceb)) {
+ $dom->addChild(
+ $node,
+ "CNPJReceb",
+ $pag->CNPJReceb,
+ true
+ );
+ $dom->addChild(
+ $node,
+ "UFReceb",
+ $pag->UFReceb,
+ true
+ );
+ }
+ return $dom->saveXML($node);
+ }
}