Merge pull request #803 from alphagov/filter-global-usage-financial-year

Allow filtering of billing info by financial year
This commit is contained in:
Chris Hill-Scott
2017-01-27 11:58:29 +00:00
committed by GitHub
4 changed files with 49 additions and 2 deletions

View File

@@ -8,15 +8,21 @@ from app.models import (
NOTIFICATION_STATUS_TYPES_BILLABLE,
KEY_TYPE_TEST
)
from app.dao.notifications_dao import get_financial_year
def get_fragment_count(service_id):
def get_fragment_count(service_id, year=None):
shared_filters = [
NotificationHistory.service_id == service_id,
NotificationHistory.status.in_(NOTIFICATION_STATUS_TYPES_BILLABLE),
NotificationHistory.key_type != KEY_TYPE_TEST
]
if year:
shared_filters.append(NotificationHistory.created_at.between(
*get_financial_year(year)
))
sms_count = db.session.query(
func.sum(NotificationHistory.billable_units)
).filter(

View File

@@ -190,7 +190,13 @@ def remove_user_from_service(service_id, user_id):
@service_blueprint.route('/<uuid:service_id>/fragment/aggregate_statistics')
def get_service_provider_aggregate_statistics(service_id):
return jsonify(data=get_fragment_count(service_id))
year = request.args.get('year')
if year is not None:
try:
year = int(year)
except ValueError:
raise InvalidRequest('Year must be a number', status_code=400)
return jsonify(data=get_fragment_count(service_id, year=year))
# This is placeholder get method until more thought

View File

@@ -2,6 +2,7 @@ from datetime import datetime
import uuid
import pytest
from freezegun import freeze_time
from app.models import NotificationHistory, KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST, NOTIFICATION_STATUS_TYPES
from app.dao.provider_statistics_dao import get_fragment_count
@@ -35,6 +36,20 @@ def test_get_fragment_count_filters_on_service_id(notify_db, sample_template, se
assert get_fragment_count(service_2.id)['sms_count'] == 0
@pytest.mark.parametrize('creation_time, expected_count', [
('2000-03-31 22:59:59', 0), # before the start of the year
('2000-04-01 00:00:00', 1), # after the start of the year
('2001-03-31 22:59:59', 1), # before the end of the year
('2001-04-01 00:00:00', 0), # after the end of the year
])
def test_get_fragment_count_filters_on_year(
notify_db, sample_template, creation_time, expected_count
):
with freeze_time(creation_time):
noti_hist(notify_db, sample_template)
assert get_fragment_count(sample_template.service_id, year=2000)['sms_count'] == expected_count
def test_get_fragment_count_sums_billable_units_for_sms(notify_db, sample_template):
noti_hist(notify_db, sample_template, billable_units=1)
noti_hist(notify_db, sample_template, billable_units=2)

View File

@@ -1393,3 +1393,23 @@ def test_get_notification_billable_unit_count_missing_year(client, sample_servic
assert json.loads(response.get_data(as_text=True)) == {
'message': 'No valid year provided', 'result': 'error'
}
@pytest.mark.parametrize('query_string, expected_status, expected_json', [
('', 200, {'data': {'email_count': 0, 'sms_count': 0}}),
('?year=2000', 200, {'data': {'email_count': 0, 'sms_count': 0}}),
('?year=abcd', 400, {'message': 'Year must be a number', 'result': 'error'}),
])
def test_get_service_provider_aggregate_statistics(
client,
sample_service,
query_string,
expected_status,
expected_json,
):
response = client.get(
'/service/{}/fragment/aggregate_statistics{}'.format(sample_service.id, query_string),
headers=[create_authorization_header(service_id=sample_service.id)]
)
assert response.status_code == expected_status
assert json.loads(response.get_data(as_text=True)) == expected_json