# 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