import os import json from ynab_sdk import YNAB from ynab_sdk.api.models.requests.transaction import TransactionRequest class YNABClient: def __init__(self, config): self.config = config self.api_key = self.config["api_key"] self.ynab = YNAB(self.api_key) self.budget = self.config["budget_name"] self.account = self.config["account_name"] self.expense_account = self.config["expense_account"] self._budgets = None self._budget_ids = None self._budget_id = None self._accounts = None self._account_ids = None self._account_id = None self._payees = None self._payee_ids = None self._category_groups = None self._categories = None self._category_ids = None self._transactions = None @property def budgets(self): if self._budgets is None: self._budgets = self.ynab.budgets.get_budgets().data.budgets return self._budgets @property def budget_ids(self): if self._budget_ids is None: self._budget_ids = {} for i, x in enumerate(self.budgets): self._budget_ids[self.budgets[i].name] = self.budgets[i].id return self._budget_ids @property def budget_id(self): if self._budget_id is None: self._budget_id = self.budget_ids[self.budget] return self._budget_id @property def accounts(self): if self._accounts is None: self._accounts = self.ynab.accounts.get_accounts(self.budget_id).data.accounts return self._accounts @property def account_ids(self): if self._account_ids is None: self._account_ids = {} for i, x in enumerate(self.accounts): self._account_ids[self.accounts[i].name] = self.accounts[i].id return self._account_ids @property def account_id(self): if self._account_id is None: self._account_id = self.account_ids[self.account] return self._account_id @property def payees(self): if self._payees is None: self._payees = self.ynab.payees.get_payees(self.budget_id).data.payees return self._payees @property def payee_ids(self): if self._payee_ids is None: self._payee_ids = {} for i, x in enumerate(self.payees): self._payee_ids[self.payees[i].name] = self.payees[i].id return self._payee_ids @property def category_groups(self): if self._category_groups is None: self._category_groups = self.ynab.categories.get_categories(self.budget_id).data.category_groups return self._category_groups @property def categories(self): if self._categories is None: self._categories = [] for i, x in enumerate(self.category_groups): self._categories.extend(self.category_groups[i].categories) return self._categories @property def category_ids(self): if self._category_ids is None: self._category_ids = {} for i, x in enumerate(self.categories): self._category_ids[self.categories[i].name] = self.categories[i].id return self._category_ids @property def transactions(self): if self._transactions is None: self._transactions = self.ynab.transactions.get_transactions(self.budget_id, account_id=self.account_id).data.transactions return self._transactions def get_payee_id(self, payee_name): payee_id = self.payee_ids[payee_name] return payee_id def create_transaction(self, date, amount, payee_name, payee_id, memo, category_id=None): txn = TransactionRequest( account_id=self.account_id, date=date, amount=amount, payee_id=payee_id, payee_name=payee_name, memo=memo, category_id=category_id ) return txn def get_latest_tnx_id(self): self.ynab.transactions.get_transactions(self.budget_id, account_id=self.account_id).data.transactions[-1].id