mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-21 07:51:13 -05:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
Reference in New Issue
Block a user