diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py
index 9d0653183..46520f8b5 100644
--- a/app/main/views/dashboard.py
+++ b/app/main/views/dashboard.py
@@ -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,
}
diff --git a/app/templates/views/usage.html b/app/templates/views/usage.html
index 16e04a3ac..c0def3336 100644
--- a/app/templates/views/usage.html
+++ b/app/templates/views/usage.html
@@ -107,17 +107,17 @@
{% if item.sms_free_allowance_used %}
{{ item.sms_free_allowance_used|format_thousands }} free {{ item.sms_free_count|message_count_label('sms', suffix='') }}
{% endif %}
- {% if item.sms_charged %}
- {{ item.sms_charged|message_count('sms') }} at
- {{- ' {:.2f}p'.format(item.sms_rate * 100) }}
- {% endif %}
+ {% for sms in item.sms_breakdown %}
+ {{ sms.sms_charged|message_count('sms') }} at
+ {{- ' {:.2f}p'.format(sms.rate * 100) }}
+ {% endfor %}
{% for letter in item.letter_breakdown %}
{% if letter.sent %}
{{ "{:,} {}".format(letter.sent, letter.postage_description) }} {{ letter.sent|message_count_label('letter', suffix='') }} at
{{ letter.rate | format_number_in_pounds_as_currency }}
{% 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) %}
–
{% endif %}
diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py
index c2910157c..a0968c673 100644
--- a/tests/app/main/views/test_dashboard.py
+++ b/tests/app/main/views/test_dashboard.py
@@ -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(
diff --git a/tests/conftest.py b/tests/conftest.py
index 1ae650b5a..569fcc7cc 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -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',