Source code for Acquire.Accounting._balance


__all__ = ["Balance"]


[docs]class Balance: """Very simple class that holds the balance, liability and recievable values for an account at a point in time """ def __init__(self, balance=None, liability=None, receivable=None, _is_safe=False): """Construct, optionally specifying the starting balance, liability and receivable. These initialise to 0 if not set """ if _is_safe: self._balance = balance self._liability = liability self._receivable = receivable else: from Acquire.ObjectStore import string_to_decimal \ as _string_to_decimal self._balance = _string_to_decimal(balance, default=0) self._liability = _string_to_decimal(liability, default=0) self._receivable = _string_to_decimal(receivable, default=0)
[docs] def balance(self): """Return the balance""" return self._balance
[docs] def liability(self): """Return the liability""" return self._liability
[docs] def receivable(self): """Return the receivable""" return self._receivable
[docs] def available(self, overdraft_limit=None): """Return the available balance (balance - liability)""" if overdraft_limit is None: return self.balance() - self.liability() else: from Acquire.Accounting import create_decimal as _create_decimal overdraft_limit = _create_decimal(overdraft_limit) return self.balance() - self.liability() + overdraft_limit
[docs] def is_overdrawn(self, overdraft_limit=None): """Return whether or not this balance is overdrawn""" return self.available(overdraft_limit=overdraft_limit) < 0
def __str__(self): return "Balance(balance=%s, liability=%s, receivable=%s)" % \ (self.balance(), self.liability(), self.receivable()) def __repr__(self): return self.__str__() def __eq__(self, other): """Comparison""" if type(other) is Balance: return self._balance == other._balance and \ self._liability == other._liability and \ self._receivable == other._receivable else: return False def __add__(self, other): """Add balances together""" if type(other) is Balance: return Balance(balance=self._balance+other._balance, liability=self._liability+other._liability, receivable=self._receivable+other._receivable, _is_safe=True) from Acquire.Accounting import TransactionInfo as _TransactionInfo if type(other) is _TransactionInfo: balance = self._balance liability = self._liability receivable = self._receivable if other.is_credit(): balance += other.value() elif other.is_debit(): balance -= other.value() elif other.is_liability(): liability += other.value() elif other.is_accounts_receivable(): receivable += other.value() elif other.is_received_receipt(): balance -= other.receipted_value() liability -= other.original_value() elif other.is_sent_receipt(): balance += other.receipted_value() receivable -= other.original_value() elif other.is_received_refund(): balance += other.value() elif other.is_sent_refund(): balance -= other.value() return Balance(balance=balance, liability=liability, receivable=receivable, _is_safe=True) from Acquire.Accounting import Transaction as _Transaction if type(other) is _Transaction: return Balance(balance=self._balance+other.value(), liability=self._liability, receivable=self._receivable, _is_safe=True) from Acquire.Accounting import create_decimal as _create_decimal value = _create_decimal(other) return Balance(balance=self._balance+value, liability=self._liability, receivable=self._receivable, _is_safe=True) def __sub__(self, other): """Add balances together""" if type(other) is type(Balance): return Balance(balance=self._balance-other._balance, liability=self._liability-other._liability, receivable=self._receivable-other._receivable, _is_safe=True) from Acquire.Accounting import Transaction as _Transaction if type(other) is _Transaction: return Balance(balance=self._balance-other.value(), liability=self._liability, receivable=self._receivable, _is_safe=True) from Acquire.Accounting import create_decimal as _create_decimal value = _create_decimal(other) return Balance(balance=self._balance+value, liability=self._liability, receivable=self._receivable, _is_safe=True)
[docs] @staticmethod def total(balances): """Return the sum of the passed balances""" from Acquire.Accounting import create_decimal as _create_decimal balance = _create_decimal(0) liability = _create_decimal(0) receivable = _create_decimal(0) for b in balances: if type(b) is not Balance: raise TypeError("You can only sum Balance objects!") balance += b._balance liability += b._liability receivable += b._receivable return Balance(balance=balance, liability=liability, receivable=receivable, _is_safe=True)
[docs] def to_data(self): """Return this balance as a JSON-serialisable object""" data = {} from Acquire.ObjectStore import decimal_to_string \ as _decimal_to_string data["balance"] = _decimal_to_string(self._balance) data["liability"] = _decimal_to_string(self._liability) data["receivable"] = _decimal_to_string(self._receivable) return data
[docs] @staticmethod def from_data(data): """Construct a balance from the passed json-deserialised object""" if data is None or len(data) == 0: return Balance() from Acquire.ObjectStore import string_to_decimal \ as _string_to_decimal balance = _string_to_decimal(data["balance"]) liability = _string_to_decimal(data["liability"]) receivable = _string_to_decimal(data["receivable"]) return Balance(balance=balance, liability=liability, receivable=receivable, _is_safe=True)