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

Copilot: agregações para melhorar o desempenho


Frank K Hosaka

Pergunta

Gastei dois dias para transformar um arquivo com o CSS Bootstrap para o Tailwinds, tive que trocar um monte de <td> por um monte de <div>:

arquivo balanceteView.blade.php
@include('menuView')
<script>btMenu.innerHTML="Balancete";document.title="Balancete"</script>


<div class="flex bg-gray-200">
    <div style=width:350px><a href='balanceteApura'>{{$apuracao->apuracao}}</a></div>
    <div style=width:200px class=text-right>Anterior</div>
    <div style=width:200px class=text-right>Débito</div>
    <div style=width:200px class=text-right>Crédito</div>
    <div style=width:200px class=text-right>Saldo</div>
</div>
@foreach($balancete as $conta)
<div class="flex bg-gray-200 odd:bg-white even:bg-gray-200">
    <div style=width:50px><a href="balanceteRazao?conta={{$conta->conta}}">{{$conta->conta}}</a></div>
    <div style=width:300px>{{$conta->descricao}}</div>
    <div style=width:200px class=text-right>{{dec($conta->inicio)}}</div>
    <div style=width:200px class=text-right>{{dec($conta->debito)}}</div>
    <div style=width:200px class=text-right>{{dec($conta->credito)}}</div>
    <div style=width:200px class=text-right>{{dec($conta->fim)}}</div>
</div>
    @if($conta->conta==304)
    <div class="flex bg-white">
    <div style=width:950px class="text-right font-semibold">Receita</div>
    <div style=width:200px class="text-right font-semibold">{{dec($receita)}}</div>
    </div>
    @endif
</div>
@endforeach
<div class="flex bg-white">
    <div style=width:950px class="text-right font-semibold">Despesa</div>
    <div style=width:200px class="text-right font-semibold">{{dec($despesa)}}</div>
</div>
<div class="flex bg-gray-200">
    <div style=width:550px class="text-right font-semibold">{{dec($anterior)}}</div>
    <div style=width:400px class="text-right font-semibold">{{$nota}}</div>
    <div style=width:200px class="text-right font-semibold">{{dec($resultado)}}</div>
</div>

e apenas alguns segundos para acabar com a lentidão da minha função balancete:

arquivo Balancete.php (listagem parcial)
<?php
// ...
function inicio (Request $request)
    {
        $previa=$this->balancete();
        $balancete=$previa->balancete;
        $apuracao=$previa->apuracao;
        $anterior=$previa->anterior;
        $receita=$previa->receita;
        $despesa=$previa->despesa;
        $resultado=$previa->resultado;
        $nota=$previa->nota;
        return view('balanceteView',['balancete'=>$balancete,
            'apuracao'=>$apuracao,'anterior'=>$anterior,'despesa'=>$despesa,
            'receita'=>$receita,'resultado'=>$resultado,'nota'=>$nota]);
    }

function balancete()
{
    $receita = 0;
    $despesa = 0;
    $anterior = 0;
    $balancete = [];
    $contas = tbconta::all();

    if (!session()->has('dia')) {
        session(['dia' => date('Y-m-d')]);
    }

    $apuracao = apuracao(session('dia'));
    $primeiroDia = $apuracao->primeiroDia;
    $ultimoDia = $apuracao->ultimoDia;

    // Agregações para melhorar a performance
    $debitosAnteriores = tbdiario::where('dia', '<', $primeiroDia)
        ->select('contad', \DB::raw('SUM(valor) as debito_anterior'))
        ->groupBy('contad')
        ->pluck('debito_anterior', 'contad')->all();

    $creditosAnteriores = tbdiario::where('dia', '<', $primeiroDia)
        ->select('contac', \DB::raw('SUM(valor) as credito_anterior'))
        ->groupBy('contac')
        ->pluck('credito_anterior', 'contac')->all();

    $debitos = tbdiario::whereBetween('dia', [$primeiroDia, $ultimoDia])
        ->select('contad', \DB::raw('SUM(valor) as debito'))
        ->groupBy('contad')
        ->pluck('debito', 'contad')->all();

    $creditos = tbdiario::whereBetween('dia', [$primeiroDia, $ultimoDia])
        ->select('contac', \DB::raw('SUM(valor) as credito'))
        ->groupBy('contac')
        ->pluck('credito', 'contac')->all();

    $debitosFinais = tbdiario::where('dia', '<=', $ultimoDia)
        ->select('contad', \DB::raw('SUM(valor) as debito_fim'))
        ->groupBy('contad')
        ->pluck('debito_fim', 'contad')->all();

    $creditosFinais = tbdiario::where('dia', '<=', $ultimoDia)
        ->select('contac', \DB::raw('SUM(valor) as credito_fim'))
        ->groupBy('contac')
        ->pluck('credito_fim', 'contac')->all();

    foreach ($contas as $conta) {
        $debitoAnterior = isset($debitosAnteriores[$conta->conta]) ? $debitosAnteriores[$conta->conta] : 0;
        $creditoAnterior = isset($creditosAnteriores[$conta->conta]) ? $creditosAnteriores[$conta->conta] : 0;
        $inicio = $debitoAnterior - $creditoAnterior;
        $anterior += $inicio;

        $debito = isset($debitos[$conta->conta]) ? $debitos[$conta->conta] : 0;
        $credito = isset($creditos[$conta->conta]) ? $creditos[$conta->conta] : 0;

        $debitoFim = isset($debitosFinais[$conta->conta]) ? $debitosFinais[$conta->conta] : 0;
        $creditoFim = isset($creditosFinais[$conta->conta]) ? $creditosFinais[$conta->conta] : 0;

        $fim = $debitoFim - $creditoFim;

        if ($conta->conta >= 301 && $conta->conta <= 304) {
            $receita += $fim;
        }

        if ($conta->conta > 304) {
            $despesa += $fim;
        }

        $balancete[] = [
            'conta' => $conta->conta,
            'descricao' => $conta->descricao,
            'inicio' => $inicio,
            'debito' => $debito,
            'credito' => $credito,
            'fim' => $fim,
        ];
    }

    $resultado = $receita + $despesa;
    $nota = ($resultado < 0) ? "Lucro" : "Prejuízo";
    $balancete = json_decode(json_encode($balancete));

    return json_decode(json_encode([
        'balancete' => $balancete,
        'apuracao' => $apuracao,
        'anterior' => $anterior,
        'despesa' => $despesa,
        'receita' => $receita,
        'resultado' => $resultado,
        'nota' => $nota,
    ]));
}

Esse Copilot é fora de série!

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