diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index c5a0492c5..2523a4d2a 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -2,7 +2,7 @@ import uuid from datetime import date, datetime, timedelta from notifications_utils.statsd_decorators import statsd -from sqlalchemy.sql.expression import asc, case, func +from sqlalchemy.sql.expression import asc, case, and_, func from sqlalchemy.orm import joinedload from flask import current_app @@ -78,6 +78,13 @@ def dao_count_live_services(): def dao_fetch_live_services_data(): year_start_date, year_end_date = get_current_financial_year() + most_recent_annual_billing = db.session.query( + AnnualBilling.service_id, + func.max(AnnualBilling.financial_year_start).label('year') + ).group_by( + AnnualBilling.service_id + ).subquery() + this_year_ft_billing = FactBilling.query.filter( FactBilling.bst_date >= year_start_date, FactBilling.bst_date <= year_end_date, @@ -105,6 +112,15 @@ def dao_fetch_live_services_data(): case([ (this_year_ft_billing.c.notification_type == 'letter', func.sum(this_year_ft_billing.c.notifications_sent)) ], else_=0).label("letter_totals"), + AnnualBilling.free_sms_fragment_limit, + ).join( + Service.annual_billing + ).join( + most_recent_annual_billing, + and_( + Service.id == most_recent_annual_billing.c.service_id, + AnnualBilling.financial_year_start == most_recent_annual_billing.c.year + ) ).outerjoin( Service.organisation ).outerjoin( @@ -131,6 +147,7 @@ def dao_fetch_live_services_data(): Service.volume_email, Service.volume_letter, this_year_ft_billing.c.notification_type, + AnnualBilling.free_sms_fragment_limit, ).order_by( asc(Service.go_live_at) ).all() diff --git a/tests/app/dao/test_services_dao.py b/tests/app/dao/test_services_dao.py index 8e199ae0e..4b9b6b774 100644 --- a/tests/app/dao/test_services_dao.py +++ b/tests/app/dao/test_services_dao.py @@ -74,7 +74,8 @@ from tests.app.db import ( create_invited_user, create_email_branding, create_letter_branding, - create_notification_history + create_notification_history, + create_annual_billing, ) @@ -392,7 +393,7 @@ def test_dao_fetch_live_services_data(sample_user): service = create_service(go_live_user=sample_user, go_live_at='2014-04-20T10:00:00') template = create_template(service=service) service_2 = create_service(service_name='second', go_live_at='2017-04-20T10:00:00', go_live_user=sample_user) - create_service(service_name='third', go_live_at='2016-04-20T10:00:00') + service_3 = create_service(service_name='third', go_live_at='2016-04-20T10:00:00') # below services should be filtered out: create_service(service_name='restricted', restricted=True) create_service(service_name='not_active', active=False) @@ -413,6 +414,14 @@ def test_dao_fetch_live_services_data(sample_user): # one letter billing record for 2nd service within current financial year: create_ft_billing(bst_date='2019-04-16', notification_type='letter', template=template_letter_2, service=service_2) + # 1st service: billing from 2018 and 2019 + create_annual_billing(service.id, 500, 2018) + create_annual_billing(service.id, 100, 2019) + # 2nd service: billing from 2018 + create_annual_billing(service_2.id, 300, 2018) + # 3rd service: billing from 2019 + create_annual_billing(service_3.id, 200, 2019) + results = dao_fetch_live_services_data() assert len(results) == 3 # checks the results and that they are ordered by date: @@ -421,17 +430,20 @@ def test_dao_fetch_live_services_data(sample_user): 'organisation_type': 'crown', 'consent_to_research': None, 'contact_name': 'Test User', 'contact_email': 'notify@digital.cabinet-office.gov.uk', 'contact_mobile': '+447700900986', 'live_date': datetime(2014, 4, 20, 10, 0), 'sms_volume_intent': None, 'email_volume_intent': None, - 'letter_volume_intent': None, 'sms_totals': 2, 'email_totals': 1, 'letter_totals': 1}, + 'letter_volume_intent': None, 'sms_totals': 2, 'email_totals': 1, 'letter_totals': 1, + 'free_sms_fragment_limit': 100}, {'service_id': mock.ANY, 'service_name': 'third', 'organisation_name': None, 'consent_to_research': None, 'organisation_type': None, 'contact_name': None, 'contact_email': None, 'contact_mobile': None, 'live_date': datetime(2016, 4, 20, 10, 0), 'sms_volume_intent': None, 'email_volume_intent': None, 'letter_volume_intent': None, - 'sms_totals': 0, 'email_totals': 0, 'letter_totals': 0}, + 'sms_totals': 0, 'email_totals': 0, 'letter_totals': 0, + 'free_sms_fragment_limit': 200}, {'service_id': mock.ANY, 'service_name': 'second', 'organisation_name': None, 'consent_to_research': None, 'contact_name': 'Test User', 'contact_email': 'notify@digital.cabinet-office.gov.uk', 'contact_mobile': '+447700900986', 'live_date': datetime(2017, 4, 20, 10, 0), 'sms_volume_intent': None, 'organisation_type': None, 'email_volume_intent': None, 'letter_volume_intent': None, - 'sms_totals': 0, 'email_totals': 0, 'letter_totals': 1} + 'sms_totals': 0, 'email_totals': 0, 'letter_totals': 1, + 'free_sms_fragment_limit': 300} ] diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 9d450dfc7..0ba6c15a8 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -51,6 +51,7 @@ from tests.app.db import ( create_organisation, create_domain, create_email_branding, + create_annual_billing, ) from tests.app.db import create_user @@ -141,7 +142,7 @@ def test_get_live_services_data(sample_user, admin_request): org = create_organisation() service = create_service(go_live_user=sample_user, go_live_at=datetime(2018, 1, 1)) - create_service(service_name='second', go_live_at=datetime(2019, 1, 1), go_live_user=sample_user) + service_2 = create_service(service_name='second', go_live_at=datetime(2019, 1, 1), go_live_user=sample_user) template = create_template(service=service) template2 = create_template(service=service, template_type='email') @@ -149,6 +150,9 @@ def test_get_live_services_data(sample_user, admin_request): create_ft_billing(bst_date='2019-04-20', notification_type='sms', template=template, service=service) create_ft_billing(bst_date='2019-04-20', notification_type='email', template=template2, service=service) + create_annual_billing(service.id, 1, 2019) + create_annual_billing(service_2.id, 2, 2018) + response = admin_request.get('service.get_live_services_data')["data"] assert len(response) == 2 @@ -169,6 +173,7 @@ def test_get_live_services_data(sample_user, admin_request): 'sms_totals': 1, 'sms_volume_intent': None, 'organisation_type': None, + 'free_sms_fragment_limit': 1 }, { 'consent_to_research': None, @@ -186,6 +191,7 @@ def test_get_live_services_data(sample_user, admin_request): 'sms_totals': 0, 'sms_volume_intent': None, 'organisation_type': None, + 'free_sms_fragment_limit': 2 }, ]