Skip to content

Instantly share code, notes, and snippets.

@fredkingham
Created October 28, 2022 10:55
Show Gist options
  • Save fredkingham/67c6f4a045586783eb84faad24823c16 to your computer and use it in GitHub Desktop.
Save fredkingham/67c6f4a045586783eb84faad24823c16 to your computer and use it in GitHub Desktop.
Check the transfer history counts to make sure we are not way out
"""
Management command that sends a sanity check about the transfer histories
"""
import datetime
from django.conf import settings
from django.db.models import Max
from django.core.management import BaseCommand
from django.utils import timezone
from intrahospital_api.apis.prod_api import ProdApi as ProdAPI
from plugins.admissions.models import TransferHistory
from django.core.mail import send_mail
import asyncio
def send_report(report):
dt = datetime.datetime.now().strftime("%d/%m/%Y")
report_str = "\n".join(report)
send_mail(
f"TransferHistory report {dt}",
report_str,
settings.DEFAULT_FROM_EMAIL,
["{{ redacted }}"],
)
def last_updated():
return TransferHistory.objects.aggregate(m=Max("updated_datetime"))["m"]
def upstream_count_all_time():
api = ProdAPI()
query = """
SELECT COUNT(*) FROM INP.TRANSFER_HISTORY_EL_CID WITH (NOLOCK)
WHERE LOCAL_PATIENT_IDENTIFIER is not null
AND LOCAL_PATIENT_IDENTIFIER <> ''
AND UPDATED_DATE <= @last_updated
AND In_TransHist = 1
AND In_Spells = 1
"""
result = api.execute_warehouse_query(query, params={"last_updated": last_updated()})
return result[0][0]
def our_count_all_time():
return TransferHistory.objects.all().count()
def upstream_count_updated_last_month():
last_month = datetime.datetime.now() - datetime.timedelta(30)
api = ProdAPI()
query = """
SELECT COUNT(*) FROM INP.TRANSFER_HISTORY_EL_CID WITH (NOLOCK)
WHERE LOCAL_PATIENT_IDENTIFIER is not null
AND LOCAL_PATIENT_IDENTIFIER <> ''
AND UPDATED_DATE >= @since
AND UPDATED_DATE <= @last_updated
AND In_TransHist = 1
AND In_Spells = 1
"""
result = api.execute_warehouse_query(
query, params={"since": last_month, "last_updated": last_updated()}
)
return result[0][0]
def our_count_updated_last_month():
last_month = timezone.make_aware(datetime.datetime.now()) - datetime.timedelta(30)
return TransferHistory.objects.filter(updated_datetime__gte=last_month).count()
def upstream_transfers_last_month():
last_month = datetime.datetime.now() - datetime.timedelta(30)
api = ProdAPI()
query = """
SELECT COUNT(*) FROM INP.TRANSFER_HISTORY_EL_CID WITH (NOLOCK)
WHERE LOCAL_PATIENT_IDENTIFIER is not null
AND LOCAL_PATIENT_IDENTIFIER <> ''
AND TRANS_HIST_START_DT_TM >= @since
AND In_TransHist = 1
AND In_Spells = 1
"""
result = api.execute_warehouse_query(
query, params={"since": last_month, "last_updated": last_updated()}
)
return result[0][0]
def our_transfers_last_month():
last_month = timezone.make_aware(datetime.datetime.now()) - datetime.timedelta(30)
return TransferHistory.objects.filter(
transfer_start_datetime__gte=last_month
).count()
async def upstream_all_time():
upstream_all_time = upstream_count_all_time()
our_all_time = our_count_all_time()
diff_all_time = our_all_time - upstream_all_time
return f"All time:\t us {our_all_time}, them {upstream_all_time}, diff {diff_all_time}"
async def updated_last_month():
upstream_count_updated_lm = upstream_count_updated_last_month()
our_count_updated_lm = our_count_updated_last_month()
diff_updated_lm = our_count_updated_lm - upstream_count_updated_lm
return f"Updated last month:\t us {our_count_updated_lm}, them {upstream_count_updated_lm}, diff {diff_updated_lm}"
async def transfers_last_month():
upstream_transfers_lm = upstream_transfers_last_month()
our_transfers_lm = our_transfers_last_month()
diff_transfers_lm = our_transfers_lm - upstream_transfers_lm
return f"Transfers last month:\t us {our_transfers_lm}, them {upstream_transfers_lm}, diff {diff_transfers_lm}"
async def main():
result = await asyncio.gather(upstream_all_time(), updated_last_month(), transfers_last_month())
return result
class Command(BaseCommand):
def handle(self, *args, **kwargs):
loop = asyncio.get_event_loop()
report = loop.run_until_complete(main())
send_report(report)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment