calculo de lucro mensal com php e mysql
05/04/2023
0
Iris
Post mais votado
05/04/2023
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
Mais Posts
05/04/2023
Iris
<?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>'; } } ?>
05/04/2023
Arthur Heinrich
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.
05/04/2023
Frank Hosaka
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>';}
06/04/2023
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
Clique aqui para fazer login e interagir na Comunidade :)