Improve amount conversion in TributeService to handle minor units

- Updated the amount handling logic to convert minor currency units (kopecks/cents) to major units before persisting.
- Added error handling for invalid amount inputs to ensure robustness in processing payment data.
- Ensured that the amount is rounded to two decimal places for accurate representation in the system.
This commit is contained in:
machka-pasla
2025-08-07 23:39:48 +03:00
parent 18f65ea493
commit bb7641bb74
+9 -2
View File
@@ -96,10 +96,17 @@ class TributeService:
period_val = data.get("period") period_val = data.get("period")
months = convert_period_to_months(period_val) months = convert_period_to_months(period_val)
# Price/amount from spec is integer cents in currency; we store float in Payment # Tribute sends amount in minor units (kopecks/cents). Convert to major units before persisting.
amount_value = data.get("amount") or data.get("price") amount_value = data.get("amount") or data.get("price")
currency = (data.get("currency") or settings.DEFAULT_CURRENCY_SYMBOL or "RUB").upper() currency = (data.get("currency") or settings.DEFAULT_CURRENCY_SYMBOL or "RUB").upper()
amount_float = float(amount_value) if amount_value is not None else 0.0 if amount_value is not None:
try:
amount_minor_units = float(amount_value)
except (TypeError, ValueError):
amount_minor_units = 0.0
amount_float = round(amount_minor_units / 100.0, 2)
else:
amount_float = 0.0
async with async_session_factory() as session: async with async_session_factory() as session:
if event_name == "new_subscription": if event_name == "new_subscription":