def yodlee_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Classification') if len(memo) > 0: return "%s - %s - %s" % ( memo, cat, cls) return "%s - %s" % ( cat, cls )
def yodlee_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Classification') if len(memo) > 0: return "%s - %s - %s" % (memo, cat, cls) return "%s - %s" % (cat, cls)
def yodlee_dscr(row, grid): " use user description for payee 1st, the original description" od = fromCSVCol(row, grid, 'Original Description') ud = fromCSVCol(row, grid, 'User Description') if len(ud) > 0: return "%s - %s" % (od, ud) return od
def msmoney_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Projects') if len(memo) > 0: return "%s - %s - %s" % (memo, cat, cls) return "%s - %s" % (cat, cls)
def msmoney_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Projects') if len(memo) > 0: return "%s - %s - %s" % ( memo, cat, cls ) return "%s - %s" % (cat, cls)
def get_payee(row, grid): name = fromCSVCol(row, grid, 'Name') transaction_type = fromCSVCol(row, grid, 'Type') if name: return name else: return transaction_type
def tmobilepl_amount(row, grid): amount = fromCSVCol(row, grid, 'Kwota').split(' ')[0] currency = fromCSVCol(row, grid, 'Kwota').split(' ')[1] memo = fromCSVCol(row, grid, 'Tytuł płatności') match = search('Kurs wymiany: (?P<currate>[0-9.]+)', memo) if match: currate = match.group('currate') amount = float(amount) * float(currate) return amount
def get_amount(row, grid): amount = fromCSVCol(row, grid, 'Kwota') if not amount and is_multiline(row, grid): amount = fromCSVCol(row, grid, 'Użytkownik') amount_normalized = amount.replace(',', '.') return str(amount_normalized)
def get_amount(row, grid): amount = fromCSVCol(row, grid, 'Kwota') if not amount and is_multiline(row, grid): amount = fromCSVCol(row, grid, 'Użytkownik') amount_normalized = amount.replace(',', '.') return amount_normalized
def get_category(row, grid): currency = fromCSVCol(row, grid, 'Currency') transaction_type = fromCSVCol(row, grid, 'Type') payee = fromCSVCol(row, grid, 'Name') if transaction_types[transaction_type]['has_own_acc']: category_format = "{transaction_type}: {currency}" else: category_format = "Imbalance-{currency}" return category_format.format(**locals())
def is_main_transaction_type(row, grid): transaction_type = fromCSVCol(row, grid, 'Type') if transaction_type in transaction_types: return transaction_types[transaction_type]['is_main_trans'] else: raise Exception('Unknown transaction type')
def get_memo(row, grid): transaction_type = fromCSVCol(row, grid, 'Type') auction_site = (' | ' + fromCSVCol(row, grid, 'Auction Site')) \ if grid.HasColumn('Auction Site') and fromCSVCol(row, grid, 'Auction Site') else '' item_title = (' | ' + fromCSVCol(row, grid, 'Item Title')) \ if grid.HasColumn('Item Title') and fromCSVCol(row, grid, 'Item Title') else '' item_id = (' | Item ID: ' + fromCSVCol(row, grid, 'Item ID')) \ if grid.HasColumn('Item ID') and fromCSVCol(row, grid, 'Item ID') else '' return '{}{}{}{}'.format(transaction_type, auction_site, item_title, item_id)
def get_all_participants_and_amounts(row, grid): participants = [] starting_column_index = splitwise['_params']['participants_columns_start_index'] for column_index in range(starting_column_index, grid.GetNumberCols()): column_id = grid.GetColLabelValue(column_index) column_value = float(fromCSVCol(row, grid, column_id)) if column_value == 0: continue else: participants.append((column_id, column_value)) return participants
return 'UBS' def ubs_toDescription(desc1, desc2, desc3): return ' / '.join([_f for _f in [desc1, desc2, desc3] if _f]) ubs = { '_params': { 'delimiter': ';', 'skip_last': 1 }, 'OFX': { 'skip': lambda row, grid: False, 'BANKID': lambda row, grid: 'UBS', 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Description'), 'DTPOSTED': lambda row, grid: ubs_fromUStoOFXDate(fromCSVCol(row, grid, 'Value date')), 'TRNAMT': lambda row, grid: ubs_toAmount(fromCSVCol(row, grid, 'Debit'), fromCSVCol(row, grid, 'Credit')), 'FITID': lambda row, grid: row, 'PAYEE': lambda row, grid: ubs_toPayee(fromCSVCol(row, grid, 'Entered by'), fromCSVCol(row, grid, 'Recipient')), 'MEMO': lambda row, grid: ubs_toDescription(fromCSVCol(row, grid, 'Description 1'), fromCSVCol(row, grid, 'Description 2'), fromCSVCol(row, grid, 'Description 3')), 'CURDEF': lambda row, grid: fromCSVCol(row, grid, 'Ccy.'), 'CHECKNUM': lambda row, grid: '' }, 'QIF': { 'split': lambda row, grid: False, 'Account': lambda row, grid: 'UBS', 'AccountDscr': lambda row, grid: fromCSVCol(row, grid, 'Description'), 'Date': lambda row, grid: ubs_toQIFDate(fromCSVCol(row, grid, 'Value date')),
def is_multiline(row, grid): return not fromCSVCol(row, grid, 'Data księgowania')
def toOFXDate(row, grid, iteration): date = fromCSVCol(row, grid, 'Date') return datetime.strptime(date, '%Y-%m-%d').strftime('%Y%m%d')
def get_payee(row, grid): return fromCSVCol(row, grid, 'Description')
def has_owner_paid_and_spent(row, grid): return has_owner_paid(row, grid) and float(fromCSVCol(row, grid, 'Cost')) - float( fromCSVCol(row, grid, get_owners_column_name())) > 0
def is_owner_involved(row, grid): return float(fromCSVCol(row, grid, get_owners_column_name())) != 0
def is_payment_transaction(row, grid): return fromCSVCol(row, grid, 'Category') == 'Payment'
memo = fromCSVCol(row, grid, 'Tytuł płatności') match = search('Kurs wymiany: (?P<currate>[0-9.]+)', memo) if match: currate = match.group('currate') amount = float(amount) * float(currate) return amount tmobilepl = { 'OFX': { 'skip': lambda row, grid: False, 'BANKID': lambda row, grid: "T-Mobile", 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Rachunek'), 'DTPOSTED': lambda row, grid: fromEUtoOFXDate(fromCSVCol(row, grid, 'Data')), 'TRNAMT': lambda row, grid: tmobilepl_amount(row, grid), 'FITID': lambda row, grid: '', 'PAYEE': lambda row, grid: fromCSVCol(row, grid, 'Nazwa odbiorcy/nadawcy'), 'MEMO': lambda row, grid: fromCSVCol(row, grid, 'Tytuł płatności'), 'CURDEF': lambda row, grid: fromCSVCol(row, grid, 'Kwota').split(' ')[1], 'CHECKNUM': lambda row, grid: '' },
def getPayee(row, grid): fromUsername = fromCSVCol(row, grid, 'from_full_name') toUsername = fromCSVCol(row, grid, 'to_full_name') return '"%s" to "%s"' % (fromUsername, toUsername) venmo = { 'OFX': { 'skip': lambda row, grid: False, 'BANKID': lambda row, grid: "Venmo", 'ACCTID': lambda row, grid: "Venmo", 'DTPOSTED': lambda row, grid: toOFXDate(fromCSVCol(row, grid, 'created_at')), 'TRNAMT': lambda row, grid: fromCSVCol(row, grid, 'amount'), 'FITID': lambda row, grid: fromCSVCol(row, grid, 'transaction_id'), 'PAYEE': lambda row, grid: getPayee(row, grid), 'MEMO': lambda row, grid: fromCSVCol(row, grid, 'note'), 'CURDEF': lambda row, grid: 'USD', 'CHECKNUM': lambda row, grid: '' }, }
def getPayee(row, grid): fromUsername = fromCSVCol(row, grid, 'from_full_name') toUsername = fromCSVCol(row, grid, 'to_full_name') return '"%s" to "%s"' % (fromUsername, toUsername)
paypal = { '_params': { 'delimiter': '\t', 'skip_initial_space': True, 'encoding': "UTF-8-sig", 'row_substitution': {}, 'date_format': '%d-%m-%Y%H:%M:%S', 'decimal_point_symbol': ',', 'thousands_separator_symbol': ' ' }, 'OFX': { 'skip': lambda row, grid: False, 'BANKID': lambda row, grid: "PayPal", 'ACCTID': lambda row, grid: 'PayPal ' + fromCSVCol(row, grid, 'Currency'), 'DTPOSTED': lambda row, grid: toOFXDate(row, grid), 'TRNAMT': lambda row, grid: get_amount(row, grid), 'FITID': lambda row, grid: fromCSVCol(row, grid, 'Transaction ID'), 'PAYEE': lambda row, grid: get_payee(row, grid), 'MEMO': lambda row, grid: get_memo(row, grid), 'CURDEF': lambda row, grid: fromCSVCol(row, grid, 'Currency'), 'CHECKNUM': lambda row, grid: '' }, 'QIF': { 'skip': lambda row, grid: should_skip_row(row, grid), 'split': lambda row, grid: False, 'Account': lambda row, grid: 'PayPal ' + fromCSVCol(get_row_to_return(row, grid), grid, 'Currency'), 'AccountDscr': lambda row, grid: '', 'Date': lambda row, grid: fromCSVCol(get_row_to_return(row, grid), grid, 'Date'), 'Payee': lambda row, grid: get_payee(get_row_to_return(row, grid), grid),
from csv2ofx.ofx import toOFXDate from csv2ofx.csvutils import fromCSVCol cu = { 'OFX': { 'skip': lambda row, grid: False, 'BANKID': lambda row, grid: 'Credit Union', 'ACCTID': lambda row, grid: 'My Account', 'DTPOSTED': lambda row, grid: toOFXDate(fromCSVCol(row, grid, 'Date')), 'TRNAMT': lambda row, grid: fromCSVCol(row, grid, 'Amount').replace('$', ''), 'FITID': lambda row, grid: row, 'PAYEE': lambda row, grid: fromCSVCol(row, grid, 'Description'), 'MEMO': lambda row, grid: fromCSVCol(row, grid, 'Comments'), 'CURDEF': lambda row, grid: 'USD', 'CHECKNUM': lambda row, grid: fromCSVCol(row, grid, 'Check Number') }, 'QIF': { 'split': lambda row, grid: False, 'Account': lambda row, grid: 'Credit Union', 'AccountDscr': lambda row, grid: 'Credit Union Account', 'Date': lambda row, grid: fromCSVCol(row, grid, 'Date'),
def getAmount(row, grid): return fromCSVCol(row, grid, 'Amount').replace('$', '')
def getPayee(row, grid): me = "me" them = fromCSVCol(row, grid, 'Name') payee, receiver = (them, me) if isReceived(row, grid) else (me, them) return '{payee} to {receiver}'.format(**locals())
def getPayee(row, grid): me = "me" them = fromCSVCol(row, grid, 'Name') payee, receiver = (them, me) if isReceived(row, grid) else (me, them) return '{payee} to {receiver}'.format(**locals()) def getAmount(row, grid): return fromCSVCol(row, grid, 'Amount').replace('$', '') def isReceived(row, grid): return True if float(getAmount(row, grid)) > 0 else False squarecash = { 'OFX': { 'skip': lambda row, grid: False, 'BANKID': lambda row, grid: "Square Cash", 'ACCTID': lambda row, grid: "Square Cash", 'DTPOSTED': lambda row, grid: toOFXDate(fromCSVCol(row, grid, 'Date')), 'TRNAMT': lambda row, grid: getAmount(row, grid), 'FITID': lambda row, grid: fromCSVCol(row, grid, 'Transaction ID'), 'PAYEE': lambda row, grid: getPayee(row, grid), 'MEMO': lambda row, grid: fromCSVCol(row, grid, 'Notes'), 'CURDEF': lambda row, grid: fromCSVCol(row, grid, 'Currency'), 'CHECKNUM': lambda row, grid: '' }, }
def is_total_balance_summary(row, grid): return fromCSVCol(row, grid, 'Description') == 'Total balance'
from csv2ofx.csvutils import fromCSVCol def msmoney_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Projects') if len(memo) > 0: return "%s - %s - %s" % ( memo, cat, cls ) return "%s - %s" % (cat, cls) msmoneyrep = { 'OFX': { 'skip': lambda row, grid: fromCSVCol(row, grid, 'Split Type') == 'Split', 'BANKID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[0], 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[-1], 'DTPOSTED': lambda row, grid: toOFXDate(fromCSVCol(row, grid, 'Date')), 'TRNAMT': lambda row, grid: fromCSVCol(row, grid, 'Amount'), 'FITID': lambda row, grid: fromCSVCol(row, grid, 'Num'), 'PAYEE': lambda row, grid: fromCSVCol(row, grid, 'Payee'), 'MEMO': lambda row, grid: msmoney_memo(row, grid), 'CURDEF': lambda row, grid: fromCSVCol(row, grid, 'Currency'), 'CHECKNUM': lambda row, grid: fromCSVCol(row, grid, 'Num') }, 'QIF': { 'split': lambda row, grid: fromCSVCol(row, grid, 'Date') == '', # split should be determined by absence of date and other fields. 'Account': lambda row, grid: fromCSVCol(row, grid, 'Account'), 'AccountDscr': lambda row, grid: fromCSVCol(row, grid, 'Account'),
def does_owner_send_payment(row, grid): return is_payment_transaction(row, grid) and float(fromCSVCol(row, grid, get_owners_column_name())) > 0
from csv2ofx.csvutils import fromCSVCol abnamro = { '_params': { 'delimiter': '\t', 'has_header': False, }, 'OFX': { 'skip': lambda row, grid: False, 'multiline': lambda row, grid: False, 'BANKID': lambda row, grid: 'ABN Amro', 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 0), 'DTPOSTED': lambda row, grid: fromCSVCol(row, grid, 2), 'TRNAMT': lambda row, grid: fromCSVCol(row, grid, 6).replace(",", "."), 'FITID': lambda row, grid: '', 'PAYEE': lambda row, grid: fromCSVCol(row, grid, 7), 'MEMO': lambda row, grid: fromCSVCol(row, grid, 7), 'CURDEF': lambda row, grid: fromCSVCol(row, grid, 1), 'CHECKNUM': lambda row, grid: '', }, 'QIF': { 'split': lambda row, grid: False, 'Account': lambda row, grid: fromCSVCol(row, grid, 0), 'AccountDscr': lambda row, grid: '', # TODO: date should be in mm/dd/YYYY or mm/dd/YY, is now YYYYMMDD 'Date': lambda row, grid: fromCSVCol(row, grid, 2), 'Payee': lambda row, grid: '', 'Memo': lambda row, grid: fromCSVCol(row, grid, 7), 'Category': lambda row, grid: '', 'Class': lambda row, grid: '', 'Amount': lambda row, grid: fromCSVCol(row, grid, 6).replace(",", "."),
def does_owner_owe(row, grid): if is_payment_transaction(row, grid): return float(fromCSVCol(row, grid, get_owners_column_name())) > 0 else: return float(fromCSVCol(row, grid, get_owners_column_name())) < 0
def toOFXDate(row, grid): date = fromCSVCol(row, grid, 'Date') time = fromCSVCol(row, grid, 'Time') # timezone = fromCSVCol(row, grid, 'Time Zone') if grid.HasColumn('Time Zone') else fromCSVCol(row, grid, 'TimeZone') # TODO: timezone is not detected by strptime return datetime.strptime(date + time, paypal['_params']['date_format']).strftime('%Y%m%d')
def get_memo(row, grid): return fromCSVCol(row, grid, 'Category')
def get_amount(row, grid): if grid.HasColumn('Net'): return fromCSVCol(row, grid, 'Net').replace(paypal['_params']['decimal_point_symbol'], '.').replace( paypal['_params']['thousands_separator_symbol'], '').replace(u'\xa0', '') else: return fromCSVCol(row, grid, 'Amount')
def get_all_transaction_splits(row, grid): splits = [] # add main transaction entry if does_owner_owe(row, grid) and not is_payment_transaction(row, grid): main_id = find_who_paid(row, grid)[0] + ' ' + fromCSVCol(row, grid, 'Currency') main_value = float(fromCSVCol(row, grid, get_owners_column_name())) * -1 elif does_owner_receive_payment(row, grid): main_id = find_who_paid(row, grid)[0] + ' ' + fromCSVCol(row, grid, 'Currency') main_value = float(fromCSVCol(row, grid, get_owners_column_name())) * -1 elif does_owner_send_payment(row, grid): main_id = find_who_paid(row, grid)[0] + ' ' + fromCSVCol(row, grid, 'Currency') main_value = float(fromCSVCol(row, grid, get_owners_column_name())) else: main_id = 'Splitwise ' + fromCSVCol(row, grid, 'Currency') main_value = float(fromCSVCol(row, grid, 'Cost')) splits.append((main_id, main_value)) # add splits for participant_and_amount in get_all_participants_and_amounts(row, grid): if participant_and_amount[0] == get_owners_column_name(): if has_owner_paid_and_spent(row, grid): split_value = round(participant_and_amount[1] - main_value, 2) split_id = 'Imbalance-' + fromCSVCol(row, grid, 'Currency') elif does_owner_owe(row, grid) and not is_payment_transaction(row, grid): split_value = participant_and_amount[1] * -1 split_id = 'Imbalance-' + fromCSVCol(row, grid, 'Currency') elif is_payment_transaction(row, grid): if does_owner_send_payment(row, grid): continue # already included in main transaction split_value = participant_and_amount[1] * -1 split_id = 'Splitwise ' + fromCSVCol(row, grid, 'Currency') else: continue elif does_owner_owe(row, grid) and not is_payment_transaction(row, grid): continue elif does_owner_receive_payment(row, grid): continue elif does_owner_send_payment(row, grid): split_id = participant_and_amount[0] + ' ' + fromCSVCol(row, grid, 'Currency') split_value = participant_and_amount[1] * -1 else: split_id = participant_and_amount[0] + ' ' + fromCSVCol(row, grid, 'Currency') split_value = participant_and_amount[1] splits.append((split_id, split_value)) return splits
def are_rows_same_transaction(first, second, grid): if grid.HasColumn('Time Zone'): return fromCSVCol(first, grid, 'Date') == fromCSVCol(second, grid, 'Date') \ and fromCSVCol(first, grid, 'Time') == fromCSVCol(second, grid, 'Time') \ and fromCSVCol(first, grid, 'Time Zone') == fromCSVCol(second, grid, 'Time Zone') \ and fromCSVCol(first, grid, 'Currency') == fromCSVCol(second, grid, 'Currency') else: return fromCSVCol(first, grid, 'Date') == fromCSVCol(second, grid, 'Date') \ and fromCSVCol(first, grid, 'Time') == fromCSVCol(second, grid, 'Time') \ and fromCSVCol(first, grid, 'TimeZone') == fromCSVCol(second, grid, 'TimeZone') \ and fromCSVCol(first, grid, 'Currency') == fromCSVCol(second, grid, 'Currency')
return od def yodlee_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Classification') if len(memo) > 0: return "%s - %s - %s" % ( memo, cat, cls) return "%s - %s" % ( cat, cls ) yodlee = { 'OFX': { 'skip': lambda row, grid: fromCSVCol(row, grid, 'Split Type') == 'Split', 'BANKID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[0], 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[-1], 'DTPOSTED': lambda row, grid: toOFXDate(fromCSVCol(row, grid, 'Date')), 'TRNAMT': lambda row, grid: fromCSVCol(row, grid, 'Amount'), 'FITID': lambda row, grid: fromCSVCol(row, grid, 'Transaction Id'), 'PAYEE': lambda row, grid: yodlee_dscr(row, grid), 'MEMO': lambda row, grid: yodlee_memo(row, grid), 'CURDEF': lambda row, grid: fromCSVCol(row, grid, 'Currency'), 'CHECKNUM': lambda row, grid: fromCSVCol(row, grid, 'Transaction Id') }, 'QIF': { 'split': lambda row, grid: fromCSVCol(row, grid, 'Split Type') == 'Split', 'Account': lambda row, grid: fromCSVCol(row, grid, 'Account Name'), 'AccountDscr': lambda row, grid: ' '.join(fromCSVCol(row, grid, 'Account Name').split('-')[1:]), 'Date': lambda row, grid: fromCSVCol(row, grid, 'Date'),
# Export CSV for both groups *and* friends, as each CSV will contain unique transactions # Set your owners name splitwise = { '_params': { 'delimiter': ',', 'skip_initial_space': True, 'has_multiple_transactions_per_line': True, 'encoding': "UTF-8", 'owners_name': 'Dawid Wróbel', 'participants_columns_start_index': 5 }, 'QIF': { 'skip': lambda row, grid: should_skip_row(row, grid), 'extra_row_iterations_to_do': lambda row, grid: get_extra_iterations_to_do(row, grid), 'split': lambda row, grid, iteration: iteration > 0, 'Account': lambda row, grid, iteration: get_account(row, grid), 'AccountDscr': lambda row, grid, iteration: '', 'Date': lambda row, grid, iteration: fromCSVCol(row, grid, 'Date'), 'Payee': lambda row, grid, iteration: get_payee(row, grid), 'Memo': lambda row, grid, iteration: get_memo(row, grid), 'Category': lambda row, grid, iteration: get_category(row, grid, iteration), 'Class': lambda row, grid, iteration: '', 'Amount': lambda row, grid, iteration: float(get_amount(row, grid, iteration)) * -1, 'Number': lambda row, grid, iteration: '' } }
raiffeisenpolbank_ccard = { '_params': { 'delimiter': ';', 'encoding': 'windows-1250', }, 'OFX': { 'skip': lambda row, grid: False, 'multiline': lambda row, grid: is_multiline(row, grid), 'BANKID': lambda row, grid: "Raiffeisen Polbank", 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Numer karty') if not is_multiline(row, grid) else '', 'DTPOSTED': lambda row, grid: fromEUtoOFXDate( fromCSVCol(row, grid, 'Data transakcji')) if not is_multiline(row, grid) else '', 'TRNAMT': lambda row, grid: invert_value(get_amount(row, grid)), 'FITID': lambda row, grid: '', 'PAYEE': lambda row, grid: fromCSVCol(row, grid, 'Miejsce transakcji') if not is_multiline(row, grid) else '', 'MEMO': lambda row, grid: fromCSVCol(row, grid, 'Numer karty') if is_multiline(row, grid) else '',
def is_settling_transaction(row, grid): return fromCSVCol(row, grid, 'Description') == 'Settle all balances'
def ubs_toDescription(desc1, desc2, desc3): return ' / '.join(filter(None, [desc1, desc2, desc3])) ubs = { '_params': { 'delimiter': ';', 'skip_last': 1 }, 'OFX': { 'skip': lambda row, grid: False, 'BANKID': lambda row, grid: 'UBS', 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Description'), 'DTPOSTED': lambda row, grid: ubs_fromUStoOFXDate( fromCSVCol(row, grid, 'Value date')), 'TRNAMT': lambda row, grid: ubs_toAmount(fromCSVCol(row, grid, 'Debit'), fromCSVCol(row, grid, 'Credit')), 'FITID': lambda row, grid: row, 'PAYEE': lambda row, grid: ubs_toPayee(fromCSVCol(row, grid, 'Entered by'), fromCSVCol(row, grid, 'Recipient')), 'MEMO': lambda row, grid: ubs_toDescription( fromCSVCol(row, grid, 'Description 1'), fromCSVCol(row, grid, 'Description 2'),
from csv2ofx.csvutils import fromCSVCol def msmoney_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Projects') if len(memo) > 0: return "%s - %s - %s" % (memo, cat, cls) return "%s - %s" % (cat, cls) msmoneyrep = { 'OFX': { 'skip': lambda row, grid: fromCSVCol(row, grid, 'Split Type') == 'Split', 'BANKID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[0 ], 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[-1 ], 'DTPOSTED': lambda row, grid: toOFXDate(fromCSVCol(row, grid, 'Date')), 'TRNAMT': lambda row, grid: fromCSVCol(row, grid, 'Amount'), 'FITID': lambda row, grid: fromCSVCol(row, grid, 'Num'), 'PAYEE': lambda row, grid: fromCSVCol(row, grid, 'Payee'), 'MEMO':
def should_skip_row(row, grid): return fromCSVCol(row, grid, 'Type') in ignored_transaction_types
return od def yodlee_memo(row, grid): memo = fromCSVCol(row, grid, 'Memo') # sometimes None cat = fromCSVCol(row, grid, 'Category') cls = fromCSVCol(row, grid, 'Classification') if len(memo) > 0: return "%s - %s - %s" % (memo, cat, cls) return "%s - %s" % (cat, cls) yodlee = { 'OFX': { 'skip': lambda row, grid: fromCSVCol(row, grid, 'Split Type') == 'Split', 'BANKID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[0 ], 'ACCTID': lambda row, grid: fromCSVCol(row, grid, 'Account Name').split(' - ')[-1 ], 'DTPOSTED': lambda row, grid: toOFXDate(fromCSVCol(row, grid, 'Date')), 'TRNAMT': lambda row, grid: fromCSVCol(row, grid, 'Amount'), 'FITID': lambda row, grid: fromCSVCol(row, grid, 'Transaction Id'), 'PAYEE': lambda row, grid: yodlee_dscr(row, grid), 'MEMO':