예제 #1
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    current_date = localtime(now()).replace(hour=0,
                                            minute=0,
                                            second=0,
                                            microsecond=0)
    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in list(capacity_summary.keys()):
        facility_summary_obj = None
        if FacilityRelatedSummary.objects.filter(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date).exists():
            facility_summary_obj = FacilityRelatedSummary.objects.get(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date)
        else:
            facility_summary_obj = FacilityRelatedSummary(
                s_type="FacilityCapacity", facility_id=i)
        facility_summary_obj.data = capacity_summary[i]
        facility_summary_obj.save()

    return True
예제 #2
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    current_date = localtime(now()).replace(hour=0,
                                            minute=0,
                                            second=0,
                                            microsecond=0)

    for facility_obj in Facility.objects.all():
        # Calculate Actual Patients Discharged and Live in this Facility
        patients_in_facility = PatientRegistration.objects.filter(
            facility_id=facility_obj.id).select_related(
                "state", "district", "local_body")
        capacity_summary[facility_obj.id] = FacilitySerializer(
            facility_obj).data
        capacity_summary[facility_obj.id][
            "actual_live_patients"] = patients_in_facility.filter(
                is_active=True).count()
        discharge_patients = patients_in_facility.filter(is_active=False)
        capacity_summary[facility_obj.id][
            "actual_discharged_patients"] = discharge_patients.count()
        capacity_summary[facility_obj.id]["availability"] = []

    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
        if "availability" not in capacity_summary[facility_id]:
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in capacity_summary:
        facility_summary_obj = None
        if FacilityRelatedSummary.objects.filter(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date).exists():
            facility_summary_obj = FacilityRelatedSummary.objects.get(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date)
        else:
            facility_summary_obj = FacilityRelatedSummary(
                s_type="FacilityCapacity", facility_id=i)
        facility_summary_obj.data = capacity_summary[i]
        facility_summary_obj.save()

    return True
예제 #3
0
def PatientSummary():
    facility_objects = Facility.objects.all()
    patient_summary = {}
    for facility_object in facility_objects:
        facility_id = facility_object.id
        if facility_id not in patient_summary:
            latest_patient_consultations = (
                PatientConsultation.objects.filter(facility=facility_id).distinct("patient").values("pk")
            )
            facility_patients = PatientConsultation.objects.filter(pk__in=Subquery(latest_patient_consultations))

            icu = Q(patient__is_active=True) & Q(admitted_to=2)
            ventilator = Q(patient__is_active=True) & Q(admitted_to=3)
            isolation = Q(patient__is_active=True) & Q(admitted_to=1)
            home_quarantine = Q(patient__is_active=True) & Q(suggestion="HI")

            total_patients_icu = facility_patients.filter(icu).count()
            total_patients_ventilator = facility_patients.filter(ventilator).count()
            total_patients_isolation = facility_patients.filter(isolation).count()
            total_patients_home_quarantine = facility_patients.filter(home_quarantine).count()

            facility_patients_today = facility_patients.filter(created_date__startswith=now().date())

            today_patients_icu = facility_patients_today.filter(icu).count()
            today_patients_isolation = facility_patients_today.filter(isolation).count()
            today_patients_ventilator = facility_patients_today.filter(ventilator).count()
            today_patients_home_quarantine = facility_patients_today.filter(home_quarantine).count()

            patient_summary[facility_id] = {
                "facility_name": facility_object.name,
                "district": facility_object.district.name,
                "total_patients_icu": total_patients_icu,
                "total_patients_ventilator": total_patients_ventilator,
                "total_patients_isolation": total_patients_isolation,
                "total_patients_home_quarantine": total_patients_home_quarantine,
                "today_patients_icu": today_patients_icu,
                "today_patients_ventilator": today_patients_ventilator,
                "today_patients_isolation": today_patients_isolation,
                "today_patients_home_quarantine": today_patients_home_quarantine,
            }

    for i in list(patient_summary.keys()):
        object_filter = Q(s_type="PatientSummary") & Q(created_date__startswith=now().date())
        if FacilityRelatedSummary.objects.filter(facility_id=i).filter(object_filter).exists():
            facility = FacilityRelatedSummary.objects.filter(object_filter).get(facility_id=i)
            facility.created_date = now()
            facility.data.pop("modified_date")
            if facility.data == patient_summary[i]:
                pass
            else:
                facility.data = patient_summary[i]
                latest_modification_date = now()
                facility.data.update({"modified_date": latest_modification_date.strftime("%d-%m-%Y %H:%M")})
                facility.save()
        else:
            modified_date = now()
            patient_summary[i].update({"modified_date": modified_date.strftime("%d-%m-%Y %H:%M")})
            FacilityRelatedSummary(s_type="PatientSummary", facility_id=i, data=patient_summary[i]).save()
    return True
예제 #4
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in list(capacity_summary.keys()):
        FacilityRelatedSummary(s_type="FacilityCapacity",
                               facility_id=i,
                               data=capacity_summary[i]).save()

    return True
예제 #5
0
def TriageSummary():
    facilities = Facility.objects.all()
    current_date = localtime(now()).replace(hour=0,
                                            minute=0,
                                            second=0,
                                            microsecond=0)
    for facility in facilities:
        facility_patient_data = FacilityPatientStatsHistory.objects.filter(
            facility=facility).aggregate(
                total_patients_visited=Sum("num_patients_visited"),
                total_patients_home_quarantine=Sum(
                    "num_patients_home_quarantine"),
                total_patients_isolation=Sum("num_patients_isolation"),
                total_patients_referred=Sum("num_patient_referred"),
                total_patients_confirmed_positive=Sum(
                    "num_patient_confirmed_positive"),
                total_count=Count("id"),
            )
        total_count = facility_patient_data.get("total_count", 0)
        total_patients_home_quarantine = facility_patient_data.get(
            "total_patients_home_quarantine", 0)
        total_patients_referred = facility_patient_data.get(
            "total_patients_referred", 0)
        total_patients_isolation = facility_patient_data.get(
            "total_patients_visited", 0)
        total_patients_visited = facility_patient_data.get(
            "total_patients_isolation", 0)
        total_patients_confirmed_positive = facility_patient_data.get(
            "num_patient_confirmed_positive", 0)
        if total_count:
            avg_patients_home_quarantine = int(total_patients_home_quarantine /
                                               total_count)
            avg_patients_referred = int(total_patients_referred / total_count)
            avg_patients_isolation = int(total_patients_isolation /
                                         total_count)
            avg_patients_visited = int(total_patients_visited / total_count)
            avg_patients_confirmed_positive = int(
                total_patients_confirmed_positive / total_count)
        else:
            avg_patients_home_quarantine = 0
            avg_patients_referred = 0
            avg_patients_isolation = 0
            avg_patients_visited = 0
            avg_patients_confirmed_positive = 0

        facility_triage_summarised_data = {
            "facility_name": facility.name,
            "district": facility.district.name,
            "total_patients_home_quarantine": total_patients_home_quarantine,
            "total_patients_referred": total_patients_referred,
            "total_patients_isolation": total_patients_isolation,
            "total_patients_visited": total_patients_visited,
            "total_patients_confirmed_positive":
            total_patients_confirmed_positive,
            "avg_patients_home_quarantine": avg_patients_home_quarantine,
            "avg_patients_referred": avg_patients_referred,
            "avg_patients_isolation": avg_patients_isolation,
            "avg_patients_visited": avg_patients_visited,
            "avg_patients_confirmed_positive": avg_patients_confirmed_positive,
        }

        facility_triage_summary = FacilityRelatedSummary.objects.filter(
            s_type="TriageSummary",
            facility=facility,
            created_date__gte=current_date).first()

        if facility_triage_summary:
            facility_triage_summary.data = facility_triage_summarised_data
        else:
            facility_triage_summary = FacilityRelatedSummary(
                s_type="TriageSummary",
                facility=facility,
                data=facility_triage_summarised_data)
        facility_triage_summary.save()
예제 #6
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    current_date = localtime(now()).replace(hour=0,
                                            minute=0,
                                            second=0,
                                            microsecond=0)

    for facility_obj in Facility.objects.all():
        # Calculate Actual Patients Discharged and Live in this Facility
        patients_in_facility = PatientRegistration.objects.filter(
            facility_id=facility_obj.id).select_related(
                "state", "district", "local_body")
        capacity_summary[facility_obj.id] = FacilitySerializer(
            facility_obj).data
        capacity_summary[facility_obj.id][
            "actual_live_patients"] = patients_in_facility.filter(
                is_active=True).count()
        discharge_patients = patients_in_facility.filter(is_active=False)
        capacity_summary[facility_obj.id][
            "actual_discharged_patients"] = discharge_patients.count()
        capacity_summary[facility_obj.id]["availability"] = []

        temp_inventory_summary_obj = {}
        summary_objs = FacilityInventorySummary.objects.filter(
            facility_id=facility_obj.id)
        for summary_obj in summary_objs:
            burn_rate = FacilityInventoryBurnRate.objects.filter(
                facility_id=facility_obj.id,
                item_id=summary_obj.item.id).first()
            log_query = FacilityInventoryLog.objects.filter(
                facility_id=facility_obj.id,
                item_id=summary_obj.item.id,
                created_date__gte=current_date)
            start_log = log_query.order_by("created_date").first()
            end_log = log_query.order_by("-created_date").first()
            start_stock = summary_obj.quantity
            if start_log:
                start_stock = start_log.current_stock - start_log.quantity_in_default_unit
            end_stock = start_stock
            if end_log:
                end_stock = end_log.current_stock
            total_consumed = 0
            temp1 = log_query.filter(is_incoming=False).aggregate(
                Sum("quantity_in_default_unit"))
            if temp1:
                total_consumed = temp1["quantity_in_default_unit__sum"]
            total_added = 0
            temp2 = log_query.filter(is_incoming=True).aggregate(
                Sum("quantity_in_default_unit"))
            if temp2:
                total_added = temp2["quantity_in_default_unit__sum"]

            if burn_rate:
                burn_rate = burn_rate.burn_rate
            temp_inventory_summary_obj[summary_obj.item.id] = {
                "item_name":
                summary_obj.item.name,
                "stock":
                summary_obj.quantity,
                "unit":
                summary_obj.item.default_unit.name,
                "is_low":
                summary_obj.is_low,
                "burn_rate":
                burn_rate,
                "start_stock":
                start_stock,
                "end_stock":
                end_stock,
                "total_consumed":
                total_consumed,
                "total_added":
                total_added,
                "modified_date":
                summary_obj.modified_date.astimezone().isoformat(),
            }
        capacity_summary[
            facility_obj.id]["inventory"] = temp_inventory_summary_obj

    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
        if "availability" not in capacity_summary[facility_id]:
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in capacity_summary:
        facility_summary_obj = None
        if FacilityRelatedSummary.objects.filter(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date).exists():
            facility_summary_obj = FacilityRelatedSummary.objects.get(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date)
        else:
            facility_summary_obj = FacilityRelatedSummary(
                s_type="FacilityCapacity", facility_id=i)
        facility_summary_obj.data = capacity_summary[i]
        facility_summary_obj.save()

    return True
예제 #7
0
def PatientSummary():
    facility_objects = Facility.objects.all()
    patient_summary = {}
    for facility_object in facility_objects:
        facility_id = facility_object.id
        if facility_id not in patient_summary:
            patient_summary[facility_id] = {
                "facility_name": facility_object.name,
                "district": facility_object.district.name,
                "facility_external_id": str(facility_object.external_id),
            }

            patients = PatientRegistration.objects.filter(
                is_active=True,
                last_consultation__discharge_date__isnull=True,
                last_consultation__facility=facility_object,
            )

            # Get Total Counts

            for admitted_choice in ADMIT_CHOICES:
                db_value = admitted_choice[0]
                text = admitted_choice[1]
                filter = {"last_consultation__" + "admitted_to": db_value}
                count = patients.filter(**filter).count()
                clean_name = "total_patients_" + "_".join(text.lower().split())
                patient_summary[facility_id][clean_name] = count

            home_quarantine = Q(last_consultation__suggestion="HI")

            total_patients_home_quarantine = patients.filter(
                home_quarantine).count()
            patient_summary[facility_id][
                "total_patients_home_quarantine"] = total_patients_home_quarantine

            # Apply Date Filters

            patients_today = patients.filter(
                last_consultation__created_date__startswith=now().date())

            # Get Todays Counts

            today_patients_home_quarantine = patients_today.filter(
                home_quarantine).count()

            for admitted_choice in ADMIT_CHOICES:
                db_value = admitted_choice[0]
                text = admitted_choice[1]
                filter = {"last_consultation__" + "admitted_to": db_value}
                count = patients_today.filter(**filter).count()
                clean_name = "today_patients_" + "_".join(text.lower().split())
                patient_summary[facility_id][clean_name] = count

            # Update Anything Extra
            patient_summary[facility_id][
                "today_patients_home_quarantine"] = today_patients_home_quarantine

    for i in list(patient_summary.keys()):
        object_filter = Q(s_type="PatientSummary") & Q(
            created_date__startswith=now().date())
        if (FacilityRelatedSummary.objects.filter(
                facility_id=i).filter(object_filter).exists()):
            facility = FacilityRelatedSummary.objects.filter(
                object_filter).get(facility_id=i)
            facility.created_date = now()
            facility.data.pop("modified_date")
            if facility.data == patient_summary[i]:
                pass
            else:
                facility.data = patient_summary[i]
                latest_modification_date = now()
                facility.data.update({
                    "modified_date":
                    latest_modification_date.strftime("%d-%m-%Y %H:%M")
                })
                facility.save()
        else:
            modified_date = now()
            patient_summary[i].update(
                {"modified_date": modified_date.strftime("%d-%m-%Y %H:%M")})
            FacilityRelatedSummary(s_type="PatientSummary",
                                   facility_id=i,
                                   data=patient_summary[i]).save()
    return True