Files
@ 5784068904e8
Branch filter:
Location: NPO-Accounting/conservancy_beancount/tests/test_reports_period_postings.py - annotation
5784068904e8
2.3 KiB
text/x-python
payroll-type — US:403b:Employee:Roth — needed separate since taxable
Since Roth contributions are taxable, there are some reports that
need to include these amounts in total salary (i.e., when running a
report that seeks to show total taxable income for an employee). As
such, we need a `payroll-type` specifically for Roth 403(b)
contributions.
Since Roth contributions are taxable, there are some reports that
need to include these amounts in total salary (i.e., when running a
report that seeks to show total taxable income for an employee). As
such, we need a `payroll-type` specifically for Roth 403(b)
contributions.
6213bc1e5da9 6213bc1e5da9 1b7fdf4f3b00 6213bc1e5da9 1b7fdf4f3b00 1b7fdf4f3b00 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 6213bc1e5da9 | """test_reports_period_postings - Unit tests for PeriodPostings"""
# Copyright © 2020 Brett Smith
# License: AGPLv3-or-later WITH Beancount-Plugin-Additional-Permission-1.0
#
# Full copyright and licensing details can be found at toplevel file
# LICENSE.txt in the repository.
import datetime
import operator
from decimal import Decimal
import pytest
from . import testutil
from conservancy_beancount import data
from conservancy_beancount.reports import core
def check_balance_attrs(balance_postings, start_usd, stop_usd):
if start_usd:
expected = {'USD': testutil.Amount(start_usd)}
assert balance_postings.start_bal == expected
assert balance_postings.begin_bal == expected
else:
assert balance_postings.start_bal.is_zero()
assert balance_postings.begin_bal.is_zero()
expected = {'USD': testutil.Amount(stop_usd)}
assert balance_postings.stop_bal == expected
assert balance_postings.end_bal == expected
expected = {'USD': testutil.Amount(stop_usd - start_usd)}
assert balance_postings.period_bal == expected
@pytest.mark.parametrize('start_date,expect_start_bal', [
(datetime.date(2019, 2, 1), 0),
(datetime.date(2019, 4, 1), 30),
(datetime.date(2019, 6, 1), 120),
])
def test_balance_postings_attrs(start_date, expect_start_bal):
entries = [testutil.Transaction(date=datetime.date(2019, n, 15), postings=[
('Income:Donations', -n * 10),
('Assets:Cash', n * 10),
]) for n in range(3, 7)]
cls = core.PeriodPostings.with_start_date(start_date)
actual = dict(cls.group_by_account(data.Posting.from_entries(entries)))
assert len(actual) == 2
check_balance_attrs(actual['Assets:Cash'], expect_start_bal, 180)
check_balance_attrs(actual['Income:Donations'], -expect_start_bal, -180)
@pytest.mark.parametrize('start_date,expect_count', [
(datetime.date(2019, 2, 1), 4),
(datetime.date(2019, 4, 1), 3),
(datetime.date(2019, 6, 1), 1),
])
def test_balance_postings_filter(start_date, expect_count):
entries = [testutil.Transaction(date=datetime.date(2019, n, 15), postings=[
('Income:Donations', -n * 10),
('Assets:Cash', n * 10),
]) for n in range(3, 7)]
cls = core.PeriodPostings.with_start_date(start_date)
for _, related in cls.group_by_account(data.Posting.from_entries(entries)):
assert len(related) == expect_count
|