leandrocfe / filament-ptbr-form-fields

This package provides custom form fields for Filament (>=v2.17.28) that are commonly used in Brazilian web applications, such as CPF/CNPJ validation, phone number formatting, money with currency symbol, and CEP integration with ViaCep.
MIT License
90 stars 11 forks source link

[Bug]: Problema no component Money #27

Open felipeArnold opened 2 months ago

felipeArnold commented 2 months ago

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

IsraelXabregas commented 2 months ago

Mesma coisa aqui

leandrocfe commented 2 months ago

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

IsraelXabregas commented 2 months ago

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 commented 2 months ago

O valor está sendo salvo assim:

update travel_packs SET price= 69000, travel_packs.updated_at= '2024-04-19 19:01:01' WHERE id= 2

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

michelbarutot commented 2 months ago

O valor está sendo salvo assim:

updatetravel_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.

IsraelXabregas commented 1 month ago

Alguma novidade, meu caro leandrocfe?