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

Upload de arquivos csv e xml no Livewire


Frank K Hosaka

Pergunta

O Livewire simplificou bastante o upload, mesmo assim, para cada tipo de arquivo, o procedimento é diferente. 

O código seguinte faz o upload de até 20 arquivos csv (para um número maior aí vai precisar mexer no WampServ ou ou o servidor que você usar).

arquivo app > Livewire > Bling.php
<?php
namespace App\Livewire;
use App\Models\tbprod;
use App\Models\tbprodbling;
use Illuminate\Support\Facades\DB;
use Livewire\Attributes\Layout;
use Livewire\Component;
use Livewire\WithFileUploads;

#[Layout('components.layouts.app',['titulo'=>'Diferença na Bling'])]
class Bling extends Component {

    use WithFileUploads;
    public $contaProdBling,$contaProduto,$dif=[],$files=[];

    function updatedFiles() {
        DB::table('tbprodbling')->truncate();
        foreach($this->files as $arquivo) {
            $dados=explode(PHP_EOL,$arquivo->get());
            foreach($dados as $linha) {
                if($linha<>"") {
                    $campos=explode(';',$linha);
                    if(aspas($campos[1])!=="Código") {
                        $codprod=intval(trim(aspas($campos[1])));
                        $un=aspas($campos[3]);
                        $prod=aspas($campos[2]);
                        $custo=deca(aspas($campos[11]));
                        $codbar=trim(aspas($campos[19]));
                        $cf=deca(aspas($campos[4]));
                        $venda=deca(aspas($campos[6]));
                        tbprodbling::create(['codprod'=>$codprod,'un'=>$un,
                            'prod'=>$prod,'custo'=>$custo,'codbar'=>$codbar,
                            'cf'=>$cf,'venda'=>$venda]);
                    }
                }
            }
        }
        $produto=tbprod::where('loc','<>','a24')->get();
        $prodBling=tbprodbling::all();
        $this->contaProduto=count($produto);
        $this->contaProdBling=count($prodBling);
        if($this->contaProdBling>$this->contaProduto) {
            $prod=$produto->pluck('codprod');
            $pBling=$prodBling->pluck('codprod');
            $difs=$pBling->diff($prod);
            foreach($difs as $d) {
                echo "problema no codprod $d na Bling <br>";
            }
            dd('parada total');
        }
        foreach($produto as $key=>$pr) {
                $codprod=$pr->codprod;
                $previa=tbprodBling::where('codprod',$codprod)->get();
                if(count($previa)==0) {
                    $this->dif[$key][]=['Codigo'=>$codprod];
                    $this->dif[$key][]=['Incluir'=>$codprod,'Incluir2'=>'Incluir'];
                } else {
                    $a=tbprodBling::where('codprod',$codprod)->first();
                    $un=($pr->un==$a->un) ? 1 : 0;
                    $prod=($pr->prod==$a->prod) ? 1 : 0;
                    $custo=($pr->custo==$a->custo) ? 1 : 0;
                    $codbar=($pr->codbar==$a->codbar) ? 1 : 0;
                    $cf=($pr->cf==$a->cf) ? 1 : 0;
                    $venda=($pr->venda==$a->venda) ? 1 : 0;
                    if($un.$prod.$custo.$codbar.$cf.$venda !== '111111') {
                        $this->dif[$key][]=['Codigo'=>$pr->codprod,'Codigo2'=>$a->codprod];
                        if($pr->prod!==$a->prod) {
                            $this->dif[$key][]=['Descricao'=>$pr->prod,'Descricao2'=>$a->prod];
                        }
                        if($pr->custo!==$a->custo) {
                            if($pr->custo || $a->custo<>0) {
                                $this->dif[$key][]=['Custo'=>$pr->custo,'Custo2'=>$a->custo];
                            }
                        }
                        if($pr->codbar!=$a->codbar) {
                            $this->dif[$key][]=['Codigo de Barra'=>$pr->codbar,'Codigo de Barra2'=>$a->codbar];
                        }
                        if($pr->cf!==$a->cf) {
                            if($pr->cf || $a->cf) {
                                $this->dif[$key][]=['NCM'=>$pr->cf,'NCM2'=>$a->cf];
                            }   
                        }
                        if($pr->venda!==$a->venda) {
                            $this->dif[$key][]=['Venda'=>$pr->venda,'Venda2'=>$a->venda];
                        }
                        if($pr->un!==$a->un) {
                            $this->dif[$key][]=['Un'=>$pr->un,'Un2'=>$a->un];
                        }
                    }
                }
        }

    }
}

arquivo resources > views > livewire > bling.blade.php
<div>
    <flux:input type="file" wire:model="files" multiple />

    <script>
        function copiar(elemento) {
            conteudo=elemento.innerText || elemento.textContent
            navigator.clipboard.writeText(conteudo)
            elemento.parentElement.style.display="none"
        }
    </script>
    <div class="font-semibold flex">
        <div class=w-[100px]>Código</div>
        <div class=w-[100px]>Campo</div>
        <div class=w-[100px]>MySQL</div>
        <div class=w-[100px]>Bling</div>
    </div>
    <div class=flex>
        <div class=w-[100px]></div>
        <div class=w-[100px]>Produtos</div>
        <div class=w-[100px]>{{ $contaProduto }}</div>
        <div class=w-[100px]>{{ $contaProdBling }}</div>
    </div>
    @foreach($dif as $d)
        @foreach($d as $v)
            @if(array_keys($v)[0]=="Codigo") 
                @php $codigo=array_values($v)[0]; @endphp
            @else
                @if(array_keys($v)[0]!=="Descricao") 
                    <div class="flex">
                        <div class=w-[100px]>{{$codigo}}</div>
                        <div class=w-[100px]>{{array_keys($v)[0]}}</div>
                        <div class=w-[100px] onclick=copiar(this)>
                            <pre class="font-sans"><?=array_values($v)[0]?></pre>
                        </div>
                        <div class=w-[100px]>
                            <pre class="font-sans"><?=array_values($v)[1]?></pre>
                        </div>
                    </div>
                @else
                    <div class=flex>
                        <div class=w-[100px]>{{$codigo}}</div>
                        <div class=w-[100px]>{{array_keys($v)[0]}}</div>
                        <div class=w-[100px] onclick=copiar(this)>
                            <pre class="font-sans"><?=array_values($v)[0]?></pre>
                        </div>
                    </div>
                    <div class=flex>
                        <div class=w-[200px]></div>
                        <div class=w-[100px] onclick=copiar(this)>
                            <pre class="font-sans"><?=array_values($v)[1]?></pre>
                        </div>
                    </div>
                @endif
            @endif
        @endforeach
    @endforeach
</div>



A seguir o código para fazer o upload de um arquivo xml:

 

arquivo app > Livewire > Cfop.php
<?php
namespace App\Livewire;
use App\Models\tbnf;
use App\Models\tbpessoa;
use App\Models\tbprod;
use Illuminate\Support\Facades\DB;
use Livewire\Attributes\Layout;
use Livewire\Component;
use Livewire\WithFileUploads;

#[Layout('components.layouts.app',['titulo'=>'NF CFOP'])]
class Cfop extends Component {

    use WithFileUploads;
    public $xmlFile,$inativos=[],$nNF,$previa=[],$xNome;

    function updatedXmlFile() { 
        tbnf::truncate();
        DB::statement('alter table tbnf auto_increment=1');
        $inativos=[];
        $xmlContent=file_get_contents($this->xmlFile->getRealPath());
        $nfe=simplexml_load_string($xmlContent); 
        $itens=$nfe->NFe->infNFe->det;
        $this->nNF = (float)$nfe->NFe->infNFe->ide->nNF;
        $this->xNome = (string)$nfe->NFe->infNFe->emit->xNome;
        $nome = explode(" ", $this->xNome)[0]; 
        $codp = tbpessoa::where('pessoa','like','%'.$nome.'%')->value('codp');     
        foreach ($itens as $item) {
            $codforn = (string)$item->prod->cProd;
            $criterio= strtolower($nome[0].$codforn);
            $consulta = tbprod::where('codforn','like','%'.$criterio.'%')->get();
            $codprod = 'null';
            if (count($consulta) == 1) {
                $codprod = $consulta[0]->codprod;
            } 
            if (count($consulta) > 1) {
                $consulta2 = tbprod::where('codforn','like','%'.$criterio)->get();
                if(count($consulta2) == 1){
                    $codprod = $consulta2[0]->codprod;
                    $consulta = $consulta2;
                } else {
                    echo "existem vários produtos com codforn com o critério $criterio";
                    foreach($consulta as $c) {
                        echo "<br>".$c->codprod." ".$c->prod;
                    }
                    exit;
                }
            }
            if (count($consulta)==0) {
                echo "nenhum produto encontrado com o critério $criterio";
                exit;
            }
            $produto = substr((string)$item->prod->xProd,0,79);
            $cfop = (string)$item->prod->CFOP;
            if($cfop==6101 || $cfop==6102 || $cfop==5101) {
                $cfop=5102;
            }
            if($cfop==6401 || $cfop==6402 || $cfop==6403 || $cfop==5401 || $cfop==5403 || $cfop==5655) {
                $cfop=5405;
            } 
            $class=($cfop == substr($consulta[0]->cfop,-4)) ? "w-[50px] text-right" : 
                "w-[50px] text-red-500 text-right";
            if(substr($consulta[0]->cfop,0,1)==0) {
                $inativos[]=$consulta[0]->codprod;
            }
            $ncm = (string)$item->prod->NCM;
            $class2=($ncm == $consulta[0]->cf) ? "w-[100px] text-right" : 
                "w-[100px] text-red-500 text-right";
            tbnf::create(['codforn'=>$codforn,'codprod'=>$codprod,'prod'=>$produto,
                'cfop'=>$cfop,'codp'=>$codp,'ncm'=>$ncm,'class'=>$class,'class2'=>$class2]);
        }
        $this->previa=tbnf::all(); 
    }


    function atualizarCfop($cfop,$codprod) {
        DB::table('tbprod')->where('codprod',$codprod)
            ->update(['cfop' => 
        DB::raw("CONCAT(LEFT(cfop, LENGTH(cfop) - 4), $cfop)")]);
        tbnf::where('codprod',$codprod)
            ->update(['class'=>"w-[50px] text-right"]);
        $this->previa=tbnf::all();    
    }

    function atualizarNcm($codprod,$ncm) {
        tbprod::where('codprod',$codprod)
            ->update(['cf'=>$ncm]);
        tbnf::where('codprod',$codprod)
            ->update(['class2'=>"w-[100px] text-right"]);
        $this->previa=tbnf::all();
    }

    
}

arquivo resources > views > livewire > cfop.blade.php
<div>
    <flux:input type="file" wire:model="xmlFile" />
    <div class=mt-5>{{ print_r($inativos) }}</div>
    <div>NF {{ $nNF." ".$xNome }}</div>
    <div class="flex bg-gray-200">
        <div class="w-[70px] text-right">Cforn</div>
        <div class="w-[50px] text-right">Cod</div>
        <div class="w-[358px] px-2">Produto</div>
        <div class="w-[50px] text-right">CFOP</div>
        <div class="w-[100px] text-right">NCM</div>
    </div>
    @foreach($previa as $p)
        <div class="flex odd:bg-gray-200">
            <div class="w-[70px] text-right truncate"><?=$p->codforn?></div>
            <div class="w-[50px] text-right"><?=$p->codprod?></div>
            <div class="w-[358px] px-2 truncate"><?=$p->prod?></div>
            <div class="{{$p->class}}" wire:click="atualizarCfop({{$p->cfop}},{{$p->codprod}})">
                {{$p->cfop}}
            </div>
            <div class="{{$p->class2}}" wire:click="atualizarNcm({{$p->codprod}},{{$p->ncm}})">
                {{$p->ncm}}
            </div>
        </div>
    @endforeach
</div>

 

Editado por Frank K Hosaka
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,4k
    • Posts
      652,3k
×
×
  • Criar Novo...