106 lines
3.9 KiB
Python
106 lines
3.9 KiB
Python
# 3. assign manually
|
|
|
|
from database import Base, engine, SessionLocal
|
|
from time import time
|
|
from models import Payments_CSV, Payments, Members
|
|
import logging, sys
|
|
import datetime
|
|
|
|
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):
|
|
year = 2025 # pc_reference is empty
|
|
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])).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):
|
|
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)
|
|
|
|
db = SessionLocal()
|
|
Base.metadata.create_all(bind=engine)
|
|
|
|
# 1. create missing reference by name
|
|
payments = db.query(Payments_CSV).filter(Payments_CSV.pc_intended!='', Payments_CSV.pc_reference=='', 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 |