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',