Ir para conteúdo
Fórum Script Brasil

Todas Atividades

Atualizada automaticamente

  1. Hoje
  2. 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>
  3. cpf[indice] == 0: Isso assume que um Worldguessr CPF igual a 0 indica um slot vazio. Você pode adaptar isso para a lógica que usa em seu programa (por exemplo, usar uma variável para contar quantos cadastros existem).
  4. Yesterday
  5. 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>
  6. Última semana
  7. Frank K Hosaka

    <flux:button>

    arquivo resources > views > livewire > loutros.blade.php <div> <div class="h-1"></div> <flux:button href='lestoqueBaixar' wire:navigate size="xs" variant="filled">Baixar Estoque</flux:button> <flux:button href="lbalancete/1" size="xs">Criar TBW</flux:button> <flux:button href="lnfArquivo" wire:navigate size="xs" variant="filled">CFOP</flux:button> <flux:button href=lprodutoDescontinuar wire:navigate size="xs">Descontinuar Produto</flux:button> <flux:button href="lnfArquivo" wire:navigate size="xs" variant="filled">Diferença Bling</flux:button> <flux:button href=estoqueDiferenca wire:navigate size="xs">Diferença Estoque</flux:button> <div class="h-1"></div> <flux:button href=lentrada wire:navigate size="xs" variant="filled">Entrada de Produtos</flux:button> <flux:button href=lmegasena wire:navigate size="xs">Mega-Sena</flux:button> <flux:button href=diarioMercado wire:navigate size="xs" variant="filled">Mercado Pago</flux:button> <flux:button href=lnfArquivo wire:navigate size="xs">Nota do Fornecedor</flux:button> <flux:button href="simples" wire:navigate size="xs" variant="filled">Simples</flux:button> <div class=flex> <div class=w-[200px]>session('codp')</div> <div>{{$vetor['codp']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('codprod')</div> <div>{{$vetor['codprod']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('criterio')</div> <div class=truncate>{{$vetor['criterio']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('criterioPessoa')</div> <div>{{$vetor['criterioPessoa']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('dia')</div> <div>{{dbr($vetor['dia'])}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('end')</div> <div>{{$vetor['end']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('id')</div> <div>{{$vetor['id']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>session('lcto')</div> <div>{{$vetor['lcto']}}</div> </div> <div class="flex"> <div class=w-[200px]>session('pessoa')</div> <div>{{$vetor['pessoa']}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>env('lctoBaixaEstoque')</div> <div class=w-[100px]>{{$baixa}}</div> <div class='w-[100px] text-red-600 text-right'>{{dec($valorBaixa)}}</div> </div> <div class="flex"> <div class=w-[200px]>env('lctoAcertoMais')</div> <div class=w-[100px]>{{$mais}}</div> <div class='w-[100px] text-red-600 text-right'>{{dec($valorMais)}}</div> </div> <div class="flex bg-gray-200"> <div class=w-[200px]>env('lctoAcertoMenos')</div> <div class=w-[100px]>{{$menos}}</div> <div class='w-[100px] text-red-600 text-right'>{{dec($valorMenos)}}</div> </div> <div class="flex"> <div class=w-[200px]>env('diaAcerto')</div> <div>{{dbr($diaAcerto)}}</div> </div> </div>
  8. Boa tarde! Minha primeira postagem. Para o office 2021, na célula A1 tenho a fórmula =Hoje, por favor elaborar sete fórmulas envolvendo a célula A1, para informar a quantidade de dias da semana. Respostas esperadas: 4 - sábados, 5 - domingos, 5 - segundas-feiras, 4 - terças-feiras, 4 - quartas-feiras, 4 - quintas-feiras e 4 - sextas-feiras Grato - Geneci.
  9. O Livewire é basicamente um par de componente e seu Blade correspondente. O Copilot disse que não é possível acessar um método do Livewire pelo roteador, ele disse que o correto é eu invocar o método desejado através do Blade. Eu não gostei da resposta do Copilot, mas com a ajuda dele eu fiz a seguinte gambiarra: arquivo routes > web.php (parcial) <?php use App\Livewire\Lbalancete; Route::middleware(['auth','verified'])->group(function() { Route::get('lbalancete/{opcao?}',Lbalancete::class)->name('lbalancete'); } arquivo resources > views > livewire > loutros.blade.php (parcial) <a href="lbalancete/1" class="text-gray-500 font-semibold">Criar TBW</a> arquivo app > Livewire > Lbalancete.php (parcial) class Lbalancete extends Component { function mount($opcao = null) { if($opcao==1) { $this->tbw() ;} $this->atualizar(); } function tbw() { $ultimoDia=tbdiario::orderBy('dia','desc')->value('dia'); session(['apuracao'=>$ultimoDia]); $balancete=$this->balancete()->balancete; DB::table('tbw')->truncate(); foreach($balancete as $conta) { $inicio=$conta->inicio ?? 'null' ; $debito=$conta->debito ?? 'null '; $credito=$conta->credito ?? 'null'; $fim=$conta->fim ?? 'null'; tbw::create(['conta'=>$conta->conta,'descricao'=>$conta->descricao, 'inicio'=>$inicio,'debito'=>$debito,'credito'=>$credito,'fim'=>$fim]); } session()->forget('apuracao'); return redirect()->to("https://123.456.78.900:8443/phpmyadmin/index.php"); } }
  10. Se você está procurando algo leve e simples, o Laravel Breeze é o mais próximo da instalação Sprunki básica do Laravel, com autenticação pronta. Ele usa Blade ou Inertia.js, e é ótimo para projetos pequenos ou para quem quer personalizar tudo desde o início.
  11. Foi em 1999 é que eu inventei o estoque como a última compra. Coloquei essa ideia no MS Access, em 2020 no PHP e agora cheguei no Livewire, eu chamei a rotina de baixa de estoque. A ideia é bem simples, o problema é como adaptar num programa de computador. Ou seja, eu fiz tudo na base da improvisação, a maior prova é que eu sempre encontro divergência na hora de rodar a rotina. Hoje eu aprendi um novo método no Eloquent chamado keyBy. Ao invés de ajuntar duas tabelas, eu fiz uma consulta numa tabela e outra consulta em outra tabela, e em seguida ajuntei o resultado, tendo como denominador o campo lançamento. A primeira diferença que eu encontrei foi lá em 2023. Naquela época, o fornecedor trocou uma mercadoria por outra. Ao invés de fazer um lançamento para a mercadoria que entrou e outro lançamento para a mercadoria que saiu, eu fiz tudo num só lançamento, e agora eu amargo o problema da inconsistência contábil no estoque. Naquela época, eu achei a ideia ótima, mas hoje eu volto a aprender que a gambiarra não compensa. app > Livewire > EstoqueDiferenca.php <?php namespace App\Livewire; use App\Models\tbdiario; use App\Models\tbhistprod; use Illuminate\Support\Facades\DB; use Livewire\Attributes\Layout; use Livewire\Component; #[Layout('components.layouts.app',['titulo'=>'Teste'])] class Teste extends Component { public $entrada,$saida; function mount() { $contabil = tbdiario::where('contac',123)->orderBy('lcto')->get()->keyBy('lcto'); $estoque = tbhistprod::select('lcto', DB::raw('SUM(custototal) as saida')) ->groupBy('lcto')->orderBy('lcto')->get()->keyBy('lcto'); $this->saida=collect(); foreach($contabil as $lcto => $conta) { $saiu=$estoque[$lcto]->saida ?? 0; $this->saida->push(['lcto'=>$lcto,'valor'=>$conta->valor,'saida'=>$saiu]); } $contabil = tbdiario::where('contad',123)->orderBy('lcto')->get()->keyBy('lcto'); $this->entrada=collect(); foreach($contabil as $lcto => $conta) { $entrou=$estoque[$lcto]->saida ?? 0; $this->entrada->push(['lcto'=>$lcto,'valor'=>$conta->valor,'entrada'=>$entrou]); } } } resources > views > estoque-diferenca.blade.php <div> <div class=flex> <div class="w-[100px] text-right">Lcto</div> <div class="w-[100px] text-right">Contábil</div> <div class="w-[100px] text-right">Estoque</div> <div class="w-[100px] text-right">Divergência</div> </div> <div class="w-[300px] ml-40">Diferença na Saída do Estoque</div> @foreach($saida as $a) @if($a['valor']+$a['saida']) <div class="flex odd:bg-gray-200"> <div class="w-[100px] text-right">{{$a['lcto']}}</div> <div class="w-[100px] text-right">{{dec($a['valor'])}}</div> <div class="w-[100px] text-right">{{dec($a['saida'])}}</div> <div class="w-[100px] text-right">{{dec($a['valor']+$a['saida'])}}</div> </div> @endif @endforeach <div class="w-[300px] ml-40">Diferença na Entrada do Estoque</div> @foreach($entrada as $a) @if($a['valor']-$a['entrada']) <div class="flex odd:bg-gray-200"> <div class="w-[100px] text-right">{{$a['lcto']}}</div> <div class="w-[100px] text-right">{{dec($a['valor'])}}</div> <div class="w-[100px] text-right">{{dec($a['entrada'])}}</div> <div class="w-[100px] text-right">{{dec($a['valor']-$a['entrada'])}}</div> </div> @endif @endforeach </div>
  12. Eu estava enfrentando um problema com o PyInstaller, por isso o Copilot me recomendou usar a versão 3.10.18. No fim das contas, acabei resolvendo o problema usando o cx_Freeze. Na verdade, meu conhecimento em programação é quase zero, então não sei explicar os detalhes com precisão — só estava procurando algo para passar o tempo.
  13. site oficial, aba de downloads, esta lá já conferi https://www.python.org/downloads/ não sei como é seu codigo ou arquivos, mas tenho duvidas se mudar a versão irá influenciar nisso
  14. Estou utilizando o Copilot para auxiliar na programação, porém estou enfrentando dificuldades para fazer múltiplos arquivos funcionarem corretamente em conjunto. O Copilot recomendou a utilização do Python na versão 3.10.18, mas não consegui localizar o instalador dessa versão nem no site oficial nem no repositório do GitHub. Gostaria de saber onde posso encontrar esse instalador.
  15. Mais Cedo
  16. Tenho consultas união funcionando no Access (Office 365) mas não consigo criar novas consultas do mesmo tipo. Até se copio o código SQL e colo em uma nova consulta dá o mesmo erro exibido na imagem que anexei. Na imagem está um exemplo de consulta união onde peguei apenas dois campos com o mesmo nome provenientes de tabelas diferentes. Nas consultas que estão funcionando, após o final da instrução da primeira parte da consulta existe o sinal ";", contrariando a instrução da MS, mas se tiro este sinal gráfico e tento salvar a consulta, também recebo a mesma mensagem de erro.
  17. Para pegar cada campo específico do endereço (como rua, bairro, cidade, estado) ao usar a API de Autocomplete do Google Maps, o ideal é usar place.address_components ao invés de tentar extrair o texto de Slither io adr_address.
  18. O marcador <flux:checkbox> desenha uma caixa de opção um pouco mais bonita do que o <input type="checkbox"> e só vale a pena utilizar, se você precisar de uma resposta do usuário. O meu caso é diferente, eu preciso mostrar ao usuário qual foi a opção que ele escolheu. Um coisa é pegar a informação e guardar no banco de dados, e outra bem diferente é fazer o caminho inverso. No caso do Livewire temos no componente public $teste e no blade <input type="checkbox" wire:model="teste">, aqui o usuário define a caixa ou a variável $teste define a caixa (mas a variável só pode usar os valores true ou false na versão Livewire 3.0). Já o marcador <flux:checkbox wire:model="teste"> só é útil para pegar a opção do usuário, já o caminho inverso não dá, o Livewire não é capaz de mudar o <flux:checkbox wire:model="teste"> para <flex:checkbox wire:model="teste" checked> quando o $teste está definido para true.
  19. No tempo do PHP e Laravel, eu usei o <form> para fazer uma ponte entre o view e o controller, mas no Livewire acredito que o <form> só serve para usar as regras de validação. Em vários tutoriais do Livewire você vai encontrar coisa do tipo unique:user, ou seja, o Livewire vai procurar a informação na tabela user. No meu caso, o nome da minha tabela é tbusuarios. Mesmo que eu tenho colocado a tabela no model User, o código no Livewire só vai funcionar se eu usar unique:tbusuarios. <?php // Teste.php namespace App\Livewire; use Livewire\Component; class Teste extends Component { public $email; function register() { $data=$this->validate(['email'=>'required|email|unique:tbusuarios']); dd("creating a user with email $this->email"); } } ?> <form wire:submit.prevent="register" class="w-25"> <!-- teste.blade.php --> <div class="h-5"></div> <flux:input wire:model="email" /> <div class="h-5"></div> <flux:button type=submit>Register</flux:button> <div class="h-5"></div> @error('email'){{ $message }}@enderror </form>
  20. Eu tentei testar o código que aparece logo no portal do livewire.laravel.com, ao invés de usar a tabela user, eu usei a tabela de produtos, mas o VS Code disse que encontrou um erro por eu não ter definido a propriedade produto no componente. O VS Code tem razão, o portal do Livewire apresenta um péssimo exemplo de programação, aonde deveria ser @foreach($users as $user), o rapaz escreveu $this->users.
  21. Hoje eu estudei o <wire:loading>, mas nenhum dos exemplos do tutorial funcionou comigo. O único que deu certo foi um que muda a cor de uma opção que foi selecionada: <div wire:click="multiploAtualiza" wire:loading.class="text-red-500" class="text-gray-500 font-semibold"> Atualizar Produtos Vinculados </div>
  22. Frank K Hosaka

    ODBC DB2 JSON

    A minha sugestão é usar o comando print_r ao invés do echo: $result=[['CDSCR'=>'RACCORD ASPIRAÇÃO']]; foreach($result as $r) { print_r($r); }
  23. paulo frutuoso

    ODBC DB2 JSON

    Ola Estou a tentar obter dados de uma base de dados DB2 via odbc e obter um objecto json do codigo acima, obtenho o seguinte output. A tabela está bem formatada, graças ao header utilizado. Depois, vou transformar o resultado num array para depois obter um objeto json. Senão converter o array com o mb_convert_encoding, o json_encode devolve um erro, porque é obrigatorio que o argumento esteja em UTF-8. Mas tenho um echo inesperado. Os caracteres à e Ç são substituidod pelo carater ? O que falta Onde está o erro? Obrigado Paulo Frutuoso
  24. que bom q deu certo. disponha👍
  25. ================= // ================= Finalmente eu achei o portal do heroicons.com, e lá achei o ícone da verificação ("check"), e coloquei no Blade assim: <div class="flex mt-2"> <div class=w-[310px]> <input id="codforn" wire:model="codforn" size="3" autofocus placeholder="codforn" onchange="qt.focus()" class="px-2 border-2 rounded py-0" autocomplete="off"> </div> <div class="w-[210px]"> <input id="qt" wire:model="qt" size="2" placeholder="qt" onchange="total.focus()" class="border-2 rounded py-0 text-center" autocomplete="off"> </div> <div class="text-right"> <input id="total" wire:model="total" size="2" placeholder="total" class="border-2 rounded py-0 text-center" autocomplete="off" wire:change="item" onchange="codforn.focus()"> </div> <flux:icon.check wire:click="item" class="ml-4" /> </div> O meu grande problema é que eu não encontrava espaço suficiente para colocar um botão, tentando simular um <button type=submit>, mas tem espaço para colocar um ícone. Graças ao ícone, eu não preciso mais das variáveis $codforn2, $qt2 e $total2, eu simplesmente só vou esvaziar as variáveis $codforn, $qt e $total só depois que elas forem usadas no cadastro do histórico do produto, ou seja, se o usuário ver a mensagem de que o produto não existe, tudo o que ele digitou vai permanecer no painel de entrada de produtos, e depois dele acertar o cadastro de produto, ele só vai ter que apertar o ícone da confirmação mais uma vez.
  26. Apesar do Livewire ser uma extensão do Laravel, aqui eu já considero como um novo recurso do PHP, principalmente para um programador eventual como eu que não conseguiu dominar o JavaScript e principalmente o Ajax. Eu tenho uma rotina que dá entrada no estoque, usando o serviço da digitação. Acredito que a grande maioria dos programadores utiliza o serviço de importação do xml para dar entrada no estoque, mas eu não tenho paciência de esperar e assim eu uso uma cópia da confirmação do pedido do fornecedor. No view, eu tenho três entradas: <input wire:model="codfornec">, <input wire:model="qt"> e <input wire:model="total">. Depois que o usuário fornece os dados, o componente procura na tabela de produtos o registro que contém o codfornec que foi digitado, e se encontrar, ele dá a entrada na tabela histórico do produto. O problema é se o componente não conseguir encontrar, aí o componente solta a mensagem "eu não achei" e fica por isso mesmo. O usuário pode abrir uma nova guia e acertar a tabela de produtos, atualizando ou criando um novo registro. Depois ele volta na guia da entrada de produto, e digita tudo de novo. A lei do menor esforço obriga o usuário a reclamar com o programador que não faz sentido digitar tudo de novo, coisa que já foi digitado antes. E ele tem razão. Eu não sei como resolver isso de maneira lógica, mas improvisei essa gambiarra: Eu criei três variáveis públicas: public $codfornec2, $qt2, $total2, e eles foram definidos quando o componente não encontrar o produto, assim: <?php // ... function item() { // ... $aux=tbprod::where('codforn','like',"%$codforn%")->get(); if (count($aux) == 0) { $this->codforn2=$codforn; $this->qt2=$qt; $this->total2=$total; $this->mensagem="Não existe produto com codforn $codforn"; $this->modal=true; return; } A rotina que fecha o modal anula o conteúdo de $codforn, $qt e $total, e assim o usuário vai ver três caixas vazias que ele não quer digitar. Eu mudei a primeira caixa de entrada: <input wire:model="codforn" wire:click="item">, e o método item no componente ficou assim: <?php // ... function item() { if($this->codforn2) { $codforn=$this->codforn2; $qt=$this->qt2; $total=$this->total2; $this->codforn2=$this->qt2=$this->total2=null; } else { if(is_null($this->codforn)) { return; } $codforn = $this->codforn; $qt = $this->qt; $total = deca($this->total); } Essa gambiarra funciona, o problema é como lembrar o usuário de que é possível recuperar a última digitação só com um clique na primeira caixa.
  27. Boa noite pessoal! Sou iniciante em javascript gostaria de saber se alguém poderia me ajudar a entender o conceito de funcão com parametros. Minha intenção é a seguinte: Estou tentando pegar o valor digitado no input e passar esse valor para uma função e dentro dessa função armazenar em uma variável que cria um Nó de texto criei um evento de click em um botão e consegui armazenar o valor do input em uma variavel "b" porém quando envio ela como parâmetro retorna um erro dizendo que "b" is not defined, acredito que seja porque ela está definida apenas no escopo da function do evento de click. seguindo esse raciocínio do meu código é possível receber esse valor do input e armazenar em uma variável pra ser usada como um nó de texto? A funcionalidade do código em questão não tem muita importação estou precisando mesmo fixar esse conceito, nesse meu raciocínio é possível passar como parâmetro? // mapeando o input var input = document.querySelector("#input"); // mapeando o botao var btn = document.querySelector("#btn"); //criando evento de click btn.addEventListener("click", function(){ var b = input.value; console.log(b); }) function criaEl(alpha){ var body = document.getElementsByName("body"); var paragrafo = document.createElement("p"); var criaNode = document.createTextNode(alpha); console.log(criaNode); } criaEl(b); // criaEl(input); // criaEl(input.value);
  28. Show... muito obrigado pela a sua atenção, deu certo aqui.
  29. 1. insira os nomes das colunas: insert into cursos (nome, descricao, carga, total_aulas, ano) values etc.. 2.é melhor prática não usar aspas ao inserir valores em colunas numericas; ex: ('Algoritmos', 'Logica de Programacao', 20, 15, '2014'), ('Photoshop', 'Dicas de Photoshop', 10, 8, '2014') etc.
  1. Mais Resultados


  • Estatísticas dos Fóruns

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