From 62081e5ec9d7561b61ebcbf30e8fa37d6a6ffa17 Mon Sep 17 00:00:00 2001 From: "Levi Siuzdak (sile)" Date: Fri, 9 Feb 2024 18:14:36 +0000 Subject: [PATCH] [FIX] {{website_,}sale_,}loyalty: format display points Steps ----- 1. Create a loyalty card program awarding 1 point per $ spent; 2. make sure "Show points Unit" is enabled; 3. give yourself a loyalty card with 267.39 points on it; 4. create a product with a price of $0.89; 5. go to website and add it to your shopping car; 6. go to checkout. Issue ----- > You have 268.28000000000003 Loyalty point(s) Cause ----- The number comes from the `_get_real_points_for_coupon` method, which uses `float_round` by way of `res.currency`. The `float_round` function isn't suited for raw number display, as it can make tiny rounding errors due to floating point arithmetic. Solution -------- Add a `_format_points` method to `loyalty.card` which will return a string using the same format the `points_display` field uses. opw-3705546 closes odoo/odoo#155652 X-original-commit: 767405a6fe8cea0407632acb57aae8bf25d8c001 Signed-off-by: Levi Siuzdak Signed-off-by: Victor Feyens (vfe) Co-authored-by: Victor Feyens --- addons/loyalty/models/loyalty_card.py | 12 ++++++++- .../views/sale_portal_templates.xml | 2 +- .../tests/tours/test_promo_main_tour.js | 5 ++++ .../tests/test_shop_sale_coupon.py | 25 +++++++++++++++++++ .../views/website_sale_templates.xml | 9 +++---- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/addons/loyalty/models/loyalty_card.py b/addons/loyalty/models/loyalty_card.py index 781f7cbb519..00999ba1f9c 100644 --- a/addons/loyalty/models/loyalty_card.py +++ b/addons/loyalty/models/loyalty_card.py @@ -5,6 +5,8 @@ from uuid import uuid4 from odoo import _, api, fields, models from odoo.exceptions import ValidationError +from odoo.tools import format_amount + class LoyaltyCard(models.Model): _name = 'loyalty.card' @@ -52,7 +54,15 @@ class LoyaltyCard(models.Model): @api.depends('points', 'point_name') def _compute_points_display(self): for card in self: - card.points_display = "%.2f %s" % (card.points or 0, card.point_name or '') + card.points_display = card._format_points(card.points) + + def _format_points(self, points): + self.ensure_one() + if self.point_name == self.program_id.currency_id.symbol: + return format_amount(self.env, points, self.program_id.currency_id) + if points == int(points): + return f"{int(points)} {self.point_name or ''}" + return f"{points:.2f} {self.point_name or ''}" # Meant to be overriden def _compute_use_count(self): diff --git a/addons/sale_loyalty/views/sale_portal_templates.xml b/addons/sale_loyalty/views/sale_portal_templates.xml index 3a323796b13..81495117f52 100644 --- a/addons/sale_loyalty/views/sale_portal_templates.xml +++ b/addons/sale_loyalty/views/sale_portal_templates.xml @@ -34,7 +34,7 @@ Gift # - ( ) + ()