robmachado / teste

Exemplo de uso da API NFePHP
27 stars 12 forks source link

PHP Fatal error: Uncaught Error: Using $this when not in object context #7

Closed marcioseabra closed 7 years ago

marcioseabra commented 8 years ago

Bom, no Xampp (Windows) rodando o PHP 5.6, tudo "funcionou" lindamente até eu receber o seguinte erro:

PHP Fatal error: Uncaught Error: Using $this when not in object context in /var/www/html/dfe/app/DFe.php:308 Stack trace:

0 /var/www/html/dfe/app/DFe.php(205): App\DFe::zTrataProcEvent(Array)

1 /var/www/html/dfe/app/DFe.php(140): App\DFe->zExtractDocs(Array, true)

2 /var/www/html/dfe/cron/distdfe.php(29): App\DFe->getNFe(50, true)

3 {main}\n thrown in /var/www/html/dfe/app/DFe.php on line 308

Observei neste arquivo que na linha 206 "$this->zSalva($aDocs, 'recebidas/resumo', $bIncludeAnomes)" estava comentada. Então descomentei e ainda assim obtive o mesmo erro acima mencionado.

Já no Linux (com PHP7), primeiro recebi o erro do SSL, mas consegui resolver setando o _CURLOPTSSLVERSION manualmente, mas ao funcionar, também retornou o mesmo erro do arquivo DFe.php:308 acima mencionado.

O que pode estar acontecendo?

robmachado commented 8 years ago

No arquivo config deve estar identificado o caminho para o diretório onde estão os xml das NFe. Exemplo: "pathNFeFiles":"\/dados\/nfe",

Esse deve ser um path VALIDO (existente, writeable, e conter a estrutura dos diretorios esperados pelo NFePHP

marcioseabra commented 8 years ago

Sim, eu configurei da seguinte maneira:

"pathNFeFiles": "\/var\/www\/html\/dfe\/xml\/nfe", "pathCTeFiles": "\/var\/www\/html\/dfe\/xml\/cte", "pathMDFeFiles": "\/var\/www\/html\/dfe\/xml\/mdfe", "pathCLeFiles": "\/var\/www\/html\/dfe\/xml\/cle", "pathNFSeFiles": "\/var\/www\/html\/dfe\/xml\/nfse", "pathCertsFiles": "\/var\/www\/html\/dfe\/certs\/",

Ele chega a importar e carregar algumas informações, mas em determinado momento que não consigo identificar, ele sempre acaba com o mesmo erro, na mesma linha, mesmo arquivo e etc.

Na linha reclamada está o seguinte conteúdo:

if ($tpEvento == '110111') { //confirmado cancelamento, localizar o xml da NFe recebida //na pasta anomes $path = $this->pathNFe . DIRECTORY_SEPARATOR . $this->ambiente . DIRECTORY_SEPARATOR . "recebidas". DIRECTORY_SEPARATOR . $anomes; $pathFile = $path . DIRECTORY_SEPARATOR . $chave . '-nfe.xml'; self::zCancela($pathFile); $aResp[] = array( 'tipo' => '-cancNFe.xml', 'chave' => $chave, 'anomes' => $anomes, 'xml' => $xmldata ); }

No Windows dispensa o problema de permissões e o mesmo erro acontece. No Linux, a pasta XML está totalmente com permissão de leitura e escrita (777).

robmachado commented 8 years ago

Tente debugar linha a linha com o xdebug e veja o que ocorre com o conteído das variáveis

Em 24 de junho de 2016 17:45, marcioseabra notifications@github.com escreveu:

Sim, eu configurei da seguinte maneira:

"pathNFeFiles": "\/var\/www\/html\/dfe\/xml\/nfe", "pathCTeFiles": "\/var\/www\/html\/dfe\/xml\/cte", "pathMDFeFiles": "\/var\/www\/html\/dfe\/xml\/mdfe", "pathCLeFiles": "\/var\/www\/html\/dfe\/xml\/cle", "pathNFSeFiles": "\/var\/www\/html\/dfe\/xml\/nfse", "pathCertsFiles": "\/var\/www\/html\/dfe\/certs\/",

Ele chega a importar e carregar algumas informações, mas em determinado momento que não consigo identificar, ele sempre acaba com o mesmo erro, na mesma linha, mesmo arquivo e etc.

Na linha reclamada está o seguinte conteúdo:

if ($tpEvento == '110111') { //confirmado cancelamento, localizar o xml da NFe recebida //na pasta anomes $path = $this->pathNFe . DIRECTORY_SEPARATOR . $this->ambiente . DIRECTORY_SEPARATOR . "recebidas". DIRECTORY_SEPARATOR . $anomes; $pathFile = $path . DIRECTORY_SEPARATOR . $chave . '-nfe.xml'; self::zCancela($pathFile); $aResp[] = array( 'tipo' => '-cancNFe.xml', 'chave' => $chave, 'anomes' => $anomes, 'xml' => $xmldata ); }

No Windows dispensa o problema de permissões e o mesmo erro acontece. No Linux, a pasta XML está totalmente com permissão de leitura e escrita (777).

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/robmachado/teste/issues/7#issuecomment-228457546, or mute the thread https://github.com/notifications/unsubscribe/ABXtUGgMAlNy9TL9Zxw43I0D6-s7xK_cks5qPEHxgaJpZM4I-DK4 .

Roberto

Nisi utile est quod facimus stulta est gloriae (Julius Phaedous)

tavinus commented 7 years ago

Oi, primeiro queria agradecer por ter postado esse app teste.

Eu também tive esse problema e acabei mudando a função zTrataProcEvent de private static para protected, no arquivo DFe.php. A função tenta usar $this->pathNFe e $this->ambiente e sendo estática, obviamente isso não funciona.

    protected function zTrataProcEvent($resp = array())
    {

Acho que usar self::pathNFe também não funcionaria.

Eu ACHO que as outras funções foram divididas e feitas estáticas pra retornar um array a ser salvo. Mas esta função ficou pra trás. Digo isso pois ela não tem suporte ao parâmetro $anomes e SEMPRE busca arquivos na pasta recebidas/anomes (pra alguns eventos).

Além disso, ela salva no disco, enquanto as outras duas funções retornam o array a ser salvo. Tem até um código comentado abaixo da chamada dela: //$this->zSalva($aDocs, 'recebidas/resumo', $bIncludeAnomes);.

No fim minha zExtractDocs() ficou assim:

    protected function zExtractDocs($docs = array(), $bIncludeAnomes = false)
    {
        $aResp = array();
        //para cada documento retornado
        foreach ($docs as $resp) {
            $schema = substr($resp['schema'], 0, 6);
            switch ($schema) {
                case 'resNFe':
                    $aDocs = self::zTrataResNFe($resp);
                    //mostar as notas resumo e manifestar
                    $this->zSalva($aDocs, 'recebidas/resumo', false);
                    break;
                case 'procNF':
                    $aDocs = self::zTrataProcNFe($resp);
                    $this->zSalva($aDocs, 'recebidas', $bIncludeAnomes);
                    break;
                case 'procEv':
                    // OBVIAMENTE TIVE QUE MUDAR AQUI DE CHAMADA ESTATICA PARA
                    // UMA CHAMADA DE METODO NORMAL COM $this->zTrataProcEvent()
                    //$aDocs = self::zTrataProcEvent($resp);
                    $aDocs = $this->zTrataProcEvent($resp);
                    //$this->zSalva($aDocs, 'recebidas/resumo', $bIncludeAnomes);
                    break;
            }
        }
        return $aResp;
    }

Note que as outras duas funções são estáticas e é usado $this->zSalva() depois delas.
Talvez seja o caso de revisar a função pra estática de fato e usar o array retornado por ela com $this->zSalva() pra salvar, mas eu não tive convicção de como fazer isso.

PS: Eu acho que por conta dessa função não suportar $anomes desligado, em alguns casos as pessoas podem ter problemas se usarem $anomes = false. Eu estou rodando uma instalação hackeada pra 4 empresas diferentes e nem todas apresentaram esse problema. Me PARECE que se não tiver algum evento a ser processado que caia a execução ali (cancelamento por exemplo), o erro não vai ocorrer. Até por isso nem toda instalação apresenta esse erro. Mas de qq forma é fácil ver no código que essa função busca sempre em recebidas/anomes e nem tem um parametro pra nao usar isso.

Cheers! Gus

robmachado commented 7 years ago

Eu preciso refatorar esse exemplo para a nova versão 5.0 farei isso assim que a nova versão do sped-nfe estiver com seu primeiro release

tavinus commented 7 years ago

Legal. Talvez eu monte tipo uma intranetzinha pra baixar notas e controlar custos com isso aqui + UserSpice ou algo parecido. Provavelmente usaria a lógica do app, mas a interface bootstrap do userspice.

Seria somente pra receber notas mesmo, não pra emitir. E aí adicionar custos como frete e gare pra fracionar e também oferecer dados detalhados dos XMLs que não tem no DANFE. Eu tenho algo parecido que usamos pra pegar dados de custo e fiscais, mas é super antigo e remendado. Tá offline e fazendo falta no momento.

O app teste ajudou muito pra montar um robozinho que colhe as notas de 4 cnpjs pra outro sistema processar. No começo desse mês o sistema antigo parou de funcionar (apesar de fazer 1 ano).

Engraçado que não achei nota alguma sobre não precisar mais manifestar pra baixar as notas, mas é assim que o sistema "novo" está funcionando né? E as notas pendentes de manifestação, ele parece sempre baixar todas né? Digo, o webservice não parece informar as já manifestadas e oferecer somente elas pra manifestar. Sempre achei uma estupidez ter que manifestar ANTES de baixar. Vc aceita algo que não pode checar, melhor assim.

Cheers! Gus

robmachado commented 7 years ago

Na verdade não aceita nota nenhuma, dar a "Ciência da Operação" não configura um ACEITE mas apenas que você já está sabendo e pode a qualquer momento declarar essa emissão com ILEGAL e ferrar o emissor

Roberto

tavinus commented 7 years ago

Entendi. Assim faz mais sentido.
Semana que vem acho que vou conseguir separar um tempo pra tentar começar a montar isso.

Desculpa desviar o assunto, mas você tem ou vende algum sistema completo de ERP?
Estou de saco cheio do sistema atual da loja de instrumentos musicais da minha família, tem mensalidade, servidor é windows, não tenho acesso ao código, etc. Ao mesmo tempo é um sistema bem completo em informações e suporta ECF, SAT, NFe. A loja ainda opera com ECF e tem mais algum tempo com ela válida antes de ter de passar pra SAT. Talvez fosse possível passar tudo pra NFe ao invés de SAT/ECF (eu não me importo). Se ao menos o BD não fosse Microsoft SQL, eu teria como brincar melhor direto no BD (eu ODEIO programar pra Windows, nem animo de começar nada).

Eu queria mesmo era uma solução que servisse para loja física e online, mas tá difícil achar algo assim que seja razoavelmente bom. Se tiver algum sistema pra indicar, sou todo ouvidos. Se der pra passar todas as máquinas da loja pra Linux, melhor ainda.

Gus

robmachado commented 7 years ago

@tavinus Infelizmente eu não tenho nada desse tipo, mas se você programa pode começar a fazer um e que funcione junto com o sistema de sua loja virtual, totalmente em PHP, existem no mercado vários sistemas muito bons via web, e alguns inclusive com o "frete de loja" que fala com o SAT e ai poderá usar a contingência do SAT. Como o acesso é pelo browser não importa o S.O. da maquina, pode ser Ruindows, Linux, ou OSX tanto faz. Existem ERP OpenSource, mas sua adaptação para nossa realidade é problemática (legislação fiscal maluca do Brasil).