def lstx(no_group, no_annotations, minimal): """List all transactions that have been derived from events and annotated.""" events = get_events(loaders.all) transactions = get_transactions(events, XDG_CONFIG_HOME + "/mistbat/tx_match.yaml") if not no_annotations: transactions = annotate_transactions( transactions, XDG_CONFIG_HOME + "/mistbat/tx_annotations.yaml") transactions = fmv_transactions(transactions, XDG_DATA_HOME + "/mistbat/tx_fmv.yaml") transactions = imply_fees(transactions) if no_group: transactions = [ tx for tx in transactions if getattr(tx, "groups", None) is None ] # Print transactions for tx in transactions: if minimal: print(tx) else: print(tx.description()) print("--------------------") print("{} total transactions".format(len(transactions))) print_usd_exposure()
def currentbasis(harvest): """See available basis by coin""" events = get_events(loaders.all) transactions = get_transactions(events, XDG_CONFIG_HOME + "/mistbat/tx_match.yaml") transactions = annotate_transactions( transactions, XDG_CONFIG_HOME + "/mistbat/tx_annotations.yaml") transactions = fmv_transactions(transactions, XDG_DATA_HOME + "/mistbat/tx_fmv.yaml") transactions = imply_fees(transactions) form_8949 = Form8949(transactions) print("\nAVAILABLE BASIS REPORT") print( "Note: Coin totals will slighly deviate from 'holdings' since SENDRECV fees do not impact basis.\n" ) table_headings = [ "Coin", "Date Acquired", "Amount", "Basis per Coin", "Total Basis", ] if harvest: table_headings.append("Cum. G/L at Spot Price") spot_prices = get_coin_spot_prices( set(form_8949.current_available_basis().keys())) table = PrettyTable(table_headings) for coin, available_basis in form_8949.current_available_basis().items(): coin_usd_total = 0.00 coin_amount_total = 0.00 cumulative_gain_or_loss = 0.00 for basis in available_basis: time = basis[0].strftime("%Y-%m-%d %H:%M:%S") amount = round(basis[1], 8) fmv = round(basis[2], 2) total = round(amount * fmv, 2) row = [coin, time, amount, fmv, total] if harvest: cumulative_gain_or_loss += (spot_prices[coin] * amount) - (fmv * amount) row.append(round(cumulative_gain_or_loss, 2)) table.add_row(row) coin_usd_total += total coin_amount_total += amount row = [ "", "TOTAL", round(coin_amount_total, 8), "", round(coin_usd_total, 2) ] if harvest: row.append("") table.add_row(row) table.add_row([" "] * len(table.field_names)) print(table)
def tax(aggregated, year): """Generate the information needed for IRS Form 8949""" events = get_events(loaders.all) transactions = get_transactions(events, XDG_CONFIG_HOME + "/mistbat/tx_match.yaml") transactions = annotate_transactions( transactions, XDG_CONFIG_HOME + "/mistbat/tx_annotations.yaml") transactions = fmv_transactions(transactions, XDG_DATA_HOME + "/mistbat/tx_fmv.yaml") transactions = imply_fees(transactions) form_8949 = Form8949(transactions) print("SHORT-TERM CAPITAL GAINS") table = PrettyTable([ "(a) Description", "(b) Date acquired", "(c) Date sold", "(d) Proceeds", "(e) Basis", "(h) Gain", ]) total_gain = 0.00 for line in form_8949.generate_form(term="short", aggregated=aggregated, year=year): table.add_row(line) if str(line[-1]).strip(): total_gain += line[-1] print(table) print(f"TOTAL SHORT-TERM CAPITAL GAIN: USD {total_gain:0.2f}") print("\nLONG-TERM CAPITAL GAINS") table = PrettyTable([ "(a) Description", "(b) Date acquired", "(c) Date sold", "(d) Proceeds", "(e) Basis", "(h) Gain", ]) total_gain = 0.00 for line in form_8949.generate_form(term="long", aggregated=aggregated, year=year): table.add_row(line) if str(line[-1]).strip(): total_gain += line[-1] print(table) print(f"TOTAL LONG-TERM CAPITAL GAIN: USD {total_gain:0.2f}")