Skip to content

Commit 66b08b8

Browse files
Merge pull request #507 from AndreWohnsland/dev
Skip sumup on free cocktails
2 parents 14edcda + 679841e commit 66b08b8

File tree

4 files changed

+31
-16
lines changed

4 files changed

+31
-16
lines changed

src/api/internal/sumup_payment.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@
1414
_logger = LoggerHandler("sumup_payment")
1515

1616

17+
def requires_sumup_payment(cocktail: Cocktail) -> bool:
18+
"""Check if cocktail price requires a SumUp checkout."""
19+
return _get_price_in_cents(cocktail) > 0
20+
21+
22+
def _get_price_in_cents(cocktail: Cocktail) -> int:
23+
"""Calculate the cocktail price in cents for SumUp."""
24+
multiplier = cfg.PAYMENT_VIRGIN_MULTIPLIER / 100 if cocktail.is_virgin else 1.0
25+
price = cocktail.current_price(cfg.PAYMENT_PRICE_ROUNDING, price_multiplier=multiplier)
26+
return int(price * 100)
27+
28+
1729
class SumupPaymentHandler:
1830
"""Handler for SumUp payment operations."""
1931

@@ -38,11 +50,7 @@ async def start_payment_flow(self, cocktail: Cocktail) -> None:
3850
shared.cocktail_status.status = PrepareResult.WAITING_FOR_PAYMENT
3951
self._payment_cancelled = False
4052

41-
# Calculate price
42-
multiplier = cfg.PAYMENT_VIRGIN_MULTIPLIER / 100 if cocktail.is_virgin else 1.0
43-
price = cocktail.current_price(cfg.PAYMENT_PRICE_ROUNDING, price_multiplier=multiplier)
44-
# SumUp uses minor units (cents), so multiply by 100
45-
value_in_cents = int(price * 100)
53+
price_in_cents = _get_price_in_cents(cocktail)
4654

4755
reader_id = cfg.PAYMENT_SUMUP_TERMINAL_ID
4856
if not reader_id:
@@ -54,7 +62,7 @@ async def start_payment_flow(self, cocktail: Cocktail) -> None:
5462
# Trigger checkout on terminal
5563
checkout_result = self.sumup_service.trigger_checkout(
5664
reader_id=reader_id,
57-
value=value_in_cents,
65+
value=price_in_cents,
5866
description=f"CocktailBerry: {cocktail.name}",
5967
)
6068

src/api/routers/cocktails.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from src.api.api_config import Tags
1818
from src.api.internal.nfc_payment import get_nfc_payment_handler
1919
from src.api.internal.payment import PaymentHandler, get_payment_handler
20+
from src.api.internal.sumup_payment import requires_sumup_payment
2021
from src.api.internal.utils import (
2122
calculate_cocktail_volume_and_concentration,
2223
map_cocktail,
@@ -137,6 +138,10 @@ async def prepare_cocktail(
137138
shared.selected_team = request.selected_team
138139
shared.team_member_name = request.team_member_name
139140
if cfg.payment_enabled:
141+
# SumUp cannot be called with 0 price
142+
if cfg.sumup_payment and not requires_sumup_payment(cocktail):
143+
background_tasks.add_task(maker.prepare_cocktail, cocktail)
144+
return CocktailStatus(status=PrepareResult.IN_PROGRESS)
140145
background_tasks.add_task(payment_handler.start_payment_flow, cocktail)
141146
return CocktailStatus(status=PrepareResult.WAITING_FOR_PAYMENT)
142147
background_tasks.add_task(maker.prepare_cocktail, cocktail)

src/ui/setup_available_window.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def _accepted_clicked(self) -> None:
4242
"""Write the new availability into the DB."""
4343
DB_COMMANDER.delete_existing_handadd_ingredient()
4444
ingredient_names = [
45-
self.LWVorhanden.item(i).text() # ty:ignore[possibly-missing-attribute] # pyright: ignore[reportOptionalMemberAccess]
45+
self.LWVorhanden.item(i).text() # pyright: ignore[reportOptionalMemberAccess] # ty:ignore[possibly-missing-attribute]
4646
for i in range(self.LWVorhanden.count())
4747
]
4848
# only add ingredients if there are any

src/ui/shared.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,23 @@ def qt_payment_flow(cocktail: Cocktail) -> CocktailBooking:
8383
return cocktailberry_payment_flow(cocktail)
8484

8585

86-
def sumup_payment_flow(cocktail: Cocktail) -> CocktailBooking:
86+
def sumup_payment_flow(cocktail: Cocktail) -> CocktailBooking: # noqa: PLR0911
8787
"""Run the SumUp payment flow for qt."""
88-
sumup_service = SumupPaymentService(
89-
api_key=cfg.PAYMENT_SUMUP_API_KEY,
90-
merchant_code=cfg.PAYMENT_SUMUP_MERCHANT_CODE,
91-
)
88+
multiplier = cfg.PAYMENT_VIRGIN_MULTIPLIER / 100 if cocktail.is_virgin else 1.0
89+
price = cocktail.current_price(cfg.PAYMENT_PRICE_ROUNDING, price_multiplier=multiplier)
90+
value_in_cents = int(price * 100)
91+
if value_in_cents <= 0:
92+
_logger.info(f"Skipping SumUp checkout for free cocktail '{cocktail.name}'")
93+
return CocktailBooking.inactive()
9294

9395
reader_id = cfg.PAYMENT_SUMUP_TERMINAL_ID
9496
if not reader_id:
9597
return CocktailBooking.sumup_no_terminal()
9698

97-
# Calculate price
98-
multiplier = cfg.PAYMENT_VIRGIN_MULTIPLIER / 100 if cocktail.is_virgin else 1.0
99-
price = cocktail.current_price(cfg.PAYMENT_PRICE_ROUNDING, price_multiplier=multiplier)
100-
value_in_cents = int(price * 100)
99+
sumup_service = SumupPaymentService(
100+
api_key=cfg.PAYMENT_SUMUP_API_KEY,
101+
merchant_code=cfg.PAYMENT_SUMUP_MERCHANT_CODE,
102+
)
101103

102104
# Trigger checkout on terminal
103105
checkout_result = sumup_service.trigger_checkout(

0 commit comments

Comments
 (0)