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
99 stars 17 forks source link

[Bug]: Problema no component Money #27

Open felipeArnold opened 6 months ago

felipeArnold commented 6 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 6 months ago

Mesma coisa aqui

leandrocfe commented 6 months ago

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

IsraelXabregas commented 6 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 6 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 6 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 5 months ago

Alguma novidade, meu caro leandrocfe?

leandrocfe commented 2 months ago

@IsraelXabregas @michelbarutot @felipeArnold

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

michelbarutot commented 2 months ago

@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!

hlspablo commented 3 weeks ago

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