<cfcomponent displayname="Authorization Functions" hint="I Return Authorization Information" output="false">
	
	<cfset client.Loc_ID = 0 />
	
   <cffunction name="init" displayname="Initialize Component" access="public" returntype="Authorization" hint="I initialize and return the Authorization object.">
		<cfreturn this>
	</cffunction>
    
    <cffunction name="getauthorizations"  returntype="any" access="public" output="false" >
	   <cfargument name="Auth_ID" required="no" hint="Auth_ID">
	  	<cfquery name = "getauth" datasource="#Application.DataSrc#">
			SELECT pAuths.*,pPayer.Auth_Req,pPayer.Output FROM #Request.prefix_db_agency#.pAuths 
			JOIN #Request.prefix_db_agency#.pPtPayer  ON pAuths.PtPayer_ID = pPtPayer.PtPayer_ID AND  pPtPayer.Status = 0
    		JOIN #Request.prefix_db_agency#.pPayer ON pPayer.Pay_ID = pPtPayer.Payer_ID AND  pPayer.Status = 0
			WHERE pAuths.STATUS !=  <cfqueryparam cfsqltype="cf_sql_integer" value="3">
			AND  pAuths.AutoAuth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#"> 
	  	</cfquery>
		<cfreturn getauth>
	</cffunction>

	<cffunction name="getauthorizationslist"  returntype="any" access="public" output="false" >
	   <cfargument name="Assmt_ID" required="no" hint="Assmt_ID" default="0">
	   	<cfargument name="Admit_ID" required="no" hint="Admit_ID" default="0">

	    <!----  <cfquery name = "getauths" datasource="#Application.DataSrc#">
	        UPDATE #Request.prefix_db_agency#.pAuths  
	        SET Status = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
	     	WHERE Date_End < CURDATE()
	     	AND Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.cs.patientid#">
	     	AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
	     </cfquery> --->

	  	<cfquery name = "getauth" datasource="#Application.DataSrc#">
			SELECT pAuths.*,pRevenue_Code.Visit_Type,pRevenue_Code.Rev_Code,pRevenue_Code.HCPCS,pPtPayer.Sub_First,pPayer.Pay_Name,pAssessments.F26,pAssessments.F177,pAssessments.F178,pAssessments.Admit_ID,pPayer.Pay_ID,pRevenue_Code.Description,pPayer.Output,pPayer.auth_measure,pPayer.bypass_compliance,pAdmit.Admit_Type,
			CONCAT(pEmployee.Emp_First , ", ", pEmployee.Emp_Last) AS name_by
			 FROM #Request.prefix_db_agency#.pAuths 
			JOIN #Request.prefix_db_agency#.pRevenue_Code ON pRevenue_Code.Rev_CodeID = pAuths.Rev_ID AND pRevenue_Code.Status = 0
			JOIN #Request.prefix_db_agency#.pPtPayer ON pPtPayer.PtPayer_ID = pAuths.PtPayer_ID AND pPtPayer.Status < 2
			JOIN #Request.prefix_db_agency#.pPayer ON pPayer.Pay_ID = pPtPayer.Payer_ID AND pPayer.Status = 0
			LEFT OUTER JOIN #Request.prefix_db_agency#.pAssessments ON pAssessments.Assmt_ID = pAuths.Assmt_ID AND pAssessments.Status = 0
			LEFT OUTER JOIN #Request.prefix_db_agency#.pAdmit ON pAdmit.Admit_ID = pAssessments.Admit_ID 
			LEFT OUTER JOIN #Request.prefix_db_lookup#.pEmployee ON pAuths.Created_by = pEmployee.Emp_ID
			WHERE pAuths.STATUS  <  <cfqueryparam cfsqltype="cf_sql_integer" value="2">
			AND pAuths.Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.cs.patientid#">
			<cfif arguments.Assmt_ID neq 0 >
				AND pAuths.Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
			</cfif>
			<cfif arguments.Admit_ID neq 0 >
				AND pAdmit.Admit_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Admit_ID#">
			</cfif>
			<cfif arguments.Assmt_ID neq 0 >
				 AND pAssessments.Admit_ID  IN ( SELECT pAdmit.Admit_ID FROM #Request.prefix_db_agency#.pAdmit 
				 WHERE pAdmit.Status < 2 AND Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.cs.patientid#"> )
			 </cfif>
			GROUP BY pAuths.AutoAuth_ID 
		</cfquery>
		<cfreturn getauth>

	</cffunction>

	<cffunction name="getactiveauth"  returntype="any" access="public" output="false" >
	   <cfargument name="Auth_ID" required="yes" hint="Auth_ID">

	  	<cfquery name = "getauth" datasource="#Application.DataSrc#">
			SELECT * FROM #Request.prefix_db_agency#.pAuths 
			WHERE STATUS !=  <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			AND Auth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#"> 
	  	</cfquery>
		<cfreturn getauth>
	</cffunction>

	<cffunction name="getfrequency"  access="remote" output="Yes" httpmethod="GET" returnformat="JSON">
			  <cfargument name="Visit_No" required="yes" hint="Visit_No"> 
			  <cfquery name="get_label" datasource="#Application.DataSrc#">    
			          SELECT * FROM  #Request.prefix_db_lookup#.pVisit_Frequency
			          WHERE Visit_No = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Visit_No#"> 
					  ORDER BY ID ASC
			 </cfquery> 
			 <cfset label_name = '' >
			 <cfset responsekey=[] />
			 <cfoutput query="get_label" group="Visit_No">
				 <cfset obj={"Set_1_visits"=#Set_1_visits# ,"Set_1_weeks" = #Set_1_weeks#,"Set_2_visits"=#Set_2_visits# ,"Set_2_weeks" = #Set_2_weeks#,"Set_3_visits"=#Set_3_visits# ,"Set_3_weeks" = #Set_3_weeks#,"Set_4_visits"=#Set_4_visits#,"Set_4_weeks" = #Set_4_weeks# }  />
                  <cfset arrayAppend(responsekey, obj) />
			 </cfoutput>
			 <cfset response={"answer_labels"= #responsekey#} />
			 <cfreturn response />
    </cffunction> 

   	<cffunction name="Checktotalvisits" access="remote" returnformat="plain" returntype="string">
		<cfargument name="Auth_ID" required="yes" hint="Auth ID">
		<cfargument name="Patient_ID" required="yes" hint="Patient_ID">
		<cfargument name="Assmt_ID" required="yes" hint="Assmt ID">
		<cfargument name="selectedvisit" required="no" hint="0" default="1">

        <cfif #Request.prefix_db_agency# neq 'prefix_db_agency_invalid'>
			<cfquery name="total_visit" datasource="#Application.DataSrc#">
				SELECT IFNULL(count(*),0) AS totalcount FROM #Request.prefix_db_agency#.pSchedules
				WHERE  Patient_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Patient_ID#">
		        AND  Assmt_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
		        AND  Auth_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
		        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
		        AND (Visit_Type is NULL OR (Visit_Type  NOT LIKE '6%' AND Visit_Type  NOT LIKE '7%'))
		        AND Missed = 0 
			</cfquery>
			<cfif arguments.selectedvisit  EQ 1 >
				<cfset totalschedulingvisit =  total_visit.totalcount + arguments.selectedvisit>
			<cfelse>
				<cfset totalschedulingvisit =  arguments.selectedvisit>
			</cfif>

			<cfquery name="getauth" datasource="#Application.DataSrc#">
				SELECT pAuths.*, pPayer.bypass_compliance, pPayer.auth_measure, pAdmit.Admit_Type
				FROM #Request.prefix_db_agency#.pAuths
				JOIN #Request.prefix_db_agency#.pPtPayer ON pAuths.PtPayer_ID = pPtPayer.PtPayer_ID AND pPtPayer.Status = 0
				JOIN #Request.prefix_db_agency#.pPayer ON pPayer.Pay_ID = pPtPayer.Payer_ID AND pPayer.Status = 0
				LEFT JOIN #Request.prefix_db_agency#.pAssessments ON pAuths.Assmt_ID = pAssessments.Assmt_ID AND pAssessments.Status = 0
				LEFT JOIN #Request.prefix_db_agency#.pAdmit ON pAssessments.Admit_ID = pAdmit.Admit_ID AND pAdmit.Status = 0
				WHERE pAuths.Patient_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Patient_ID#">
		        AND  pAuths.Assmt_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
		        AND  pAuths.Auth_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
		        AND pAuths.Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			</cfquery>
			<!--- <cfset totalauthorizedvisit = #getauth.Total_Visits# + #getauth.prn_visits# > --->
			<cfset totalauthorizedvisit = #getauth.Total_Visits#>

			<!--- Check if we should skip visit count validation --->
			<cfset skip_visit_validation = false>
			<cfif getauth.recordcount GT 0>
				<cfif getauth.bypass_compliance EQ 1>
					<cfset skip_visit_validation = true>
				<cfelseif getauth.Admit_Type EQ 'Non-Medical'>
					<cfset skip_visit_validation = true>
				<cfelseif getauth.auth_measure EQ 'units' OR getauth.auth_measure EQ 'hours'>
					<cfset skip_visit_validation = true>
				</cfif>
			</cfif>

			<!--- If skipping validation, return Success immediately --->
			<cfif skip_visit_validation>
				<cfreturn 'Success'>
			</cfif>

			<cfif totalschedulingvisit LTE totalauthorizedvisit OR arguments.Auth_ID EQ 0>
				<cfreturn 'Success'>
			<cfelse>
			   <cfif selectedvisit eq 1>
					<cfset message = "Already total scheduled visits are "& #total_visit.totalcount# & " but authorized visit are "& #totalauthorizedvisit# &". So please try to create new visit with different authorization." />
					<cfset message ="New visit exceeds total visits established in related authorization. Change the number of visits in the related authorization if necessary" />
				<cfelse>
					<cfset message = "Already Total scheduled visits are "& #total_visit.totalcount# &  " but authorized visit are "& #totalauthorizedvisit# & ". So please try to unselect few dates or please try with different authorization." />
					<cfset message ="New visit exceeds total visits established in related authorization. Change the number of visits in the related authorization if necessary" />
				</cfif>
				 <cfreturn message>
			</cfif>
		<cfelse>
			<cfreturn 'Failure'>
		</cfif>
	</cffunction>

	<!--- Match patientpayers_forms.cfm: default Util_Force Yes for Medicare when not explicitly saved on pPtPayer --->
	<cffunction name="getEffectiveUtilForce" access="public" returntype="numeric" output="false">
		<cfargument name="utilForce" required="false" default="">
		<cfargument name="m0150" required="false" default="">
		<cfif Len(Trim("" & arguments.utilForce)) OR (IsNumeric(arguments.utilForce) AND Val(arguments.utilForce) EQ 0)>
			<cfreturn Val(arguments.utilForce) />
		</cfif>
		<cfif Len(Trim(arguments.m0150)) AND Left(Trim(arguments.m0150), 1) EQ "1" AND Left(Trim(arguments.m0150), 2) NEQ "10">
			<cfreturn 1 />
		</cfif>
		<cfreturn 0 />
	</cffunction>

	<cffunction name="checkUtilForceHippsCap" access="remote" returnformat="plain" returntype="string">
		<cfargument name="Auth_ID" required="no" default="0">
		<cfargument name="Patient_ID" required="yes">
		<cfargument name="Assmt_ID" required="yes">
		<cfargument name="PtPayer_ID" required="yes">
		<cfargument name="Total_Visits" required="yes" default="0">
		<cfargument name="no_assessments" required="no" default="0">

		<cfset var hippsCapMessage = "Visits exceeds average for this HIPPS Score. Contact Clinical Director." />

		<cfif Val(arguments.no_assessments) EQ 1 OR Val(arguments.Assmt_ID) EQ 0 OR Val(arguments.PtPayer_ID) EQ 0>
			<cfreturn "Success">
		</cfif>
		<cfif #Request.prefix_db_agency# EQ 'prefix_db_agency_invalid'>
			<cfreturn "Success">
		</cfif>

		<cfquery name="getUtilForcePayer" datasource="#Application.DataSrc#">
			SELECT pPayer.M0150, pPtPayer.Util_Force
			FROM #Request.prefix_db_agency#.pPtPayer pPtPayer
			JOIN #Request.prefix_db_agency#.pPayer pPayer ON pPayer.Pay_ID = pPtPayer.Payer_ID AND pPayer.Status = 0
			WHERE pPtPayer.PtPayer_ID = <cfqueryparam value="#arguments.PtPayer_ID#" cfsqltype="cf_sql_integer">
			AND pPtPayer.Status = 0
			LIMIT 1
		</cfquery>
		<cfset var effectiveUtilForce = 0 />
		<cfif getUtilForcePayer.recordcount GT 0>
			<cfset effectiveUtilForce = getEffectiveUtilForce(getUtilForcePayer.Util_Force, getUtilForcePayer.M0150) />
		</cfif>
		<cfif getUtilForcePayer.recordcount EQ 0
			OR effectiveUtilForce NEQ 1
			OR NOT (Left(Trim(getUtilForcePayer.M0150), 1) EQ "1" AND Left(Trim(getUtilForcePayer.M0150), 2) NEQ "10")>
			<cfreturn "Success">
		</cfif>

		<cfquery name="getUtilForceAssessment" datasource="#Application.DataSrc#">
			SELECT F300, F297
			FROM #Request.prefix_db_agency#.pAssessments
			WHERE Assmt_ID = <cfqueryparam value="#arguments.Assmt_ID#" cfsqltype="cf_sql_integer">
			AND Status = 0
			LIMIT 1
		</cfquery>
		<cfif getUtilForceAssessment.recordcount EQ 0 OR Len(Trim(getUtilForceAssessment.F300)) EQ 0>
			<cfreturn "Success">
		</cfif>

		<cfset var hippsAvgF300 = 0 />
		<cfset var hippsAvgF297 = 0 />
		<cfquery name="getUtilForceHippsAvgF300" datasource="#Application.DataSrc#">
			SELECT IFNULL(Total_skilled, 0) AS Total_skilled
			FROM #Request.prefix_db_lookup#.CW_Visit_Utilization
			WHERE HIPPS_Code = <cfqueryparam value="#Trim(getUtilForceAssessment.F300)#" cfsqltype="cf_sql_varchar">
			LIMIT 1
		</cfquery>
		<cfif getUtilForceHippsAvgF300.recordcount GT 0>
			<cfset hippsAvgF300 = Val(getUtilForceHippsAvgF300.Total_skilled) />
		</cfif>
		<cfif Len(Trim(getUtilForceAssessment.F297)) GT 0>
			<cfquery name="getUtilForceHippsAvgF297" datasource="#Application.DataSrc#">
				SELECT IFNULL(Total_skilled, 0) AS Total_skilled
				FROM #Request.prefix_db_lookup#.CW_Visit_Utilization
				WHERE HIPPS_Code = <cfqueryparam value="#Trim(getUtilForceAssessment.F297)#" cfsqltype="cf_sql_varchar">
				LIMIT 1
			</cfquery>
			<cfif getUtilForceHippsAvgF297.recordcount GT 0>
				<cfset hippsAvgF297 = Val(getUtilForceHippsAvgF297.Total_skilled) />
			</cfif>
		</cfif>
		<cfset var hippsAvgVisits = hippsAvgF300 + hippsAvgF297 />
		<cfif hippsAvgVisits LTE 0>
			<cfreturn "Success">
		</cfif>
		<cfquery name="getAssmtAuthVisitSum" datasource="#Application.DataSrc#">
			SELECT IFNULL(SUM(Total_Visits), 0) AS total_visits
			FROM #Request.prefix_db_agency#.pAuths
			WHERE Assmt_ID = <cfqueryparam value="#arguments.Assmt_ID#" cfsqltype="cf_sql_integer">
			AND Status = 0
		</cfquery>
		<cfset var oldAuthVisits = 0 />
		<cfif Val(arguments.Auth_ID) GT 0>
			<cfquery name="getCurrentAuthVisits" datasource="#Application.DataSrc#">
				SELECT IFNULL(Total_Visits, 0) AS Total_Visits
				FROM #Request.prefix_db_agency#.pAuths
				WHERE Auth_ID = <cfqueryparam value="#arguments.Auth_ID#" cfsqltype="cf_sql_integer">
				AND Status = 0
				LIMIT 1
			</cfquery>
			<cfif getCurrentAuthVisits.recordcount GT 0>
				<cfset oldAuthVisits = Val(getCurrentAuthVisits.Total_Visits) />
			</cfif>
		</cfif>
		<cfset var projectedAuthVisits = Val(getAssmtAuthVisitSum.total_visits) - oldAuthVisits + Val(arguments.Total_Visits) />
		<cfif projectedAuthVisits GT hippsAvgVisits>
			<cfreturn hippsCapMessage>
		</cfif>
		<cfreturn "Success">
	</cffunction>

	<cffunction name="checkauthnumber"   access="remote" returnformat="plain" returntype="string">
		<cfargument name="Auth_ID" required="yes" hint="Auth ID"  default="0">
		<cfargument name="Auth_No" required="yes" hint="Auth No">
		<cfargument name="Patient_ID" required="yes" hint="Patient_ID">
		<cfargument name="Assmt_ID" required="yes" hint="Assmt ID">
		<cfargument name="PtPayer_ID" required="yes" hint="PtPayer_ID" default="0">

	  	<cfquery name = "getauth" datasource="#Application.DataSrc#">
			SELECT * FROM #Request.prefix_db_agency#.pAuths 
			WHERE STATUS =  <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			AND Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Patient_ID#"> 
			AND Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#"> 
			AND Auth_No = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.Auth_No#"> 
			AND PtPayer_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.PtPayer_ID#"> 
	  	</cfquery>
		<cfif getauth.recordcount GTE 1 AND  arguments.Auth_ID EQ 0>
			<cfreturn 'Failure'> 
		<cfelseif getauth.recordcount GTE 1 AND  arguments.Auth_ID NEQ  getauth.Auth_ID>
			<cfreturn 'Failure'>
		<cfelse>
			<cfreturn 'Success'>
		</cfif>
	</cffunction>



   	<cffunction name="checkSupervisoryold" access="remote" returnformat="plain" returntype="string">
		<cfargument name="Auth_ID" required="yes" hint="Auth ID">
		<cfargument name="Patient_ID" required="yes" hint="Patient_ID">
		<cfargument name="Assmt_ID" required="yes" hint="Assmt ID">
		<cfargument name="selectedvisit" required="no" hint="0" default="1">
		<cfargument name="Visit_Date" required="no" hint="VisitDate">
		<cfargument name="Emp_ID" required="yes" hint="Emp_ID">

         <cfif #Request.prefix_db_agency# neq 'prefix_db_agency_invalid'>
         	<cfquery name="getauth" datasource="#Application.DataSrc#">
		    	SELECT * FROM #Request.prefix_db_agency#.pAuths 
		    	WHERE  Auth_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
		        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
		    </cfquery>
		    <cfset Request.Skill = getauth.Skill />

        	<cfquery name="getemployee" datasource="#Application.DataSrc#">
				SELECT * FROM #Request.prefix_db_lookup#.pEmployee
				WHERE  Emp_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Emp_ID#">
		        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
		        <!--- AND (Skill_1 IN ('HHA','CNA','PTA','OTA') OR  Skill_2 IN ('HHA','CNA','PTA','OTA') OR
		        Skill_3 IN ('HHA','CNA','PTA','OTA')) --->
		        <cfif Request.Skill EQ 'SN' >
		            AND (Skill_1 IN ('HHA','CNA') OR  Skill_2 IN ('HHA','CNA') OR Skill_3 IN ('HHA','CNA'))
		        <cfelseif Request.Skill EQ 'PT'>
		        	AND (Skill_1 IN ('PTA') OR  Skill_2 IN ('PTA') OR Skill_3 IN ('PTA'))
		        <cfelseif Request.Skill EQ 'OT'>
		        	AND (Skill_1 IN ('OTA') OR  Skill_2 IN ('OTA') OR Skill_3 IN ('OTA'))
		        </cfif>
			</cfquery>
			<cfquery name="getass" datasource="#Application.DataSrc#">
				SELECT * FROM #Request.prefix_db_agency#.pAssessments
				WHERE  Assmt_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
		        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			</cfquery>
			<cfset countVar = 0 />
			<cfset empskill_1 = #getemployee.Skill_1# />
			<cfset empskill_2 = #getemployee.Skill_2# />
			<cfset empskill_3 = #getemployee.Skill_3# />
			<cfset Request.Date_Start = #getass.F177# />
		    <cfset Request.Date_End   = #getass.F178# />
		    <cfset message = '' />
		    <cfset Request.Date_Start = #Request.Date_Start# />

		    


			<cfif getemployee.recordcount GT 0 AND (Request.Skill EQ 'SN' OR   Request.Skill EQ 'PT' OR  Request.Skill EQ 'OT')>
				<cfloop from = "1" to ="8"  index="weekcount" step="1"> 
					<cfset Request.Date_End = #DateAdd("d",6,Request.Date_Start)# />
					<cfset Request.Date_End = #DateFormat(Request.Date_End,"yyyy-mm-dd")# />

					<cfquery name="getscheduled" datasource="#Application.DataSrc#">
						SELECT * FROM #Request.prefix_db_agency#.pSchedules
						WHERE  Assmt_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
				        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
				        AND Visit_Date BETWEEN  '#Request.Date_Start#' AND '#Request.Date_End#'
					</cfquery>
					<!--- <cfif  getscheduled.recordcount gt 0> --->
						<cfif (weekcount EQ 2 OR weekcount EQ 4 OR weekcount EQ 6 OR weekcount EQ 8)>
							<cfquery name="getsupervisits" datasource="#Application.DataSrc#">
								SELECT * FROM #Request.prefix_db_agency#.pSchedules
								WHERE  Patient_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Patient_ID#">
						        AND  Assmt_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
						        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
						        AND Visit_Date BETWEEN  '#Request.Date_Start#' AND '#Request.Date_End#'
						        AND Supervision = 1
						       <!--- <cfif empskill_1 EQ 'HHA' OR empskill_1 EQ 'CNA' OR empskill_2 EQ 'HHA' OR empskill_2 EQ 'CNA' OR empskill_3 EQ 'HHA' OR empskill_3 EQ 'CNA' >
						            AND Skill = 'SN'
						        <cfelseif empskill_1 EQ 'PTA' OR empskill_2 EQ 'PTA' OR empskill_3 EQ 'PTA' >
						        	 AND Skill = 'PT'
						        <cfelseif empskill_1 EQ 'OTA' OR empskill_2 EQ 'OTA' OR empskill_3 EQ 'OTA' >
						        	 AND Skill = 'OT'
						        </cfif> --->
						         AND  Skill =  <cfqueryparam cfsqltype="cf_sql_varchar" value="#Request.Skill#">
							</cfquery>
							<!---  <cfdump var="#getsupervisits#">   --->
							<cfif getsupervisits.recordcount EQ 0 >
								<cfset message = message & 'Week ' & #weekcount# & ", " /> 
							</cfif>
							<!---<cfif arguments.Visit_Date GTE Request.Date_Start OR  arguments.Visit_Date LTE Request.Date_End>
								<cfdump var="#Request#"> <cfdump var="#arguments#">   hi<cfbreak> 
							</cfif> --->
						</cfif>	
						<!--- <cfdump var="#getsupervisits#"> --->
					<!--- </cfif> --->


					<cfset Request.Date_Start =  #DateAdd("d",1,Request.Date_End)#  />		
					<cfset Request.Date_Start = #DateFormat(Request.Date_Start,"yyyy-mm-dd")# />			
				</cfloop>
				<cfif message NEQ ''>
					 <cfset message = message & "Supervision visits must be scheduled every other week before aide or assistant can be scheduled" />
					<!---<cfif empskill_1 EQ 'HHA' OR empskill_1 EQ 'CNA' OR empskill_2 EQ 'HHA' OR empskill_2 EQ 'CNA' OR empskill_3 EQ 'HHA' OR empskill_3 EQ 'CNA' >
						<cfset message = message & "Supervision visits must be scheduled every other week before aide or assistant can be scheduled" /> 
					<cfelseif empskill_1 EQ 'PTA' OR empskill_2 EQ 'PTA' OR empskill_3 EQ 'PTA' >
						<cfset message = message & "Supervision visits must be scheduled every other week before aide or assistant can be scheduled" /> 
					<cfelseif empskill_1 EQ 'OTA' OR empskill_2 EQ 'OTA' OR empskill_3 EQ 'OTA' >
						<cfset message = message & "Supervision visits must be scheduled every other week before aide or assistant can be scheduled" />  
					 </cfif>--->

				<cfelse>
					<cfset message =  "Success" />
				</cfif>
				<cfreturn  message>
		    <cfelse>
				<cfreturn 'Success'>
			</cfif>
		<cfelse>
			<cfreturn 'Failure'>
		</cfif> 


	</cffunction>


	<cffunction name="checkSupervisory" access="remote" returnformat="plain" returntype="string">
		<cfargument name="Auth_ID" required="yes" hint="Auth ID">
		<cfargument name="Patient_ID" required="yes" hint="Patient_ID">
		<cfargument name="Assmt_ID" required="yes" hint="Assmt ID">
		<cfargument name="selectedvisit" required="no" hint="0" default="1">
		<cfargument name="Visit_Date" required="no" hint="VisitDate">
		<cfargument name="Emp_ID" required="yes" hint="Emp_ID">

         <cfif #Request.prefix_db_agency# neq 'prefix_db_agency_invalid'>
         	<cfquery name="getauth" datasource="#Application.DataSrc#">
		    	SELECT * FROM #Request.prefix_db_agency#.pAuths 
		    	WHERE  Auth_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
		        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
		    </cfquery>

		    <cfset Request.Skill = getauth.Skill />

        	<cfquery name="getemployee" datasource="#Application.DataSrc#">
				SELECT * FROM #Request.prefix_db_lookup#.pEmployee
				WHERE  Emp_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Emp_ID#">
		        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
		        <cfif Request.Skill EQ 'HHA' >
		            AND (Skill_1 IN ('HHA','CNA') OR  Skill_2 IN ('HHA','CNA') OR Skill_3 IN ('HHA','CNA'))
		        <cfelseif Request.Skill EQ 'PTA'>
		        	AND (Skill_1 IN ('PTA') OR  Skill_2 IN ('PTA') OR Skill_3 IN ('PTA'))
		        <cfelseif Request.Skill EQ 'OTA'>
		        	AND (Skill_1 IN ('OTA') OR  Skill_2 IN ('OTA') OR Skill_3 IN ('OTA'))
		        </cfif>
			</cfquery>
			<cfquery name="getass" datasource="#Application.DataSrc#">
				SELECT * FROM #Request.prefix_db_agency#.pAssessments
				WHERE  Assmt_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
		        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			</cfquery>
			<cfset countVar = 0 />
			<cfset empskill_1 = #getemployee.Skill_1# />
			<cfset empskill_2 = #getemployee.Skill_2# />
			<cfset empskill_3 = #getemployee.Skill_3# />
			<cfset Request.Date_Start = #getass.F177# />
		    <cfset Request.Date_End   = #getass.F178# />
		    <cfset message = '' />
		    <cfset Request.Date_Start = #Request.Date_Start# />
			<cfif getemployee.recordcount GT 0 AND (Request.Skill EQ 'PTA' OR  Request.Skill EQ 'OTA'  OR Request.Skill EQ 'HHA')>
				<cfloop from = "1" to ="8"  index="weekcount" step="1"> 
					<cfset Request.Date_End = #DateAdd("d",6,Request.Date_Start)# />
					<cfset Request.Date_End = #DateFormat(Request.Date_End,"yyyy-mm-dd")# />
					<cfif (weekcount EQ 2 OR weekcount EQ 4 OR weekcount EQ 6 OR weekcount EQ 8)>
						<cfquery name="getsupervisits" datasource="#Application.DataSrc#">
							SELECT * FROM #Request.prefix_db_agency#.pSchedules
							WHERE  Assmt_ID =  <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
					        AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
					        AND Visit_Date BETWEEN  '#Request.Date_Start#' AND '#Request.Date_End#'
					        AND Supervision = 1
					        <cfif Request.Skill EQ 'HHA' >
					        	AND  Skill =  <cfqueryparam cfsqltype="cf_sql_varchar" value="SN">
					        <cfelseif  Request.Skill EQ 'PTA' >
					        	AND  Skill =  <cfqueryparam cfsqltype="cf_sql_varchar" value="PT">
					        <cfelseif  Request.Skill EQ 'OTA' >
					        	AND  Skill =  <cfqueryparam cfsqltype="cf_sql_varchar" value="OT">
					        </cfif>
						</cfquery>
					    <cfif  getsupervisits.recordcount EQ 0> 
							<cfset message = message & 'Week ' & #weekcount# & " " /> 
							<cfbreak>
						</cfif>
						<cfif arguments.Visit_Date GTE Request.Date_Start OR  arguments.Visit_Date LTE Request.Date_End>
							<cfbreak>
						</cfif>
					</cfif>	
					<cfset Request.Date_Start =  #DateAdd("d",1,Request.Date_End)#  />		
					<cfset Request.Date_Start = #DateFormat(Request.Date_Start,"yyyy-mm-dd")# />			
				</cfloop>
				<cfif message NEQ ''>
					 <cfset message = message & "Supervision visits must be scheduled every other week before aide or assistant can be scheduled" />
				<cfelse>
					<cfset message =  "Success" />
				</cfif>
				<cfreturn  message>
		    <cfelse>
				<cfreturn 'Success'>
			</cfif>
		<cfelse>
			<cfreturn 'Failure'>
		</cfif> 

	</cffunction>


	<cffunction name="getunschedulevisits"   access="remote"  returnFormat= "JSON" >
		<cfargument name="Rev_CodeID" required="yes" hint="Rev_CodeID"  default="0">
		<cfargument name="Patient_ID" required="yes" hint="Patient_ID">

	  	<cfquery name = "getauth" datasource="#Application.DataSrc#">
			SELECT pAuths.* FROM #Request.prefix_db_agency#.pAuths 
			JOIN #Request.prefix_db_agency#.pAssessments ON pAssessments.Assmt_ID = pAuths.Assmt_ID AND pAssessments.Status = 0
			WHERE pAuths.Status =  <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			AND pAuths.Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Patient_ID#"> 
			AND pAuths.Skill IN  ( SELECT Visit_Type FROM #Request.prefix_db_agency#.pRevenue_Code  
			 WHERE Rev_CodeID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.Rev_CodeID#"> )
			AND pAssessments.Admit_ID  IN ( SELECT pAdmit.Admit_ID FROM #Request.prefix_db_agency#.pAdmit 
			WHERE pAdmit.Status < 2 AND Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.cs.patientid#"> )
			GROUP BY pAuths.Auth_ID 
	  	</cfquery>

  		<cfset request.totremaining = 0 >
  		<cfloop query="getauth">
  			<cfquery  datasource="#Application.DataSrc#" name="Getvisitcount">
				SELECT *
				FROM #Request.prefix_db_agency#.pSchedules s
				WHERE s.Auth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#getauth.Auth_ID#" maxlength="10">
				AND s.Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.cs.patientid#" maxlength="10">
				AND s.Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0" maxlength="10">
			</cfquery>
  	 		<cfquery  dbtype="query" name="getprn">
				SELECT * FROM Getvisitcount
				WHERE  prn_visit  = 1
				 AND (Visit_Type is NULL OR (Visit_Type  NOT LIKE '6%' AND Visit_Type  NOT LIKE '7%'))
			</cfquery>
			<cfquery  dbtype="query" name="getmissed">
				SELECT * FROM Getvisitcount
				WHERE   Missed  > 0
				 <!---AND (Visit_Type is NULL OR (Visit_Type  NOT LIKE '6%' AND Visit_Type  NOT LIKE '7%'))--->
			</cfquery>

			<cfquery  dbtype="query" name="getcompleted">
				SELECT * FROM Getvisitcount
				WHERE  Missed = 0
                and Visit_Date < #Now()#
			</cfquery>                     
            <cfset novisits = Total_visits - (Getvisitcount.recordcount) + (getmissed.recordcount  ) />   
            <cfset request.totremaining = request.totremaining + novisits />
        </cfloop>



        <cfif  request.totremaining gt 0 >
        	<cfset message = "There are " & #request.totremaining# & " " & #getauth.Skill#   & " visits for a prior authorization. Do you want to rollover unscheduled visits?"/>
        	 <cfset response_key={"statusCode"= 200,"statusText"= 'success',"data"= message, Skill =#getauth.Skill#,Unscheduled_Visits = #request.totremaining# } />
        	<cfreturn  response_key>
        <cfelse>
			 <cfset response_key={"statusCode"= 200,"statusText"= 'failure',"data"= "No schedules found", Unscheduled_Visits = #request.totremaining# } />
        	<cfreturn  response_key>
		</cfif>
	</cffunction>


	<cffunction name="show_weeklydates"  access="remote" output="Yes" returnFormat= "plain">   
		<cfargument name="Auth_ID" required="yes" default="0">
		<cfargument name="Assmt_ID" required="no" default="0">
		<cfargument name="Date_Start" required="yes" default="">
		<cfargument name="Date_End" required="yes" default= "">
		<cfset message = "Success">

			<cfquery  name="getauthorizations" datasource="#Application.DataSrc#">
			    SELECT   pAssessments.F177,pAssessments.F178  
			    FROM  #Request.prefix_db_agency#.pAssessments 
			    WHERE pAssessments.Status= 0
			    AND pAssessments.Assmt_ID = "#arguments.Assmt_ID#"
			</cfquery>

			<cfif arguments.Date_Start NEQ '' AND arguments.Date_End NEQ ''>
				<cfset arguments.Date_Start =  #dateFormat(arguments.Date_Start, "yyyy-mm-dd")# />
				<cfset arguments.Date_End =  #dateFormat(arguments.Date_End, "yyyy-mm-dd")# />
				<cfif arguments.Date_End LTE getauthorizations.F178
				 OR arguments.Assmt_ID EQ '' OR arguments.Assmt_ID EQ 0 OR getauthorizations.F177 EQ '' OR getauthorizations.F178 EQ '' OR getauthorizations.recordcount EQ 0>
				    <cfset strating_date = arguments.Date_Start />
				    <cfset ending_date = arguments.Date_End />
				<cfelse>
				    <cfset strating_date = getauthorizations.F177 />
				    <cfset ending_date = getauthorizations.F178 />
				</cfif>
			    <cfscript>
			        // Define start and end dates for the range
			        startDate = strating_date;  // Example start date: August 1, 2024
			        endDate = ending_date;    // Example end date: August 31, 2024

			        FirstWeekStart = createDateTime(year(startDate), month(startDate), day(startDate), 0, 0, 0);
			        // Initialize variables
			        currentWeekStart = createDateTime(year(startDate), month(startDate), day(startDate), 0, 0, 0);
			        currentWeekStart = dateAdd("d", -DayOfWeek(currentWeekStart) + 1, currentWeekStart); // Start of the week (Sunday)
			        weeks = []; // Array to hold week data
			        week_no =  1;
			        // Loop through each week in the date range
			        while (currentWeekStart LTE endDate) 
			        {
			                // Calculate end of the week
			                currentWeekEnd = dateAdd("d", 6, currentWeekStart); // End of the week (Saturday)
			                if (currentWeekEnd GT endDate) {
			                    currentWeekEnd = endDate; // Adjust end date if it exceeds the range
			                }
			                // Collect dates for the current week
			                weekDates = [];
			                dateIter = currentWeekStart;
			                while (dateIter LTE currentWeekEnd) {
			                    arrayAppend(weekDates, dateFormat(dateIter, "yyyy-mm-dd"));
			                    dateIter = dateAdd("d", 1, dateIter);
			                }

			                // Store week information in the weeks array
			                if (week_no == 1)
			                {
			                    arrayAppend(weeks, {start = FirstWeekStart, end = currentWeekEnd, dates = weekDates});
			                }
			                else
			                {
			                    arrayAppend(weeks, {start = currentWeekStart, end = currentWeekEnd, dates = weekDates});
			                }
			                //arrayAppend(weeks, {start = currentWeekStart, end = currentWeekEnd, dates = weekDates});
			                week_no = week_no + 1;
			                // Move to the next week
			                currentWeekStart = dateAdd("d", 7, currentWeekStart);
			        }
				</cfscript>
				<cfquery name="getauthallweeks" datasource="#Application.DataSrc#">
				     SELECT * FROM #Request.prefix_db_agency#.pAuths_weeks
				     WHERE Auth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">  AND status = 0
				</cfquery>

				<cfsavecontent	variable = "html_weeklydates"> 
					<cfloop from="1" to="#arraylen(weeks)#" index="i">
							<cfset week_start = #weeks[i].start# >
					        <cfset week_end = #weeks[i].end# >
					        <cfset WeeK_Total_visits = 0 >
							<cfquery name="getauthweeks" dbtype="query">
							     SELECT * FROM getauthallweeks
							     WHERE Week_No = '#i#'
							     <!--- AND Week_Start = '#DateFormat(week_start,"yyyy-mm-dd")#'
							     AND Week_End = '#DateFormat(week_end,"yyyy-mm-dd")#' --->							      
							</cfquery>
							<cfif getauthweeks.recordcount gt 0>
								<cfset WeeK_Total_visits =#getauthweeks.Total_visits# />
							</cfif>
			                <cfif i LTE  #arraylen(weeks)#>
			                <div class="form-group auth-week-group">
			                   <div class="auth-week-row">
			                       <label class="control-label" for="WeeK_Total_visits#i#">Week #i# visit/s : #DateFormat(Week_Start,"mm/dd/yyyy")# - #DateFormat(Week_End,"mm/dd/yyyy")#</label>
			                       <div class="auth-week-radio-group" role="radiogroup" aria-label="Week #i# visit count">
			                           <cfloop index="j" from ="0" to="7">
			                               <label class="auth-week-radio-label">
			                                   <input type="radio" class="week-visits-radio" name="week_radio_#i#" value="#j#" data-week="#i#" <cfif WeeK_Total_visits EQ j>checked</cfif> onchange="setWeekVisitValue(#i#, #j#);">
			                                   <span>#j#</span>
			                               </label>
			                           </cfloop>
			                       </div>
			                   </div>
			                   <input type="hidden" id="WeeK_Total_visits#i#" name="WeeK_Total_visits#i#" value="#WeeK_Total_visits#">
			                </div>
			                <cfelse>
			                     <input type="hidden" id="WeeK_Total_visits#i#" name="WeeK_Total_visits#i#"  value="0">
			                </cfif>
		            </cfloop> 
		        </cfsavecontent>
		        <cfreturn html_weeklydates >
		    <cfelse>
		    	<cfreturn message >
		    </cfif>
	        
	</cffunction>

	<cffunction name="check_visit_date_auth" access="remote" returnformat="plain" returntype="string">
		<cfargument name="Patient_ID" required="yes" hint="Patient ID">
		<cfargument name="Assmt_ID" required="yes" hint="Assessment ID">
		<cfargument name="Auth_ID" required="yes" hint="Assessment ID">
		<cfargument name="Visit_Date" required="yes" hint="Visit Date">

		<cfset visit_date_valid = true>
		
		<!--- Check pAuths table for valid authorization periods --->
		<cfquery name="get_auths" datasource="#Application.DataSrc#">
			SELECT pAuths.Date_Start, pAuths.Date_End
			FROM #Request.prefix_db_agency#.pAuths 
			WHERE pAuths.Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Patient_ID#">
			AND pAuths.Status = 0
			AND pAuths.Auth_ID= '#arguments.Auth_ID#'
			<cfif arguments.Assmt_ID NEQ '' AND arguments.Assmt_ID NEQ '0'>
				AND pAuths.Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
			</cfif>
		</cfquery>
		
		<cfif get_auths.recordcount gt 0>
			<cfloop query="get_auths">
				<cfif get_auths.Date_Start NEQ '' AND get_auths.Date_End NEQ ''>
					<cfset auth_start = DateFormat(get_auths.Date_Start, "yyyy-mm-dd")>
					<cfset auth_end = DateFormat(get_auths.Date_End, "yyyy-mm-dd")>
					<cfset visit_date = DateFormat(arguments.Visit_Date, "yyyy-mm-dd")>
					
					<cfif visit_date LT auth_start OR visit_date GT auth_end>
						<cfset visit_date_valid = false>
						<cfbreak>
					</cfif>
				</cfif>
			</cfloop>
		</cfif>
		
		<cfif visit_date_valid>
			<cfreturn "valid">
		<cfelse>
			<cfreturn "invalid">
		</cfif>
	</cffunction>

	<cffunction name="checkOverScheduling" access="remote" returnformat="plain" returntype="string">
		<cfargument name="Auth_ID" required="yes" hint="Auth ID">
		<cfargument name="Patient_ID" required="yes" hint="Patient ID">
		<cfargument name="Assmt_ID" required="yes" hint="Assmt ID">
		<cfargument name="StartTime" required="yes" hint="Start Time">
		<cfargument name="EndTime" required="yes" hint="End Time">
		<cfargument name="Visit_Date" required="yes" hint="Visit Date">
		<cfargument name="Exclude_Schedule_ID" required="no" default="0" hint="Schedule ID to exclude from calculation (for editing existing visits)">

		<cfif #Request.prefix_db_agency# neq 'prefix_db_agency_invalid'>
			<!--- Get authorization details including auth_measure, Total_Visits, bypass_compliance, and admit_type --->
			<cfquery name="getauth" datasource="#Application.DataSrc#">
				SELECT pAuths.*, pPayer.auth_measure, pPayer.bypass_compliance, pAdmit.Admit_Type
				FROM #Request.prefix_db_agency#.pAuths 
				JOIN #Request.prefix_db_agency#.pPtPayer ON pAuths.PtPayer_ID = pPtPayer.PtPayer_ID AND pPtPayer.Status = 0
				JOIN #Request.prefix_db_agency#.pPayer ON pPayer.Pay_ID = pPtPayer.Payer_ID AND pPayer.Status = 0
				LEFT JOIN #Request.prefix_db_agency#.pAssessments ON pAuths.Assmt_ID = pAssessments.Assmt_ID AND pAssessments.Status = 0
				LEFT JOIN #Request.prefix_db_agency#.pAdmit ON pAssessments.Admit_ID = pAdmit.Admit_ID AND pAdmit.Status = 0
				WHERE pAuths.Auth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
				AND pAuths.Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			</cfquery>

			<cfif getauth.recordcount gt 0>
				<cfset auth_measure = getauth.auth_measure>
				<cfset total_visits = getauth.Total_Visits>
				<cfset bypass_compliance = getauth.bypass_compliance>
				<cfset admit_type = getauth.Admit_Type>
				
				<!--- Check if we should skip visit count validation --->
				<cfset skip_visit_validation = false>
				<cfif bypass_compliance EQ 1>
					<cfset skip_visit_validation = true>
				<cfelseif admit_type EQ 'Non-Medical'>
					<cfset skip_visit_validation = true>
				</cfif>
				
				<!--- Only check over-scheduling for units or hours if not skipping validation --->
				<cfif NOT skip_visit_validation AND (auth_measure EQ 'units' OR auth_measure EQ 'hours' OR auth_measure EQ '')>
					<!--- Calculate visit duration based on auth_measure --->
					<cfif auth_measure EQ 'units' OR auth_measure EQ ''>
						<!--- For units: every 15 minutes = 1 unit --->
						<!--- Parse time strings (format: HH:MM) --->
						<cfset start_hour = ListGetAt(arguments.StartTime, 1, ':')>
						<cfset start_minute = ListGetAt(arguments.StartTime, 2, ':')>
						<cfset end_hour = ListGetAt(arguments.EndTime, 1, ':')>
						<cfset end_minute = ListGetAt(arguments.EndTime, 2, ':')>
						
						<!--- Convert to total minutes --->
						<cfset start_total_minutes = (start_hour * 60) + start_minute>
						<cfset end_total_minutes = (end_hour * 60) + end_minute>
						
						<!--- Calculate duration in minutes --->
						<cfset duration_minutes = end_total_minutes - start_total_minutes>
						
						<!--- Handle case where end time is next day --->
						<cfif duration_minutes LT 0>
							<cfset duration_minutes = duration_minutes + 1440> <!--- Add 24 hours (1440 minutes) --->
						</cfif>
						
						<!--- Calculate units (every 15 minutes = 1 unit) --->
						<cfset visit_units = Round(duration_minutes / 15)>
						
					<cfelseif auth_measure EQ 'hours'>
						<!--- For hours: calculate total hours --->
						<!--- Parse time strings (format: HH:MM) --->
						<cfset start_hour = ListGetAt(arguments.StartTime, 1, ':')>
						<cfset start_minute = ListGetAt(arguments.StartTime, 2, ':')>
						<cfset end_hour = ListGetAt(arguments.EndTime, 1, ':')>
						<cfset end_minute = ListGetAt(arguments.EndTime, 2, ':')>
						
						<!--- Convert to total minutes --->
						<cfset start_total_minutes = (start_hour * 60) + start_minute>
						<cfset end_total_minutes = (end_hour * 60) + end_minute>
						
						<!--- Calculate duration in minutes --->
						<cfset duration_minutes = end_total_minutes - start_total_minutes>
						
						<!--- Handle case where end time is next day --->
						<cfif duration_minutes LT 0>
							<cfset duration_minutes = duration_minutes + 1440> <!--- Add 24 hours (1440 minutes) --->
						</cfif>
						
						<!--- Convert to hours --->
						<cfset visit_hours = Round((duration_minutes / 60) * 100) / 100>
					</cfif>

					<!--- Get all scheduled visits for this authorization (excluding current visit if editing) --->
					<cfquery name="getscheduled" datasource="#Application.DataSrc#">
						SELECT StartTime, EndTime, Visit_Date
						FROM #Request.prefix_db_agency#.pSchedules 
						WHERE Auth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
						AND Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
						AND Missed = 0
						<cfif arguments.Exclude_Schedule_ID NEQ 0>
							AND Schedule_ID <> <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Exclude_Schedule_ID#">
						</cfif>
					</cfquery>

					<!--- Calculate total scheduled units/hours --->
					<cfset total_scheduled_units = 0>
					<cfset total_scheduled_hours = 0>
					
					<cfloop query="getscheduled">
						<!--- Parse scheduled visit times (format: HH:MM) --->
						<cfset sch_start_hour = ListGetAt(getscheduled.StartTime, 1, ':')>
						<cfset sch_start_minute = ListGetAt(getscheduled.StartTime, 2, ':')>
						<cfset sch_end_hour = ListGetAt(getscheduled.EndTime, 1, ':')>
						<cfset sch_end_minute = ListGetAt(getscheduled.EndTime, 2, ':')>
						
						<!--- Convert to total minutes --->
						<cfset sch_start_total_minutes = (sch_start_hour * 60) + sch_start_minute>
						<cfset sch_end_total_minutes = (sch_end_hour * 60) + sch_end_minute>
						
						<!--- Calculate duration in minutes --->
						<cfset sch_duration_minutes = sch_end_total_minutes - sch_start_total_minutes>
						
						<!--- Handle case where end time is next day --->
						<cfif sch_duration_minutes LT 0>
							<cfset sch_duration_minutes = sch_duration_minutes + 1440> <!--- Add 24 hours (1440 minutes) --->
						</cfif>
						
						<!--- Calculate units and hours --->
						<cfset sch_units = Round(sch_duration_minutes / 15)>
						<cfset sch_hours = Round((sch_duration_minutes / 60) * 100) / 100>
						
						<cfset total_scheduled_units = total_scheduled_units + sch_units>
						<cfset total_scheduled_hours = total_scheduled_hours + sch_hours>
					</cfloop>
 					<!--- Add current visit to total --->
					<cfif auth_measure EQ 'units' OR auth_measure EQ ''>
						<cfset total_scheduled_units = total_scheduled_units + visit_units>
						<cfif total_scheduled_units GT total_visits>
							<cfreturn "Over-scheduling detected: Total scheduled units (#total_scheduled_units#) exceeds authorized visits (#total_visits#). Each 15-minute period counts as 1 unit.">
						</cfif>
					<cfelseif auth_measure EQ 'hours'>
						<cfset total_scheduled_hours = total_scheduled_hours + visit_hours>
						<cfif total_scheduled_hours GT total_visits>
							<cfreturn "Over-scheduling detected: Total scheduled hours (#total_scheduled_hours#) exceeds authorized visits (#total_visits#).">
						</cfif>
					</cfif>
				</cfif>
				
				<cfreturn "Success">
			<cfelse>
				<cfreturn "Authorization not found">
			</cfif>
		<cfelse>
			<cfreturn "Failure">
		</cfif>
	</cffunction>

	<cffunction name="getScheduleAuthAmount" access="public" returntype="numeric" output="false">
		<cfargument name="schedule_units" required="true">
		<cfargument name="StartTime" type="string" required="false" default="">
		<cfargument name="EndTime" type="string" required="false" default="">
		<cfargument name="auth_measure" type="string" required="false" default="visits">

		<cfset measure = LCase(Trim(arguments.auth_measure)) />
		<cfif measure EQ 'visits'>
			<cfreturn 1 />
		</cfif>

		<!--- Prefer the actual visit Start/End times over the stored Total_Units: Total_Units can be
			  stale (e.g. computed from a mistyped EndTime earlier than StartTime, which the legacy
			  formula wrapped past midnight into ~90+ units) and is not always recalculated when the
			  times are corrected. Fall back to Total_Units only when the times are unusable. --->
		<cfset schedAmount = val(arguments.schedule_units) />
		<cfif Len(Trim(arguments.StartTime)) AND Len(Trim(arguments.EndTime)) AND ListLen(arguments.StartTime, ':') GTE 2 AND ListLen(arguments.EndTime, ':') GTE 2>
			<cfset start_total_minutes = (val(ListGetAt(arguments.StartTime, 1, ':')) * 60) + val(ListGetAt(arguments.StartTime, 2, ':')) />
			<cfset end_total_minutes = (val(ListGetAt(arguments.EndTime, 1, ':')) * 60) + val(ListGetAt(arguments.EndTime, 2, ':')) />
			<cfset duration_minutes = end_total_minutes - start_total_minutes />
			<!--- An EndTime of exactly midnight with a later StartTime means the visit was never
				  clocked out, not an overnight visit; don't wrap it into a huge duration. --->
			<cfif duration_minutes LT 0 AND end_total_minutes NEQ 0>
				<cfset duration_minutes = duration_minutes + 1440 />
			</cfif>
			<cfif duration_minutes GT 0>
				<cfif measure EQ 'hours'>
					<cfset schedAmount = Round((duration_minutes / 60) * 100) / 100 />
				<cfelse>
					<cfset schedAmount = Round(duration_minutes / 15) />
				</cfif>
			</cfif>
		</cfif>

		<cfreturn schedAmount />
	</cffunction>

	<cffunction name="getCompletedAuthAmount" access="public" returntype="numeric" output="false">
		<cfargument name="Auth_ID" type="numeric" required="true">
		<cfargument name="Patient_ID" type="numeric" required="true">
		<cfargument name="Assmt_ID" type="numeric" required="true">
		<cfargument name="auth_measure" type="string" required="false" default="visits">

		<cfif #Request.prefix_db_agency# EQ 'prefix_db_agency_invalid'>
			<cfreturn 0 />
		</cfif>

		<cfquery name="getAuthSchedules" datasource="#Application.DataSrc#">
			SELECT IFNULL(Total_Units, 0) AS schedule_units, StartTime, EndTime
			FROM #Request.prefix_db_agency#.pSchedules
			WHERE Auth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
			AND status = <cfqueryparam cfsqltype="cf_sql_integer" value="0">
			AND Patient_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Patient_ID#">
			AND Assmt_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Assmt_ID#">
			AND (Visit_Type IS NULL OR (Visit_Type NOT LIKE '6%' AND Visit_Type NOT LIKE '7%'))
			AND Missed = 0
		</cfquery>

		<cfset measure = LCase(Trim(arguments.auth_measure)) />
		<cfif measure EQ 'units' OR measure EQ '' OR measure EQ 'hours'>
			<cfset completed = 0 />
			<cfloop query="getAuthSchedules">
				<cfset completed = completed + getScheduleAuthAmount(getAuthSchedules.schedule_units, getAuthSchedules.StartTime, getAuthSchedules.EndTime, arguments.auth_measure) />
			</cfloop>
			<cfreturn completed />
		</cfif>

		<cfreturn getAuthSchedules.recordcount />
	</cffunction>

	<cffunction name="getAuthorizedAuthAmount" access="public" returntype="numeric" output="false">
		<cfargument name="Auth_ID" type="numeric" required="true">

		<cfquery name="getauth" datasource="#Application.DataSrc#">
			SELECT Total_Visits, IFNULL(prn_visits, 0) AS prn_visits
			FROM #Request.prefix_db_agency#.pAuths
			WHERE Auth_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Auth_ID#">
			AND Status = 0
		</cfquery>

		<cfif getauth.recordcount EQ 0>
			<cfreturn 0 />
		</cfif>

		<cfreturn val(getauth.Total_Visits) - val(getauth.prn_visits) />
	</cffunction>

	<cffunction name="isAuthLimitReached" access="public" returntype="boolean" output="false">
		<cfargument name="Auth_ID" type="numeric" required="true">
		<cfargument name="Patient_ID" type="numeric" required="true">
		<cfargument name="Assmt_ID" type="numeric" required="true">
		<cfargument name="auth_measure" type="string" required="false" default="visits">

		<cfset var authorized = getAuthorizedAuthAmount(arguments.Auth_ID) />
		<cfif authorized LTE 0>
			<cfreturn false />
		</cfif>

		<cfset var completed = getCompletedAuthAmount(arguments.Auth_ID, arguments.Patient_ID, arguments.Assmt_ID, arguments.auth_measure) />
		<cfreturn completed GTE authorized />
	</cffunction>

	<cffunction name="getAuthLimitMessage" access="public" returntype="string" output="false">
		<cfargument name="Auth_ID" type="numeric" required="true">
		<cfargument name="Patient_ID" type="numeric" required="true">
		<cfargument name="Assmt_ID" type="numeric" required="true">
		<cfargument name="auth_measure" type="string" required="false" default="visits">

		<cfset var authorized = getAuthorizedAuthAmount(arguments.Auth_ID) />
		<cfset var completed = getCompletedAuthAmount(arguments.Auth_ID, arguments.Patient_ID, arguments.Assmt_ID, arguments.auth_measure) />
		<cfset var measure = LCase(Trim(arguments.auth_measure)) />
		<cfset var label = 'visits' />
		<cfif measure EQ 'units' OR measure EQ ''>
			<cfset label = 'units' />
		<cfelseif measure EQ 'hours'>
			<cfset label = 'hours' />
		</cfif>

		<cfreturn "Authorization limit reached (#authorized# #label#). Completed #label#: #completed#" />
	</cffunction>

            
</cfcomponent>