Enviado em 11/07/2025 - 02:40h
Fazer modal no PHP ou no Laravel foi bem difícil para mim, pois eu não tinha nenhuma familiaridade com o JavaScript.arquivo app > Livewire > NotaFiscal.php
<?php
namespace App\Livewire;
use App\Models\tbdiario;
use App\Models\tbpessoa;
use App\Models\tbhistprod;
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 do Fornecedor'])]
class NotaFiscal extends Component {
use WithFileUploads;
public $comando="pegar xml",$criterio,$difAliqICMS,$inativos=[],$indicador,$lcto;
public $modal=true,$modal2,$modal3;
public $nNF,$opcoes=[],$previa=[],$quant,$soma,$xNome,$XmlFile,$vNF;
function updatedXmlFile() {
$this->previa=[];
$xmlContent=file_get_contents($this->XmlFile->getRealPath());
$nfe=simplexml_load_string($xmlContent);
$itens=$nfe->NFe->infNFe->det;
$this->difAliqICMS=0;
$aliquotaInterna=0.18;
foreach ($itens as $item) {
if ((float)$item->prod->CFOP == 6102 || (float)$item->prod->CFOP ==6101) {
$vBC = (float)$item->imposto->ICMS->ICMS10->vBC;
$vBC = $vBC ? $vBC : (float)$item->imposto->ICMS->ICMS00->vBC;
$vICMS = (float)$item->imposto->ICMS->ICMS10->vICMS;
$vICMS = $vICMS ? $vICMS : (float)$item->imposto->ICMS->ICMS00->vICMS;
$this->difAliqICMS += round(($vBC * $aliquotaInterna - $vICMS+0.00001),2);
}
}
$this->vNF = (float)$nfe->NFe->infNFe->total->ICMSTot->vNF;
$this->nNF = (string)$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');
$this->soma=0;
foreach ($itens as $item) {
$codforn = (string)$item->prod->cProd;
$criterio= strtolower($nome[0].$codforn);
$consulta = tbprod::where('codforn','like','%'.$criterio.'%')->get();
$cfop = (string)$item->prod->CFOP;
$ncm = (string)$item->prod->NCM;
if (count($consulta) == 1) {
$codprod = $consulta[0]->codprod;
if(substr($consulta[0]->cfop,0,1)==0) {
$this->inativos[]=$consulta[0]->codprod;
}
$class=($cfop == substr($consulta[0]->cfop,-4)) ? "w-[50px] text-right" :
"w-[50px] text-red-500 text-right";
$class2=($ncm == $consulta[0]->cf) ? "w-[100px] text-right" :
"w-[100px] text-red-500 text-right";
}
if (count($consulta) > 1) {
$consulta2 = tbprod::where('codforn','like','%'.$criterio)->get();
if(count($consulta2) == 1){
$codprod = $consulta2[0]->codprod;
$consulta = $consulta2;
} else {
$codprod = "mult";
}
}
if (count($consulta)==0) {
$codprod = "none";
}
$produto = substr((string)$item->prod->xProd,0,79);
$quantidade = (float)$item->prod->qCom;
if($cfop==6101 || $cfop==6102 || $cfop==5101) {
$cfop=5102;
}
if($cfop==6401 || $cfop==6402 || $cfop==6403 || $cfop==5401 || $cfop==5403 || $cfop==5655) {
$cfop=5405;
}
if (is_numeric($codprod)) {
$produtoDobrado = [506, 507, 508, 509, 510, 519, 1768, 1770, 1772];
if (in_array($codprod, $produtoDobrado)) {
$quantidade = 2 * $quantidade;
}
$produtox5=[1798];
if (in_array($codprod,$produtox5 )) {
$quantidade = 5 * $quantidade;
}
$produtoX10 = [2192,1782,2456];
if (in_array($codprod, $produtoX10)) {
$quantidade = 10 * $quantidade;
}
$produtox12 = [2403,2406,2496,2497,2498,2499];
if (in_array($codprod, $produtox12)) {
$quantidade = 12 * $quantidade;
}
$produtox24 = [2493,2405,2494,2495,2409];
if (in_array($codprod, $produtox24)) {
$quantidade = 24 * $quantidade;
}
}
$vICMSST1 = ((float)$item->imposto->ICMS->ICMS10->vICMSST) ?
(float)$item->imposto->ICMS->ICMS10->vICMSST : null;
$vICMSST2 = ((float)$item->imposto->ICMS->ICMSSN202->vICMSST) ?
(float)$item->imposto->ICMS->ICMSSN202->vICMSST : null;
$vICMSST = $vICMSST1 ? $vICMSST1 : $vICMSST2;
$difAliq = 0;
if ((float)$item->prod->CFOP == 6102 || (float)$item->prod->CFOP == 6101){
$vBC = (float)$item->imposto->ICMS->ICMS10->vBC;
$vBC = $vBC ? $vBC : (float)$item->imposto->ICMS->ICMS00->vBC;
$vICMS = (float)$item->imposto->ICMS->ICMS10->vICMS;
$vICMS = $vICMS ? $vICMS : (float)$item->imposto->ICMS->ICMS00->vICMS;
$difAliq = round(($vBC * $aliquotaInterna - $vICMS+0.00001),2);
}
$vIPI =(isset($item->imposto->IPI->IPITrib->vIPI) && (float)$item->imposto->IPI->IPITrib->vIPI) ?
(float)$item->imposto->IPI->IPITrib->vIPI : 0;
$vProd = (string)$item->prod->vProd;
$valorTotal = $vProd + $vICMSST + $difAliq + $vIPI;
$this->soma += $valorTotal;
$custoAtual = intval($valorTotal / $quantidade * 100) / 100;
$custoAnterior=0;
$marg=0;
$cclass="w-[70px] text-right";
$nclass="w-[100px] text-right";
$fclass="w-[50px] text-right";
if (is_numeric($codprod)) {
$consulta = tbprod::where('codprod',$codprod)->first();
$custoAnterior = $consulta->custo;
$marg=$consulta->marg;
if (abs($custoAnterior - $custoAtual) > 0.02) {
$cclass = 'w-[70px] text-right text-red-500';
}
if ($ncm !== $consulta->cf) {
$nclass = 'w-[100px] text-right text-red-500';
}
if (trim($cfop) !== trim(substr($consulta->cfop,-4))) {
$fclass = 'w-[50px] text-right text-red-500';
}
}
$this->previa[]=['codforn'=>$codforn,'codprod'=>$codprod,'prod'=>$produto,
'qt'=>$quantidade,'custoanterior'=>$custoAnterior,'custoatual'=>$custoAtual,
'custototal'=>$valorTotal, 'fclass'=>$fclass,
'cfop'=>$cfop,'codp'=>$codp,'ncm'=>$ncm,'nclass'=>$nclass,'cclass'=>$cclass,
'marg'=>$marg];
}
$this->modal=false;
$this->modal2=true;
}
function atualizarCfop($indicador) {
$codprod=$this->previa[$indicador]['codprod'];
$cfop=$this->previa[$indicador]['cfop'];
DB::table('tbprod')->where('codprod',$codprod)
->update(['cfop' =>
DB::raw("CONCAT(LEFT(cfop, LENGTH(cfop) - 4), $cfop)")]);
$this->previa[$indicador]['fclass']='w-[50px] text-right';
}
function atualizarNcm($indicador) {
$codprod=$this->previa[$indicador]['codprod'];
$ncm=$this->previa[$indicador]['ncm'];
tbprod::where('codprod',$codprod)->update(['cf'=>$ncm]);
$this->previa[$indicador]['nclass']='w-[100px] text-right';
}
function cancelar() { $this->modal=false; }
function custo($indicador) {
$this->indicador=$indicador;
$this->comando="alterar custo";
$this->modal=true;
}
function custoConfirmado() {
$custo=$this->previa[$this->indicador]['custoatual'];
$codprod=$this->previa[$this->indicador]['codprod'];
$this->previa[$this->indicador]['cclass']="w-[70px] text-right";
tbprod::where('codprod',$codprod)->update(['custo'=>$custo]);
$this->modal=false;
}
function mostrarMais() {
if($this->modal2) {
$this->modal2=false;
$this->modal3=true;
} else {
$this->modal2=true;
$this->modal3=false;
}
}
function multiplo($indicador) {
$this->criterio=$this->previa[$indicador]['codforn'];
$consulta=tbprod::where('codforn','like',"%$this->criterio")->get();
$this->opcoes=[];
foreach($consulta as $c) {
$this->opcoes[]=['indicador'=>$indicador,'codprod'=>$c->codprod,'prod'=>$c->prod];
}
$this->modal=true;
}
function qtDefinir($indicador) {
$this->indicador=$indicador;
$this->comando="qt";
$this->modal=true;
}
function qtDefinida() {
$quant=$this->quant;
$custo=round($this->previa[$this->indicador]['custototal']/$quant,2);
$this->previa[$this->indicador]['qt']=$quant;
$this->previa[$this->indicador]['custoatual']=$custo;
$this->previa[$this->indicador]['cclass']="w-[50px] text-right text-red-500";
$this->modal=false;
}
function selecionado($chave) {
$indicador=$this->opcoes[$chave]['indicador'];
$codprod=$this->opcoes[$chave]['codprod'];
$this->previa[$indicador]['codprod']=$codprod;
$consulta=tbprod::where('codprod',$codprod)->first();
$this->previa[$indicador]['marg']=$consulta->marg;
$this->previa[$indicador]['custoanterior']=$consulta->custo;
if($this->previa[$indicador]['custoanterior'] !== $this->previa[$indicador]['custoatual']) {
$previa[$indicador]['pclass']="w-[50px] text-right text-red-200";
}
$this->modal=false;
}
function transferir() {
if(count(tbhistprod::where('lcto',$this->lcto)->get())>0){
$this->comando="transferido";
$this->modal=true;
} else {
$dia=tbdiario::where('lcto',$this->lcto)->value('dia');
foreach($this->previa as $p) {
tbhistprod::create(['codprod'=>$p['codprod'],'dia'=>$dia,'qt'=>$p['qt'],
'custototal'=>$p['custototal'],'codp'=>$p['codp'],'lcto'=>$this->lcto]);
}
return redirect('ldiario');
}
}
}
arquivo resources > views > livewire > nota-fiscal.blade.php
<div>
@if($modal)
<div class="fixed inset-0 flex items-center justify-center z-10" style="background-color: rgba(243,244,246,0.5)">
<div class="bg-white p-6 rounded shadow-lg">
@if($comando=="pegar xml")
<flux:input type="file" wire:model="XmlFile" label="Pegar arquivo xml"/>
@endif
@if($comando=="escolher produto")
@foreach($opcoes as $chave => $o)
<flux:button wire:click="selecionado({{$chave}})">{{ $o['codprod']." ".$o['prod'] }} </flux:button>
@endforeach
<p>Existem muitos produtos com o critério {{$criterio}}. Escolha um.</p>
@endif
@if($comando=="alterar custo")
<div class=w-[300px]>
<flux:input.group>
<flux:input.group.prefix>Custo Anterior</flux:input.group.prefix>
<flux:input value="{{dec($previa[$indicador]['custoanterior'])}}" />
</flux:input.group>
<flux:input.group>
<flux:input.group.prefix>Custo Atual</flux:input.group.prefix>
<flux:input value="{{ dec($previa[$indicador]['custoatual']) }}" />
</flux:input.group>
<flux:button wire:click="custoConfirmado">Confirmar</flux:button>
</div>
@endif
@if($comando=="qt")
<div class=w-[300px]>
<flux:input.group>
<flux:input.group.prefix>Definir Quantidade</flux:input.group.prefix>
<flux:input wire:model="quant" wire:change="qtDefinida" autofocus autocomplete="off" />
</flux:input.group>
<flux:button wire:click="cancelar" class="mt-5">Cancelar</flux:button>
</div>
@endif
@if($comando=="transferido")
<div class="text-lg">Documento já transferido anteriormente</div>
@endif
</div>
</div>
@endif
@if($modal2 || $modal3)
@if(count($inativos))
<div class=mt-5>{{ "verificar ".print_r($inativos) }}</div>
@endif
<div class=flex>
<div class=w-[530px]>NF {{ $nNF." ".$xNome }}</div>
<div class="w-[100px] text-right">{{ dec($vNF) }}</div>
</div>
@if($difAliqICMS!==0)
<div class="flex">
<div class="w-[530px] text-right">Diferença de Alíquota de ICMS</div>
<div class="w-[100px] text-right"><?=dec($difAliqICMS)?></div>
</div>
<div class="flex">
<div class="w-[530px] text-right">Total a conferir</div>
<div class="w-[100px] text-right"><?=dec($difAliqICMS+$vNF)?></div>
</div>
@endif
@if($modal2)
<div class="flex even:bg-gray-200">
<div class="w-[70px] text-right">Cforn</div>
<div class="w-[50px] text-right">Cod</div>
<div class="w-[288px] px-2">Produto</div>
<div class="w-[50px] text-right">Mg</div>
<div class="w-[50px] text-right">Qt</div>
<div class="w-[70px] text-right">Preço</div>
<div class="w-[100px] text-right font-semibold" wire:click=mostrarMais>Total</div>
</div>
@foreach($previa as $key => $p)
<div class="flex even:bg-gray-200">
<div class="w-[70px] text-right truncate">{{$p['codforn']}}</div>
@if($p['codprod']=="none")
<div class="w-[50px] text-right text-red-500">{{$p['codprod']}}</div>
@endif
@if($p['codprod']=="mult")
<div class="w-[50px] text-right text-red-500" wire:click="multiplo({{$key}})">
{{ $p['codprod']}}
</div>
@endif
@if($p['codprod']!=="none" && $p['codprod']!=="mult")
<div class="w-[50px] text-right">{{$p['codprod']}}</div>
@endif
<div class="w-[288px] px-2 truncate">{{$p['prod']}}</div>
<div class="w-[50px] text-right">{{$p['marg']}}</div>
<div class="w-[50px] text-right" wire:click="qtDefinir({{$key}})">{{$p['qt']}}</div>
<div class="{{ $p['cclass']}}" wire:click="custo({{$key}})">{{dec($p['custoatual'])}}</div>
<div class="w-[100px] text-right">{{dec($p['custototal'])}}</div>
</div>
@endforeach
@endif
@if($modal3)
<div class="flex even: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 font-semibold" wire:click="mostrarMais">NCM</div>
</div>
@foreach($previa as $key => $p)
<div class="flex even:bg-gray-200">
<div class="w-[70px] text-right truncate">{{$p['codforn']}}</div>
@if($p['codprod']=="none")
<div class="w-[50px] text-right text-red-500">{{$p['codprod']}}</div>
@endif
@if($p['codprod']=="mult")
<div class="w-[50px] text-right text-red-500" wire:click="multiplo({{$key}})">
{{ $p['codprod']}}
</div>
@endif
@if($p['codprod']!=="none" && $p['codprod']!=="mult")
<div class="w-[50px] text-right">{{$p['codprod']}}</div>
@endif
<div class="w-[358px] px-2 truncate">{{$p['prod']}}</div>
<div class="{{$p['fclass']}}" wire:click="atualizarCfop({{ $key }})">
{{$p['cfop']}}
</div>
<div class="{{$p['nclass']}}" wire:click="atualizarNcm({{ $key }})">
{{$p['ncm']}}
</div>
</div>
@endforeach
@endif
<div class=flex>
<div class="w-[300px]">
<flux:input.group>
<flux:button>Enviar para Lançamento</flux:button>
<flux:input wire:model="lcto" wire:change="transferir" />
</flux:input.group>
</div>
<div class="w-[330px] text-right">{{ dec($soma) }}</div>
</div>
@endif
</div>
O que é o THP na configuração de RAM do Linux e quando desabilitá-lo
Comparação entre os escalonadores BFQ e MQ-Deadline (acesso a disco) no Arch e Debian
Conciliando o uso da ZRAM e SWAP em disco na sua máquina
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Deixando o Plasma6 mais fluido no Linux
Como unir duas coleções de ROMs preservando as versões traduzidas (sem duplicatas)
Isso acontece com vcs também? (8)
Problema com audio apos upgrade (10)
Instalação automatizada do Debian 12 em UEFI (2)