188 lines
10 KiB
Python
188 lines
10 KiB
Python
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...")
|