From 68844fb2ec510f786c5b1124e391b86a147f66f6 Mon Sep 17 00:00:00 2001 From: dusker Date: Fri, 3 Apr 2026 22:20:36 +0200 Subject: [PATCH] Add EPC QR code to make bank transactions easier --- requirements.txt | Bin 218 -> 232 bytes src/ezgg_lan_manager/pages/Account.py | 14 +++++++-- .../services/AccountingService.py | 28 ++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index d2dea2e3f934aebec47d8fe918599e0abf17e341..c7d61bcb27710c51ff7bf7da022fd774004c9ea3 100644 GIT binary patch delta 69 zcmcb`_=0hQ(nJ*nNiK#WhD?Th23>|yAZ-hT1`K)(h73j%6ZI!fQkl3zNrH=^5U3~_ Ts3?UYl_8p;0H`pBA(jCEInWPp delta 31 hcmaFCc#Cm@5+m8=2si)$ diff --git a/src/ezgg_lan_manager/pages/Account.py b/src/ezgg_lan_manager/pages/Account.py index 7222943..169a6a1 100644 --- a/src/ezgg_lan_manager/pages/Account.py +++ b/src/ezgg_lan_manager/pages/Account.py @@ -1,7 +1,7 @@ from decimal import Decimal from typing import Optional -from rio import Column, Component, event, Text, TextStyle, Button, Color, Revealer, Row, ProgressCircle, Link +from rio import Column, Component, event, Text, TextStyle, Button, Color, Revealer, Row, ProgressCircle, Link, Image from src.ezgg_lan_manager import ConfigurationService, UserService, AccountingService from src.ezgg_lan_manager.components.MainViewContentBox import MainViewContentBox @@ -14,6 +14,7 @@ class AccountPage(Component): user: Optional[User] = None balance: Optional[Decimal] = None transaction_history: list[Transaction] = list() + payment_qr_image: bytes = None banking_info_revealer_open: bool = False paypal_info_revealer_open: bool = False @@ -28,6 +29,11 @@ class AccountPage(Component): self.user = await self.session[UserService].get_user(user_id) self.balance = await self.session[AccountingService].get_balance(user_id) self.transaction_history = await self.session[AccountingService].get_transaction_history(user_id) + self.payment_qr_image = self.session[AccountingService].make_payment_qr_image( + "Einfach Zocken Gaming Gesellschaft", + "GENODE51BIK", + "DE47517624340019856607", + f"AUFLADUNG - {self.user.user_id} - {self.user.user_name}") async def _on_banking_info_press(self) -> None: self.banking_info_revealer_open = not self.banking_info_revealer_open @@ -36,7 +42,7 @@ class AccountPage(Component): self.paypal_info_revealer_open = not self.paypal_info_revealer_open def build(self) -> Component: - if not self.user and not self.balance: + if not self.user or not self.payment_qr_image: return Column( MainViewContentBox( ProgressCircle( @@ -85,6 +91,10 @@ class AccountPage(Component): margin=0, margin_bottom=1, align_x=0.5 + ), + Image(self.payment_qr_image, + min_width=20, + min_height=20 ) ), margin=2, diff --git a/src/ezgg_lan_manager/services/AccountingService.py b/src/ezgg_lan_manager/services/AccountingService.py index 07bc0a9..cf40ee3 100644 --- a/src/ezgg_lan_manager/services/AccountingService.py +++ b/src/ezgg_lan_manager/services/AccountingService.py @@ -1,4 +1,6 @@ +import io import logging +import qrcode from collections.abc import Callable from datetime import datetime from decimal import Decimal, ROUND_DOWN @@ -74,3 +76,29 @@ class AccountingService: return "0.00 €" rounded_decimal = str(euros.quantize(Decimal(".01"), rounding=ROUND_DOWN)) return f"{rounded_decimal} €" + + @staticmethod + def make_payment_qr_image(beneficiary_name, beneficiary_bic, beneficiary_iban, text, amount_euros=None) -> bytes: + text = text.replace("\n",";") + amount_formatted = "EUR{:.2f}".format(amount_euros) if amount_euros else "" + epc_text = f"""BCD +002 +1 +SCT +{beneficiary_bic} +{beneficiary_name} +{beneficiary_iban} +{amount_formatted} + + +{text} +""" + qr = qrcode.QRCode( + version=6, + error_correction=qrcode.constants.ERROR_CORRECT_M, + ) + qr.add_data(epc_text) + img = qr.make_image() + img_bytes = io.BytesIO() + img.save(img_bytes) + return img_bytes.getvalue()