filament-ptbr-form-fields icon indicating copy to clipboard operation
filament-ptbr-form-fields copied to clipboard

[Bug]: Problema no component Money

Open felipeArnold opened this issue 1 year ago • 17 comments

What happened?

Ao utilizar o component Money o campo de valor salva correto, conforme a primeira e segunda imagem, porém ao editar e não mexer no campo e não alterando nada e salvar o valor é multiplicado vezes 10, conforme a 3 imagem, analisando o código verifiquei que está realmente fazendo a multiplicação do valor decimal vezes 10.

Estou utilizando uma coluna decimal:10,2 e no meu model estou adicionado aos casts que esse campo é um decimal:2.

Alguma alternativa para não ser feito modificação no código podendo afetar mais usuários?

Função que faz a alteração de valor.

        floatval(
            Str::of($state)
                ->replace('.', '')
                ->replace(',', '.')
                ->toString()
        ) * 10 :
        null

How to reproduce the bug

Imagem 1: image

Imagem 2: image

Imagem 3: image

Package Version

3.0.6

PHP Version

8.2.0

Laravel Version

11.4

Which operating systems does with happen with?

No response

Notes

No response

felipeArnold avatar Apr 17 '24 00:04 felipeArnold

Mesma coisa aqui

IsraelXabregas avatar Apr 19 '24 21:04 IsraelXabregas

Eu tô refatorando, mas ainda não tenho data de lançamento

leandrocfe avatar Apr 19 '24 22:04 leandrocfe

Eu vi que já houve uma tentativa de corrigir, porém ainda sem efeito:

$this->dehydrateStateUsing( fn ($state): ?float => $state ? floatval( Str::of($state) ->replace('.', '') ->replace(',', '.') ->toString() ) : null );

IsraelXabregas avatar Apr 19 '24 22:04 IsraelXabregas

O valor está sendo salvo assim:

update travel_packsSETprice= 69000,travel_packs.updated_at= '2024-04-19 19:01:01' WHEREid = 2

Porém o valor correto é R$ 690,00

IsraelXabregas avatar Apr 19 '24 22:04 IsraelXabregas

O valor está sendo salvo assim:

update travel_packsSETprice= 69000,travel_packs.updated_at= '2024-04-19 19:01:01' WHEREid = 2

Porém o valor correto é R$ 690,00

Eu implementei uma mudança provisória no meu sistema, onde eu criei um service provider que substitui o método dehydrateMask original do Money, por esse método:

`public function dehydrateMask(bool|Closure $condition = true): static {

    if ($condition) {
        $this->dehydrateStateUsing(
            fn($state): ?float => $state ?
                (float)Str::of($state)
                    ->replace('.', '')
                    ->replace(',', '.')
                    ->toString() :
                null
        );
    } else {
        $this->dehydrateStateUsing(null);
    }

    return $this;
}`

A grande diferença é que este método não está multiplicando por 10 o estado. Não sei exatamente qual era o objetivo do Leandro ao fazer essa multiplicação, mas por aqui está funcionando legal por enquanto.

michelbarutot avatar Apr 22 '24 13:04 michelbarutot

Alguma novidade, meu caro leandrocfe?

IsraelXabregas avatar May 21 '24 12:05 IsraelXabregas

@IsraelXabregas @michelbarutot @felipeArnold

Verifiquem essa versão por favor https://github.com/leandrocfe/filament-ptbr-form-fields/releases/tag/3.1.0

leandrocfe avatar Aug 30 '24 12:08 leandrocfe

@IsraelXabregas @michelbarutot @felipeArnold

Verifiquem essa versão por favor https://github.com/leandrocfe/filament-ptbr-form-fields/releases/tag/3.1.0

Boa tarde Leandro, testado e aprovado. Muito obrigado!

michelbarutot avatar Sep 05 '24 16:09 michelbarutot

Testei SEM sucesso na versão: "filament/filament": "^3.2", com: "laravel/framework": "^11.9", na hora de salvar, ele tenta salva tudo errado:

SQLSTATE[HY000]: General error: 1366 Incorrect decimal value: '69,000' for column 'min_deposit' at row 1 (Connection: mysql, SQL: update `settings` set `min_deposit` = 69,000, `settings`.`updated_at` = 2024-10-10 11:44:13 where `id` = 1)

uso:

  Money::make('min_deposit')
      ->label('Depósito Mínimo')

EDIT >>>> Encontrei a causa de não funcionar, eu estava com um submit customizado, e estava acessando $this->data diretamente, mas o correto é usar o getState, pois ele vai fazer com que dehydrateStateUsing seja chamado ( que é onde acontece a formatação ), vou deixar a resposta pq alguêm mais pode está cometendo o mesmo erro

hlspablo avatar Oct 10 '24 11:10 hlspablo

Boa parte do problema dessa thread aqui eu acho que seria usar DECIMAL(10,2) no banco. É receita pra se incomodar. SEMPRE faça a persistência dos dados em centavos, por exemplo R$ 123.45 no banco ficaria 12345 mesmo.

Eu faço casting dos campos pra essa biblioteca, que cuida da parte de dividir por 100 ao requisitar do banco e multiplicar por 100 ao salvar.

https://github.com/snoeren-development/laravel-currency-casting

lucasff avatar Nov 15 '24 16:11 lucasff

wip

leonardyrj avatar Dec 05 '24 02:12 leonardyrj

Boa noite Leandro, acabei implementando seu componente de money em um projeto pessoal e conseguir realizar o ajuste para que evitasse a duplicidade do valor, iria abrir um PR sobre a melhoria mas vi que seu componente foi muito modificado em cima da base que peguei, segue o link do que para mim funcionou.

https://github.com/felipeArnold/filament-multi-tenancy-start-kit/blob/main/app/Filament/Components/PtbrMoney.php

felipeArnold avatar Dec 23 '24 23:12 felipeArnold

Boa tarde, o problema agora está sendo com outros campos live do formulário. Vou corrigir isso na próxima versão.

leandrocfe avatar Dec 24 '24 16:12 leandrocfe

Eu também estou com esse problema. Estou usando o Laravel 12 com a versão 3.2.1 deste pacote.

Eu tentei essa resolução #41. Parece que nos casos que testei os resultados foram positivos.

LuizCristino avatar Apr 26 '25 03:04 LuizCristino

Esse pacote parece que está abandonado, melhor procurar outro.

leonardyrj avatar Apr 26 '25 10:04 leonardyrj

@leonardyrj Pode ser pelo motivo do mantenedor estar ocupado com a versão 4 do Filament. Obrigado pela preocupação e resposta.

LuizCristino avatar Apr 28 '25 11:04 LuizCristino

@leonardyrj . Eu precisei muito do money field acabei lançando esse pacote. Se alguém tiver precisando me ajudou muito.

Image

https://github.com/a21ns1g4ts/filament-brl-money-field

a21ns1g4ts avatar May 06 '25 17:05 a21ns1g4ts