From a836ed037e5094db45838300e855d0f34c3b0260 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Mon, 11 Dec 2017 16:55:23 +0000 Subject: [PATCH] Added query for billing usage of letter notifications. --- app/dao/notification_usage_dao.py | 35 +++++++++++++++++++- tests/app/dao/test_notification_usage_dao.py | 27 +++++++++++++-- tests/app/db.py | 27 ++++++++++++++- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/app/dao/notification_usage_dao.py b/app/dao/notification_usage_dao.py index 5fe278cae..7a892689b 100644 --- a/app/dao/notification_usage_dao.py +++ b/app/dao/notification_usage_dao.py @@ -12,7 +12,10 @@ from app.models import ( NOTIFICATION_STATUS_TYPES_BILLABLE, KEY_TYPE_TEST, SMS_TYPE, - EMAIL_TYPE + EMAIL_TYPE, + LETTER_TYPE, + LetterRate, + Service ) from app.statsd_decorators import statsd from app.utils import get_london_month_from_utc_column @@ -139,3 +142,33 @@ def rate_multiplier(): (NotificationHistory.rate_multiplier == None, literal_column("'1'")), # noqa (NotificationHistory.rate_multiplier != None, NotificationHistory.rate_multiplier), # noqa ]), Integer()) + + +@statsd(namespace="dao") +def billing_letter_data_per_month_query(service_id, start_date, end_date): + month = get_london_month_from_utc_column(NotificationHistory.created_at) + crown = Service.query.get(service_id).crown + results = db.session.query( + month.label('month'), + func.sum(NotificationHistory.billable_units).label('billing_units'), + rate_multiplier().label('rate_multiplier'), + NotificationHistory.international, + NotificationHistory.notification_type, + cast(LetterRate.rate, Float()).label('rate') + ).filter( + *billing_data_filter(LETTER_TYPE, start_date, end_date, service_id), + LetterRate.sheet_count == NotificationHistory.billable_units, + LetterRate.crown == crown, + NotificationHistory.created_at.between(LetterRate.start_date, end_date), + LetterRate.post_class == 'second' + ).group_by( + NotificationHistory.notification_type, + month, + NotificationHistory.rate_multiplier, + NotificationHistory.international + ).order_by( + month, + rate_multiplier() + ).all() + + return results \ No newline at end of file diff --git a/tests/app/dao/test_notification_usage_dao.py b/tests/app/dao/test_notification_usage_dao.py index 24f09e026..6b7f95582 100644 --- a/tests/app/dao/test_notification_usage_dao.py +++ b/tests/app/dao/test_notification_usage_dao.py @@ -1,4 +1,5 @@ import uuid +from _decimal import Decimal from datetime import datetime, timedelta from freezegun import freeze_time @@ -7,13 +8,14 @@ from app.dao.date_util import get_financial_year from app.dao.notification_usage_dao import ( get_rates_for_daterange, get_billing_data_for_month, - get_monthly_billing_data + get_monthly_billing_data, + billing_letter_data_per_month_query ) from app.models import ( Rate, SMS_TYPE, ) -from tests.app.db import create_notification, create_rate +from tests.app.db import create_notification, create_rate, create_letter_rate, create_template, create_service def test_get_rates_for_daterange(notify_db, notify_db_session): @@ -211,3 +213,24 @@ def test_get_monthly_billing_data_where_start_date_before_rate_returns_empty( ) assert not results + + +def test_billing_letter_data_per_month_query( + notify_db_session +): + rate = create_letter_rate() + service = create_service() + template = create_template(service=service, template_type='letter') + create_notification(template=template, billable_units=1, created_at=datetime(2017, 2, 1, 13, 21), + status='delivered') + create_notification(template=template, billable_units=1, created_at=datetime(2017, 2, 1, 13, 21), + status='delivered') + create_notification(template=template, billable_units=1, created_at=datetime(2017, 2, 1, 13, 21), + status='delivered') + + results = billing_letter_data_per_month_query(service_id=service.id, + start_date=datetime(2017, 2, 1), + end_date=datetime(2017, 2, 28)) + + assert len(results) == 1 + assert results[0].rate == Decimal('0.31') diff --git a/tests/app/db.py b/tests/app/db.py index 717b1aa2b..1b12ec991 100644 --- a/tests/app/db.py +++ b/tests/app/db.py @@ -29,6 +29,7 @@ from app.models import ( SMS_TYPE, KEY_TYPE_NORMAL, AnnualBilling, + LetterRate ) from app.dao.users_dao import save_model_user from app.dao.notifications_dao import ( @@ -68,7 +69,8 @@ def create_service( active=True, email_from=None, prefix_sms=True, - message_limit=1000 + message_limit=1000, + crown=True ): service = Service( name=service_name, @@ -77,6 +79,7 @@ def create_service( email_from=email_from if email_from else service_name.lower().replace(' ', '.'), created_by=user or create_user(email='{}@digital.cabinet-office.gov.uk'.format(uuid.uuid4())), prefix_sms=prefix_sms, + crown=crown ) dao_create_service(service, service.created_by, service_id, service_permissions=service_permissions) @@ -453,3 +456,25 @@ def create_annual_billing( db.session.commit() return annual_billing + + +def create_letter_rate( + start_date=datetime(2017, 1,1, 00,00,00), + end_date=None, + sheet_count=1, + rate=0.31, + crown=True, + post_class='second' +): + rate = LetterRate( + start_date=start_date, + end_date=end_date, + sheet_count=sheet_count, + rate=rate, + crown=crown, + post_class=post_class + ) + db.session.add(rate) + db.session.commit() + + return rate