示例#1
0
def get_expenses(db_exp_data_fpaths: list,
                 db_inc_data_fpaths: list,
                 stor_pair_path: str,
                 stor_exp_data_path: str,
                 budg_path: str,
                 exp_path: str,
                 dont_print_cols=None,
                 bankconfig=None):
    """
    main method for the importing of expense data
    """
    bank_json = data_help.read_jsonFile(bankconfig.settings_path)
    exp_df = data_help.load_csvs(
        db_exp_data_fpaths,
        dtype=bankconfig.exp_dtypes,
        parse_dates=env.pdates_colname
    )  # only using on csv db for now. newest will be last? idk verify later.

    exp_df = data_help.drop_for_substring(
        exp_df, env.BANK_STORENAME, bankconfig.ignorable_transactions,
        "\nRemoving the below expense transactions as they are either an internal bank acct transfer, cash advance or credit payment."
    )
    dates = data_help.extract_months(exp_df[env.DATE], start=False)
    # check for any missing budgets either this month or any month in the data
    expManager.get_budgets(budg_path, exp_path, dates)
    exp_df = expManager.get_expenses_for_rows(exp_df, stor_exp_data_path,
                                              stor_pair_path, budg_path,
                                              bankconfig)
    print("\nFinished gathering your expense data: \n")
    util.print_fulldf(exp_df, dont_print_cols)
    data_help.write_data(exp_df, db_exp_data_fpaths[0])
示例#2
0
def notes_editor(db_exp_data_fpaths,
                 db_inc_data_fpaths,
                 notes_path,
                 bankconfig=None):
    """
    Main menu for editing notes
    """
    done = False
    while not done:
        exp_df = data_help.load_csvs(db_exp_data_fpaths,
                                     dtype=bankconfig.exp_dtypes,
                                     parse_dates=env.pdates_colname)
        inc_df = data_help.load_csvs(db_inc_data_fpaths,
                                     dtype=bankconfig.inc_dtypes,
                                     parse_dates=env.pdates_colname)
        notes_dict = data_help.read_jsonFile(notes_path)

        exp_months = data_help.extract_months(exp_df[env.DATE], start=False)
        inc_months = data_help.extract_months(inc_df[env.DATE], start=False)
        months_in_data = util.add_set_to_set(exp_months, inc_months, sort=True)

        if notes_dict == {}:
            prompt = "You have not entered any notes yet. Which month(s) would you like to add notes for? "
            edit_prompt_base = "Please enter your note below for month "

        else:
            prompt = "Please select a month to edit : "
            edit_prompt_base = "Edit your note below for month "

        sel_months = util.select_indices_of_list(
            prompt,
            list_to_compare_to=months_in_data,
            return_matches=True,
            abortchar='q')

        if sel_months is not None:
            notes = edit_notes(edit_prompt_base, notes_dict, sel_months,
                               notes_path)

        else:
            done = True
示例#3
0
def get_income(db_inc_data_fpaths: list,
               dont_print_cols=None,
               bankconfig=None):
    """
    main method for the importing of income data
    """
    inc_df = data_help.load_csvs(db_inc_data_fpaths,
                                 dtype=bankconfig.inc_dtypes,
                                 parse_dates=env.pdates_colname)
    inc_df = data_help.drop_for_substring(
        inc_df, env.BANK_STORENAME, bankconfig.ignorable_transactions,
        "\nRemoving the below income transactions as they are either an internal bank acct transfer, cash advance or credit payment."
    )
    data_help.write_data(inc_df, db_inc_data_fpaths[0])
    print("\nFinished gathering your income data: \n")
    util.print_fulldf(inc_df, dont_print_cols)
示例#4
0
def store_editor(db_exp_data_fpaths,
                 db_exprec_data_fpath,
                 stor_pair_path,
                 exp_stor_data_path,
                 budg_path,
                 exp_path,
                 bankconfig=None):
    """
    Edits a store's name across all databases.
    params:
        db_exp_data_fpaths - filepaths to expense csv's
        stor_pair_path - filepath to store name database
        exp_stor_data_path - filepath to store-expense data base
        budg_path - filepath to budget database
    """

    done = False
    while not done:
        df = data_help.load_csvs(db_exp_data_fpaths,
                                 dtype=bankconfig.exp_dtypes,
                                 parse_dates=env.pdates_colname)
        df_rec = data_help.load_csv(db_exprec_data_fpath,
                                    dtype=bankconfig.exp_dtypes,
                                    parse_dates=env.pdates_colname)
        stor_data = data_help.read_jsonFile(stor_pair_path)
        exp_stor_data = data_help.read_jsonFile(exp_stor_data_path)
        exp_data = data_help.read_jsonFile(exp_path)
        budg_db = data_help.read_jsonFile(budg_path)

        prompt = "Would you like to: \n(a) - change storenames\n(b) - edit bank to database store relationships\n(q) - quit\ntype here: "
        user_in = util.get_user_input_for_chars(prompt, ['a', 'b', 'q'])

        if user_in == 'a':
            change_storename(db_exp_data_fpaths, df, db_exprec_data_fpath,
                             df_rec, exp_stor_data, stor_data, stor_pair_path,
                             exp_stor_data_path)
        elif user_in == 'b':
            change_storepair(db_exp_data_fpaths, df, db_exprec_data_fpath,
                             df_rec, exp_stor_data, stor_data, stor_pair_path,
                             exp_stor_data_path, exp_data, budg_db)
        elif user_in == 'q':
            done = True
    return
示例#5
0
def check_for_data(ndata_filepaths, db_exp_data_fpaths, db_inc_data_fpaths,
                   adata_path, db_exp_data_path, db_inc_data_path,
                   exp_recbin_path, inc_recbin_path, bankconfig):
    """
    Checks db and new folder for any data. 
    Imports the data into expense and income dataframes
    """
    if len(ndata_filepaths) == 0:
        return False

    if len(ndata_filepaths) != 0 and len(db_exp_data_fpaths) != 0 and len(
            db_inc_data_fpaths) != 0:
        df_new = data_help.load_and_process_csvs(
            file_paths=ndata_filepaths,
            strip_cols=bankconfig.strip_cols,
            data_type=bankconfig.selection)
        util.print_fulldf(df_new)

        df_inc_new, df_exp_new = data_help.filter_by_amnt(
            df_new,
            col_name=env.AMOUNT,
            col_name2=env.NULL,
            bank_name=bankconfig.selection)
        df_inc_new = data_help.add_columns(
            df_inc_new, [env.ADJUSTMENT, env.INC_UUID, env.EXP_UUID])

        df_exp_new = data_help.add_columns(df_exp_new, [
            env.FILT_STORENAME, env.EXPENSE, env.ADJUSTMENT, env.EXP_UUID,
            env.INC_UUID
        ])

        df_exp = data_help.load_csvs(file_paths=db_exp_data_fpaths,
                                     strip_cols=bankconfig.strip_cols,
                                     dtype=bankconfig.exp_dtypes)
        df_inc = data_help.load_csvs(file_paths=db_inc_data_fpaths,
                                     strip_cols=bankconfig.strip_cols,
                                     dtype=bankconfig.inc_dtypes)
        df_exp = pd.concat([df_exp, df_exp_new])
        df_inc = pd.concat([df_inc, df_inc_new])

    elif len(ndata_filepaths) != 0:
        df_new = data_help.load_and_process_csvs(
            file_paths=ndata_filepaths,
            strip_cols=bankconfig.strip_cols,
            data_type=bankconfig.selection)
        df_inc, df_exp = data_help.filter_by_amnt(
            df_new,
            col_name=env.AMOUNT,
            col_name2=env.NULL,
            bank_name=bankconfig.selection)
        df_inc_new = data_help.add_columns(
            df_inc, [env.ADJUSTMENT, env.INC_UUID, env.EXP_UUID])

        df_exp_new = data_help.add_columns(df_exp, [
            env.FILT_STORENAME, env.EXPENSE, env.ADJUSTMENT, env.EXP_UUID,
            env.INC_UUID
        ])

    else:
        return False

    df_exp_recbin = data_help.load_csvs([exp_recbin_path],
                                        dtype=bankconfig.exp_dtypes,
                                        parse_dates=env.pdates_colname)
    df_inc_recbin = data_help.load_csvs([inc_recbin_path],
                                        dtype=bankconfig.inc_dtypes,
                                        parse_dates=env.pdates_colname)
    print("New data loaded locally.\n\n")
    print("INCOME\n\n")
    util.print_fulldf(df_inc)
    print("IGNORED INCOME\n\n")
    util.print_fulldf(df_inc_recbin)
    print("EXPENSES\n\n")
    util.print_fulldf(df_exp)
    print("YOUR IGNORED EXPENSES\n\n")
    util.print_fulldf(df_exp_recbin)

    df_exp = data_help.drop_dups(df=df_exp,
                                 col_names=bankconfig.check_for_dups_cols,
                                 ignore_index=True)
    df_inc = data_help.drop_dups(df=df_inc,
                                 col_names=bankconfig.check_for_dups_cols,
                                 ignore_index=True)

    df_exp = data_help.remove_subframe(
        df_to_remove_from=df_exp,
        df_to_remove=df_exp_recbin,
        col_names=bankconfig.check_for_dups_cols)
    df_inc = data_help.remove_subframe(
        df_to_remove_from=df_inc,
        df_to_remove=df_inc_recbin,
        col_names=bankconfig.check_for_dups_cols)

    print("INCOME WITHOUT DUPS\n\n")
    util.print_fulldf(df_inc)
    print("EXPENSES WITHOUT DUPS\n\n")
    util.print_fulldf(df_exp)

    df_exp = data_help.iterate_df_and_add_uuid_to_col(df_exp, env.EXP_UUID)
    df_inc = data_help.iterate_df_and_add_uuid_to_col(df_inc, env.INC_UUID)

    data_help.write_data(df_exp,
                         os.path.join(db_exp_data_path,
                                      env.OUT_EXP_DATA_TEMPL),
                         sortby=env.DATE,
                         fillna_col=[env.ADJUSTMENT])
    data_help.write_data(df_inc,
                         os.path.join(db_inc_data_path,
                                      env.OUT_INC_DATA_TEMPL),
                         sortby=env.DATE,
                         fillna_col=[env.ADJUSTMENT])
    timestamp = datetime.datetime.now().strftime("%m_%d_%Y__%H_%M_%S") + ".csv"
    data_help.move_files(files=ndata_filepaths,
                         dest=os.path.join(adata_path, timestamp))
    print(
        f"Data imported to {db_inc_data_path} and {db_exp_data_path}. Old files moved to {adata_path}"
    )
    return True
示例#6
0
def view_money_data(db_exp_data_fpaths,
                    db_inc_data_fpaths,
                    stor_pair_path,
                    stor_exp_data_path,
                    budg_path,
                    notes_path,
                    exp_path,
                    dont_print_cols=None,
                    bankconfig=None,
                    settings_path=None):
    """
    main method for the viewing of data
    params:
        exp_path - path to expenses.json
        dont_print_cols - ignore columns for output to CLI
    """
    df_exp = data_help.load_csvs(db_exp_data_fpaths,
                                 dtype=bankconfig.exp_dtypes,
                                 parse_dates=env.pdates_colname,
                                 index=env.DATE)
    df_inc = data_help.load_csvs(
        db_inc_data_fpaths,
        dtype=bankconfig.inc_dtypes,
        parse_dates=env.pdates_colname,
        index=env.DATE)  # TODO SHOW NET INCOME ON PLOTS
    df_exp = data_help.combine_and_drop(df_exp, env.AMOUNT, env.ADJUSTMENT,
                                        'subtract')

    df_inc = data_help.combine_and_drop(df_inc, env.AMOUNT, env.ADJUSTMENT,
                                        'subtract')
    exp_dict = data_help.read_jsonFile(exp_path)

    settings = data_help.read_jsonFile(settings_path)

    if df_inc.empty:  # set index to datetime if empty.
        df_inc.set_index(pd.to_datetime(df_inc.index), inplace=True)

    budg_db = data_help.read_jsonFile(budg_path)  # load the budget data
    df_budg = pd.DataFrame(budg_db)
    df_budg = df_budg.T  # transpose to make index date str
    df_budg.set_index(pd.to_datetime(df_budg.index),
                      inplace=True)  # set index to date time

    notes_dict = data_help.read_jsonFile(notes_path)

    years = data_help.extract_years(df_exp.index.to_series())
    years_to_show = util.select_indices_of_list(
        "Which of the above year(s) would you like to take a peak at, 'a' for all: ",
        years,
        return_matches=True,
        abortchar='q',
        ret_all_char='a')

    if years_to_show is None:  # select_indices_of_list returns None if user aborts
        return None

    dfs = data_help.drop_dt_indices_not_in_selection(years_to_show, years,
                                                     [df_exp, df_budg, df_inc])
    df_exp = dfs[0]
    df_budg = dfs[1]
    df_inc = dfs[2]
    if df_exp is None:  # quit condition
        return None

    freq, freq_desc = get_plotting_frequency()
    if freq == None:
        return None

    if freq == env.YEAR_FREQ:
        plot_for_date(years,
                      dont_print_cols,
                      exp_dict,
                      df_inc,
                      df_budg,
                      df_exp,
                      settings,
                      notes_dict,
                      freq=freq,
                      freq_desc=freq_desc)
    elif freq == env.MONTH_FREQ:
        df_exp, df_budg, df_inc, months = choose_months_in_dfs(
            df_exp, df_budg, df_inc, years_to_show)
        if df_exp is None:
            return None

        plot_for_date(years,
                      dont_print_cols,
                      exp_dict,
                      df_inc,
                      df_budg,
                      df_exp,
                      settings,
                      notes_dict,
                      freq=env.MONTH_FREQ,
                      freq_desc=freq_desc,
                      months=months)
    elif freq == 'b':

        df_exp_mnth, df_budg_mnth, df_inc_mnth, months = choose_months_in_dfs(
            df_exp, df_budg, df_inc, years_to_show)
        if df_exp_mnth is None:
            return None
        plot_for_date(years,
                      dont_print_cols,
                      exp_dict,
                      df_inc_mnth,
                      df_budg_mnth,
                      df_exp_mnth,
                      settings,
                      notes_dict,
                      freq=env.MONTH_FREQ,
                      freq_desc='month',
                      override_show=True,
                      months=months)
        plot_for_date(years,
                      dont_print_cols,
                      exp_dict,
                      df_inc,
                      df_budg,
                      df_exp,
                      settings,
                      notes_dict,
                      freq=env.YEAR_FREQ,
                      freq_desc='year')

    else:
        pass
示例#7
0
def expenses_editor(db_exp_data_fpaths,
                    exp_recbin_path,
                    stor_pair_path,
                    exp_stor_data_path,
                    budg_path,
                    exp_path,
                    bankconfig=None):
    """
    Edits an expense's name across all databases
    """
    done = False
    while not done:
        exp_data = data_help.read_jsonFile(exp_path)
        df_rec = data_help.load_csv(exp_recbin_path,
                                    dtype=bankconfig.exp_dtypes,
                                    parse_dates=env.pdates_colname)
        df = data_help.load_csvs(db_exp_data_fpaths,
                                 dtype=bankconfig.exp_dtypes,
                                 parse_dates=env.pdates_colname)
        stor_data = data_help.read_jsonFile(stor_pair_path)
        exp_stor_data = data_help.read_jsonFile(exp_stor_data_path)
        budg_data = data_help.read_jsonFile(budg_path)

        prompt = "\n".join(
            ("Would you like to:", "(a) - add an expense",
             "(b) - edit an expenses name", "(c) - pair expenses to stores",
             "(d) - delete an expense **CAUTION**",
             "(e) - edit an expense within your database",
             "(f) - unpair an expense from stores",
             "(g) - add expense to be subtracted in plot title",
             "(h) - remove expense to be subtracted in plot title",
             "(q) - quit editor", "type here: "))
        user_in = util.get_user_input_for_chars(
            prompt, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'q', 's'])

        if user_in == 'a':
            add_expense(exp_data, exp_stor_data, exp_path, exp_stor_data_path)
        elif user_in == 'b':  # TODO
            edit_expense_name(db_exp_data_fpaths[0], df, exp_recbin_path,
                              df_rec, exp_data, budg_data, exp_stor_data,
                              exp_path, budg_path, exp_stor_data_path)
        elif user_in == 'c':
            add_expenses_to_store(exp_stor_data, exp_stor_data_path,
                                  exp_data[env.EXPENSE_DATA_KEY])
        elif user_in == 'd':
            remove_expense_from_dbs(db_exp_data_fpaths[0], exp_recbin_path,
                                    exp_stor_data, exp_data, budg_data, df,
                                    df_rec, exp_stor_data_path, budg_path,
                                    exp_path)
        elif user_in == 'e':
            edit_cell_in_dfcol(db_exp_data_fpaths[0],
                               df,
                               col_name=env.EXPENSE,
                               opt_col=env.FILT_STORENAME,
                               opt_dict=exp_stor_data)
        elif user_in == 'f':
            remove_exp_from_store(db_exp_data_fpaths[0], df, exp_recbin_path,
                                  df_rec, exp_stor_data, exp_stor_data_path)
        elif user_in == 'g':
            prompt = "Which expense(s) would you like to be subtracted in the title to your plots? "
            util.edit_list_in_dict(prompt,
                                   exp_data[env.EXPENSE_DATA_KEY],
                                   exp_data,
                                   env.EXPENSES_SUBTRACTED_KEY,
                                   exp_path,
                                   add=True)
        elif user_in == 'h':
            prompt = "Which expense(s) would you like to remove? "
            util.edit_list_in_dict(prompt,
                                   exp_data[env.EXPENSES_SUBTRACTED_KEY],
                                   exp_data,
                                   env.EXPENSES_SUBTRACTED_KEY,
                                   exp_path,
                                   add=False)
        elif user_in == 'q':
            done = True
        elif user_in == 's':
            print("Ah so youre an alchemist then.")
            sync_expenses(exp_data, exp_stor_data, exp_path,
                          exp_stor_data_path)