Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
def operation_of(amount=None, address=None):
    """ Operation object factory """
    o = Operation()
    o.amount = amount
    o.get_init_location().address = address
    return o
Exemplo n.º 3
0
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