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'), ).label('sent_by'),
func.coalesce(table.rate_multiplier, 1).cast(Integer).label('rate_multiplier'), func.coalesce(table.rate_multiplier, 1).cast(Integer).label('rate_multiplier'),
func.coalesce(table.international, False).label('international'), 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.sum(table.billable_units).label('billable_units'),
func.count().label('notifications_sent'), func.count().label('notifications_sent'),
Service.crown, Service.crown,
@@ -162,6 +167,7 @@ def fetch_billing_data_for_day(process_day, service_id=None):
table.service_id, table.service_id,
table.notification_type, table.notification_type,
'sent_by', 'sent_by',
'letter_page_count',
table.rate_multiplier, table.rate_multiplier,
table.international, table.international,
Service.crown Service.crown
@@ -182,9 +188,9 @@ def get_rates_for_billing():
return non_letter_rates, letter_rates 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: 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: elif notification_type == SMS_TYPE:
return next(r[2] for r in non_letter_rates if notification_type == r[0] and date > r[1]) return next(r[2] for r in non_letter_rates if notification_type == r[0] and date > r[1])
else: else:
@@ -198,9 +204,8 @@ def update_fact_billing(data, process_day):
data.notification_type, data.notification_type,
process_day, process_day,
data.crown, data.crown,
data.rate_multiplier) data.letter_page_count)
billing_record = create_billing_record(data, rate, process_day) billing_record = create_billing_record(data, rate, process_day)
table = FactBilling.__table__ table = FactBilling.__table__
''' '''
This uses the Postgres upsert to avoid race conditions when two threads try to insert 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, template=letter_template,
notification_type='letter', notification_type='letter',
rate=0.33) 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 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, letter_rate = get_rate(non_letter_rates=non_letter_rates, letter_rates=letter_rates,
notification_type='letter', notification_type='letter',
crown=True, crown=True,
rate_multiplier=1, letter_page_count=1,
date=datetime.utcnow()) date=datetime.utcnow())
assert rate == 2.2 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 # returns 3 rows, per month, returns financial year april to end of march
# Orders by Month # Orders by Month
assert len(results) == 36 assert len(results) == 48
assert str(results[0].month) == "2016-04-01" assert str(results[0].month) == "2016-04-01"
assert results[0].notification_type == 'email' assert results[0].notification_type == 'email'
assert results[0].notifications_sent == 30 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].notification_type == 'letter'
assert results[1].notifications_sent == 30 assert results[1].notifications_sent == 30
assert results[1].billable_units == 30 assert results[1].billable_units == 30
assert results[1].rate == Decimal('0.33') assert results[1].rate == Decimal('0.30')
assert str(results[2].month) == "2016-04-01" assert str(results[1].month) == "2016-04-01"
assert results[2].notification_type == 'sms' assert results[2].notification_type == 'letter'
assert results[2].notifications_sent == 30 assert results[2].notifications_sent == 30
assert results[2].billable_units == 30 assert results[2].billable_units == 30
assert results[2].rate == Decimal('0.162') assert results[2].rate == Decimal('0.33')
assert str(results[3].month) == "2016-05-01" assert str(results[3].month) == "2016-04-01"
assert str(results[35].month) == "2017-03-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): def test_fetch_billing_totals_for_year(notify_db_session):
service = set_up_yearly_data() service = set_up_yearly_data()
results = fetch_billing_totals_for_year(service_id=service.id, year=2016) 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].notification_type == 'email'
assert results[0].notifications_sent == 365 assert results[0].notifications_sent == 365
assert results[0].billable_units == 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].notification_type == 'letter'
assert results[1].notifications_sent == 365 assert results[1].notifications_sent == 365
assert results[1].billable_units == 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].notifications_sent == 365
assert results[2].billable_units == 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')