In order to correctly select the rate for letters you need the billable_unit or page count to use to match on the letter_rates.

A new column is added to the query to populate ft_billing which is only populated for letter.
This commit is contained in:
Rebecca Law
2018-05-22 17:35:21 +01:00
parent e5584348ef
commit 1567e9bfe5
2 changed files with 36 additions and 16 deletions

View File

@@ -149,6 +149,11 @@ def fetch_billing_data_for_day(process_day, service_id=None):
).label('sent_by'),
func.coalesce(table.rate_multiplier, 1).cast(Integer).label('rate_multiplier'),
func.coalesce(table.international, False).label('international'),
case(
[
(table.notification_type == 'letter', table.billable_units),
]
).label('letter_page_count'),
func.sum(table.billable_units).label('billable_units'),
func.count().label('notifications_sent'),
Service.crown,
@@ -162,6 +167,7 @@ def fetch_billing_data_for_day(process_day, service_id=None):
table.service_id,
table.notification_type,
'sent_by',
'letter_page_count',
table.rate_multiplier,
table.international,
Service.crown
@@ -182,9 +188,9 @@ def get_rates_for_billing():
return non_letter_rates, letter_rates
def get_rate(non_letter_rates, letter_rates, notification_type, date, crown=None, rate_multiplier=None):
def get_rate(non_letter_rates, letter_rates, notification_type, date, crown=None, letter_page_count=None):
if notification_type == LETTER_TYPE:
return next(r[3] for r in letter_rates if date > r[0] and crown == r[1] and rate_multiplier == r[2])
return next(r[3] for r in letter_rates if date > r[0] and crown == r[1] and letter_page_count == r[2])
elif notification_type == SMS_TYPE:
return next(r[2] for r in non_letter_rates if notification_type == r[0] and date > r[1])
else:
@@ -198,9 +204,8 @@ def update_fact_billing(data, process_day):
data.notification_type,
process_day,
data.crown,
data.rate_multiplier)
data.letter_page_count)
billing_record = create_billing_record(data, rate, process_day)
table = FactBilling.__table__
'''
This uses the Postgres upsert to avoid race conditions when two threads try to insert

View File

@@ -47,6 +47,11 @@ def set_up_yearly_data():
template=letter_template,
notification_type='letter',
rate=0.33)
create_ft_billing(bst_date='{}-{}-{}'.format(year, mon, d),
service=service,
template=letter_template,
notification_type='letter',
rate=0.30)
return service
@@ -236,7 +241,7 @@ def test_get_rate(notify_db_session):
letter_rate = get_rate(non_letter_rates=non_letter_rates, letter_rates=letter_rates,
notification_type='letter',
crown=True,
rate_multiplier=1,
letter_page_count=1,
date=datetime.utcnow())
assert rate == 2.2
@@ -302,7 +307,7 @@ def test_fetch_monthly_billing_for_year_return_financial_year(notify_db_session)
# returns 3 rows, per month, returns financial year april to end of march
# Orders by Month
assert len(results) == 36
assert len(results) == 48
assert str(results[0].month) == "2016-04-01"
assert results[0].notification_type == 'email'
assert results[0].notifications_sent == 30
@@ -312,21 +317,26 @@ def test_fetch_monthly_billing_for_year_return_financial_year(notify_db_session)
assert results[1].notification_type == 'letter'
assert results[1].notifications_sent == 30
assert results[1].billable_units == 30
assert results[1].rate == Decimal('0.33')
assert str(results[2].month) == "2016-04-01"
assert results[2].notification_type == 'sms'
assert results[1].rate == Decimal('0.30')
assert str(results[1].month) == "2016-04-01"
assert results[2].notification_type == 'letter'
assert results[2].notifications_sent == 30
assert results[2].billable_units == 30
assert results[2].rate == Decimal('0.162')
assert str(results[3].month) == "2016-05-01"
assert str(results[35].month) == "2017-03-01"
assert results[2].rate == Decimal('0.33')
assert str(results[3].month) == "2016-04-01"
assert results[3].notification_type == 'sms'
assert results[3].notifications_sent == 30
assert results[3].billable_units == 30
assert results[3].rate == Decimal('0.162')
assert str(results[4].month) == "2016-05-01"
assert str(results[47].month) == "2017-03-01"
def test_fetch_billing_totals_for_year(notify_db_session):
service = set_up_yearly_data()
results = fetch_billing_totals_for_year(service_id=service.id, year=2016)
assert len(results) == 3
assert len(results) == 4
assert results[0].notification_type == 'email'
assert results[0].notifications_sent == 365
assert results[0].billable_units == 365
@@ -335,9 +345,14 @@ def test_fetch_billing_totals_for_year(notify_db_session):
assert results[1].notification_type == 'letter'
assert results[1].notifications_sent == 365
assert results[1].billable_units == 365
assert results[1].rate == Decimal('0.33')
assert results[1].rate == Decimal('0.3')
assert results[2].notification_type == 'sms'
assert results[2].notification_type == 'letter'
assert results[2].notifications_sent == 365
assert results[2].billable_units == 365
assert results[2].rate == Decimal('0.162')
assert results[2].rate == Decimal('0.33')
assert results[3].notification_type == 'sms'
assert results[3].notifications_sent == 365
assert results[3].billable_units == 365
assert results[3].rate == Decimal('0.162')