
<cfquery  datasource="#Application.DataSrc#" name="GtDX2">
	 SELECT p.*, pt.*,a.AutoAssmt_ID,a.Admit_ID,a.Assmt_ID,a.F26,a.F176,
	 a.F320 AS QA_View  FROM #Request.prefix_db_agency#.pProblem p
	 LEFT OUTER JOIN #Request.prefix_db_lookup#.meds_pathway_lookup mdp ON mdp.Path_ID = p.Path_ID  AND   mdp.Agency_ID IS NULL
     JOIN #Request.prefix_db_agency#.pAssessments a ON a.Assmt_ID = p.Assmt_ID
	 JOIN #Request.prefix_db_agency#.pPatients pt  ON pt.Patient_ID = a.Patient_ID
	 JOIN #Request.prefix_db_agency#.pAdmit ad  ON ad.Admit_ID = a.Admit_ID
	  JOIN (
    SELECT Admit_ID
    FROM #Request.prefix_db_agency#.pAdmit 
    WHERE Patient_ID = '#session.cs.patientid#' AND Status = 0
    ORDER BY M0030_START_CARE_DT DESC 
    LIMIT 1
) AS latest_admit ON latest_admit.Admit_ID = a.Admit_ID
	 WHERE ad.status = 0
	 AND pt.status IN (0,1,4)
	 AND a.status = 0
	 AND p.status = 0
	 AND pt.Patient_ID = '#session.cs.patientid#'
	 <!---AND p.Skill ='SN'--->
	 <!---AND ad.M0030_START_CARE_DT >= '2024-10-01'--->
	   AND (a.F26 like '1%' OR a.F26 like '4%' OR a.F26 like 'Hospice admission'
	   	OR a.Assmt_ID = '#parent_OASIS.Assmt_ID#')
	      <!---  AND a.F25 = 1  --->
	      AND a.F176 < #Now()#
     AND p.M0_No like 'M102%'
     GROUP BY p.Problem_ID,p.Assmt_ID
	 ORDER BY p.Assmt_ID, a.F177 DESC, p.dx_order ASC
</cfquery>
 
<cfset i = 1>	
<cfset Orphan_IDs = ArrayNew(1)>
<cfset Assmt_IDs = ArrayNew(1)>
<cfset PtMeds_IDs = ArrayNew(1)>
<cfset Drug_Name_array = ArrayNew(1)>
<cfset Med_Dx_ID = ArrayNew(1)>
<cfset Diagnosis_array = ArrayNew(1)>
<cfset Paired_array = ArrayNew(1)>
<cfset Request.Max_Orphan_ID =  0 >
<cfoutput query="GtDX2" group="Assmt_ID" >	
	<cfset orphan_insertion = 0 >
	<cfset currentDateTime = DateTimeFormat(Now(), "yyyy-mm-dd HH:mm:ss")>
	<cfif Request.Max_Orphan_ID EQ 0 >
		<cfquery  name="getorphans_id" datasource="#Application.DataSrc#">
			SELECT IFNULL(MAX(Orphan_ID),0) AS Max_Orphan_ID 
			FROm #Request.prefix_db_agency#.pMed_Recon
		</cfquery>
		<cfset Request.Max_Orphan_ID =  #getorphans_id.Max_Orphan_ID#  />
	</cfif>
	<cfquery  name="getorphans_ass" datasource="#Application.DataSrc#">
		SELECT  * FROm #Request.prefix_db_agency#.pMed_Recon
		WHERE Assmt_ID =  '#Assmt_ID#' AND  Med_Dx_ID = #Problem_ID# AND status = 0
	</cfquery>
	<cfif getorphans_ass.recordcount EQ 0 >
		<cfset orphan_insertion = 1 >
	</cfif>
	<!--- Diagnosis with paired symptoms --->
	<cfoutput>
		<cfquery  datasource="#Application.DataSrc#" name="getMed_Recon">
			select * from #Request.prefix_db_agency#.pMed_Recon
			where status = 0
			and Med_Dx_ID = '#Problem_ID#'
			AND Assmt_ID = '#Assmt_ID#'
		</cfquery>
		<cfquery  datasource="#Application.DataSrc#" name="getpMeds">
			select pPtmeds.*,mdp.Approved from #Request.prefix_db_agency#.pPtmeds
			LEFT OUTER JOIN #Request.prefix_db_lookup#.meds_pathway_lookup mdp ON mdp.Trade_Num = pPtmeds.Drug_ID
			AND mdp.Path_ID = '#GtDX2.Path_ID#'
			where pPtmeds.status = 0
			and pPtmeds.Patient_ID = '#Patient_ID#'
			GROUP BY pPtmeds.PtMeds_ID
		</cfquery>

		<cfif M0_No contains 'M102' AND getMed_Recon.recordcount EQ 0>
			<cfif getpMeds.recordcount gt 0 >
			 	<cfloop query="getpMeds">
			 		<cfquery  dbtype="query" name="getmeds_recon">
						SELECT * FROM getMed_Recon
						WHERE Med_Dx_ID = '#GtDX2.Problem_ID#'
						AND PtMeds_ID = '#PtMeds_ID#'
 					</cfquery>
			 		<cfif <!--- orphan_insertion EQ 1 AND---> getmeds_recon.recordcount EQ 0>
				 		<cfset Request.Max_Orphan_ID =  Request.Max_Orphan_ID + 1 />
				 		<cfset ArrayAppend(Orphan_IDs, #Request.Max_Orphan_ID#)/>
				 		<cfset ArrayAppend(Assmt_IDs, #GtDX2.Assmt_ID#)/>
				 		<cfset ArrayAppend(PtMeds_IDs, #getpMeds.PtMeds_ID#)/>
				 		<cfset ArrayAppend(Drug_Name_array, #getpMeds.Drug_Name#)/>
				 		<cfset ArrayAppend(Med_Dx_ID, #GtDX2.Problem_ID#)/>
				 		<cfset ArrayAppend(Diagnosis_array, #GtDX2.Description#)/>
				 		<cfif getpMeds.Approved  EQ 'Yes'>
				 			<cfset ArrayAppend(Paired_array, 'Y')/>
				 		<cfelse>
				 			<cfset ArrayAppend(Paired_array, 'N')/>
				 		</cfif>
				 	</cfif>
			 	</cfloop>
			</cfif>
		</cfif>
	</cfoutput>
</cfoutput>

<!--- pMed_Recon table INSERT START --->
<cfif ArrayLen(PtMeds_IDs) gt 0>
	<cfset total_array = ArrayLen(PtMeds_IDs) />
	<cfquery  datasource="#Application.DataSrc#" name="Insert_pMed_Recon">
		INSERT INTO #Request.prefix_db_agency#.pMed_Recon
		( Orphan_ID, Assmt_ID, PtMeds_ID, Drug_Name, Med_Dx_ID, Diagnosis, Paired,automatic_paired,
		 Date_Created, Created_By)
			VALUES
			 <cfloop from="1" to ="#total_array#" index ="j">
                (<cfqueryparam value="#Orphan_IDs[j]#" cfsqltype="CF_SQL_INTEGER">,
                	<cfqueryparam value="#Assmt_IDs[j]#" cfsqltype="CF_SQL_INTEGER">,
                	<cfqueryparam value="#PtMeds_IDs[j]#" cfsqltype="CF_SQL_INTEGER">,
                	<cfqueryparam value="#Drug_Name_array[j]#" cfsqltype="CF_SQL_VARCHAR">,
                	<cfqueryparam value="#Med_Dx_ID[j]#" cfsqltype="CF_SQL_INTEGER">,
                	<cfqueryparam value="#Diagnosis_array[j]#" cfsqltype="CF_SQL_VARCHAR">,
                	<cfqueryparam value="#Paired_array[j]#" cfsqltype="CF_SQL_VARCHAR">,
                	<cfqueryparam value="#Paired_array[j]#" cfsqltype="CF_SQL_VARCHAR">,
                	<cfqueryparam value="#now()#" cfsqltype="CF_SQL_TIMESTAMP">,
                	<cfqueryparam value="#session.employeeid#" cfsqltype="CF_SQL_INTEGER">
                )
                <cfif total_array NEQ j>,</cfif>
            </cfloop>
	</cfquery>

	<!--- Get the latest assessment ID for this patient --->
	<cfquery  name="getLatestAssmt" datasource="#Application.DataSrc#">
		SELECT Assmt_ID
		FROM #Request.prefix_db_agency#.pAssessments
		WHERE Patient_ID = <cfqueryparam value="#session.cs.patientid#" cfsqltype="cf_sql_integer">
		AND Status = <cfqueryparam value="0" cfsqltype="cf_sql_varchar">
		AND (F26 like '1%' OR F26 like '4%')
		ORDER BY Assmt_ID DESC
		LIMIT 1
	</cfquery>
	<!--- Check if pCareplan records exist for the latest assessment before updating Med_Approve and Med_Recon_Field --->
	<cfif getLatestAssmt.recordcount GT 0>
		<cfquery  name="check_pCareplan" datasource="#Application.DataSrc#">
			SELECT COUNT(*) AS careplan_count
			FROM #Request.prefix_db_agency#.pCareplan
			WHERE Assmt_ID = <cfqueryparam value="#getLatestAssmt.Assmt_ID#" cfsqltype="cf_sql_integer">
			AND Status = <cfqueryparam value="0" cfsqltype="cf_sql_integer">
		</cfquery>
	<cfelse>
		<cfset check_pCareplan = QueryNew("careplan_count") />
		<cfset QueryAddRow(check_pCareplan) />
		<cfset QuerySetCell(check_pCareplan, "careplan_count", 0) />
	</cfif>
	<!--- Only update Med_Approve and Med_Recon_Field if no pCareplan records exist for the latest assessment --->
	<cfif check_pCareplan.careplan_count EQ 0>
		<cfquery  name="update_patients_medsapprove" datasource="#Application.DataSrc#">
			UPDATE  #Request.prefix_db_agency#.pPatients
			SET Med_Approve = 0,
			Med_Recon_Field = 0
			WHERE  Status IN (0,1,4)
			AND Patient_ID =  '#session.cs.patientid#'
		</cfquery>
	</cfif>

</cfif>



<cfif Request.Max_Orphan_ID EQ 0 >
	<cfquery  name="getorphans_id" datasource="#Application.DataSrc#">
		SELECT IFNULL(MAX(Orphan_ID),0) AS Max_Orphan_ID 
		FROm #Request.prefix_db_agency#.pMed_Recon
	</cfquery>
	<cfset Request.Max_Orphan_ID =  #getorphans_id.Max_Orphan_ID#  />
</cfif>
<!--- Batch fetch all medications that need to be inserted --->
<cfset insertMedReconArray = ArrayNew(1) />
<cfset needsPatientUpdate = false />
<cfif GtDX2.recordcount gt 0>
	<cfset allAssmtIDsForMeds = ValueList(GtDX2.Assmt_ID) />
</cfif>

<cfoutput query="GtDX2" group="Assmt_ID" >	
	<cfquery  datasource="#Application.DataSrc#" name="Getmeds">
		SELECT  *   FROM #Request.prefix_db_agency#.pPtmeds
		  WHERE   pPtmeds.Patient_ID = <cfqueryparam value="#getP.Patient_Id#" cfsqltype="CF_SQL_INTEGER">
		  AND PtMeds_ID NOT IN (SELECT PtMeds_ID FROM #Request.prefix_db_agency#.pMed_Recon
		  	WHERE Status = 0 AND Assmt_ID = <cfqueryparam value="#Assmt_ID#" cfsqltype="CF_SQL_INTEGER">)
		  AND pPtmeds.status = 0
		  GROUP BY PtMeds_ID 
		  ORDER BY pPtmeds.status ASC
	</cfquery>
	<cfif Getmeds.recordcount gt 0>
		<cfset needsPatientUpdate = true />
		<cfloop query="Getmeds">
			<cfset Request.Max_Orphan_ID = Request.Max_Orphan_ID + 1 />
			<cfset medRecord = StructNew() />
			<cfset medRecord.Orphan_ID = Request.Max_Orphan_ID />
			<cfset medRecord.Assmt_ID = GtDX2.Assmt_ID />
			<cfset medRecord.PtMeds_ID = PtMeds_ID />
			<cfset medRecord.Drug_Name = Drug_Name />
			<cfset medRecord.Med_Dx_ID = GtDX2.Problem_ID />
			<cfset medRecord.Diagnosis = GtDX2.Description />
			<cfset ArrayAppend(insertMedReconArray, medRecord) />
		</cfloop>
	</cfif>
</cfoutput>

<!--- Batch insert all medication records --->
<cfif ArrayLen(insertMedReconArray) GT 0>
	<cfquery  datasource="#Application.DataSrc#" name="Insert_pMed_Recon_batch">
		INSERT INTO #Request.prefix_db_agency#.pMed_Recon
		( Orphan_ID, Assmt_ID, PtMeds_ID, Drug_Name, Med_Dx_ID, Diagnosis, Paired, automatic_paired,
		 Date_Created, Created_By)
		VALUES
		<cfloop from="1" to="#ArrayLen(insertMedReconArray)#" index="idx">
			(<cfqueryparam value="#insertMedReconArray[idx].Orphan_ID#" cfsqltype="CF_SQL_INTEGER">,
			 <cfqueryparam value="#insertMedReconArray[idx].Assmt_ID#" cfsqltype="CF_SQL_INTEGER">,
			 <cfqueryparam value="#insertMedReconArray[idx].PtMeds_ID#" cfsqltype="CF_SQL_INTEGER">,
			 <cfqueryparam value="#insertMedReconArray[idx].Drug_Name#" cfsqltype="CF_SQL_VARCHAR">,
			 <cfqueryparam value="#insertMedReconArray[idx].Med_Dx_ID#" cfsqltype="CF_SQL_INTEGER">,
			 <cfqueryparam value="#insertMedReconArray[idx].Diagnosis#" cfsqltype="CF_SQL_VARCHAR">,
			 <cfqueryparam value="N" cfsqltype="CF_SQL_VARCHAR">,
			 <cfqueryparam value="N" cfsqltype="CF_SQL_VARCHAR">,
			 <cfqueryparam value="#now()#" cfsqltype="CF_SQL_TIMESTAMP">,
			 <cfqueryparam value="#session.employeeid#" cfsqltype="CF_SQL_INTEGER">)
			<cfif idx LT ArrayLen(insertMedReconArray)>,</cfif>
		</cfloop>
	</cfquery>
</cfif>

<cfif needsPatientUpdate>
	<!--- Get the latest assessment ID for this patient --->
	<cfquery  name="getLatestAssmt" datasource="#Application.DataSrc#">
		SELECT Assmt_ID
		FROM #Request.prefix_db_agency#.pAssessments
		WHERE Patient_ID = <cfqueryparam value="#session.cs.patientid#" cfsqltype="cf_sql_integer">
		AND Status = <cfqueryparam value="0" cfsqltype="cf_sql_varchar">
		ORDER BY Assmt_ID DESC
		LIMIT 1
	</cfquery>
	<!--- Check if pCareplan records exist for the latest assessment before updating Med_Approve and Med_Recon_Field --->
	<cfif getLatestAssmt.recordcount GT 0>
		<cfquery  name="check_pCareplan" datasource="#Application.DataSrc#">
			SELECT COUNT(*) AS careplan_count
			FROM #Request.prefix_db_agency#.pCareplan
			WHERE Assmt_ID = <cfqueryparam value="#getLatestAssmt.Assmt_ID#" cfsqltype="cf_sql_integer">
			AND Status = <cfqueryparam value="0" cfsqltype="cf_sql_integer">
		</cfquery>
	<cfelse>
		<cfset check_pCareplan = QueryNew("careplan_count") />
		<cfset QueryAddRow(check_pCareplan) />
		<cfset QuerySetCell(check_pCareplan, "careplan_count", 0) />
	</cfif>
	<!--- Only update Med_Approve and Med_Recon_Field if no pCareplan records exist for the latest assessment --->
	<cfif check_pCareplan.careplan_count EQ 0>
		<cfquery  name="update_patients_medsapprove" datasource="#Application.DataSrc#">
			UPDATE  #Request.prefix_db_agency#.pPatients
			SET Med_Approve = 0,
			Med_Recon_Field = 0
			WHERE  Status IN (0,1,4)
			AND Patient_ID = <cfqueryparam value="#session.cs.patientid#" cfsqltype="CF_SQL_INTEGER">
		</cfquery>
	</cfif>
</cfif>

<!--- Batch delete orphaned medication records for all assessments --->
<cfif GtDX2.recordcount gt 0>
	<cfset allAssmtIDsForDelete = ValueList(GtDX2.Assmt_ID) />
	<cfquery  name="delete_pMed_Recon" datasource="#Application.DataSrc#">
		UPDATE  #Request.prefix_db_agency#.pMed_Recon
		SET Status = 2
		WHERE  Status = 0 
		AND PtMeds_ID NOT IN (
			SELECT PtMeds_ID FROM #Request.prefix_db_agency#.pPtmeds
			WHERE Patient_ID = <cfqueryparam value="#session.cs.patientid#" cfsqltype="CF_SQL_INTEGER">
			AND Status = 0)
		AND Assmt_ID IN (<cfqueryparam value="#allAssmtIDsForDelete#" cfsqltype="CF_SQL_INTEGER" list="yes">)
	</cfquery>
</cfif>

