diff --git a/fake/fakeSefazCancela.php b/fake/fakeSefazCancela.php index af11b591..e4b8811e 100755 --- a/fake/fakeSefazCancela.php +++ b/fake/fakeSefazCancela.php @@ -16,7 +16,7 @@ "tpAmb" => 2, "razaosocial" => "SUA RAZAO SOCIAL LTDA", "cnpj" => "99999999999999", - "siglaUF" => "SP", + "siglaUF" => "AM", "schemes" => "PL_009_V4", "versao" => '4.00', "tokenIBPT" => "AAAAAAA", @@ -35,17 +35,17 @@ $content = file_get_contents('expired_certificate.pfx'); $tools = new Tools($configJson, Certificate::readPfx($content, 'associacao')); - $tools->model('55'); + $tools->model('65'); $tools->setVerAplic('5.1.34'); $tools->loadSoapClass($soap); - $chave = '35345678901234567890123456789012345678901234'; + $chave = '13345678901234567890123456789012345678901234'; $justificativa = 'nfe com erros de digitação'; $nProt = '123456789012345'; $response = $tools->sefazCancela($chave, $justificativa, $nProt); - + echo FakePretty::prettyPrint($response); - + } catch (\Exception $e) { echo $e->getMessage(); -} \ No newline at end of file +} diff --git a/fake/fakeSefazConcilicacao.php b/fake/fakeSefazConcilicacao.php index 435b03b9..7bf8aa0a 100644 --- a/fake/fakeSefazConcilicacao.php +++ b/fake/fakeSefazConcilicacao.php @@ -15,7 +15,7 @@ "tpAmb" => 2, "razaosocial" => "SUA RAZAO SOCIAL LTDA", "cnpj" => "99999999999999", - "siglaUF" => "SP", + "siglaUF" => "MG", "schemes" => "PL_009_V4", "versao" => '4.00', "tokenIBPT" => "AAAAAAA", @@ -70,13 +70,17 @@ $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 diff --git a/fake/fakeSefazDistDfe.php b/fake/fakeSefazDistDfe.php index 3a9a2315..65940206 100755 --- a/fake/fakeSefazDistDfe.php +++ b/fake/fakeSefazDistDfe.php @@ -40,12 +40,12 @@ $tools->loadSoapClass($soap); $ultNSU = 0; - $numNSU = null; + $numNSU = 0; $response = $tools->sefazDistDFe($ultNSU, $numNSU); echo FakePretty::prettyPrint($response); - + } catch (\Exception $e) { echo $e->getMessage(); -} \ No newline at end of file +} diff --git a/fake/fakeSefazManifesta.php b/fake/fakeSefazManifesta.php index 4b4fb2b0..a4dc8101 100755 --- a/fake/fakeSefazManifesta.php +++ b/fake/fakeSefazManifesta.php @@ -38,14 +38,14 @@ $tools->model('55'); $tools->setVerAplic('5.1.34'); $tools->loadSoapClass($soap); - + $chave = "35345678901234567890123456789012345678901234"; - $justificativa = null; + $justificativa = ''; $tipo = $tools::EVT_CIENCIA; $response = $tools->sefazManifesta($chave, $tipo, $justificativa); echo FakePretty::prettyPrint($response); - + } catch (\Exception $e) { echo $e->getMessage(); -} \ No newline at end of file +} diff --git a/src/Common/Tools.php b/src/Common/Tools.php index 3e3dd7bf..e7f37648 100755 --- a/src/Common/Tools.php +++ b/src/Common/Tools.php @@ -456,9 +456,14 @@ protected function servico(string $service, string $uf, $tpAmb, bool $ignoreCont throw new \RuntimeException("Servico [$service] indisponivel UF [$uf] ou modelo [$this->modelo]"); } } - $this->urlcUF = $this->getcUF($uf); //recuperação do cUF - if ($this->urlcUF > 91) { - $this->urlcUF = $this->getcUF($this->config->siglaUF); //foi solicitado dado de SVCRS ou SVCAN + //NT 2024.002 1.00 Maio/2024, comentário P08 elemento cOrgao + if ($uf === 'SVRS') { + $this->urlcUF = 92; + } else { + $this->urlcUF = $this->getcUF($uf); //recuperação do cUF + if ($this->urlcUF > 91) { + $this->urlcUF = $this->getcUF($this->config->siglaUF); //foi solicitado dado de SVCRS ou SVCAN + } } $this->urlVersion = $stdServ->$service->version; //recuperação da versão $this->urlService = $stdServ->$service->url; //recuperação da url do serviço diff --git a/src/Common/Webservices.php b/src/Common/Webservices.php index 91bae1d2..352e0e43 100755 --- a/src/Common/Webservices.php +++ b/src/Common/Webservices.php @@ -40,12 +40,7 @@ public function __construct(string $xml) */ public function get(string $sigla, $amb, int $modelo): \stdClass { - $autfile = realpath(__DIR__ . '/../../storage/autorizadores.json'); - $autorizadores = json_decode(file_get_contents($autfile), true); - if (!key_exists($sigla, $autorizadores[$modelo])) { - throw new \RuntimeException("Nao existe autorizador [$sigla] para os webservices do modelo [$modelo]"); - } - $auto = $autorizadores[$modelo][$sigla]; + $auto = self::getAuth($sigla, $modelo); if (empty($auto) || empty($this->std)) { throw new \RuntimeException('Falhou autorizador, parece vazio'); } @@ -72,6 +67,22 @@ public function get(string $sigla, $amb, int $modelo): \stdClass return $svw; } + /** + * Obtem a sigla do autorizador para um estado origem e modelo de documento fiscal + * @param string $sigla + * @param int $modelo + * @return string + */ + public static function getAuth(string $sigla, int $modelo): string + { + $autfile = realpath(__DIR__ . '/../../storage/autorizadores.json'); + $autorizadores = json_decode(file_get_contents($autfile), true); + if (!key_exists($sigla, $autorizadores[$modelo])) { + throw new \RuntimeException("Nao existe autorizador [$sigla] para os webservices do modelo [$modelo]"); + } + return $autorizadores[$modelo][$sigla]; + } + /** * Return WS parameters in a stdClass */ diff --git a/src/Tools.php b/src/Tools.php index 96ab0d38..5b22d75a 100755 --- a/src/Tools.php +++ b/src/Tools.php @@ -21,6 +21,7 @@ use NFePHP\Common\Signer; use NFePHP\Common\UFList; use NFePHP\NFe\Common\Tools as ToolsCommon; +use NFePHP\NFe\Common\Webservices; use NFePHP\NFe\Traits\TraitEPECNfce; use RuntimeException; use InvalidArgumentException; @@ -869,13 +870,24 @@ public function sefazConciliacao( } } //cancela um evento anterior de conciliação financeira - if ($std->cancela) { + if ($std->cancelar) { $tpEvento = self::EVT_CANCELA_CONCILIACAO; $tagAdic = "{$std->verAplic}" . "{$std->protocolo}"; } + /* + NT 2024.002 1.00 Maio/2024, comentário P08 elemento cOrgao + Se for referente a uma NFe (mod 55) usar a SVRS + Se for referente a uma BFCe (mod 65) usar a URL normal + */ + $uf = $this->config->siglaUF; + if ((int)$this->modelo === 55) { + $uf = 'SVRS'; + } else { + $uf = Webservices::getAuth($uf, $this->modelo); + } return $this->sefazEvento( - 'AN', + $uf, $std->chNFe, $tpEvento, $std->nSeqEvento, @@ -1124,7 +1136,12 @@ public function sefazEvento( } $sSeqEvento = str_pad((string)$nSeqEvento, 2, "0", STR_PAD_LEFT); $eventId = "ID" . $tpEvento . $chave . $sSeqEvento; - $cOrgao = UFList::getCodeByUF($uf); + //NT 2024.002 versão 1.00 - Maio 2024, comentário P08 elemento cOrgao + if ($tpEvento === self::EVT_CONCILIACAO && $uf === 'SVRS') { + $cOrgao = 92; + } else { + $cOrgao = UFList::getCodeByUF($uf); + } $request = "urlPortal\" versao=\"$this->urlVersion\">" . "" . "$cOrgao" @@ -1139,7 +1156,6 @@ public function sefazEvento( . "$tpEvento" . "$nSeqEvento" . "$verEvento" - //em alguns casos haverá um verAplic nesta posição ??? ver xsd conciliação . "" . "$descEvento" . "$tagAdic" @@ -1170,7 +1186,6 @@ public function sefazEvento( $this->isValid($this->urlVersion, $request, 'envEvento'); } $this->lastRequest = $request; - //return $request; $parameters = ['nfeDadosMsg' => $request]; $body = "urlNamespace\">$request"; $this->lastResponse = $this->sendRequest($body, $parameters);