diff --git a/src/Utils/utils.py b/src/Utils/utils.py index 6308896..6ea96f7 100644 --- a/src/Utils/utils.py +++ b/src/Utils/utils.py @@ -400,6 +400,32 @@ def convert_datetime_to_iso(data): for item in data: convert_datetime_to_iso(item) +def convert_iso_to_dmY(data): + """ + Convert ISO format datetime strings or datetime objects to 'dd/MM/YYYY' format + """ + def convert_single_value(value): + if isinstance(value, str): + try: + # Try to parse the string as an ISO format datetime + dt = datetime.fromisoformat(value) + return dt.strftime('%d/%m/%Y') + except ValueError: + # If it's not a valid ISO format, return the original string + return value + elif isinstance(value, datetime): + # If it's already a datetime object, just format it + return value.strftime('%d/%m/%Y') + else: + # For any other type, return as is + return value + + if isinstance(data, dict): + return {key: convert_iso_to_dmY(value) for key, value in data.items()} + elif isinstance(data, list): + return [convert_iso_to_dmY(item) for item in data] + else: + return convert_single_value(data) def get_currencies_from_txt(file_path:str ="config/currencies.txt"): # Read the file and return a list of currency codes diff --git a/src/api.py b/src/api.py index 0147f07..fd991c3 100644 --- a/src/api.py +++ b/src/api.py @@ -20,9 +20,9 @@ from src.ldap_authen import (User, get_current_user, ldap_authen, Token, create_access_token) from src.Utils.utils import (read_config, get_current_time, is_base64, - valid_base64_image, convert_datetime_to_iso, + valid_base64_image, convert_datetime_to_iso, convert_iso_to_dmY, get_land_and_city_list, get_currencies_from_txt) -from src.invoice_extraction import extract_invoice_info +from src.invoice_extraction import extract_invoice_info, validate_invoice from src.Utils.logger import create_logger from src.export_excel.main import export_json_to_excel @@ -351,9 +351,20 @@ async def modify_invoice(invoice_uuid: str, request: Request): status_code=status.HTTP_400_BAD_REQUEST, content=msg) + logger.debug(msg = f"invoice_info.keys {invoice_info.keys()}") + + invoice_info['invoice_info'] = convert_iso_to_dmY(invoice_info['invoice_info']) + + invoice_dict = validate_invoice(invoice_info=invoice_info, + invoice_type=invoice_info['invoice_type'], + config=config) + + logger.debug(msg = f"invoice_dict['invoice_info']: {invoice_dict['invoice_info']}") + + # Prepare update fields update_fields = { - "invoice_info": invoice_info, + "invoice_info": invoice_dict['invoice_info'], "last_modified_at": get_current_time(timezone=config['timezone']), "last_modified_by": user_uuid } diff --git a/src/invoice_extraction.py b/src/invoice_extraction.py index 320899f..52d34de 100644 --- a/src/invoice_extraction.py +++ b/src/invoice_extraction.py @@ -2,6 +2,7 @@ sys.path.append("") import re import numpy as np +from copy import deepcopy from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity from typing import List, Optional @@ -133,23 +134,25 @@ def extract_invoice_info(base64_img:str, ocr_reader:OcrReader, -def validate_invoice(invoice_info:dict, invoice_type:str, config:dict) ->dict: - - if invoice_type == "invoice 1": - valid_invoice = validate_invoice_1(invoice_data=invoice_info, config=config) - full_invoice = Invoice1(invoice_info=valid_invoice['invoice_info']) +def validate_invoice(invoice_info: dict, invoice_type: str, config: dict) -> dict: + # Create a deep copy of the invoice_info to avoid modifying the original + invoice_info_copy = deepcopy(invoice_info) - - elif invoice_type == "invoice 2": - valid_invoice = validate_invoice_2(invoice_data=invoice_info, config=config) - full_invoice = Invoice2(invoice_info=valid_invoice['invoice_info']) - - elif invoice_type == "invoice 3": - valid_invoice = validate_invoice_3(invoice_data=invoice_info, config=config) - full_invoice = Invoice3(invoice_info=valid_invoice['invoice_info']) + invoice_types = { + "invoice 1": (validate_invoice_1, Invoice1), + "invoice 2": (validate_invoice_2, Invoice2), + "invoice 3": (validate_invoice_3, Invoice3) + } - full_invoice_dict = full_invoice.model_dump(exclude_unset=False) - return full_invoice_dict + if invoice_type not in invoice_types: + raise ValueError(f"Invalid invoice type: {invoice_type}") + + validate_func, invoice_class = invoice_types[invoice_type] + + valid_invoice = validate_func(invoice_data=invoice_info_copy, config=config) + full_invoice = invoice_class(invoice_info=valid_invoice['invoice_info']) + + return full_invoice.model_dump(exclude_unset=False) if __name__ == "__main__":