calculo de lucro mensal com php e mysql
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
Curtidas 0
Melhor post
Frank Hosaka
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?
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?
GOSTEI 1
Mais Respostas
Iris
05/04/2023
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>'; } } ?>
GOSTEI 0
Arthur Heinrich
05/04/2023
A query utilizada:
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:
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.
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.
GOSTEI 1
Frank Hosaka
05/04/2023
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:
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>';}
GOSTEI 1
Iris
05/04/2023
ah sim, agora eu entendi, obrigado
GOSTEI 0
Iris
05/04/2023
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:
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
GOSTEI 0