def get_binance_symbols_and_codes(): with firefly_iii_client.ApiClient(firefly_config) as api_client: # Create an instance of the API class accounts_api = firefly_iii_client.AccountsApi(api_client) try: accounts = accounts_api.list_account().data list_of_symbols_and_codes = [] relevant_accounts = [] for account in accounts: if account.attributes.type == 'asset' and \ account.attributes.notes is not None and \ "py1binance2firefly3:binance-fund" in account.attributes.notes: relevant_accounts.append(account) print( str(relevant_accounts.__len__()) + " Binance accounts found within your FireFly-III instance.") for account in relevant_accounts: if not any(account.attributes.currency_code in s for s in list_of_symbols_and_codes): list_of_symbols_and_codes.append( account.attributes.currency_code) if not any(account.attributes.currency_symbol in s for s in list_of_symbols_and_codes): list_of_symbols_and_codes.append( account.attributes.currency_symbol) return list_of_symbols_and_codes except Exception as e: print('There was an error getting the accounts' % e) exit(-601)
def connect(): try: print('Trying to connect to your FireFly-III account...') firefly_iii_client.configuration.verify_ssl = False configuration = firefly_iii_client.configuration.Configuration( host=config.firefly_host) configuration.verify_ssl = config.firefly_verify_ssl configuration.access_token = config.firefly_access_token # Enter a context with an instance of the API client with firefly_iii_client.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = firefly_iii_client.AboutApi(api_client) try: api_instance.get_about() except Exception as e: print("Cannot get server instance About information." % e) print('Connection to your FireFly-III account established.\n') global firefly_config firefly_config = configuration return True except Exception as e: print('Cannot connect to your FireFly-III account.' % e) exit(-600)
def write_commission(transaction_collection): with firefly_iii_client.ApiClient(firefly_config) as api_client: transaction_api = firefly_iii_client.TransactionsApi(api_client) list_inner_transactions = [] currency_code = transaction_collection.from_commission_account.currency_code currency_symbol = transaction_collection.from_commission_account.currency_symbol amount = transaction_collection.binance_transaction.get('commission') tags = ['binance'] if config.debug: tags.append('dev') split = firefly_iii_client.TransactionSplit( amount=amount, date=datetime.datetime.fromtimestamp( int( transaction_collection.binance_transaction.get('time') / 1000)), description="Binance | FEE | Currency: " + currency_code, type='withdrawal', tags=tags, source_name=transaction_collection.from_commission_account.name, source_type=transaction_collection.from_commission_account.type, currency_code=currency_code, currency_symbol=currency_symbol, destination_name=transaction_collection.commission_account.name, destination_type=transaction_collection.commission_account.type, external_id=transaction_collection.binance_transaction.get('id'), notes="py1binance2firefly3:binance-fee") split.import_hash_v2 = hash_transaction( split.amount, split.date, split.description, split.external_id, split.source_name, split.destination_name, split.tags) list_inner_transactions.append(split) new_transaction = firefly_iii_client.Transaction( apply_rules=False, transactions=list_inner_transactions, error_if_duplicate_hash=True) try: pass print('Writing a new paid commission.') # pprint(new_transaction) transaction_api.store_transaction(new_transaction) except Exception as e: print( 'There was an error writing a new transaction (probably a duplicate?)' )
def get_account_from_firefly(security, account_type, notes_keywords): with firefly_iii_client.ApiClient(firefly_config) as api_client: # Create an instance of the API class accounts_api = firefly_iii_client.AccountsApi(api_client) try: accounts = accounts_api.list_account().data for account in accounts: if account.attributes.type == account_type and \ account.attributes.notes is not None and \ notes_keywords in account.attributes.notes: if security is None: return account else: if account.attributes.currency_code == security or account.attributes.currency_symbol == security: return account except Exception as e: print('There was an error getting the accounts from Firefly-III' % e) exit(-604) return None
def get_binance_currencies_for_accounts(accounts): with firefly_iii_client.ApiClient(firefly_config) as api_client: # Create an instance of the API class currency_api = firefly_iii_client.CurrenciesApi(api_client) try: relevant_currencies = [] for account in accounts: print('Fetching currency with code ' + str(account.attributes.currency_code)) account_currency = currency_api.get_currency( account.attributes.currency_code) relevant_currencies.append(account_currency.data) return relevant_currencies except Exception as e: print( 'There was an error while getting currencies from FireFly-III' % e) exit(-603)
def write_new_transaction(transaction_collection): with firefly_iii_client.ApiClient(firefly_config) as api_client: transaction_api = firefly_iii_client.TransactionsApi(api_client) list_inner_transactions = [] if transaction_collection.collection_type == CollectionType.BUY: type_string = "BUY" else: type_string = "SELL" if type_string == "BUY": currency_code = transaction_collection.from_ff_account.currency_code currency_symbol = transaction_collection.from_ff_account.currency_symbol foreign_currency_code = transaction_collection.to_ff_account.currency_code foreign_currency_symbol = transaction_collection.to_ff_account.currency_symbol amount = transaction_collection.binance_transaction.get('quoteQty') foreign_amount = float( transaction_collection.binance_transaction.get('qty')) else: currency_code = transaction_collection.from_ff_account.currency_code currency_symbol = transaction_collection.from_ff_account.currency_symbol foreign_currency_code = transaction_collection.to_ff_account.currency_code foreign_currency_symbol = transaction_collection.to_ff_account.currency_symbol amount = transaction_collection.binance_transaction.get('qty') foreign_amount = float( transaction_collection.binance_transaction.get('quoteQty')) tags = ['binance'] if config.debug: tags.append('dev') split = firefly_iii_client.TransactionSplit( amount=amount, date=datetime.datetime.fromtimestamp( int( transaction_collection.binance_transaction.get('time') / 1000)), description='Binance | ' + type_string + " | Security: " + transaction_collection.trading_pair.security + " | Currency: " + transaction_collection.trading_pair.currency + " | Ticker " + transaction_collection.trading_pair.pair, type='transfer', tags=tags, source_name=transaction_collection.from_ff_account.name, source_type=transaction_collection.from_ff_account.type, currency_code=currency_code, currency_symbol=currency_symbol, destination_name=transaction_collection.to_ff_account.name, destination_type=transaction_collection.to_ff_account.type, foreign_currency_code=foreign_currency_code, foreign_currency_symbol=foreign_currency_symbol, foreign_amount=foreign_amount, external_id=transaction_collection.binance_transaction.get('id'), notes="py1binance2firefly3:binance-trade") split.import_hash_v2 = hash_transaction( split.amount, split.date, split.description, split.external_id, split.source_name, split.destination_name, split.tags) list_inner_transactions.append(split) new_transaction = firefly_iii_client.Transaction( apply_rules=False, transactions=list_inner_transactions, error_if_duplicate_hash=True) try: print('Writing a new trade.') # pprint(new_transaction) transaction_api.store_transaction(new_transaction) except Exception as e: print( 'There was an error writing a new transaction (probably a duplicate?)' )