[Bug]: Problema no component Money
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:
Imagem 2:
Imagem 3:
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:
updatetravel_packsSETprice= 69000,travel_packs.updated_at= '2024-04-19 19:01:01' WHEREid= 2Poré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
@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!
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
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
wip
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
Boa tarde, o problema agora está sendo com outros campos live do formulário. Vou corrigir isso na próxima versão.
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.
Esse pacote parece que está abandonado, melhor procurar outro.
@leonardyrj Pode ser pelo motivo do mantenedor estar ocupado com a versão 4 do Filament. Obrigado pela preocupação e resposta.
@leonardyrj . Eu precisei muito do money field acabei lançando esse pacote. Se alguém tiver precisando me ajudou muito.
https://github.com/a21ns1g4ts/filament-brl-money-field