Files
notifications-api/app/dao/annual_billing_dao.py

119 lines
3.5 KiB
Python
Raw Permalink Normal View History

from flask import current_app
2024-10-14 11:33:21 -07:00
from sqlalchemy import select, update
2017-11-02 17:02:00 +00:00
from app import db
from app.dao.dao_utils import autocommit
from app.dao.date_util import get_current_calendar_year_start_year
from app.enums import OrganizationType
2021-03-10 13:55:06 +00:00
from app.models import AnnualBilling
@autocommit
2023-08-29 14:54:30 -07:00
def dao_create_or_update_annual_billing_for_year(
service_id, free_sms_fragment_limit, financial_year_start
):
result = dao_get_free_sms_fragment_limit_for_year(service_id, financial_year_start)
if result:
result.free_sms_fragment_limit = free_sms_fragment_limit
else:
2023-08-29 14:54:30 -07:00
result = AnnualBilling(
service_id=service_id,
financial_year_start=financial_year_start,
free_sms_fragment_limit=free_sms_fragment_limit,
)
db.session.add(result)
return result
def dao_get_annual_billing(service_id):
2024-10-14 11:33:21 -07:00
stmt = (
select(AnnualBilling)
2024-12-19 11:10:03 -08:00
.where(
AnnualBilling.service_id == service_id,
2023-08-29 14:54:30 -07:00
)
.order_by(AnnualBilling.financial_year_start)
)
2024-10-14 11:33:21 -07:00
return db.session.execute(stmt).scalars().all()
@autocommit
2023-08-29 14:54:30 -07:00
def dao_update_annual_billing_for_future_years(
service_id, free_sms_fragment_limit, financial_year_start
):
2024-10-14 11:33:21 -07:00
stmt = (
update(AnnualBilling)
2024-12-20 08:09:19 -08:00
.where(
2024-10-14 11:33:21 -07:00
AnnualBilling.service_id == service_id,
AnnualBilling.financial_year_start > financial_year_start,
)
.values({"free_sms_fragment_limit": free_sms_fragment_limit})
)
db.session.execute(stmt)
db.session.commit()
def dao_get_free_sms_fragment_limit_for_year(service_id, financial_year_start=None):
if not financial_year_start:
financial_year_start = get_current_calendar_year_start_year()
2024-12-19 11:10:03 -08:00
stmt = select(AnnualBilling).where(
AnnualBilling.service_id == service_id,
AnnualBilling.financial_year_start == financial_year_start,
2024-10-14 11:33:21 -07:00
)
return db.session.execute(stmt).scalars().first()
def dao_get_all_free_sms_fragment_limit(service_id):
2024-10-14 11:33:21 -07:00
stmt = (
select(AnnualBilling)
2024-12-19 11:10:03 -08:00
.where(
AnnualBilling.service_id == service_id,
2023-08-29 14:54:30 -07:00
)
.order_by(AnnualBilling.financial_year_start)
)
2024-10-14 11:33:21 -07:00
return db.session.execute(stmt).scalars().all()
def set_default_free_allowance_for_service(service, year_start=None):
default_free_sms_fragment_limits = {
OrganizationType.FEDERAL: {
2020: 250_000,
2021: 150_000,
2022: 40_000,
},
OrganizationType.STATE: {
2020: 250_000,
2021: 150_000,
2022: 40_000,
},
OrganizationType.OTHER: {
2020: 250_000,
2021: 150_000,
2022: 40_000,
2023-08-29 14:54:30 -07:00
},
}
if not year_start:
year_start = get_current_calendar_year_start_year()
# handle cases where the year is less than 2020 or greater than 2021
if year_start < 2020:
year_start = 2020
if year_start > 2022:
year_start = 2022
2023-07-10 11:06:29 -07:00
if service.organization_type:
2023-08-29 14:54:30 -07:00
free_allowance = default_free_sms_fragment_limits[service.organization_type][
year_start
]
else:
2023-08-29 14:54:30 -07:00
current_app.logger.info(
f"no organization type for service {service.id}. Using other default of "
f"{default_free_sms_fragment_limits['other'][year_start]}"
)
free_allowance = default_free_sms_fragment_limits[OrganizationType.OTHER][
year_start
]
return dao_create_or_update_annual_billing_for_year(
2023-08-29 14:54:30 -07:00
service.id, free_allowance, year_start
)