Merge pull request #2524 from alphagov/free-allowance-report

Free sms allowance in billing report
This commit is contained in:
Leo Hemsted
2019-06-05 14:34:55 +01:00
committed by GitHub
4 changed files with 108 additions and 78 deletions

View File

@@ -51,16 +51,3 @@ def dao_get_all_free_sms_fragment_limit(service_id):
return AnnualBilling.query.filter_by(
service_id=service_id,
).order_by(AnnualBilling.financial_year_start).all()
def dao_insert_annual_billing_for_this_year(service, free_sms_fragment_limit):
"""
This method is called from create_service which is wrapped in a transaction.
"""
annual_billing = AnnualBilling(
free_sms_fragment_limit=free_sms_fragment_limit,
financial_year_start=get_current_financial_year_start_year(),
service=service,
)
db.session.add(annual_billing)

View File

@@ -2,7 +2,7 @@ import uuid
from datetime import date, datetime, timedelta
from notifications_utils.statsd_decorators import statsd
from sqlalchemy import asc, func, case
from sqlalchemy.sql.expression import asc, case, and_, func
from sqlalchemy.orm import joinedload
from flask import current_app
@@ -77,25 +77,32 @@ def dao_count_live_services():
def dao_fetch_live_services_data():
year_start_date, year_end_date = get_current_financial_year()
most_recent_annual_billing = db.session.query(
AnnualBilling.service_id,
func.max(AnnualBilling.financial_year_start).label('year')
).group_by(
AnnualBilling.service_id
).subquery()
this_year_ft_billing = FactBilling.query.filter(
FactBilling.bst_date >= year_start_date,
FactBilling.bst_date <= year_end_date,
).subquery()
data = db.session.query(
Service.id,
Organisation.name.label("organisation_name"),
Organisation.organisation_type,
Service.id.label('service_id'),
Service.name.label("service_name"),
Service.consent_to_research,
Service.go_live_user_id,
Service.count_as_live,
User.name.label('user_name'),
User.email_address,
User.mobile_number,
Organisation.name.label("organisation_name"),
Organisation.organisation_type.label('organisation_type'),
Service.consent_to_research.label('consent_to_research'),
User.name.label('contact_name'),
User.email_address.label('contact_email'),
User.mobile_number.label('contact_mobile'),
Service.go_live_at.label("live_date"),
Service.volume_sms,
Service.volume_email,
Service.volume_letter,
Service.volume_sms.label('sms_volume_intent'),
Service.volume_email.label('email_volume_intent'),
Service.volume_letter.label('letter_volume_intent'),
case([
(this_year_ft_billing.c.notification_type == 'email', func.sum(this_year_ft_billing.c.notifications_sent))
], else_=0).label("email_totals"),
@@ -105,6 +112,15 @@ def dao_fetch_live_services_data():
case([
(this_year_ft_billing.c.notification_type == 'letter', func.sum(this_year_ft_billing.c.notifications_sent))
], else_=0).label("letter_totals"),
AnnualBilling.free_sms_fragment_limit,
).join(
Service.annual_billing
).join(
most_recent_annual_billing,
and_(
Service.id == most_recent_annual_billing.c.service_id,
AnnualBilling.financial_year_start == most_recent_annual_billing.c.year
)
).outerjoin(
Service.organisation
).outerjoin(
@@ -130,42 +146,21 @@ def dao_fetch_live_services_data():
Service.volume_sms,
Service.volume_email,
Service.volume_letter,
this_year_ft_billing.c.notification_type
this_year_ft_billing.c.notification_type,
AnnualBilling.free_sms_fragment_limit,
).order_by(
asc(Service.go_live_at)
).all()
results = []
for row in data:
is_service_in_list = None
i = 0
while i < len(results):
if results[i]["service_id"] == row.id:
is_service_in_list = i
break
else:
i += 1
if is_service_in_list is not None:
results[is_service_in_list]["email_totals"] += row.email_totals
results[is_service_in_list]["sms_totals"] += row.sms_totals
results[is_service_in_list]["letter_totals"] += row.letter_totals
existing_service = next((x for x in results if x['service_id'] == row.service_id), None)
if existing_service is not None:
existing_service["email_totals"] += row.email_totals
existing_service["sms_totals"] += row.sms_totals
existing_service["letter_totals"] += row.letter_totals
else:
results.append({
"service_id": row.id,
"service_name": row.service_name,
"organisation_name": row.organisation_name,
"organisation_type": row.organisation_type,
"consent_to_research": row.consent_to_research,
"contact_name": row.user_name,
"contact_email": row.email_address,
"contact_mobile": row.mobile_number,
"live_date": row.live_date,
"sms_volume_intent": row.volume_sms,
"email_volume_intent": row.volume_email,
"letter_volume_intent": row.volume_letter,
"sms_totals": row.sms_totals,
"email_totals": row.email_totals,
"letter_totals": row.letter_totals,
})
results.append(row._asdict())
return results