import models.models as models
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm
from reportlab.lib import colors
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from segno import helpers
from payment_report import get_payment_table_element
import datetime
import locale
import os
from config_loader import load_config
from salutation_helpers import get_gender_salutation, get_pronouns
cfg = load_config()
year = cfg['year']
yearly_fee = cfg['yearly_fee']
MM_TO_POINTS = 72 / 25.4
offset_2mm = 2 * MM_TO_POINTS
offset_1mm = MM_TO_POINTS
def create_payment_slip(member: models.Members = None,
forMail: bool = False):
locale.setlocale(locale.LC_ALL, '')
w, h = A4
# Create EPC QR code
if not member is None:
qrcode = helpers.make_epc_qr(
name='Sportunion St. Thomas',
iban='AT493443700000113407',
amount=yearly_fee * member.member_count,
reference=f'{year}-4732-{member.id:03}-{member.member_count}'
)
qrcode.save("epc_qr.png", scale=2)
subfolder = "mail" if member.member_email else ""
fullfilepath = os.path.join(
os.path.expanduser("~"),
"sust",
f"payment_slips_{year}",
subfolder,
f"{member.member_zip}_payment_slip_member{member.id}.pdf"
)
else:
fullfilepath = os.path.join(
os.path.expanduser("~"),
"sust",
f"payment_slips_{year}",
"",
f"4732_payment_slip_blanko.pdf"
)
os.makedirs(os.path.dirname(fullfilepath), exist_ok=True)
# Create PDF with Platypus
doc = SimpleDocTemplate(fullfilepath, pagesize=A4, topMargin=15*mm, bottomMargin=15*mm)
elements = []
styles = getSampleStyleSheet()
# Custom styles
header_style = ParagraphStyle(
'CustomHeader',
parent=styles['Normal'],
fontSize=11,
leading=14
)
body_style = ParagraphStyle(
'CustomBody',
parent=styles['Normal'],
fontSize=9,
leading=12
)
small_style = ParagraphStyle(
'CustomSmall',
parent=styles['Normal'],
fontSize=7,
leading=9
)
# Logo and header
image_path = os.path.join(os.path.dirname(__file__), "Sportunion quer 4c.png")
from reportlab.platypus import Image
logo = Image(image_path, width=150*mm/25.4, height=50*mm/25.4)
elements.append(logo)
elements.append(Spacer(1, 5*mm))
# Address and salutation
if not member is None:
if member.member_count > 1:
address_line1 = f"{member.member_firstname_spouse} u. {member.member_firstname} {member.member_surname}"
else:
address_line1 = f"{member.member_firstname} {member.member_surname} {member.member_suffix}"
address_text = f"""
{address_line1}
{member.member_street} {member.member_streetnumber}
{member.member_zip} {member.member_city}
"""
elements.append(Paragraph(address_text, header_style))
elements.append(Spacer(1, 5*mm))
# Salutation
if member.member_count > 1:
spouse_salutation = get_gender_salutation(str(member.spouse.member_gender), capitalize=False)
member_salutation = get_gender_salutation(str(member.member_gender), capitalize=False)
salutation_text = f"{spouse_salutation.capitalize()} {member.spouse.member_firstname} und {member_salutation} {member.member_firstname}!"
pronouns = get_pronouns(is_plural=True)
salutation = pronouns['possessive']
salutation2 = pronouns['neutral']
salutation3 = pronouns['accusative']
salutation4 = pronouns['conditional']
salutation5 = pronouns['verb']
else:
member_salutation = get_gender_salutation(str(member.member_gender), capitalize=True)
salutation_text = f"{member_salutation} {member.member_firstname}!"
pronouns = get_pronouns(is_plural=False)
salutation = pronouns['possessive']
salutation2 = pronouns['neutral']
salutation3 = pronouns['accusative']
salutation4 = pronouns['conditional']
salutation5 = pronouns['verb']
elements.append(Paragraph(salutation_text, body_style))
elements.append(Spacer(1, 3*mm))
# Main text
main_text = f"""
Vielen Dank für {salutation} Treue!
{salutation2.capitalize()} Beitrag ist gut angelegt, denn der Sportverein St. Thomas bietet für jede(n) etwas:
• Skigymnastik
• Radfahren
• Stockschiessen
• Pilates
• Tagesskifahrt
• uvam
"""
elements.append(Paragraph(main_text, body_style))
elements.append(Spacer(1, 3*mm))
# Email request
if not forMail:
email_text = f"""
Wir möchten das Zustellen des Mitgliedsbeitrags-Zahlscheines zuküntig auf Mail umstellen,
daher bitten wir {salutation3}, uns eine Mail mit dem Betreff "Zahlschein" an unsere
Mail-Adresse sv.stthomas@gmx.at zu senden!
"""
elements.append(Paragraph(email_text, body_style))
elements.append(Spacer(1, 3*mm))
closing_text = f"{salutation2.capitalize()} Sportverein-Team!"
elements.append(Paragraph(closing_text, body_style))
# GDPR disclaimer
elements.append(Spacer(1, 5*mm))
gdpr_text = f"""
Auf Grund der DSGVO müssen wir darauf hinweisen, dass wir außer Name, Adresse, Mail-Adresse
zum Zwecke der Einebung des Mitgliedsbeitrags, keine persönlichen Daten unserer Mitglieder führen!
Diese Daten werden von uns nicht an Dritte weitergegeben!
Weiters informieren wir darüber, dass Fotos, die bei Veranstaltungen oder Aktivitäten entstehen,
auf unserer Homepage oder in Zeitungen veröffentlicht werden können.
{salutation4} gegen die Speicherung {salutation}r Daten oder die Veröffentlichung diverser Foto sein, {salutation5} uns bitte eine Mail.
"""
elements.append(Paragraph(gdpr_text, small_style))
# Payment details table (right aligned)
if not member is None:
amount = locale.format_string('%.2f', yearly_fee * member.member_count)
member_number = f"4732-{member.id:03}"
payment_reference = f"{year}-4732-{member.id:03}-{member.member_count}"
payment_details = f"""
Beitrag gesamt: {amount}
Mitgliedsnummer: {member_number}
Zahlungsreferenz: {payment_reference}
"""
elements.append(Spacer(1, 5*mm))
elements.append(Paragraph(payment_details, body_style))
# Page break before payment table
elements.append(PageBreak())
# Add payment summary table
# payment_table = get_payment_table_element()
# if payment_table:
# elements.append(Paragraph("Zahlungsübersicht", styles['Heading2']))
# elements.append(Spacer(1, 5*mm))
# elements.append(payment_table)
# Build PDF
doc.build(elements)
print(f"✅ Payment slip created: {fullfilepath}")