diff --git a/apps/promotions/models.py b/apps/promotions/models.py index 54ef57d..eb174cc 100644 --- a/apps/promotions/models.py +++ b/apps/promotions/models.py @@ -215,12 +215,16 @@ class Recipient(BaseModel): base_amount=promotion_amount, ) if recipient and promotion_amount and created: - with transaction.atomic(): - reserved = self.plan.reserve_promotion_amount(promotion_amount) - if reserved: - promotion.promote() - else: - raise Exception('promotion reward not reserved') + try: + with transaction.atomic(): + reserved = self.plan.reserve_promotion_amount(promotion_amount) + if reserved: + promotion.promote() + else: + raise Exception('promotion reward not reserved') + except Exception as e: + promotion.change_state(from_states=[promotion.state], to_state=PaymentStateChoices.EXPECTED_FAILURE, same_ok=True) + promotion.refresh_from_db() return promotion return None