R-002 — Desconto precisa ser menor que o total do checkout
TLDR:
discount_amountaceita de0até menos que ototaldo checkout; igual ou maior é inválido, para a base nunca cair a zero.
Given / When / Then
Dado um checkout com total definido,
Quando o discount_amount informado é maior ou igual ao total, ou é negativo,
Então o checkout é inválido e errors[:discount_amount] é preenchido.
Dado o mesmo checkout,
Quando o discount_amount informado é maior ou igual a 0 e menor que o total,
Então o checkout é válido.
Tabela de decisão
total |
discount_amount |
Válido? |
|---|---|---|
| 897,00 | -1,00 | ❌ negativo |
| 897,00 | 0,00 | ✅ |
| 897,00 | 200,00 | ✅ |
| 897,00 | 897,00 | ❌ igual ao total |
| 897,00 | 900,00 | ❌ maior que o total |
Restrições
discount_amountédecimal(10,2),default: 0,null: false.- A validação cobre o
checkout.total, não os totais por tipo de pagamento. Se ototalde umcheckout_payment_typefor menor que odiscount_amount, a base daquele tipo cai a 0 e o gateway rejeita o pagamento — essa lacuna é conhecida e não está coberta pela validação.
Teste vinculado
spec/models/checkout_spec.rb — “is invalid when discount_amount is negative”
spec/models/checkout_spec.rb — “is invalid when discount_amount is equal to the total”
spec/models/checkout_spec.rb — “is invalid when discount_amount is greater than the total”
spec/models/checkout_spec.rb — “is valid when discount_amount is lower than the total”
Referências
- ../../reference/checkout/member_discount.md — configuração e limitações conhecidas
- R-001 — quando o desconto é efetivamente aplicado