Spaces:
Build error
Build error
| import logging | |
| def setup_logger(): | |
| # Create a logger | |
| logger = logging.getLogger('remittance_processing') | |
| logger.setLevel(logging.DEBUG) | |
| # Create handlers | |
| c_handler = logging.StreamHandler() | |
| f_handler = logging.FileHandler('remittance_processing.log') | |
| c_handler.setLevel(logging.INFO) | |
| f_handler.setLevel(logging.DEBUG) | |
| # Create formatters and add it to handlers | |
| log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') | |
| c_handler.setFormatter(log_format) | |
| f_handler.setFormatter(log_format) | |
| # Add handlers to the logger | |
| logger.addHandler(c_handler) | |
| logger.addHandler(f_handler) | |
| return logger | |
| remittance_logger = setup_logger() | |
| def remove_duplicate_lists(lists): | |
| """ | |
| Remove duplicate lists from a list of lists. | |
| Args: | |
| lists: | |
| a list of lists of strings | |
| Returns: | |
| a list of lists of strings, where each list is unique | |
| """ | |
| seen = set() | |
| unique_lists = [] | |
| for lst in lists: | |
| sorted_list = tuple(sorted(lst)) | |
| if sorted_list not in seen: | |
| seen.add(sorted_list) | |
| unique_lists.append(lst) | |
| return unique_lists | |
| import re | |
| from decimal import Decimal, ROUND_HALF_UP | |
| def format_amount_str_to_decimal(amount_str: str) -> str: | |
| def standardize_number(s): | |
| # Find the last occurrence of a comma or period | |
| last_separator_index = max(s.rfind(','), s.rfind('.')) | |
| if last_separator_index != -1: | |
| # Split the string into two parts | |
| before_separator = s[:last_separator_index] | |
| after_separator = s[last_separator_index+1:] | |
| # Clean the first part of any commas, periods, or whitespace | |
| before_separator_cleaned = re.sub(r'[.,\s]', '', before_separator) | |
| # Ensure the decimal part starts with a period, even if it was a comma | |
| standardized_s = before_separator_cleaned + '.' + after_separator | |
| else: | |
| # If there's no separator, just remove commas, periods, or whitespace | |
| standardized_s = re.sub(r'[.,\s]', '', s) | |
| return standardized_s | |
| def remove_chars_after_last_digit(s): | |
| # Remove any non-digit characters following the last digit in the string | |
| return re.sub(r'(?<=\d)[^\d]*$', '', s) | |
| def clean_text(s): | |
| # This pattern looks for: | |
| # - Optional non-digit or non-negative sign characters followed by whitespace (if any) | |
| # - Followed by any characters until a digit is found in the word | |
| # It then replaces this matched portion with the remaining part of the word from the first digit | |
| cleaned_s = re.sub(r'[^\d-]*\s?(\S*\d\S*)', r'\1', s) | |
| return cleaned_s | |
| # Run functions to format a text decimal | |
| cleaned_amount = clean_text(remove_chars_after_last_digit(standardize_number(amount_str.strip().lower()))) | |
| # Convert to Decimal and round to 2 decimal places | |
| try: | |
| decimal_amount = Decimal(cleaned_amount).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP) | |
| return f"{decimal_amount:.2f}" | |
| except: | |
| # If conversion fails, return the cleaned string as is | |
| return cleaned_amount | |