openboleto / OpenCnabPHP

Biblioteca multibanco para geração e leitura de arquivos Cnab240 e Cna400 de remessa e retorno
MIT License
192 stars 117 forks source link

Retorno - Loop #136

Open marxlf opened 5 years ago

marxlf commented 5 years ago

Boa tarde!

Estou com um problema aparentemente simples, mas que estou apanhando para resolver. Em meu código tenho um loop (while) que lista todos os arquivos de retorno dentro de umas pasta. Apliquei o código para tratar o arquivo de retorno dentro deste loop. Sendo assim ele lista o arquivo e já trata as informações deste arquivo. Entretanto, está apresentando erro no método após a leitura do 2º arquivo:

Fatal error: Uncaught Error: Call to a member function getChilds() on null in /financeiro/formas_pagamento/boletos/transmissao/vendor/quilhasoft/opencnabphp/src/resources/generico/retorno/L040/Generico0.php:35 Stack trace: #0 /financeiro/formas_pagamento/boletos/transmissao/vendor/quilhasoft/opencnabphp/src/RetornoAbstract.php(86): CnabPHP\resources\generico\retorno\L040\Generico0->getRegistros(NULL) QuilhaSoft/JasperPHP-OpenBoleto#1 /financeiro/baixa-parcelas-automaticas/emitir-relatorio.php(24): CnabPHP\RetornoAbstract->getRegistros() QuilhaSoft/JasperPHP-OpenBoleto#2 {main} thrown in /financeiro/formas_pagamento/boletos/transmissao/vendor/quilhasoft/opencnabphp/src/resources/generico/retorno/L040/Generico0.php on line 35

Conseguem me ajudar? Obrigado!

Rctnet commented 5 years ago

Boa tarde. Talvez a biblioteca tenha um problema de design para atender a essa sua demanda, a classe RetornoAbstract tem varias propriedades que são acessadas de forma estática, ou seja sem instanciação, que vão estar preenchidas quanto saltar para o próximo arquivo. para tentar contornar isso, ao debugar observe essas variáveis e tente limpa-las antes de tentar ler um novo arquivo. por favor nos conte de seu progresso e se precisar de mais ajuda, é só falar... Que a força esteja com você.

marxlf commented 5 years ago

Opa Rctnet, boa tarde!

Sou grato pela explicação. Diante do que vc havia me falado tentei fazer da forma que sugeriu limpando as variáveis. Retorna o mesmo erro.

Tentei concatenar os arquivos no laço utilizando "$arquivo .=" mas deparo com o erro de memória já que acumularia todas as informações dos arquivos em uma única variável. Com poucos arquivos até que ele consegue fazer a leitura. Chega um momento, a depender da quantidade de arquivos, que o erro de memória apresentado.

Aí por fim, fiz por requisição ajax. A cada 10 segundos o script faz a requisição de cada arquivo. Com isto consegui fazer a leitura de todos os arquivos.

Não seria o ideal já que a intenção era cria uma cronn para que o sistema reanalisasse os arquivos enviados da semana e, se por falha na leitura do arquivo, não tratasse as informações de forma correta, a cronn corregeria a questão. Mas funcionou desta forma.

Na sua opinião fica legal desta forma?

Agradeço mais um vez pela ajuda. Abraços.

Rctnet commented 5 years ago

boa tarde, se for usar cron, poderia fazer a parte de ler a pasta, mover arquivos lidos com sucesso para outra pasta, provavelmente poderia até ler a saída do PHP para checar se o arquivo foi processado com sucesso e ou interromper o processo se tiver erros. com script shell da para fazer tudo isso, ai você pode chamar um programa PHP em cada iteração da lista de arquivos dentro do script shell, fazendo com que cada programa PHP se auto contenha isolando as variáveis estáticas dentro de cada execução, eu faria dessa forma, tenho que certeza que funcionaria, boa sorte, e mais uma vez.... Que a força esteja com você.