ynab-splitwise-connect / ynab_splitwise_connect / splitwise_utils.py
splitwise_utils.py
Raw
from splitwise import Splitwise

class SplitwiseClient:
    def __init__(self, config):
        self.config = config
        self.sw = Splitwise(config["consumer_key"], self.config["consumer_secret"], self.config["api_key"])
        self.friend_name = self.config["friend_name"]

        self._user = None
        self._user_name = None
        self._user_id = None
        self._friends = None
        self._friend_ids = None
        self._friend_id = None
        self._friend = None

        self._expenses_included = None

    @property
    def user(self):
        if self._user is None:
            self._user = self.sw.getCurrentUser()
        return self._user
    
    @property
    def user_name(self):
        if self._user_name is None:
            first_name = self.user.getFirstName()
            last_name = self.user.getLastName()
            self._user_name = first_name + " " + last_name
        return self._user_name
    
    @property
    def user_id(self):
        if self._user_id is None:
            self._user_id = self.user.getId()
        return self._user_id

    @property
    def friends(self):
        if self._friends is None:
            self._friends = self.sw.getFriends()
        return self._friends
    
    @property
    def friend_ids(self):
        if self._friend_ids is None:
            self._friend_ids = {}
            for i, x in enumerate(self.friends):
                first_name = self.friends[i].getFirstName()
                last_name = self.friends[i].getLastName()
                name = first_name + " " + last_name
                id = self.friends[i].getId()
                self._friend_ids[name] = id
        return self._friend_ids
    
    @property
    def friend_id(self):
        if self._friend_id is None:
            self._friend_id = self.friend_ids[self.friend_name]
        return self._friend_id
    
    @property
    def friend(self):
        if self._friend is None:
            self._friend = self.sw.getUser(self.friend_id)
        return self._friend
    
    @property
    def expenses_included(self):
        if self._expenses_included is None:
            raise ValueError("Expenses included have not been set. Call set_expenses_included() first.")
        return self._expenses_included
    
    @property
    def debtor_name(self, debtor_id):
        if debtor_id == self.user_id:
            return self.user_name
        elif debtor_id == self.friend_ids[self.friend_name]:
            return self.friend_name
        else:
            raise ValueError("Debtor not found.")

    @property
    def creditor_name(self, creditor_id):
        if creditor_id == self.user_id:
            return self.user_name
        elif creditor_id == self.friend_ids[self.friend_name]:
            return self.friend_name
        else:
            raise ValueError("Creditor not found.")

    def set_expenses_included(self, date_cutoff=None):
        self._expenses_included = [
            exp for exp in self.sw.getExpenses(limit=0, dated_after=date_cutoff)
            if exp.repayments[0].getToUser() == self.friend_ids[self.friend_name]
        ]