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?)'
            )