Ir para conteúdo
Fórum Script Brasil
  • 0

Não consegui fazer upload de um arquivo zipado


Frank K Hosaka

Pergunta

A mágica do Livewire é a variável pública do componente e a diretriz wire:model no Blade, mas essa ferramenta não funciona no caso do arquivo zipado pela Bling onde contém todas as notas emitidas no mês, nesse caso eu tenho que imaginar o componente como um controlador e o Blade como o terminal do cliente. A minha primeira tentativa foi usar o <form method=post> para fazer uma ponte entre o Blade e o controlador, mas no caso do Livewire descobri que ele tem o recurso do escutador, ou seja, eu usei o JavaScript para capturar o nome do arquivo obtido através do <input> e a seguir mandar a informação para o componente, assim:

 

<flux:input type="file" 
            label="Escolha um arquivo zipado da Bling já descompactado"
            onchange="arquivo=event.target.files[0].name;
            Livewire.dispatch('verArquivo',[arquivo])" />
 

O constrangimento começa aqui. O <input> no Livewire escreve "escolha o arquivo" e fica por isso mesmo, já o <flux:input> desenha um botão com a frase "choose a file" e uma outra caixa escrito algo do tipo "No files", ele é bonito, mas tudo escrito em inglês.

Do lado do componente, tenho

	protected $listeners=['verArquivo'];

    function verArquivo($arquivo) {
        $this->modal=false;
        $arquivo=substr($arquivo,0,-4);
        $diretorio="C:/Users/Frank/Downloads/".$arquivo;
        $contaArquivos=count(scandir($diretorio))-2;
        $nfces = scandir($diretorio);
        // etc
	}

Aqui, outro constrangimento. Já que eu não posso abrir o arquivo zipado, eu peço para o Windows descompactar o arquivo, e peço para o código usar scandir e ver o conteúdo da pasta. O problema é que o Livewire, o Laravel e o PHP não podem ver o conteúdo do notebook a partir da internet, só o <input> é capaz de fazer essa proeza, mas o <input> só é capaz de pegar no máximo 20 arquivos (o Copilot disse que isso é uma restrição do servidor).

Assim, eu preciso executar o programa lá na internet para gravar o faturamento do mês no banco de dados, depois eu importo o banco de dados MySQL aqui no notebook, e finalmente executo o código localmente para finalmente ter a previsão do Simples. Eu acho que esse é o pior exemplo de programa, tudo porque eu não consigo usar o ZipArchive do PHP com o arquivo zipado da Bling.

A seguir a listagem completa de toda a gambiarra:

 

arquivo app > Livewire > Simples.php
<?php
namespace App\Livewire;
use App\Models\tbrendabruta;
use Carbon\Carbon;
use DOMDocument;
use Livewire\Attributes\Layout;
use Livewire\Component;

#[Layout('components.layouts.app',['titulo'=>'Estimativa do Simples'])]
class Simples extends Component {

    protected $listeners=['verArquivo'];
    public $aliquota=7.3, $reducao=5940, $efetiva; 
        // 2a. faixa da tabela do simples no comércio
    public $comST,$grupos,$mensagem,$modal,$modal1,$notasFiscais = [],$nfCanceladas = [];
    public $notasCanceladas,$primeiraNota,$receitasAnteriores,$renda12;
    public $semST,$somaTotal,$totalDeNotas,$ultimaNota;
    public $CST,$SST,$TT;
    public $apuracao,$proxApuracao,$venda;

    function fecharModal() {
        $this->modal1=false;
    }

    function incluir() {
        $venda=deca($this->venda);
        tbrendabruta::create(['apuracao'=>$this->proxApuracao,'renda'=>$venda]);
        $this->notasFiscais=[];
        $this->modal=true;
        if(gethostname()=="srv461917") {
            $this->mensagem="Continuar a apuração do Simples pelo PC";
            $this->modal1=true;
        }

    }

    function verArquivo($arquivo) {
        $this->modal=false;
        $arquivo=substr($arquivo,0,-4);
        $diretorio="C:/Users/Frank/Downloads/".$arquivo;
        $contaArquivos=count(scandir($diretorio))-2;
        $nfces = scandir($diretorio);
        $this->notasCanceladas=0;
        $this->somaTotal=0;
        $this->comST=0;
        $this->semST=0;
        foreach($nfces as $nfce) {
            if($nfce !== '.' && $nfce !=='..' ) {
                if(strpos($nfce,'-can') !== false) {
                    $this->nfCanceladas[] = intval(substr($nfce,28,6));
                    $this->notasCanceladas++;
                    continue;
                }
                $numeroNota=intval(substr($nfce,28,6));
                if(in_array($numeroNota,$this->nfCanceladas)) {
                    continue;
                }
                $this->notasFiscais[]=$numeroNota;
                $dom = new DOMDocument();
                $dom->load("$diretorio/$nfce");
                $nfe=$dom->documentElement;
                if($nfe->getElementsByTagName('vNF')->item(0)) {
                    $somaNF=$nfe->getElementsByTagName('vNF')->item(0)->nodeValue;
                    $this->somaTotal+=$somaNF;
                    $produtos=$nfe->getElementsByTagName('prod');
                    foreach($produtos as $p) {
                        $cfop=$p->getElementsByTagName('CFOP')->item(0)->nodeValue;
                        $vProd=$p->getElementsByTagName('vProd')->item(0)->nodeValue;
                        $vDesc=0;
                        if($p->getElementsByTagName('vDesc')->item(0)) {
                            $vDesc=$p->getElementsByTagName('vDesc')->item(0)->nodeValue;
                        }
                        if($cfop==5405) {
                            $this->comST += $vProd - $vDesc;
                        } else {
                            $this->semST += $vProd - $vDesc;
                        } 
                    }
                }
            }
        }
        sort($this->notasFiscais);
        $this->primeiraNota=intval($this->notasFiscais[0]);
        $this->ultimaNota=intval($this->notasFiscais[$contaArquivos-1]);
        $this->totalDeNotas=count($this->notasFiscais);
        $this->receitasAnteriores = tbrendabruta::orderBy('id','desc')
            ->skip(1)->take(12)->get();
        $this->renda12=array_reduce($this->receitasAnteriores->toArray(),function($total,$r) {
            return $total + $r['renda']; },0);
        $this->grupos=array_chunk($this->receitasAnteriores->toArray(),3);
        $this->efetiva=round((($this->renda12*$this->aliquota/100-$this->reducao)/$this->renda12)*100,4);
        $this->CST=round($this->comST*$this->efetiva/100*(1-34/100),2);
        $this->SST=round($this->semST*$this->efetiva/100,2);
        $this->TT=$this->CST+$this->SST;
    }

    function mount() {
        $this->apuracao=tbrendabruta::max('apuracao');
        $ano=substr($this->apuracao,0,4);
        $mes=substr($this->apuracao,4,2);
        $previa=Carbon::create($ano,$mes,1);
        $this->proxApuracao=$previa->addMonth()->format('Ym');
        $this->modal=true;
    }

}

arquivo resources > vies > livewire > simples.blade.php
<div>
    <div class="mt-5"></div>
    @if($modal1)
        <div class="fixed inset-0 flex items-center 
            justify-center" style="background-color: rgba(0, 0, 0, 0.5)">
            <div class="bg-white p-6 rounded shadow-lg">
                <h2 class="text-lg font-semibold">Mensagem</h2>
                <p class="mt-2 text-gray-700 text-xl whitespace-nowrap">{{$mensagem}}</p>
                <flux:button wire:click="fecharModal" class="mt-2">
                    Fechar
                </flux:button>
            </div>
        </div>        
    @endif
    @if($modal)
        <div class="flex items-center">
            Próxima Apuração {{ $proxApuracao }} 
            <div class="w-[200px] ml-2">
                <flux:input wire:model="venda" wire:change="incluir" size=xs 
                    placeholder="valor da venda"/>
            </div>
        </div>
        <flux:input type="file" 
            label="Escolha um arquivo zipado da Bling já descompactado"
            onchange="arquivo=event.target.files[0].name;
            Livewire.dispatch('verArquivo',[arquivo])" />
    @else
        <div class=font-semibold>Estimativa do Simples Nacional {{ $apuracao }}</div>
        <div class=flex>
            <div>Total de Notas</div>
            <div class="ml-2">{{$totalDeNotas}}</div>
        </div>
        <div class=flex>
            <div>Notas Canceladas</div>
            <div class="ml-2 text-right mr-2">{{$notasCanceladas.": ";}}</div>
            @foreach($nfCanceladas as $n)
                {{ $n." "}}
            @endforeach
        </div>
        <div class=flex>
            <div>Primeira Nota</div>
            <div class="text-right ml-2 font-semibold">{{$primeiraNota}}</div>
            <div class="ml-5"ltima Nota</div>
            <div class="text-right ml-5 font-semibold">{{$ultimaNota}}</div>
        </div>
        @foreach($grupos as $grupo)
            <div class='flex'>
                @foreach($grupo as $r)
                    <div class="w-[40px] font-semibold">{{$r['apuracao']}}</div>
                    <div class="w-[100px] text-right mr-5">{{dec($r['renda'])}}</div>
                @endforeach
            </div>
        @endforeach
        <div class="flex">
            <div class="mr-5">Renda 12 meses:</div>
            <div class="font-semibold">{{dec($renda12)}}</div>
        </div>
        <div class="flex">
            <div class="w-[130px]">Alíquota Efetiva</div>
            <div class="w-[320px]">{{"(".dec($renda12)." x ".virgula($aliquota).
                " % - ".dec($reducao).") / ".dec($renda12)}}</div>
            <div class="w-[10px]">{{" = "}}</div>
            <div class="w-[80px] text-right font-semibold">{{ virgula($efetiva)." %" }} </div>
        </div>
        <div class=flex>
            <div class="w-[70px]">Com ST</div>
            <div class="w-[100px] text-right">{{dec($comST)}}</div>
            <div class="ml-1 w-[160px]">{{ " x ".virgula($efetiva)." % x (1 - 34%)"}}</div>
            <div class="w-[10px]">=</div>
            <div class="w-[100px] font-semibold text-right">{{ dec($CST) }}</div>
        </div>
        <div class=flex>
            <div class="w-[70px]">Sem ST</div>
            <div class="w-[100px] text-right">{{dec($semST)}}</div>
            <div class="ml-1 w-[160px]">{{ " x ".virgula($efetiva)." %"}}</div>
            <div class="w-[10px]">=</div>
            <div class="w-[100px] font-semibold text-right">{{ dec($SST) }}</div>

        </div>
        <div class=flex>
            <div class="w-[70px]">Total</div>
            <div class="w-[100px] text-right">{{dec($somaTotal)}}</div>
            <div class="ml-1 w-[160px]"></div>
            <div class="w-[10px]">{{ " " }}</div>
            <div class="w-[100px] font-semibold text-right text-red-700">{{ dec($TT) }}</div>
        </div>    
    @endif
</div>


 

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,5k
    • Posts
      652,3k
×
×
  • Criar Novo...