Files
SUST/sustApp/assign_payments.py
T
2025-07-24 14:36:35 +02:00

127 lines
4.6 KiB
Python

# 3. assign manually
from models import models
from models.database import Base, engine, SessionLocal
from models.models import Payments_CSV, Payments, Members
from time import time
import logging, sys
import datetime
from config_loader import load_config
def assign_by_reference(payments: Payments_CSV):
for payment in payments:
logging.debug(f'payment.pc_reference {payment.pc_reference}')
reference = payment.pc_reference.split('-')
if len(reference) == 1:
reference = payment.pc_reference.split(' ')
if len(reference) == 4:
addPayment(payment, reference[2], reference[0], payment.pc_amount)
else:
# more than one reference (e.g. 2024-4732-096-2,-097-1,-099-1)
referenceList = payment.pc_reference.split(',')
number_of_references = completeReference(referenceList=referenceList)
amount = payment.pc_amount # assume that the payment is for all references
for reference in referenceList:
referenceItem = reference.split('-')
addPayment(payment, referenceItem[2], year=referenceItem[0], amount=amount/number_of_references*int(referenceItem[3]))
try:
db.commit()
except Exception as e:
print(e)
db.rollback()
def assign_by_name(payments: Payments_CSV):
# pc_reference is empty or starts with 'Mitglied'
removables = ('Dipl.', 'Ing.', 'Mag.')
for payment in payments:
logging.debug(f'payment.pc_intended {payment.pc_intended}')
name = payment.pc_client.split(' ')
for removeable in removables:
while removeable in name: name.remove(removeable)
# last part is usually surname
member = db.query(Members).filter(Members.member_surname.like(name[len(name)-1]), Members.member_firstname.like(name[0]), Members.member_active.is_(True)).all()
if len(member) > 1:
logging.debug(f'More than one member with same name {payment.pc_client}')
elif len(member) == 0:
logging.debug(f'No member found with name {payment.pc_client}')
else:
# update Payments_CSV
payment.pc_reference = f'{year}-4732-{member[0].id}-{member[0].member_count}'
#addPayment(payment, referenceItem[2], referenceItem[0], amount/number_of_references*int(referenceItem[3]))
try:
db.commit()
except Exception as e:
print(e)
db.rollback()
def addPayment(payment, member_id, year, amount):
# Check if payment already exists
exists = db.query(Payments).filter(
Payments.payment_date == payment.pc_valuta_date,
Payments.member_id == member_id,
Payments.payment_year == datetime.date(int(year), 1, 1)
).first()
if exists:
logging.debug(f"Payment already exists for member_id {member_id}, year {year}, amount {amount}, date {payment.pc_valuta_date}")
payment.pc_processed = True
return
logging.debug(f'Adding payment for member_id {member_id}, year {year}, amount {amount}')
newPayment = Payments(payment_date = payment.pc_valuta_date,
member_id = member_id,
payment_year = datetime.date(int(year),1,1),
payment_amount = amount)
db.add(newPayment)
payment.pc_processed = True
def completeReference(referenceList: list) -> int:
number_of_references = 0
i=0
for reference in referenceList:
referenceItem = reference.split('-')
if referenceItem[0] == '':
referenceItem.insert(1, referenceList[0].split('-')[0])
referenceItem.insert(2, referenceList[0].split('-')[1])
referenceItem.pop(0)
reference = '-'.join(referenceItem)
referenceList[i]=reference
i+=1
number_of_references += int(referenceItem[3])
return number_of_references
if __name__ == "__main__":
t = time()
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
cfg = load_config()
year = cfg['year']
db = SessionLocal()
Base.metadata.create_all(bind=engine)
# 1. create missing reference by name
payments = db.query(Payments_CSV).filter(
(Payments_CSV.pc_reference.is_(None) | Payments_CSV.pc_reference.like('Mitglied%')),
Payments_CSV.pc_processed!=True
).all()
assign_by_name(payments)
# 2. assign payment by reference
payments = db.query(Payments_CSV).filter(Payments_CSV.pc_reference!='', Payments_CSV.pc_processed!=True).all()
assign_by_reference(payments)
logging.debug(f"Time elapsed: " + str(time() - t) + " s.") #0.091s