119 lines
4.3 KiB
Python
119 lines
4.3 KiB
Python
"""Expose budget metrics."""
|
|
import os
|
|
import calendar
|
|
import datetime
|
|
|
|
import pytz
|
|
import requests
|
|
import dateutil.parser
|
|
|
|
import firefly
|
|
|
|
|
|
header = {"Authorization": "Bearer " + os.environ.get('FIREFLY_PERSONAL_ACCESS_TOKEN')}
|
|
host = os.environ.get('FIREFLY_API_HOST')
|
|
|
|
|
|
def _get_budgets():
|
|
budgets_req = requests.get(
|
|
host + "/api/v1/budgets", headers=header
|
|
)
|
|
budgets_json = budgets_req.json()
|
|
budgets = budgets_json.get('data')
|
|
while "next" in budgets_json.get('links'):
|
|
budgets_json = requests.get(
|
|
budgets_json.get('links').get('next'), headers=header
|
|
).json()
|
|
budgets.extend(budgets_json.get('data'))
|
|
return budgets
|
|
|
|
|
|
def _get_current_limit(budget_id):
|
|
budgets_json = requests.get(
|
|
host + "/api/v1/budgets/{}/limits".format(budget_id), headers=header
|
|
).json()
|
|
budgets = budgets_json.get('data')
|
|
while "next" in budgets_json.get('links'):
|
|
budget_json = requests.get(
|
|
budgets_json.get('links').get('next'), headers=header
|
|
).json()
|
|
budgets.extend(budget_json.get('data'))
|
|
|
|
today = datetime.datetime.combine(datetime.date.today(), datetime.datetime.min.time()).replace(tzinfo=pytz.UTC)
|
|
return [
|
|
budget for budget in budgets
|
|
if today >= dateutil.parser.parse(budget.get('attributes').get('start')) and today <= dateutil.parser.parse(budget.get('attributes').get('end'))
|
|
][0]
|
|
|
|
|
|
def _get_current_transactions(budget_id):
|
|
limit_id = _get_current_limit(budget_id).get('id')
|
|
transactions_req = requests.get(
|
|
host + "/api/v1/budgets/{}/limits/{}/transactions".format(
|
|
budget_id,
|
|
limit_id
|
|
), headers=header
|
|
)
|
|
transactions_json = transactions_req.json()
|
|
transactions = transactions_json.get('data')
|
|
while 'next' in transactions_json:
|
|
transactions_json = requests.get(
|
|
transactions_json.get('links').get('next'), headers=header
|
|
).json()
|
|
transactions.extend(transactions_json.get('data'))
|
|
return transactions
|
|
|
|
|
|
def _get_current_spent_amount(budget_id):
|
|
transactions = _get_current_transactions(budget_id)
|
|
spent_amount = 0.0
|
|
for transaction in transactions:
|
|
for detail in transaction.get('attributes').get('transactions'):
|
|
if detail.get('type') == "withdrawal":
|
|
spent_amount += float(detail.get('amount'))
|
|
elif detail.get('type') == "deposit":
|
|
spent_amount -= float(detail.get('amount'))
|
|
return spent_amount
|
|
|
|
|
|
def _collect_budget_data():
|
|
budgets = []
|
|
for budget in _get_budgets():
|
|
budgets.append({
|
|
"id": budget.get('id'),
|
|
"name": budget.get('attributes').get('name'),
|
|
"limit": float(_get_current_limit(budget.get('id')).get('attributes').get('amount')),
|
|
"spent": _get_current_spent_amount(budget.get('id')),
|
|
})
|
|
currbudget = budgets[-1]
|
|
currbudget['remaining'] = (float(currbudget.get('limit')) - float(currbudget.get('spent')))
|
|
remaining_per_day = currbudget.get('remaining') / firefly.get_remaining_days()
|
|
currbudget['remaining_per_day'] = 0 if remaining_per_day < 0 else remaining_per_day
|
|
currbudget['spent_per_day'] = currbudget['spent'] / datetime.datetime.today().day
|
|
currbudget['average_per_day'] = currbudget['limit'] / (datetime.datetime.today().day + firefly.get_remaining_days() - 1)
|
|
return budgets
|
|
|
|
|
|
def get_budget_metrics():
|
|
out = ""
|
|
for budget in _get_budgets():
|
|
budget_id = budget.get('id')
|
|
budget_name = budget.get('attributes').get('name')
|
|
budget_limit = _get_current_limit(budget_id).get('attributes').get('amount')
|
|
budget_spent = str(_get_current_spent_amount(budget.get('id')))
|
|
|
|
out += 'firefly_budget_limit{{budget_id="{}",budget_name="{}",year="{}",month="{}"}} {}\n'.format(
|
|
budget_id,
|
|
budget_name,
|
|
datetime.datetime.today().year,
|
|
datetime.datetime.today().month,
|
|
budget_limit,
|
|
)
|
|
out += 'firefly_budget_spent{{budget_id="{}",budget_name="{}",year="{}",month="{}"}} {}\n'.format(
|
|
budget_id,
|
|
budget_name,
|
|
datetime.datetime.today().year,
|
|
datetime.datetime.today().month,
|
|
budget_spent,
|
|
)
|
|
return out
|