Support multiple SMS rates per month on usage page

This commit is contained in:
Ben Thorner
2022-05-03 13:13:29 +01:00
parent 75e0d53e76
commit 3449ccd923
4 changed files with 25 additions and 22 deletions

View File

@@ -398,13 +398,9 @@ def get_monthly_usage_breakdown(year, monthly_usage):
for month in get_months_for_financial_year(year):
monthly_sms = [row for row in sms if row['month'] == month]
sms_charged = sum(row['sms_charged'] for row in monthly_sms)
sms_free_allowance_used = sum(row['sms_free_allowance_used'] for row in monthly_sms)
sms_cost = sum(row['sms_cost'] for row in monthly_sms)
# makes the assumption that there is either no item in `monthly_sms` because they
# have not sent any SMS or that they have sent SMS and that there is only a single
# item in `monthly_sms` because they have only been sent at a single rate
sms_rate = monthly_sms[0]['rate'] if len(monthly_sms) else 0
sms_breakdown = [row for row in monthly_sms if row['sms_charged']]
monthly_letters = [row for row in letters if row['month'] == month]
letter_cost = sum(row['letter_cost'] for row in monthly_letters)
@@ -414,9 +410,8 @@ def get_monthly_usage_breakdown(year, monthly_usage):
'month': month,
'letter_cost': letter_cost,
'letter_breakdown': list(letter_breakdown),
'sms_charged': sms_charged,
'sms_free_allowance_used': sms_free_allowance_used,
'sms_rate': sms_rate,
'sms_breakdown': sms_breakdown,
'sms_cost': sms_cost,
}

View File

@@ -107,17 +107,17 @@
{% if item.sms_free_allowance_used %}
<li class="tabular-numbers">{{ item.sms_free_allowance_used|format_thousands }} free {{ item.sms_free_count|message_count_label('sms', suffix='') }}</li>
{% endif %}
{% if item.sms_charged %}
<li class="tabular-numbers">{{ item.sms_charged|message_count('sms') }} at
{{- ' {:.2f}p'.format(item.sms_rate * 100) }}</li>
{% endif %}
{% for sms in item.sms_breakdown %}
<li class="tabular-numbers">{{ sms.sms_charged|message_count('sms') }} at
{{- ' {:.2f}p'.format(sms.rate * 100) }}</li>
{% endfor %}
{% for letter in item.letter_breakdown %}
{% if letter.sent %}
<li class="tabular-numbers">{{ "{:,} {}".format(letter.sent, letter.postage_description) }} {{ letter.sent|message_count_label('letter', suffix='') }} at
{{ letter.rate | format_number_in_pounds_as_currency }}</li>
{% endif %}
{% endfor %}
{% if not (item.sms_free_allowance_used or item.sms_charged or item.letter_breakdown) %}
{% if not (item.sms_free_allowance_used or item.sms_cost or item.letter_breakdown) %}
<li aria-hidden="true"></li>
{% endif %}
</ul>

View File

@@ -1068,21 +1068,17 @@ def test_usage_page_monthly_breakdown(
mock_get_monthly_usage_for_service,
mock_get_free_sms_fragment_limit
):
service_one['permissions'].append('letter')
page = client_request.get(
'main.usage',
service_id=SERVICE_ONE_ID,
)
page = client_request.get('main.usage', service_id=SERVICE_ONE_ID)
monthly_breakdown = normalize_spaces(page.find('table').text)
assert 'April' in monthly_breakdown
assert '249,860 free text messages' in monthly_breakdown
assert 'February' in monthly_breakdown
assert '£28.99' in monthly_breakdown
assert '£29.55' in monthly_breakdown
assert '140 free text messages' in monthly_breakdown
assert '960 text messages at 1.65p' in monthly_breakdown
assert '33 text messages at 1.70p' in monthly_breakdown
assert '10 second class letters at 31p' in monthly_breakdown
assert '5 first class letters at 33p' in monthly_breakdown
assert '10 international letters at 84p' in monthly_breakdown
@@ -1125,9 +1121,9 @@ def test_usage_page_letter_breakdown_ordering(
row_for_feb = page.find('table').find_all('tr', class_='table-row')[10]
postage_details = row_for_feb.find_all('li', class_='tabular-numbers')
assert normalize_spaces(postage_details[2].text) == '5 first class letters at 33p'
assert normalize_spaces(postage_details[3].text) == '10 second class letters at 31p'
assert normalize_spaces(postage_details[4].text) == '10 international letters at 84p'
assert normalize_spaces(postage_details[3].text) == '5 first class letters at 33p'
assert normalize_spaces(postage_details[4].text) == '10 second class letters at 31p'
assert normalize_spaces(postage_details[5].text) == '10 international letters at 84p'
def test_usage_page_with_0_free_allowance(

View File

@@ -2370,6 +2370,18 @@ def mock_get_monthly_usage_for_service(mocker):
'sms_cost': 20.91,
'letter_cost': 0,
},
{
'month': 'February',
'notification_type': 'sms',
'rate': 0.017,
'chargeable_units': 33,
'notifications_sent': 1234,
'postage': 'none',
'sms_charged': 33,
'sms_free_allowance_used': 0,
'sms_cost': 0.561,
'letter_cost': 0,
},
{
'month': 'February',
'notification_type': 'sms',