Example #1
0
def test_budgets_doc_quarterly(budgets_doc):
    """
    2014-05-01 custom "budget" Expenses:Books "quarterly" 123456.7 EUR"""
    BUDGET = D("123456.7")

    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 2, 1),
                            date(2016, 2, 2))['EUR'] == BUDGET / 91
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 8, 15),
                            date(2016, 8, 16))['EUR'] == BUDGET / 92
Example #2
0
def test_budgets_weekly(budgets_doc):
    """
    2016-05-01 custom "budget" Expenses:Books "weekly" 21 EUR"""
    BUDGET = D(21)

    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 5, 1),
                            date(2016, 5, 2))['EUR'] == BUDGET / 7
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 9, 1),
                            date(2016, 9, 2))['EUR'] == BUDGET / 7
Example #3
0
def test_budgets_monthly(budgets_doc):
    """
    2014-05-01 custom "budget" Expenses:Books "monthly" 100 EUR"""
    BUDGET = D(100)

    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 1, 1),
                            date(2016, 1, 2))['EUR'] == BUDGET / 31
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 2, 1),
                            date(2016, 2, 2))['EUR'] == BUDGET / 29
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2018, 3, 31),
                            date(2018, 4, 1))['EUR'] == BUDGET / 31
Example #4
0
def test_budgets_daily(budgets_doc):
    """
    2016-05-01 custom "budget" Expenses:Books "daily" 2.5 EUR"""
    BUDGET = D(2.5)

    assert 'EUR' not in calculate_budget(budgets_doc, 'Expenses:Books',
                                         date(2010, 2, 1), date(2010, 2, 2))
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 5, 1),
                            date(2016, 5, 2))['EUR'] == BUDGET
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 5, 1),
                            date(2016, 5, 3))['EUR'] == BUDGET * 2
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2016, 9, 2),
                            date(2016, 9, 3))['EUR'] == BUDGET
    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2018, 12, 31),
                            date(2019, 1, 1))['EUR'] == BUDGET
Example #5
0
def test_budgets_doc_yearly(budgets_doc):
    """
    2010-01-01 custom "budget" Expenses:Books "yearly" 99999.87 EUR"""
    BUDGET = D("99999.87")

    assert calculate_budget(budgets_doc, 'Expenses:Books', date(2011, 2, 1),
                            date(2011, 2, 2))['EUR'] == BUDGET / 365
Example #6
0
def test_budgets(load_doc):
    """
    2016-01-01 custom "budget" Expenses:Groceries "weekly" 100.00 CNY
    2016-06-01 custom "budget" Expenses:Groceries "weekly"  10.00 EUR
    2016-06-01 custom "budget" Expenses:Groceries 10.00 EUR
    """
    entries, _, _ = load_doc
    budgets, errors = parse_budgets(entries)

    assert len(errors) == 1

    assert calculate_budget(budgets, 'Expenses', date(2016, 6, 1),
                            date(2016, 6, 8)) == {}

    budgets = calculate_budget(budgets, 'Expenses:Groceries',
                               date(2016, 6, 1), date(2016, 6, 8))

    assert budgets['CNY'] == D(100)
    assert budgets['EUR'] == D(10)
Example #7
0
    def interval_totals(self, interval, account_name):
        """Renders totals for account (or accounts) in the intervals."""
        if isinstance(account_name, str):
            names = [account_name]
        else:
            names = account_name

        interval_tuples = self.api._interval_tuples(interval)
        return [{
            'begin_date':
            begin_date,
            'totals':
            self._total_balance(names, begin_date, end_date),
            'budgets':
            calculate_budget(self.api.budgets, names[0], begin_date, end_date),
        } for begin_date, end_date in interval_tuples]
Example #8
0
    def interval_totals(self, interval, account_name):
        """Renders totals for account (or accounts) in the intervals."""
        if isinstance(account_name, str):
            names = [account_name]
        else:
            names = account_name

        interval_tuples = self.api._interval_tuples(interval)
        return [{
            'begin_date': begin_date,
            'totals': self._total_balance(
                names,
                begin_date, end_date),
            'budgets': calculate_budget(self.api.budgets, names[0],
                                        begin_date, end_date),
        } for begin_date, end_date in interval_tuples]
Example #9
0
    def add_budgets(self, zipped_interval_balances, interval_tuples, accumulate):
        """Add budgets data to zipped (recursive) interval balances."""
        if not zipped_interval_balances:
            return

        interval_budgets = [
            calculate_budget(
                self.budgets,
                zipped_interval_balances["account"],
                interval_tuples[0][0] if accumulate else begin_date,
                end_date,
            )
            for begin_date, end_date in interval_tuples
        ]

        zipped_interval_balances["balance_and_balance_children"] = [
            (
                balances[0],
                balances[1],
                {
                    curr: value - (balances[0][curr] if curr in balances[0] else Decimal(0.0))
                    for curr, value in budget.items()
                },  # noqa
                {
                    curr: value - (balances[1][curr] if curr in balances[1] else Decimal(0.0))
                    for curr, value in budget.items()
                },
            )  # noqa
            for balances, budget in zip(
                zipped_interval_balances["balance_and_balance_children"], interval_budgets
            )  # noqa
        ]

        zipped_interval_balances["children"] = [
            self.add_budgets(child, interval_tuples, accumulate) for child in zipped_interval_balances["children"]
        ]

        return zipped_interval_balances
Example #10
0
 def calculate_budget(self, account_name, begin_date, end_date):
     return calculate_budget(self.budgets, account_name, begin_date, end_date)
Example #11
0
 def calculate_budget(self, account_name, begin_date, end_date):
     return calculate_budget(self.budgets, account_name, begin_date,
                             end_date)