Add "free_allowance_units" to service usage APIs

This represents the number of chargeable_units that were actually
free due to the free allowance - they won't be included in "cost".

Although the existing calculations in Admin [^1][^2] will still be
correct with a change in SMS rates - it's cost that's the problem
- it makes sense to have all the knowledge about calculating usage
consistently in these two APIs.

Note that the Integer casting is covered by the API-level tests in
test_rest.

[^1]: 474d7dfda8/app/main/views/dashboard.py (L490)
[^2]: c63660d56d/app/main/views/dashboard.py (L350)
This commit is contained in:
Ben Thorner
2022-04-21 12:55:30 +01:00
parent cd84928a1e
commit 555868c442
4 changed files with 35 additions and 3 deletions

View File

@@ -438,6 +438,7 @@ def test_fetch_monthly_billing_for_year(notify_db_session):
assert results[0].chargeable_units == 0
assert results[0].rate == Decimal('0')
assert results[0].cost == Decimal('0')
assert results[0].free_allowance_used == 0
assert str(results[1].month) == "2016-04-01"
assert results[1].notification_type == 'letter'
@@ -446,6 +447,7 @@ def test_fetch_monthly_billing_for_year(notify_db_session):
assert results[1].chargeable_units == 30
assert results[1].rate == Decimal('0.30')
assert results[1].cost == Decimal('9')
assert results[1].free_allowance_used == 0
assert str(results[1].month) == "2016-04-01"
assert results[2].notification_type == 'letter'
@@ -454,6 +456,7 @@ def test_fetch_monthly_billing_for_year(notify_db_session):
assert results[2].chargeable_units == 30
assert results[2].rate == Decimal('0.33')
assert results[2].cost == Decimal('9.9')
assert results[2].free_allowance_used == 0
assert str(results[3].month) == "2016-04-01"
assert results[3].notification_type == 'sms'
@@ -463,6 +466,7 @@ def test_fetch_monthly_billing_for_year(notify_db_session):
assert results[3].rate == Decimal('0.162')
# free allowance is 10, so (30 - 10) * 0.162
assert results[3].cost == Decimal('3.24')
assert results[3].free_allowance_used == 10
assert str(results[4].month) == "2016-05-01"
assert str(results[47].month) == "2017-03-01"
@@ -483,6 +487,7 @@ def test_fetch_monthly_billing_for_year_variable_rates(notify_db_session):
assert results[0].chargeable_units == 1
assert results[0].rate == Decimal('0.33')
assert results[0].cost == Decimal('0.33')
assert results[0].free_allowance_used == 0
assert str(results[1].month) == "2018-05-01"
assert results[1].notification_type == 'letter'
@@ -491,6 +496,7 @@ def test_fetch_monthly_billing_for_year_variable_rates(notify_db_session):
assert results[1].chargeable_units == 2
assert results[1].rate == Decimal('0.36')
assert results[1].cost == Decimal('0.72')
assert results[1].free_allowance_used == 0
assert str(results[2].month) == "2018-05-01"
assert results[2].notification_type == 'sms'
@@ -500,6 +506,7 @@ def test_fetch_monthly_billing_for_year_variable_rates(notify_db_session):
assert results[2].rate == Decimal('0.015')
# 1 free units on the 17th
assert results[2].cost == Decimal('0.045')
assert results[2].free_allowance_used == 1
assert str(results[3].month) == "2018-05-01"
assert results[3].notification_type == 'sms'
@@ -509,6 +516,7 @@ def test_fetch_monthly_billing_for_year_variable_rates(notify_db_session):
assert results[3].rate == Decimal('0.162')
# 5 free units on the 16th
assert results[3].cost == Decimal('0')
assert results[3].free_allowance_used == 5
@freeze_time('2018-08-01 13:30:00')
@@ -543,6 +551,7 @@ def test_fetch_billing_totals_for_year(notify_db_session):
assert results[0].chargeable_units == 0
assert results[0].rate == Decimal('0')
assert results[0].cost == Decimal('0')
assert results[0].free_allowance_used == 0
assert results[1].notification_type == 'letter'
assert results[1].notifications_sent == 365
@@ -550,6 +559,7 @@ def test_fetch_billing_totals_for_year(notify_db_session):
assert results[1].chargeable_units == 365
assert results[1].rate == Decimal('0.3')
assert results[1].cost == Decimal('109.5')
assert results[1].free_allowance_used == 0
assert results[2].notification_type == 'letter'
assert results[2].notifications_sent == 365
@@ -557,6 +567,7 @@ def test_fetch_billing_totals_for_year(notify_db_session):
assert results[2].chargeable_units == 365
assert results[2].rate == Decimal('0.33')
assert results[2].cost == Decimal('120.45')
assert results[2].free_allowance_used == 0
assert results[3].notification_type == 'sms'
assert results[3].notifications_sent == 365
@@ -564,6 +575,7 @@ def test_fetch_billing_totals_for_year(notify_db_session):
assert results[3].chargeable_units == 365
assert results[3].rate == Decimal('0.162')
assert results[3].cost == Decimal('0')
assert results[3].free_allowance_used == 365
def test_fetch_billing_totals_for_year_uses_current_annual_billing(notify_db_session):
@@ -593,6 +605,7 @@ def test_fetch_billing_totals_for_year_variable_rates(notify_db_session):
assert results[0].chargeable_units == 1
assert results[0].rate == Decimal('0.33')
assert results[0].cost == Decimal('0.33')
assert results[0].free_allowance_used == 0
assert results[1].notification_type == 'letter'
assert results[1].notifications_sent == 2
@@ -600,6 +613,7 @@ def test_fetch_billing_totals_for_year_variable_rates(notify_db_session):
assert results[1].chargeable_units == 2
assert results[1].rate == Decimal('0.36')
assert results[1].cost == Decimal('0.72')
assert results[1].free_allowance_used == 0
assert results[2].notification_type == 'sms'
assert results[2].notifications_sent == 1
@@ -608,6 +622,7 @@ def test_fetch_billing_totals_for_year_variable_rates(notify_db_session):
assert results[2].rate == Decimal('0.015')
# 1 free unit on the 17th
assert results[2].cost == Decimal('0.045')
assert results[2].free_allowance_used == 1
assert results[3].notification_type == 'sms'
assert results[3].notifications_sent == 2
@@ -616,6 +631,7 @@ def test_fetch_billing_totals_for_year_variable_rates(notify_db_session):
assert results[3].rate == Decimal('0.162')
# 5 free units on the 16th
assert results[3].cost == Decimal('0')
assert results[3].free_allowance_used == 5
def test_delete_billing_data(notify_db_session):