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

Pegando o nome de um arquivo zipado (Simples Nacional)


Frank K Hosaka

Pergunta

O tutorial do Livewire afirma que é fácil fazer upload, mas eu só recebi a mensagem de que o upload falhou, no caso do arquivo zipado.

Mas eu vi que o <input type=file> pegou o nome do arquivo selecionado. Com a ajuda do Copilot, consegui pegar o nome do arquivo e mandar para o Livewire:

arquivo app > Livewire > Simples.php
<?php
namespace App\Livewire;
use Livewire\Component;
 
class Simples extends Component {
    protected $listeners=['verArquivo'];

    public function verArquivo($arquivo) {
        dd($arquivo);
    }
}

arquivo resources > views > livewire > simples.blade.php
<flux:input type="file"
    onchange="arquivo=event.target.files[0].name;
    Livewire.dispatch('verArquivo',[arquivo])" />

Apesar do código ser bem pequeno, isso é resultado de várias tentativas e erros. Foi muita sorte o código JavaScript funcionar, a lista do Copilot era bem maior. Já o Livewire.dispatch, esse deu muito trabalho, a ideia de colocar colchete em torno da variável que contém o nome do arquivo foi pura tentativa erro, não sei como usar o comando dispatch, mas nesse caso, deu certo. Claro que o nome do arquivo não ajuda muito, mas eu espero explorar o diretório que tem o mesmo nome do arquivo zipado. O PHP, o Laravel e o Livewire não gostam de arquivos zipados, mas para trabalhar com arquivo xml, eles não reclamam.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

A seguir a listagem completa:

 

arquivo app > Models > tbrendabruta.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class tbrendabruta extends Model {
    use HasFactory;
    protected $table="tbrendabruta";
    protected $fillable=['apuracao','renda'];
    const UPDATED_AT=null;
    const CREATED_AT=null;
}
?>

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,$modal, $notasFiscais = [],$nfCanceladas = [];
    public $notasCanceladas,$primeiraNota,$receitasAnteriores,$renda12;
    public $semST,$somaTotal,$totalDeNotas,$ultimaNota;
    public $CST,$SST,$TT;
    public $apuracao,$proxApuracao,$venda;

    function incluir() {
        tbrendabruta::create(['apuracao'=>$this->proxApuracao,'renda'=>$this->venda]);
        $this->modal=true;
    }

    function verArquivo($arquivo) {
        $this->modal=false;
        $this->apuracao=tbrendabruta::max('apuracao');
        $previa=Carbon::createFromFormat('Ym',$this->apuracao);
        $this->proxApuracao=$previa->addMonth()->format('Ym');
        $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->modal=true;
    }

}
?>

arquivo resources > views > livewire > simples.blade.php
<div>
    <div class="mt-5"></div>
    @if($modal)
        <flux:input type="file" wire:model="zip" 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 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>
        <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>

 

Captura de tela 2025-05-11 144557.png

Link para o comentário
Compartilhar em outros sites

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,4k
    • Posts
      652,2k
×
×
  • Criar Novo...