Closed JulianoAmaralChaves closed 8 years ago
algo do tipo if(file_exists($nfeXML)) -> loadxmlfile else -> loadxmlstring
Sim ... é bem possível fazer isso !! não quer propor um "PULL REQUEST" ?
Eu não sei muito como propor um "PULL REQUEST", mas acho que consegui, pelo menos foi o que aparentou ter acontecido, caso não tenha conseguido e alguém puder me orientar com faz para criar uma "PULL REQUEST" ficarei grato
@JulianoAmaralChaves é exatamente o que fez! 👍 PR #809
@JulianoAmaralChaves só ajustar a identação do código (para seguir o mesmo padrão do que já usamos), como você ainda precisa ajustar, pode colocar no comentário do commit: fix #809
isso fará com que após seu PR seja merged, fecha essa issue 😉
@JulianoAmaralChaves Isso foi bem inteligente, parabéns, com certeza e bem mais rápido ler variável do quer um I/O no disco para ler o arquivo, considerando que praticamente qualquer aplicação que for utilizar a API vai fazer uso de BD.
Mas particularmente nesse seu código, você esqueceu de considerar o "Tempo médio de resposta do serviço (tMed)" retornado na consulta de Recibo, provavelmente em seu teste não deu falha por que na maior parte do tempo o valor é de 1s (ainda mais se o ambiente for Homologação), mas se ocorrer da WebService esta congestionada e esse tMed for de 5s por exemplo, seu código não vai conseguir protocolar e imprimir a Danfe, e se sua aplicação executar novamente o código vai reenviar o lote e receber um novo recibo, e se esse recibo ainda estiver com tMed alto, não vai conseguir protocolar e imprimir a Danfe novamente é isso se repete até o tMed abaixar para 1s.
sugiro (nesse seu código especifico...) colocar um sleep(tMed)
após o envio do lote, evitando assim que a sua consulta de recibo seja mais rápida que a fila de processamento dos servidores da SEFAZ.
Obs: é claro que você vai precisar extrair o valor tMed do XML e só assim informar no parâmetro os segundos...
@chinnonsantos discordo da sua colocação sobre o sleep
, pois essa biblioteca não deveria fazer este tipo de tratamento (isso pode ser facilmente resolvido com rotinas de cron ou fila)
a meu ver, sleep é um recurso que nunca deveria ser usado para este tipo de rotina, é mais seguro seguimentar a comunicação ou fazer isso de forma encadeada (tipo, já gerei a nfe e agora posso protocolar)
@robmachado estou falando besteira?
Não Antonio sua colocação está CORRETISSIMA Não existe nenhum local em toda a API que poderia ser usado um comando sleep() !! Não podem existir invocações ou chamadas concatenadas em uma API isso é tarefa do APLICATIVO que usar a API.
Linha 12 do meu comentário => 'sugiro (nesse seu código especifico...)...'
é obvio que isso é uma página de teste com todos os métodos para emitir a NF-e em sequência, ninguém colocar isso em produção... e logicamente ninguém vai fazer um Pull Request disso também... ¬¬'
Isso já está incluso no método addProtocol() podendo receber como parametro tanto um arquivo como uma string com o xml.
Olá
Me deparei com uma situação que acredito possa ser melhorada, a situação é a seguinte:
após a chamada da função "sefazEnviaLote()" preciso acrescentar o protocolo no XML para poder imprimir o DANFe, a questão é que a função "addProtocolo()" pede os CAMINHOS do XMLs da NF-e e do protocolo, e é este o ponto, reescrevi a função "addProtocolo()" com o nome de "addProtocoloXML()" e ao invés de pedir os caminhos como parâmetro, a função pede o próprio XML, desta forma não preciso manipular os arquivos em disco e posso fazer todo o procedimento da seguinte forma:
$toolsNFe->sefazEnviaLote($xml, $tpAmb, $idLote, $resposta, $indSinc, $flagZip);
$protXML = $toolsNFe->sefazConsultaRecibo($resposta['nRec'], $tpAmb);
$nfeXML = $toolsNFe->addProtocoloXML($xml, $protXML , false);
Assim eu posso gravar a variavel $nfeXML no banco de dados sendo o XML da NF-e já com o protocolo
essa não é a unica função que pede o CAMINHO como parâmetro, acredito que passar o XML torna mais pratico
Obs.: A nova função "addProtocoloXML()" é uma cópia da função original "addProtocolo()" onde alterei apenas a forma de carregar os XMLs de:
$docnfe->loadXMLFile($pathNFefile); $docprot->loadXMLFile($pathProtfile);
para
$docnfe->loadXMLString($nfeXML); $docprot->loadXMLString($protXML);
caso exista uma outra forma melhor também de se fazer sem a necessidade de ficar gravando e lendo arquivos do disco seria bem vinda