ynab-splitwise-connect / ynab_splitwise_connect / ynab_utils.py
ynab_utils.py
Raw
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