Created
October 28, 2022 10:55
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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