leandrocfe/filament-ptbr-form-fields

[Bug]: Problema no component Money

felipeArnold opened this issue · 13 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

Mesma coisa aqui

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

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 );

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

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.

Alguma novidade, meu caro 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!