calculo de lucro mensal com php e mysql

05/04/2023

0

boa madrugada, to com um projeto onde preciso apresentar o lucro mensal de uma empresa, a ideia é simples: fazer a soma do lucro total de cada mês separado pra exibir no grafico, tenho que fazer usando php e mysql mas estou com um pouco de dificuldade, se alguém puder me dar uma força, uma dica ou um direcionamento, ficarei grata :3
Iris

Iris

Responder

Post mais votado

05/04/2023

Bom dia, Iris,

A primeira coisa a se fazer é procurar a informação no MySQL. Você já tem a tabela que contém todos os períodos de apuração e o respectivo resultado?

Frank Hosaka

Frank Hosaka
Responder

Mais Posts

05/04/2023

Iris

ja sim, eu tbm tenho um trecho de código que fiz, no grafico ta funcionando bem até, mas em um label por exemplo, eu quero exibir só o mês atual mesmo e aí ou ele exibe a soma de todos os meses que tem no meu banco, ou ele exibe a soma separada mas repetindo varias vezes o valor, tipo: R$9300 R$9300 R$9300 R$12300 R$12300, mas o que eu preciso é só o 12300, o código é esse abaixo, eu tinha um outro que exibia na tela o R$12300 duas vezes também.
  <?php
                                               
           $query_valor = "SELECT 
                                       extract(month from data_emissao) as mes_atual,
                                       SUM(valor) OVER(partition by data_emissao order by data_emissao  desc) as acumulo 
                                       from formulario.ordem_de_servico";

                                       $result = mysqli_query($conexao, $query_valor);
                                        while($row = mysqli_fetch_assoc($result)){
                                                    
                                       if($row['mes_atual'] == "1"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "2"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "3"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "4"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "5"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "6"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "7"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "8"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "9"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "10"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else if($row['mes_atual'] == "11"){
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                                    else{
                                                        echo '<h4 class="mb-0 ">R$ '. number_format($row['acumulo'], 2, ",", ".")  . '</h4>';
                                                    }
                                      }

 ?>
Responder

05/04/2023

Arthur Heinrich

A query utilizada:

SELECT 
  extract(month from data_emissao) as mes_atual,
  SUM(valor) OVER(partition by data_emissao order by data_emissao  desc) as acumulo 
from formulario.ordem_de_servico


possui alguns problemas.

1 - Você deveria obter apenas 1 linha por mês com o resultado do lucro. Porém, sua query parece retornar uma linha para cada ordem de serviço, contendo como valor "acumulo" a soma de todas as ordens emitidas no mesmo dia/horário.

2 - A função analítica sum() over() não requer a cláusula order by, uma vez que precisa somar todos os valores da partição.

3 - Ao extrair o mês, você obtém um valor que vai de 1 (janeiro) a 12 (dezembro). Porém, como você não filtrou o período, está somando o faturamento de múltiplos anos, o que é incorreto.

Você primeiro precisa calcular o lucro. Da forma como está, está apresentando o faturamento.

Para calcular o lucro de uma empresa, você precisa apurar todas as receitas e todas as despesas, que podem ser decorrentes da prestação do serviço, como custo de mão de obra, deslocamento e peças, mas também as despesas indiretas, como impostos, aluguel, contas de serviços de água, luz, etc.

Enfim, ao contabilizar tudo o que entra, menos tudo o que sai, você terá o lucro.

Supondo que você queira apurar o lucro direto com as ordens de serviço, você precisa saber o custo da operação, para então apurar o lucro.

Vamos supor que sua tabela contenha a coluna VALOR, como o valor cobrado pela ordem de serviço (receita) e tenha outra coluna CUSTO para registrar o custo operacional. Você poderia ter uma query mais ou menos assim:

SELECT 
  DATE_FORMAT(SYSDATE(), '%Y-%m') as mes,
  SUM(valor) as faturamento,
  SUM(custo) as custo,
  SUM(valor)-SUM(custo) lucro
from formulario.ordem_de_servico
group by DATE_FORMAT(SYSDATE(), '%Y-%m')
order by 1


Você também pode acrescentar um filtro (where), para restringir o período desejado. Geralmente o período de interesse é fechado, podendo ser do mês anterior, ano anterior ou até mesmo de um período recente, para calcular uma prévia.

Ou seja, primeiro dedique-se a escrever uma query que retorne exatamente o que você precisa mostrar no relatório. Quando isto estiver correto, então parta para a codificação do programa que irá exibi-lo.
Responder

05/04/2023

Frank Hosaka

Olá, Iris,

Acredito que a sua listagem saiu truncada. Eu não consegui trabalhar com a tabela com o nome de formulario.ordem_de_servico, eu reduzi para ordem_de_servico. O máximo que eu consegui foi reduzir a sua listagem, assim:
<?php
function fmt($valor){return number_format($valor,2,",",".");}
$conexao=new mysqli("localhost","root","","astudy");
$query_valor = "SELECT extract(month from data_emissao) as mes_atual,
    SUM(valor) OVER(partition by data_emissao order by data_emissao  desc) as acumulo 
    from ordem_de_servico";
$result = mysqli_query($conexao, $query_valor);
while($row = mysqli_fetch_assoc($result)){
    echo '<h4 class="mb-0 ">R$ '. fmt($row['acumulo'])  . '</h4>';}
Responder

06/04/2023

Iris

ah sim, agora eu entendi, obrigado
Responder

06/04/2023

Iris

Olá, Iris,

Acredito que a sua listagem saiu truncada. Eu não consegui trabalhar com a tabela com o nome de formulario.ordem_de_servico, eu reduzi para ordem_de_servico. O máximo que eu consegui foi reduzir a sua listagem, assim:
<?php
function fmt($valor){return number_format($valor,2,",",".");}
$conexao=new mysqli("localhost","root","","astudy");
$query_valor = "SELECT extract(month from data_emissao) as mes_atual,
    SUM(valor) OVER(partition by data_emissao order by data_emissao  desc) as acumulo 
    from ordem_de_servico";
$result = mysqli_query($conexao, $query_valor);
while($row = mysqli_fetch_assoc($result)){
    echo '<h4 class="mb-0 ">R$ '. fmt($row['acumulo'])  . '</h4>';}


eu vou executar agora aqui, vlws
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar