firefly-exporter/firefly/budgets.py

100 lines
3.3 KiB
Python

"""Expose budget metrics."""
import os
import calendar
import datetime
import pytz
import requests
import dateutil.parser
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 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