def _update_buckets_from_dataframe(self, account: Account, df: pd.DataFrame):
        try:
            logging.debug(df.dtypes)
            for index, row in df.iterrows():
                name = row['name']
                logging.debug(row)
                dsvca.update_bucket(account, name,
                                    priority=int(row["priority"]),
                                    due_day_of_month=int(row["due_day_of_month"]),
                                    spend_category=SpendCategory[row["spend_category"].upper()],
                                    base_budget_amount=float(row["base_budget_amount"]),
                                    perc_budget_amount=float(row["perc_budget_amount"]),
                                    waterfall_amount=float(row["waterfall_amount"]),
                                    saved_amount=float(row["saved_amount"]),
                                    percent_of_income_adjustment_amount=float(row["percent_of_income_adjustment_amount"]),
                                    provider=row["provider"] if pd.notna(row["provider"]) else "",
                                    payment_account=row["payment_account"] if pd.notna(row["payment_account"]) else "",
                                    payment_method=PaymentMethod[row["payment_method"].upper()] if pd.notna(row["payment_method"]) else ""
                                    )

            bucket_names_imported = set(x.upper() for x in df['name'])
            buckets = dsvca.buckets_by_account(account)
            for bucket in buckets:
                if bucket.name.upper() not in bucket_names_imported:
                    dsvca.delete_bucket_from_account(account, bucket.name)

            return True


        except Exception as e:
            error = f"Unable to import the dataset: {e}"
            self.uns.notify_user(error)
            self.uns.notify_user(df.columns)
            return False
    def delete_account(self, ledgerManager, account:Account=None):
        account = account if account else self.uns.select_account()
        if account is None:
            return

        yousure = self.uns.request_you_sure("Are you sure? This will break all reference to this account!")
        if yousure is None:
            return

        if yousure == "Yes":
            buckets = dsvca.buckets_by_account(account)

            waterfall_amt = 0
            saved_amt = 0
            for bucket in buckets:
                waterfall_amt += bucket.waterfall_amount
                saved_amt += bucket.saved_amount

            okay_to_delete = False
            if((waterfall_amt > 0) or (saved_amt > 0)):
                yousure = self.uns.request_you_sure("Funds in account. Are you sure?")
                if yousure is None:
                    return

                if yousure == "Yes":
                    okay_to_delete = True
            else:
                okay_to_delete = True

            if okay_to_delete:
                dsvca.delete_account(account.account_name)
                self.uns.notify_user(f"Account {account.account_name} Deleted")
            else:
                self.uns.notify_user(f"Deletion Cancelled.")
    def print_waterfall_buckets(self, account: Account = None):
        account = account if account else self.uns.select_account()

        buckets = dsvca.buckets_by_account(account)
        data = mongoHelper.list_mongo_to_pandas(buckets)
        data.sort_values(by=["priority", 'due_day_of_month'], inplace=True)

        self.uns.pretty_print_items(data)
    def cycle_waterfall(self, account:Account=None):
        account = account if account else self.uns.select_account()
        buckets = dsvca.buckets_by_account(account)

        for bucket in buckets:
            self._cycle_bucket(account, bucket)

        self.uns.notify_user(f"{account.account_name} cycled")
Exemple #5
0
    def get_add_waterfall_funds_input(self, account: Account):
        ret = {}
        ret['amount'] = self.request_float("Amount to add:", forcePos=True)
        ret['description'] = self.request_string("Description: ")
        ret['date'] = self.request_date()
        ret['notes'] = self.request_string("Notes: ")
        ret['buckets'] = dsvca.buckets_by_account(account)

        return ret
    def positive_remaining_buckets(self, account: Account=None, amount_threshold: float = None):
        account = account if account else self.uns.select_account()

        buckets = dsvca.buckets_by_account(account)
        data = mongoHelper.list_mongo_to_pandas(buckets)
        filtered = data[data["saved_amount"] > 0].sort_values(by=["priority"])

        if amount_threshold is not None:
            filtered = filtered[filtered['saved_amount']>amount_threshold]

        return filtered
    def save_buckets_as_csv(self, account: Account = None):
        account = account if account else self.uns.select_account()

        buckets = dsvca.buckets_by_account(account)
        data = mongoHelper.list_mongo_to_pandas(buckets)

        filepath = self.uns.request_save_filepath()

        data.to_csv(filepath)
        if data is None:
            return

        self.uns.notify_user(f"Buckets data written successfully to {filepath}")
    def print_waterfall_summary(self, account: Account = None):
        account = account if account else self.uns.select_account()

        buckets = dsvca.buckets_by_account(account)
        data = mongoHelper.list_mongo_to_pandas(buckets)

        waterfall_amount = data['waterfall_amount'].sum()
        saved_amount = data['saved_amount'].sum()

        total_saved = waterfall_amount + saved_amount
        self.uns.notify_user(f"\n------Waterfall Summary------\n"
                             f"Total Balance: ${round(total_saved, 2)}\n"
                             f"Saved for next cycle: S{round(saved_amount, 2)}", delay_sec=0)
 def allocated_total(self, account: Account):
     buckets = dsvca.buckets_by_account(account)
     return sum(b.saved_amount + b.waterfall_amount for b in buckets)
 def print_buckets(self, account:Account=None):
     account = account if account else self.uns.select_account()
     buckets = dsvca.buckets_by_account(account)
     self.uns.notify_user("\n------Buckets------", delay_sec=0)
     self.uns.pretty_print_items(sorted(buckets, key=lambda x: x.priority),
                                 title=CollectionType.BUCKETS.name)