Fix to return billing data before a rate begins

This commit is contained in:
Imdad Ahad
2017-08-02 15:24:14 +01:00
parent 5b9377c697
commit 824063ddb8
2 changed files with 82 additions and 8 deletions

View File

@@ -22,14 +22,31 @@ def get_yearly_billing_data(service_id, year):
start_date, end_date = get_financial_year(year) start_date, end_date = get_financial_year(year)
rates = get_rates_for_daterange(start_date, end_date, SMS_TYPE) rates = get_rates_for_daterange(start_date, end_date, SMS_TYPE)
if not rates:
return []
def get_valid_from(valid_from): def get_valid_from(valid_from):
return start_date if valid_from < start_date else valid_from return start_date if valid_from < start_date else valid_from
result = [] result = []
for r, n in zip(rates, rates[1:]): for r, n in zip(rates, rates[1:]):
result.append(sms_yearly_billing_data_query(r.rate, service_id, get_valid_from(r.valid_from), n.valid_from)) result.append(
sms_yearly_billing_data_query(
r.rate,
service_id,
get_valid_from(r.valid_from),
n.valid_from
)
)
result.append( result.append(
sms_yearly_billing_data_query(rates[-1].rate, service_id, get_valid_from(rates[-1].valid_from), end_date)) sms_yearly_billing_data_query(
rates[-1].rate,
service_id,
get_valid_from(rates[-1].valid_from),
end_date
)
)
result.append(email_yearly_billing_data_query(service_id, start_date, end_date)) result.append(email_yearly_billing_data_query(service_id, start_date, end_date))
return sum(result, []) return sum(result, [])
@@ -38,6 +55,10 @@ def get_yearly_billing_data(service_id, year):
@statsd(namespace="dao") @statsd(namespace="dao")
def get_billing_data_for_month(service_id, start_date, end_date): def get_billing_data_for_month(service_id, start_date, end_date):
rates = get_rates_for_daterange(start_date, end_date, SMS_TYPE) rates = get_rates_for_daterange(start_date, end_date, SMS_TYPE)
if not rates:
return []
result = [] result = []
# so the start end date in the query are the valid from the rate, not the month - this is going to take some thought # so the start end date in the query are the valid from the rate, not the month - this is going to take some thought
for r, n in zip(rates, rates[1:]): for r, n in zip(rates, rates[1:]):
@@ -54,6 +75,9 @@ def get_monthly_billing_data(service_id, year):
start_date, end_date = get_financial_year(year) start_date, end_date = get_financial_year(year)
rates = get_rates_for_daterange(start_date, end_date, SMS_TYPE) rates = get_rates_for_daterange(start_date, end_date, SMS_TYPE)
if not rates:
return []
result = [] result = []
for r, n in zip(rates, rates[1:]): for r, n in zip(rates, rates[1:]):
result.extend(sms_billing_data_per_month_query(r.rate, service_id, r.valid_from, n.valid_from)) result.extend(sms_billing_data_per_month_query(r.rate, service_id, r.valid_from, n.valid_from))

View File

@@ -1,13 +1,15 @@
import pytest
import uuid import uuid
from datetime import datetime, timedelta from datetime import datetime, timedelta
from freezegun import freeze_time
import pytest
from flask import current_app from flask import current_app
from app.dao.date_util import get_financial_year from app.dao.date_util import get_financial_year
from app.dao.notification_usage_dao import ( from app.dao.notification_usage_dao import (
get_rates_for_daterange, get_rates_for_daterange,
get_yearly_billing_data, get_yearly_billing_data,
get_billing_data_for_month,
get_monthly_billing_data, get_monthly_billing_data,
get_total_billable_units_for_sent_sms_notifications_in_date_range, get_total_billable_units_for_sent_sms_notifications_in_date_range,
discover_rate_bounds_for_billing_query discover_rate_bounds_for_billing_query
@@ -16,11 +18,16 @@ from app.models import (
Rate, Rate,
NOTIFICATION_DELIVERED, NOTIFICATION_DELIVERED,
NOTIFICATION_STATUS_TYPES_BILLABLE, NOTIFICATION_STATUS_TYPES_BILLABLE,
NOTIFICATION_STATUS_TYPES_NON_BILLABLE) NOTIFICATION_STATUS_TYPES_NON_BILLABLE,
from tests.app.conftest import sample_notification, sample_email_template, sample_letter_template, sample_service SMS_TYPE,
from tests.app.db import create_notification )
from freezegun import freeze_time from tests.app.conftest import (
sample_notification,
sample_email_template,
sample_letter_template,
sample_service
)
from tests.app.db import create_notification, create_rate
from tests.conftest import set_config from tests.conftest import set_config
@@ -722,3 +729,46 @@ def test_deducts_free_tier_from_bill_across_rate_boundaries(
)[1] == expected_cost )[1] == expected_cost
finally: finally:
current_app.config['FREE_SMS_TIER_FRAGMENT_COUNT'] = start_value current_app.config['FREE_SMS_TIER_FRAGMENT_COUNT'] = start_value
def test_get_yearly_billing_data_for_start_date_before_rate_returns_empty(
sample_template
):
create_rate(datetime(2016, 4, 1), 0.014, SMS_TYPE)
results = get_yearly_billing_data(
service_id=sample_template.service_id,
year=2015
)
assert not results
@freeze_time("2016-05-01")
def test_get_billing_data_for_month_where_start_date_before_rate_returns_empty(
sample_template
):
create_rate(datetime(2016, 4, 1), 0.014, SMS_TYPE)
results = get_monthly_billing_data(
service_id=sample_template.service_id,
year=2015
)
assert not results
@freeze_time("2016-05-01")
def test_get_monthly_billing_data_where_start_date_before_rate_returns_empty(
sample_template
):
now = datetime.utcnow()
create_rate(now, 0.014, SMS_TYPE)
results = get_billing_data_for_month(
service_id=sample_template.service_id,
start_date=now - timedelta(days=2),
end_date=now - timedelta(days=1)
)
assert not results