Foto de Geraldo B.
Geraldo há 3 anos
Enviada pelo
Site

Como garantir o resultado final de cálculos monetários ?

Estou desenvolvendo um sistema na qual tem cálculos monetários e inicialmente para interatividade fiz tudo em javascript para depois salvar no banco de dados, aparentemente funciona certo, mas de vez em quanto gera erros, chegando a conclusão, não sei se é equivocada que nao se pode confiar no navegador ou mesmo no pc do usuário. Gostaria de saber como as empresas tipos bancos, trabalhão com essa questão para garantiar o resultado final. No momento considero isso uma área extremamente crítica do sistema por que qualquer erro pode gerar um valor equivocado. Agora considero manter o calculos no lado cliente, mas considero fazer uma confirmação como recalculo no lado servidor, so lembrando que estou usando laravel 8 (PHP), mysql, jquery . Alguem poderia me dar uma luz, é a primeira vez que tenho que lidar com questoes assim que nao pode dar errado. No demais, obrigado a todos que poderem me ajudar.

Professor Scavy K.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 3 anos
Contatar Scavy

Boa tarde!

A sua questão de fazer calculos no lado cliente é bem complicado pelo fato dos navegadores poderem apresentar alguma incompatibilidade.

No lado servidor  você tem que tratar no PHP os dados antes de enviar para a database (MySQL) e o campo da tabela correspondente do MySQL que irá gravar os valores moeda, pode ser do tipo decimal(10,3) ou algo semelhante.

Em meus sistemas eu uso JavaScript ou JQuery apenas para interagir com o usuario.

No caso do Brasil, R$ mil ponto centenas virgula centavos, porem para a máquina é sempre mil centenas ponto centavos.

Existem varias funções no PHP para fazer essa interação.

Se a dúvida persistir marca uma aula pelo profes para que eu possa te ajudar.

Grato!

 

 

 

 

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Envie uma dúvida grátis
Resposta na hora da Minerva IA e de professores particulares
Enviar dúvida
Professor Angelo R.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 3 anos
Contatar Angelo

Os testes vão garantir exatamente isso.

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Professora Thalita S.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 1 semana
Contatar Thalita

Você está absolutamente correto em considerar que não se deve confiar exclusivamente nas informações fornecidas pelo cliente (navegador ou PC do usuário) quando se trata de cálculos financeiros críticos. Isso é uma prática comum em sistemas financeiros, bancários ou qualquer outro sistema onde a precisão dos dados é essencial, e a abordagem que você está considerando — realizar um **recalculo no lado do servidor** para garantir a precisão — é uma estratégia bastante eficiente e segura. Vou explicar em detalhes como as empresas, especialmente bancos, lidam com isso e dar algumas sugestões específicas para o seu caso.

### 1. **Como Bancos e Empresas lidam com isso?**

As empresas, especialmente aquelas que lidam com transações financeiras (como bancos, fintechs, etc.), sempre **verificam e validam** os dados no lado do servidor, independentemente dos dados enviados pelo cliente. Isso é feito por várias razões:

- **Segurança e Integridade dos Dados**: Dados manipulados no lado do cliente podem ser alterados por ataques de man-in-the-middle, modificações no código JavaScript, ou até mesmo por erros de configuração no navegador do usuário.
- **Evitar Fraudes e Erros de Cálculo**: Se um cálculo financeiro importante for feito apenas no lado do cliente, um atacante poderia manipular o resultado para obter um valor incorreto.
- **Auditoria e Conformidade**: Em ambientes regulados, como o setor bancário, é fundamental garantir que todas as operações financeiras possam ser auditadas. Isso exige que as operações críticas, como cálculos monetários, sejam feitas no servidor, onde podem ser monitoradas, verificadas e auditadas adequadamente.

Por exemplo, um banco pode permitir que o usuário veja uma estimativa de saldo no lado do cliente, mas, antes de realizar qualquer transação (como transferência ou pagamento), ele recalcula os valores no servidor para garantir que os cálculos sejam precisos.

### 2. **Como Garantir Cálculos Monetários Precisos no Servidor com Laravel 8?**

No seu caso, a abordagem de fazer **cálculos no lado do cliente** para interação e **validação no lado do servidor** para garantir a precisão é excelente. Abaixo estão algumas sugestões práticas para implementar isso no seu sistema com Laravel 8 e MySQL.

#### A. **Cálculos no Lado do Cliente (JavaScript)**

Manter o cálculo inicial no lado do cliente para interação é perfeitamente aceitável e proporciona uma experiência rápida e interativa para o usuário. Aqui você pode usar **JavaScript** ou **jQuery** para calcular os valores conforme o usuário insere as informações. No entanto, não confie nos resultados diretamente.

#### B. **Enviar os Dados para o Servidor (Laravel)**

Quando o usuário enviar os dados para o servidor (por exemplo, ao submeter um formulário ou fazer um pagamento), você deve garantir que **todas as operações críticas sejam recalculadas no servidor** antes de serem gravadas no banco de dados ou utilizadas para transações.

No Laravel, você pode capturar esses dados via **POST** e realizar os cálculos necessários no lado do servidor antes de qualquer operação de banco de dados.

##### Exemplo: Validar e recalcular no servidor

```php
public function processarCalculo(Request $request)
{
    // Obter os dados enviados pelo cliente
    $valor1 = $request->input('valor1');
    $valor2 = $request->input('valor2');
    $percentual = $request->input('percentual');
    
    // Realizar os cálculos no servidor (exemplo simples)
    $calculo1 = $valor1 * (1 + $percentual / 100);
    $calculo2 = $valor2 + $calculo1;

    // Verifique se o cálculo está correto
    if ($calculo1 < 0 || $calculo2 < 0) {
        return response()->json(['error' => 'Cálculo inválido'], 400);
    }

    // Salvar os dados no banco de dados (por exemplo, em uma transação financeira)
    DB::beginTransaction();
    try {
        // Insira os dados no banco
        $transacao = new Transacao();
        $transacao->valor1 = $valor1;
        $transacao->valor2 = $valor2;
        $transacao->calculo_final = $calculo2;
        $transacao->save();

        // Confirmar a transação
        DB::commit();

        return response()->json(['success' => 'Cálculo realizado e transação salva'], 200);
    } catch (\Exception $e) {
        DB::rollBack();
        return response()->json(['error' => 'Erro ao salvar transação'], 500);
    }
}
```

Aqui, **Laravel** processa os dados de cálculo de maneira confiável no servidor. Apenas depois de calcular os valores, o servidor realiza a operação no banco de dados (no exemplo, uma transação).

#### C. **Utilizando Tipos de Dados Precisos para Cálculos Monetários**

Ao trabalhar com valores monetários, é essencial garantir que a precisão seja mantida. No MySQL, você pode usar o tipo de dado **`DECIMAL`** para armazenar valores monetários. Isso é preferível ao tipo `FLOAT`, que pode gerar imprecisão devido à maneira como os números de ponto flutuante são armazenados.

Exemplo de criação de tabela:

```sql
CREATE TABLE transacoes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    valor1 DECIMAL(10,2),
    valor2 DECIMAL(10,2),
    calculo_final DECIMAL(10,2)
);
```

### 3. **Confirmar os Cálculos no Servidor com Testes Automáticos**

Você pode usar **testes automáticos** para garantir que os cálculos no servidor sejam precisos. O Laravel tem suporte para testes com PHPUnit, e você pode escrever testes para verificar se os cálculos realizados no servidor estão corretos.

##### Exemplo de Teste no Laravel:
```php
public function testCalculoDeTransacao()
{
    $response = $this->post('/processar-calculo', [
        'valor1' => 100,
        'valor2' => 200,
        'percentual' => 10,
    ]);

    $response->assertStatus(200);
    $this->assertDatabaseHas('transacoes', [
        'valor1' => 100,
        'valor2' => 200,
        'calculo_final' => 330.00, // Valor esperado baseado nos cálculos do servidor
    ]);
}
```

Isso garante que os cálculos realizados no servidor estão de acordo com o esperado.

### 4. **Considerações Finais sobre Segurança e Confiabilidade**

Além de validar os cálculos no servidor, você também pode implementar as seguintes medidas para garantir a segurança e confiabilidade do sistema:

- **Validação de Entrada**: Certifique-se de que os dados enviados do cliente (valores monetários, percentuais, etc.) sejam sempre validados no servidor para evitar manipulação de dados.
- **Comunicação Segura (HTTPS)**: Utilize HTTPS para garantir que a comunicação entre o cliente e o servidor seja segura e que os dados não possam ser interceptados ou manipulados durante a transmissão.
- **Log de Transações**: Mantenha um log de todas as transações e cálculos realizados no servidor, para auditoria e rastreamento de possíveis erros ou fraudes.
- **Monitoramento de Erros**: Utilize ferramentas como **Sentry** ou **Laravel Log** para monitorar erros e garantir que qualquer falha no processamento seja registrada e corrigida rapidamente.

### Conclusão

Em sistemas críticos, como o seu, onde os cálculos financeiros não podem falhar, é essencial que o **servidor** seja responsável pelo cálculo final, garantindo que os dados no banco de dados sejam sempre precisos. Manter o processamento no **lado do cliente** para interatividade é uma boa prática, mas sempre **recalcule** os valores no servidor antes de realizar qualquer operação que envolva transações financeiras. 

Esse fluxo garantirá não só a precisão dos cálculos, mas também a segurança e a integridade dos dados no sistema.

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Minerva IA
do Profes
Respostas na hora
100% no WhatsApp
Envie suas dúvidas pelo App. Baixe agora
Precisa de outra solução? Conheça
Aulas particulares Encontre um professor para combinar e agendar aulas particulares Buscar professor