diff --git a/src/pretix/base/models/vouchers.py b/src/pretix/base/models/vouchers.py index 6d326ebead..1a18ca09c7 100644 --- a/src/pretix/base/models/vouchers.py +++ b/src/pretix/base/models/vouchers.py @@ -581,6 +581,10 @@ class Voucher(LoggedModel): else: return bool(subevent.seating_plan) if subevent else self.event.seating_plan + @property + def min_usages_remaining(self): + return max(1, self.min_usages - self.redeemed) + @classmethod def annotate_budget_used_orders(cls, qs): opq = OrderPosition.objects.filter( diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 5074989505..c015f8baf1 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -530,11 +530,11 @@ class CartManager: ops.append((listed_price - price_after_voucher, self.VoucherOperation(p, voucher, price_after_voucher))) for voucher, cnt in list(voucher_use_diff.items()): - if 0 < cnt < (voucher.min_usages - voucher.redeemed): + if 0 < cnt < voucher.min_usages_remaining: raise CartError( _(error_messages['voucher_min_usages']) % { 'voucher': voucher.code, - 'number': (voucher.min_usages - voucher.redeemed), + 'number': voucher.min_usages_remaining, } ) @@ -943,7 +943,7 @@ class CartManager: for voucher, count in vouchers.items(): if not voucher or count == 0: continue - if count < (voucher.min_usages - voucher.redeemed): + if count < voucher.min_usages_remaining: self._operations = [o for o in self._operations if not ( isinstance(o, self.AddOperation) and o.voucher.pk == voucher.pk )] @@ -953,13 +953,13 @@ class CartManager: self._operations.append(self.RemoveOperation(position=p)) err = _(error_messages['voucher_min_usages_removed']) % { 'voucher': voucher.code, - 'number': (voucher.min_usages - voucher.redeemed), + 'number': voucher.min_usages_remaining, } if not err: raise CartError( _(error_messages['voucher_min_usages']) % { 'voucher': voucher.code, - 'number': (voucher.min_usages - voucher.redeemed), + 'number': voucher.min_usages_remaining, } ) return err diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 5b1a436084..283b8ea7c4 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -722,10 +722,10 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio delete(cp) for voucher, cnt in v_usages.items(): - if 0 < cnt < voucher.min_usages - voucher.redeemed: + if 0 < cnt < voucher.min_usages_remaining: raise OrderError(error_messages['voucher_min_usages'], { 'voucher': voucher.code, - 'number': (voucher.min_usages - voucher.redeemed), + 'number': voucher.min_usages_remaining, }) # Check prices diff --git a/src/pretix/presale/templates/pretixpresale/event/voucher.html b/src/pretix/presale/templates/pretixpresale/event/voucher.html index d7110647ce..9481fafb57 100644 --- a/src/pretix/presale/templates/pretixpresale/event/voucher.html +++ b/src/pretix/presale/templates/pretixpresale/event/voucher.html @@ -411,10 +411,10 @@ {% if event.presale_is_running and options > 0 %}
- {% if voucher.min_usages > 1 %} + {% if voucher.min_usages_remaining > 1 %}

- {% blocktrans trimmed with number=voucher.min_usages %} + {% blocktrans trimmed with number=voucher.min_usages_remaining %} You need to select at least {{ number }} products. {% endblocktrans %}