Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions sale_triple_discount/models/sale_order_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,13 @@ def triple_discount_preprocess(self):
this method is called multiple times."""
prev_values = dict()

# The newly computed discount might have
# more digits than allowed from field's precision,
# so let's increase it just for saving it correctly in cache
discount_field = self._fields['discount']
discount_original_digits = discount_field._digits
discount_field._digits = (16, 10)

for line in self:
prev_values[line] = dict(
discount=line.discount,
Expand All @@ -120,6 +127,9 @@ def triple_discount_preprocess(self):
'discount2': 0.0,
'discount3': 0.0
})

# Restore discount field's precision
discount_field._digits = discount_original_digits
return prev_values

@api.model
Expand Down
29 changes: 29 additions & 0 deletions sale_triple_discount/tests/test_sale_triple_discount.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,32 @@ def test_05_round_globally(self):
self.assertEqual(self.so_line2.price_subtotal, 300.0)
self.assertEqual(self.order.amount_untaxed, 375.0)
self.assertEqual(self.order.amount_tax, 56.25)

def test_increased_precision(self):
"""
Check that final discount is computed correctly
when final discount's precision exceeds
discount field's allowed precision.
"""
so_line = self.so_line1
discount_field = so_line._fields['discount']
self.assertEqual(discount_field.digits[1], 2)
so_line.discount = 45.0
so_line.discount2 = 10.0
so_line.discount3 = 5.0

self.assertAlmostEqual(
so_line._get_final_discount(),
52.975,
places=3,
)
so_line.triple_discount_preprocess()

# Check that the line's discount still has all the 3 digits
self.assertAlmostEqual(
so_line.discount,
52.975,
places=3,
)
# Check that field's precision is not changed
self.assertEqual(discount_field.digits[1], 2)