from Schemas import AccountRecords, BuildIbans, BuildDecisionBook, Build, BuildLivingSpace, People, OccupantTypes, BuildParts, BuildDecisionBookPayments, ApiEnumDropdown from Controllers.Postgres.engine import get_session_factory from parser import parse_comment_with_name, parse_comment_with_name_iban_description from validations import Similarity import re import time from datetime import timedelta def account_save_search_result(account_record_main_session: AccountRecords, similarity_result: Similarity): with AccountRecords.new_session() as session: AccountRecords.set_session(session) BuildParts.set_session(session) Build.set_session(session) BuildLivingSpace.set_session(session) People.set_session(session) account_record = AccountRecords.query.filter_by(id=account_record_main_session.id).first() if not account_record: # print(f"Could not find account record with ID {account_record_main_session.id}") return company_id = getattr(similarity_result, 'company_id', None) living_space_id = getattr(similarity_result, 'living_space_id', None) build_part_id = getattr(similarity_result, 'build_part_id', None) customer_id = getattr(similarity_result, 'customer_id', None) part, build, found_customer = None, None, None if living_space_id: found_customer = BuildLivingSpace.query.get(living_space_id) if build_part_id: part = BuildParts.query.get(build_part_id) elif found_customer and hasattr(found_customer, 'build_parts_id'): part = BuildParts.query.filter_by(id=found_customer.build_parts_id, human_livable=True).first() if part: build = Build.query.filter_by(id=part.build_id).first() account_record.similarity = similarity_result.similarity account_record.found_from = similarity_result.found_from account_record.company_id = company_id if company_id: company = People.query.get(company_id) account_record.company_uu_id = getattr(company, "uu_id", None) if company else None account_record.build_parts_id = getattr(part, "id", None) account_record.build_parts_uu_id = getattr(part, "uu_id", None) if part else None if not account_record.build_id and build: account_record.build_id = getattr(build, "id", None) account_record.build_uu_id = getattr(build, "uu_id", None) account_record.living_space_id = living_space_id if found_customer: account_record.living_space_uu_id = getattr(found_customer, "uu_id", None) if customer_id: account_record.send_person_id = customer_id customer = People.query.get(customer_id) if customer: account_record.send_person_uu_id = getattr(customer, "uu_id", None) account_record.save() if __name__ == "__main__": # Start timer start_time = time.time() print("Build Living Space Service is running...") new_session = get_session_factory() flat_id_list = [] build_living_space_dict = {} found_list = [] account_records_ibans = [] with OccupantTypes.new_session() as occupant_types_session: OccupantTypes.set_session(occupant_types_session) flat_resident = OccupantTypes.query.filter_by(occupant_category_type="FL", occupant_code="FL-RES").first() flat_owner = OccupantTypes.query.filter_by(occupant_category_type="FL", occupant_code="FL-OWN").first() flat_tenant = OccupantTypes.query.filter_by(occupant_category_type="FL", occupant_code="FL-TEN").first() flat_represent = OccupantTypes.query.filter_by(occupant_category_type="FL", occupant_code="FL-REP").first() flat_id_list = [flat_resident.id, flat_owner.id, flat_tenant.id, flat_represent.id] AccountRecords.set_session(new_session) BuildLivingSpace.set_session(new_session) BuildParts.set_session(new_session) People.set_session(new_session) account_records_ibans = AccountRecords.query.filter(AccountRecords.build_decision_book_id != None).distinct(AccountRecords.iban).all() for account_records_iban in account_records_ibans: if account_records_iban.iban not in build_living_space_dict: build_parts = BuildParts.query.filter_by(build_id=account_records_iban.build_id, human_livable=True).all() build_parts_data = [] for bp in build_parts: bp_dict = {'id': bp.id, 'build_id': bp.build_id, 'human_livable': bp.human_livable} if hasattr(bp, 'part_no'): bp_dict['part_no'] = bp.part_no build_parts_data.append(bp_dict) living_spaces = BuildLivingSpace.query.filter( BuildLivingSpace.build_parts_id.in_([bp.id for bp in build_parts]), BuildLivingSpace.occupant_type_id.in_(flat_id_list), ).all() living_spaces_data = [] for ls in living_spaces: ls_dict = {'id': ls.id, 'build_parts_id': ls.build_parts_id, 'occupant_type_id': ls.occupant_type_id, 'person_id': ls.person_id} if hasattr(ls, 'name'): ls_dict['name'] = ls.name living_spaces_data.append(ls_dict) living_spaces_people = [ls.person_id for ls in living_spaces if ls.person_id] people_list = People.query.filter(People.id.in_(living_spaces_people)).all() people_data = [] for p in people_list: p_dict = {'id': p.id, 'name': p.firstname, 'surname': p.surname, 'middle_name': p.middle_name} p_dict['full_name'] = f"{p.firstname} {p.surname}".strip() people_data.append(p_dict) build_living_space_dict[str(account_records_iban.iban)] = {"people": people_data, "living_space": living_spaces_data, "build_parts": build_parts_data} with AccountRecords.new_session() as query_session: AccountRecords.set_session(query_session) account_record_ids = [record.id for record in AccountRecords.query.filter(AccountRecords.build_decision_book_id != None).order_by(AccountRecords.bank_date.desc()).all()] for account_id in account_record_ids: with AccountRecords.new_session() as record_session: AccountRecords.set_session(record_session) account_record = AccountRecords.query.filter_by(id=account_id).first() if not account_record: continue account_iban = account_record.iban account_process_comment = account_record.process_comment account_currency_value = account_record.currency_value account_similarity_value = float(account_record.similarity or 0.0) account_build_id = account_record.build_id account_data = {"id": account_id, "iban": account_iban, "process_comment": account_process_comment, "currency_value": account_currency_value, "similarity": account_similarity_value, "build_id": account_build_id} try: similarity_result = parse_comment_with_name(account_record=account_data, living_space_dict=build_living_space_dict) fs = float(similarity_result.similarity) if fs >= 0.8 and fs >= account_similarity_value: found_list.append(similarity_result) with AccountRecords.new_session() as save_session: AccountRecords.set_session(save_session) fresh_account = AccountRecords.query.filter_by(id=account_id).first() if fresh_account: account_save_search_result(account_record_main_session=fresh_account, similarity_result=similarity_result) print("POSITIVE SIMILARITY RESULT:", { 'similarity': similarity_result.similarity, 'found_from': similarity_result.found_from, 'garbage': similarity_result.garbage, 'cleaned': similarity_result.cleaned, 'company_id': getattr(similarity_result, 'company_id', None), 'living_space_id': getattr(similarity_result, 'living_space_id', None), 'build_part_id': getattr(similarity_result, 'build_part_id', None), 'customer_id': getattr(similarity_result, 'customer_id', None) }) else: similarity_result = parse_comment_with_name_iban_description(account_record=account_data) fs = float(similarity_result.similarity) if fs >= 0.8 and fs > account_similarity_value: found_list.append(similarity_result) with AccountRecords.new_session() as save_session: AccountRecords.set_session(save_session) fresh_account = AccountRecords.query.filter_by(id=account_id).first() if fresh_account: account_save_search_result(account_record_main_session=fresh_account, similarity_result=similarity_result) print("NEGATIVE SIMILARITY RESULT:", { 'similarity': similarity_result.similarity, 'found_from': similarity_result.found_from, 'garbage': similarity_result.garbage, 'cleaned': similarity_result.cleaned, 'company_id': getattr(similarity_result, 'company_id', None), 'living_space_id': getattr(similarity_result, 'living_space_id', None), 'build_part_id': getattr(similarity_result, 'build_part_id', None), 'customer_id': getattr(similarity_result, 'customer_id', None) }) except Exception as e: # print(f"Error processing account {account_id}: {e}") continue # Calculate elapsed time end_time = time.time() elapsed_time = end_time - start_time elapsed_formatted = str(timedelta(seconds=int(elapsed_time))) print("Account Records Search : ", len(found_list), "/", len(account_record_ids)) print(f"Total runtime: {elapsed_formatted} (HH:MM:SS)") print(f"Total seconds: {elapsed_time:.2f}") new_session.close() print("Build Living Space Service is finished...")