2017-07-18 18:21:35 +01:00
|
|
|
from datetime import datetime
|
|
|
|
|
|
2017-07-13 17:22:11 +01:00
|
|
|
from app import db
|
2017-07-25 14:26:42 +01:00
|
|
|
from app.dao.dao_utils import transactional
|
2017-07-24 15:13:18 +01:00
|
|
|
from app.dao.date_util import get_month_start_end_date
|
2017-07-18 18:21:35 +01:00
|
|
|
from app.dao.notification_usage_dao import get_billing_data_for_month
|
2017-07-24 15:13:18 +01:00
|
|
|
from app.models import MonthlyBilling, SMS_TYPE, NotificationHistory
|
2017-07-25 14:26:42 +01:00
|
|
|
from app.statsd_decorators import statsd
|
2017-07-24 15:13:18 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_service_ids_that_need_sms_billing_populated(start_date, end_date):
|
|
|
|
|
return db.session.query(
|
|
|
|
|
NotificationHistory.service_id
|
|
|
|
|
).filter(
|
|
|
|
|
NotificationHistory.created_at >= start_date,
|
|
|
|
|
NotificationHistory.created_at <= end_date,
|
|
|
|
|
NotificationHistory.notification_type == SMS_TYPE,
|
|
|
|
|
NotificationHistory.billable_units != 0
|
|
|
|
|
).distinct().all()
|
2017-07-13 17:22:11 +01:00
|
|
|
|
|
|
|
|
|
2017-07-25 14:26:42 +01:00
|
|
|
@transactional
|
2017-07-18 18:21:35 +01:00
|
|
|
def create_or_update_monthly_billing_sms(service_id, billing_month):
|
2017-07-24 15:13:18 +01:00
|
|
|
start_date, end_date = get_month_start_end_date(billing_month)
|
|
|
|
|
monthly = get_billing_data_for_month(service_id=service_id, start_date=start_date, end_date=end_date)
|
2017-07-18 18:21:35 +01:00
|
|
|
# update monthly
|
|
|
|
|
monthly_totals = _monthly_billing_data_to_json(monthly)
|
2017-07-31 17:47:53 +01:00
|
|
|
row = get_monthly_billing_entry(service_id, start_date, SMS_TYPE)
|
|
|
|
|
|
2017-07-18 18:21:35 +01:00
|
|
|
if row:
|
|
|
|
|
row.monthly_totals = monthly_totals
|
2017-07-26 13:19:17 +01:00
|
|
|
row.updated_at = datetime.utcnow()
|
2017-07-18 18:21:35 +01:00
|
|
|
else:
|
2017-07-31 17:47:53 +01:00
|
|
|
row = MonthlyBilling(
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
notification_type=SMS_TYPE,
|
|
|
|
|
monthly_totals=monthly_totals,
|
|
|
|
|
start_date=start_date,
|
|
|
|
|
end_date=end_date
|
|
|
|
|
)
|
|
|
|
|
|
2017-07-18 18:21:35 +01:00
|
|
|
db.session.add(row)
|
|
|
|
|
|
|
|
|
|
|
2017-07-31 17:47:53 +01:00
|
|
|
def get_monthly_billing_entry(service_id, start_date, notification_type):
|
|
|
|
|
entry = MonthlyBilling.query.filter_by(
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
start_date=start_date,
|
|
|
|
|
notification_type=notification_type
|
|
|
|
|
).first()
|
|
|
|
|
|
|
|
|
|
return entry
|
|
|
|
|
|
|
|
|
|
|
2017-07-25 14:26:42 +01:00
|
|
|
@statsd(namespace="dao")
|
2017-07-18 18:21:35 +01:00
|
|
|
def get_monthly_billing_sms(service_id, billing_month):
|
2017-07-26 13:19:17 +01:00
|
|
|
start_date, end_date = get_month_start_end_date(billing_month)
|
2017-07-18 18:21:35 +01:00
|
|
|
monthly = MonthlyBilling.query.filter_by(service_id=service_id,
|
2017-07-26 13:19:17 +01:00
|
|
|
start_date=start_date,
|
2017-07-18 18:21:35 +01:00
|
|
|
notification_type=SMS_TYPE).first()
|
|
|
|
|
return monthly
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _monthly_billing_data_to_json(monthly):
|
|
|
|
|
# total cost must take into account the free allowance.
|
|
|
|
|
# might be a good idea to capture free allowance in this table
|
2017-07-25 11:43:41 +01:00
|
|
|
return [{"billing_units": x.billing_units,
|
|
|
|
|
"rate_multiplier": x.rate_multiplier,
|
|
|
|
|
"international": x.international,
|
|
|
|
|
"rate": x.rate,
|
|
|
|
|
"total_cost": (x.billing_units * x.rate_multiplier) * x.rate} for x in monthly]
|