mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
Discounts: Fix edge case in computation (#4126)
* Add new test case for discounts: Two discounts: - "For every 1 item1, you get three item2 for 10 % off." - "For every 1 item1, you get five item3 for 10 % off." Cart: 2x item1, 2x item2, 6x item3 Expected result: 2x item1 full price, 2x item2 discounted, 5x item3 discounted, 1x item3 full price * Fix discount calculation bug * Update src/pretix/base/models/discount.py Co-authored-by: Raphael Michel <michel@rami.io> * Update src/pretix/base/models/discount.py Co-authored-by: Richard Schreiber <schreiber@rami.io> --------- Co-authored-by: Raphael Michel <michel@rami.io> Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
from collections import defaultdict
|
||||
from decimal import Decimal
|
||||
from itertools import groupby
|
||||
from math import ceil
|
||||
from typing import Dict, Optional, Tuple
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
@@ -272,7 +273,7 @@ class Discount(LoggedModel):
|
||||
|
||||
# Prevent over-consuming of items, i.e. if our discount is "buy 2, get 1 free", we only
|
||||
# want to match multiples of 3
|
||||
n_groups = min(len(condition_idx_group) // self.condition_min_count, len(benefit_idx_group))
|
||||
n_groups = min(len(condition_idx_group) // self.condition_min_count, ceil(len(benefit_idx_group) / self.benefit_only_apply_to_cheapest_n_matches))
|
||||
consume_idx = condition_idx_group[:n_groups * self.condition_min_count]
|
||||
benefit_idx = benefit_idx_group[:n_groups * self.benefit_only_apply_to_cheapest_n_matches]
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user