Fórum calculo de lucro mensal com php e mysql #619766
05/04/2023
0

Iris
Curtir tópico
+ 0Post 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

Gostei + 1
Mais Posts
05/04/2023
Iris
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <?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
05/04/2023
Arthur Heinrich
1 2 3 4 | 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:
1 2 3 4 5 6 7 8 | 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
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:
1 2 3 4 5 6 7 8 9 | <?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
06/04/2023
Iris
Gostei + 0
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:
1 2 3 4 5 6 7 8 9 | <?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
Clique aqui para fazer login e interagir na Comunidade :)