def get_topic(self) -> topics.Topic: return GENERAL.EXPENSES.SPORT.BADMINTON def self_matches(self, operation: Operation) -> bool: badminton = matches_address(operation, 'KLUB BADMINTONA') return badminton REGISTERED_MATCHERS: List[TopicMatcher] = [] def register(matcher: TopicMatcher): REGISTERED_MATCHERS.append(matcher) register(GeneralMatcher()) register(ExpensesMatcher()) register(WorkLunchMatcher()) register(WorkFrogMatcher()) register(WorkSubwayMatcher()) register(BadmintonMatcher()) if __name__ == '__main__': # quick test o = Operation() o.amount = -100.0 o.location = Location() o.location.address = 'THAI WOK' match(o) print(o.topic)
def operation_of(amount=None, address=None): """ Operation object factory """ o = Operation() o.amount = amount o.get_init_location().address = address return o
def load_and_parse_operations(filename): bank_operations = [] missed_bank_operations = [] all_operations: List[Operation] = [] with open(filename) as csv_file: reader = csv.reader(csv_file) csv_count = -1 for row in reader: csv_count += 1 # parse data if csv_count == 0: # skip header line continue pko_operation = PkoBpOperation() pko_operation.id = csv_count pko_operation.operation_date = row[0] pko_operation.currency_date = row[1] pko_operation.transaction_type = row[2] pko_operation.amount = row[3] pko_operation.currency = row[4] pko_operation.after_transaction_balance = row[5] pko_operation.descriptions = [] for data in row[6:]: # 7th column = start of 'descriptions', total number of columns varies pko_operation.descriptions.append(data) bank_operations.append(pko_operation) # map PkoBpOperation to Operation for pko_operation in bank_operations: o = Operation() all_operations.append(o) o.id = pko_operation.id o.date = datetime.datetime.strptime(pko_operation.currency_date, '%Y-%m-%d') o.transaction_type = typeMappings.get(pko_operation.transaction_type) o.amount = float(pko_operation.amount) o.currency = pko_operation.currency o.balance = pko_operation.after_transaction_balance parse_description_by_regex(pko_operation, o, 'receiver_account', 'Rachunek odbiorcy: (?P<acc>.*)', 'acc') parse_description_by_regex(pko_operation, o, 'receiver_name', 'Nazwa odbiorcy: (?P<name>.*)', 'name') parse_description_by_regex(pko_operation, o, 'receiver_address', 'Adres odbiorcy: (?P<addr>.*)', 'addr') parse_description_by_regex(pko_operation, o, 'sender_account', 'Rachunek nadawcy: (?P<acc>.*)', 'acc') parse_description_by_regex(pko_operation, o, 'sender_name', 'Nazwa nadawcy: (?P<name>.*)', 'name') parse_description_by_regex(pko_operation, o, 'sender_address', 'Adres nadawcy: (?P<addr>.*)', 'addr') parse_description_by_regex(pko_operation, o, 'conversion_date', 'Data przetworzenia: (?P<date>\\d{4}-\\d{2}-\\d{2})', 'date') parse_description_by_regex(pko_operation, o, 'title', 'Tytuł: (?P<title>.*)', 'title') parse_original_payment_amount(pko_operation, o) parse_simple_location(pko_operation, o) parse_full_location(pko_operation, o) # ignore unimportant descriptions parse_ignore_description(pko_operation, 'Data i czas operacji: (?P<date>\\d{4}-\\d{2}-\\d{2})') parse_ignore_description(pko_operation, 'Numer telefonu: \\+48 665 396 588') parse_ignore_description(pko_operation, 'KAPIT\\.ODSETEK KARNYCH-OBCIĄŻENIE') parse_ignore_description(pko_operation, 'Referencje własne zleceniodawcy:') if o.transaction_type is OperationType.US_PAYMENT: parse_ignore_description(pko_operation, 'Nazwa i nr identyfikatora:') parse_ignore_description(pko_operation, 'Symbol formularza:') parse_ignore_description(pko_operation, 'Okres płatności:') if o.transaction_type in [OperationType.MOBILE_PAYMENT, OperationType.TERMINAL_RETURN]: parse_ignore_description(pko_operation, 'Numer referencyjny:') if o.transaction_type in [OperationType.CARD_PAYMENT, OperationType.CARD_PAYMENT_RETURN, OperationType.ATM_OUT]: parse_ignore_description(pko_operation, 'Numer karty: 425125.*452') # aggregate unmapped values to other field for desc in pko_operation.descriptions: if desc and '<OK>' not in desc: o.other += desc + ' | ' # override payment type if it was a forwarded ZUS payment if o.title and ' ZUS ' in o.title: o.transaction_type = OperationType.ZUS_PAYMENT valid_operations = operation.get_valid_operations(all_operations) if debug_print: # sort bank all_operations using all description columns and transaction type for i in reversed(range(len(bank_operations[0].descriptions))): bank_operations.sort(key=lambda bo: bo.descriptions[i]) bank_operations.sort(key=lambda bo: bo.transaction_type) utils.print_bank_operations_list(bank_operations) valid_operations.sort(key=lambda o: o.transaction_type) utils.print_bank_operations_list(valid_operations) print() # separator if debug_check: # operations.check_ignored_descriptions(IGNORED) operation.check_entries_count(all_operations, csv_count) operation.check_untyped(all_operations) operation.check_unassigned_descriptions(all_operations) operation.check_untopiced(all_operations) return all_operations