<!--- #10556 Pending Visits - AI Review Required column helpers --->
<cffunction name="pendingVisitIsEvalType" output="false" returntype="boolean">
	<cfargument name="visitType" type="string" required="true">
	<cfreturn (Len(Trim(arguments.visitType)) GT 0 AND FindNoCase("Eval", arguments.visitType) GT 0)>
</cffunction>

<cffunction name="pendingVisitIsOasisType" output="false" returntype="boolean">
	<cfargument name="visitType" type="string" required="true">
	<cfargument name="visittypes" type="string" required="false" default="">
	<cfset var vt = Trim(arguments.visitType)>
	<cfif Len(vt) EQ 0 OR pendingVisitIsEvalType(vt)>
		<cfreturn false>
	</cfif>
	<cfset var firstChar = Left(vt, 1)>
	<cfreturn ListFindNoCase("1,3,4,5,6,7,8,9", firstChar) GT 0>
</cffunction>

<cffunction name="getPendingVisitAssessmentPendingLabel" output="false" returntype="string">
	<cfargument name="visitType" type="string" required="true">
	<cfargument name="visittypes" type="string" required="false" default="">
	<cfset var vt = Trim(arguments.visitType)>
	<cfif pendingVisitIsEvalType(vt)>
		<cfreturn "Evaluation pending">
	</cfif>
	<cfif pendingVisitIsOasisType(vt)>
		<cfreturn "OASIS pending">
	</cfif>
	<cfreturn "Assessment pending">
</cffunction>

<!--- OASIS visits (SOC/ROC/Recert/etc.) do not use progress notes --->
<cffunction name="pendingVisitUsesProgressNotes" output="false" returntype="boolean">
	<cfargument name="visitType" type="string" required="true">
	<cfset var vt = Trim(arguments.visitType)>
	<cfif Len(vt) EQ 0>
		<!--- Routine / blank visit type uses progress notes --->
		<cfreturn true>
	</cfif>
	<!--- SOC, ROC, Recert, Transfer, Discharge, Death: assessment only --->
	<cfif pendingVisitIsOasisType(vt)>
		<cfreturn false>
	</cfif>
	<cfreturn true>
</cffunction>

<cffunction name="getPendingVisitAIReviewLabel" output="false" returntype="struct">
	<cfargument name="visitType" type="string" required="true">
	<cfargument name="assessmentsCompleted" type="any" required="true">
	<cfargument name="pgnotesdraft" type="numeric" required="true">
	<cfargument name="visittypes" type="string" required="true">

	<cfset var result = { "label" = "", "showWarningIcon" = false }>
	<cfset var vt = Trim(arguments.visitType)>
	<cfset var assessmentPending = false>
	<!--- #10556: SOC/OASIS visits do not have progress notes --->
	<cfset var progressPending = (pendingVisitUsesProgressNotes(vt) AND Val(arguments.pgnotesdraft) LT 2)>
	<cfset var assessmentLabel = getPendingVisitAssessmentPendingLabel(vt, arguments.visittypes)>

	<cfif Len(vt) GT 0 AND Val(arguments.assessmentsCompleted) NEQ 1>
		<cfset assessmentPending = true>
	</cfif>

	<cfif assessmentPending AND progressPending>
		<!--- Screenshot: combined assessment + routine/progress note --->
		<cfif assessmentLabel EQ "OASIS pending">
			<cfset result.label = "OASIS + Progress Note pending">
		<cfelseif assessmentLabel EQ "Evaluation pending">
			<cfset result.label = "Evaluation + Progress Note pending">
		<cfelse>
			<cfset result.label = "Assessment + Routine pending">
		</cfif>
		<cfset result.showWarningIcon = true>
	<cfelseif assessmentPending>
		<cfset result.label = assessmentLabel>
	<cfelseif progressPending>
		<cfset result.label = "Progress Note pending">
	</cfif>

	<cfreturn result>
</cffunction>

<!--- True when mobile/app whisper upload flagged Review_Status=1 for this assessment or schedule --->
<cffunction name="pendingVisitHasAppAIReviewRequired" output="false" returntype="boolean">
	<cfargument name="assmtId" type="any" required="false" default="0">
	<cfargument name="scheduleId" type="any" required="false" default="0">
	<cfargument name="aiReviewAssmtList" type="string" required="false" default="">
	<cfargument name="aiReviewScheduleList" type="string" required="false" default="">

	<cfset var aid = Val(arguments.assmtId)>
	<cfset var sid = Val(arguments.scheduleId)>
	<cfif aid GT 0 AND Len(Trim(arguments.aiReviewAssmtList)) AND ListFind(arguments.aiReviewAssmtList, aid) GT 0>
		<cfreturn true>
	</cfif>
	<cfif sid GT 0 AND Len(Trim(arguments.aiReviewScheduleList)) AND ListFind(arguments.aiReviewScheduleList, sid) GT 0>
		<cfreturn true>
	</cfif>
	<cfreturn false>
</cffunction>

<cffunction name="patientHasPendingAdmissionDraft" output="false" returntype="boolean">
	<cfargument name="patientId" type="numeric" required="true">
	<cfargument name="assmtId" type="numeric" required="false" default="0">
	<cfquery name="qAdmitDraft" datasource="#Application.DataSrc#">
		SELECT pAdmit.drafts
		FROM #Request.prefix_db_agency#.pAdmit
		WHERE pAdmit.Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.patientId#">
		AND pAdmit.Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
		<cfif Val(arguments.assmtId) GT 0>
			AND pAdmit.Admit_ID = (
				SELECT Admit_ID FROM #Request.prefix_db_agency#.pAssessments
				WHERE Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.assmtId#">
				AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
				LIMIT 1
			)
		</cfif>
		ORDER BY pAdmit.Admit_ID DESC
		LIMIT 1
	</cfquery>
	<cfreturn (qAdmitDraft.RecordCount GT 0 AND Val(qAdmitDraft.drafts) EQ 1)>
</cffunction>

<cffunction name="patientHasIncompleteActiveMedsForAIReview" output="false" returntype="boolean">
	<cfargument name="patientId" type="numeric" required="true">
	<cfquery name="qIncompleteMeds" datasource="#Application.DataSrc#">
		SELECT PtMeds_ID
		FROM #Request.prefix_db_agency#.pPtmeds
		WHERE Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.patientId#">
		AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
		AND (
			LOWER(TRIM(IFNULL(Dose_Units,''))) = <cfqueryparam cfsqltype="cf_sql_varchar" value="not available">
			OR LOWER(TRIM(IFNULL(Route,''))) = <cfqueryparam cfsqltype="cf_sql_varchar" value="not available">
			OR LOWER(TRIM(IFNULL(Freq,''))) = <cfqueryparam cfsqltype="cf_sql_varchar" value="not available">
			OR In_Home IS NULL
			OR In_Home = <cfqueryparam cfsqltype="cf_sql_integer" value="2">
		)
		LIMIT 1
	</cfquery>
	<cfreturn qIncompleteMeds.RecordCount GT 0>
</cffunction>

<!--- Redirect to Meds when active meds still need review (not available / pending in-home / unset in-home) --->
<cffunction name="enforcePatientMedReviewOrRedirect" output="false" returntype="void">
	<cfargument name="patientId" type="numeric" required="true">
	<cfargument name="encPatientId" type="string" required="false" default="">
	<cfargument name="scheduleId" type="numeric" required="false" default="0">
	<cfargument name="encAid" type="string" required="false" default="">
	<cfargument name="encSid" type="string" required="false" default="">
	<cfargument name="returnUrl" type="string" required="false" default="">

	<cfif NOT patientHasIncompleteActiveMedsForAIReview(arguments.patientId)>
		<cfreturn />
	</cfif>

	<cfset var encPid = Trim(arguments.encPatientId) />
	<cfif Len(encPid) EQ 0 AND Val(arguments.patientId) GT 0>
		<cfset encPid = encrypt(arguments.patientId, application.enckey, "AES", "Hex") />
	</cfif>

	<cfset session.cs.patientid = arguments.patientId />
	<cfif Len(encPid)>
		<cfset session.cs.enc_patientid = encPid />
	</cfif>

	<cfif Val(arguments.scheduleId) GT 0>
		<cfset session.cs.ScheduleID = Val(arguments.scheduleId) />
		<cfset session.cs.pendingVisitMedReview = 1 />
		<cfif Len(Trim(arguments.encSid))>
			<cfset session.cs.pendingVisitEncSID = arguments.encSid />
		</cfif>
		<cfif Len(Trim(arguments.encAid))>
			<cfset session.cs.pendingVisitEncAID = arguments.encAid />
		</cfif>
	<cfelseif Len(Trim(arguments.returnUrl))>
		<cfset session.cs.pendingVisitMedReview = 1 />
	<cfelse>
		<cfset session.cs.pendingVisitMedReview = 0 />
	</cfif>

	<cfif Len(Trim(arguments.returnUrl))>
		<cfset session.cs.pendingSocMedReturnUrl = Trim(arguments.returnUrl) />
	</cfif>

	<cflocation url="/patientadmin_new/index.cfm?page=patient&ID=#encPid#&cat=medlist&med_incomplete_alert=1" addtoken="no">
</cffunction>
