<cfcomponent>
	<cffunction name="init" access="public" returntype="queries">
        <cfargument name="dataSrc" type="string" required="yes">
        <cfargument name="prefixDbLookup" type="string" required="yes">
        
        <cfset variables.dataSrc = trim(arguments.dataSrc)>
        <cfset variables.prefixDbLookup = trim(arguments.prefixDbLookup)>

        <cfreturn this>
	</cffunction>

    <cffunction name="getSuperUser" access="public" returntype="query">
        <cfargument name="userName" type="string" required="yes">

        <cfset var qUser = ''>

        <cfquery name="qUser" datasource="#variables.DataSrc#">
            SELECT SuperUsers.User_Id AS Emp_ID,SuperUsers.Username FROM #variables.prefixDbLookup#.SuperUsers
            WHERE Username = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.userName)#" maxlength="30">
        </cfquery>

        <cfreturn qUser>
	</cffunction>

    <cffunction name="checkLoginSuperUser" access="public" returntype="query">
        <cfargument name="userName" type="string" required="yes">
        <cfargument name="password" type="string" required="yes">

        <cfset var qLogin = ''>

        <cfquery name="qLogin" datasource="#variables.DataSrc#">
            SELECT pEmployee.Emp_ID AS Login_Id,SuperUsers.User_Id AS Emp_ID,SuperUsers.Username, 
                Agency.Agency_ID, Agency.Super_ID, Agency.Agency_Login, pEmployee.Emp_Email AS Emp_Email,
                pEmployee.Emp_Telephone AS Emp_Telephone ,SuperUsers.Two_FA_Type AS Two_FA_Type
            FROM  #variables.prefixDbLookup#.SuperUsers, #variables.prefixDbLookup#.pEmployee 
            <!--- LEFT  OUTER JOIN #variables.prefixDbLookup#.Physician ON Employee.Emp_ID = Physician.Emp_ID --->
            LEFT  JOIN #variables.prefixDbLookup#.Agency ON pEmployee.Loc_ID = Agency.Agency_ID
            WHERE SuperUsers.Super_ID = Agency.Super_ID 
            AND   Agency_Login =        <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.userName)#" maxlength="30">
            AND   SuperUsers.Username = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.password)#" maxlength="30">
            AND Agency.Status = 'active'
        </cfquery>

        <cfreturn qLogin>
	</cffunction>

    <cffunction name="checkLoginEmployee" access="public" returntype="query">
        <cfargument name="Username" type="string" required="yes">
        <cfargument name="encryptedPassword" type="string" required="yes">

        <cfset var qLogin = ''>

        <cfquery name="qLogin" datasource="#variables.DataSrc#">
            SELECT pEmployee.Emp_ID,pEmployee.Username, pEmployee.Password, pEmployee.Emp_ID AS Login_Id,Agency.Agency_Id,Agency.Agency_Login, pEmployee.Emp_Email,1 AS PPInUse             
            ,pPhysicians.Emp_ID, pPhysicians.Phys_ID,0 AS Portal , pEmployee.Emp_Telephone , pEmployee.Two_FA_Type  
            FROM #variables.prefixDbLookup#.pEmployee  
            LEFT JOIN #variables.prefixDbLookup#.Agency ON pEmployee.Loc_ID = Agency.Agency_ID 
            LEFT OUTER JOIN #variables.prefixDbLookup#.pPhysicians ON pEmployee.Emp_ID = pPhysicians.Emp_ID 
            WHERE pEmployee.Username = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.Username)#" maxlength="64">
            AND pEmployee.Password = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.encryptedPassword)#">
            AND pEmployee.Emp_Type != 'Physician'
            AND Agency.Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0" maxlength="8">
            AND pEmployee.Status = <cfqueryparam cfsqltype="cf_sql_integer" value="0" maxlength="8">
        </cfquery>

        <cfreturn qLogin>
	</cffunction>

    <cffunction name="getInfoEmployee" access="public" returntype="query">
        <cfargument name="employeeId" type="numeric" required="yes">

        <cfset var qEmployee = ''>

        <cfquery name="qEmployee" datasource="#variables.DataSrc#">
            SELECT pEmployee.Emp_ID , pEmployee.Emp_Email, pEmployee.Emp_Telephone , pEmployee.Two_FA_Type , pEmployee.Two_FA_Code , Two_FA_CreationTime
            FROM #variables.prefixDbLookup#.pEmployee              
            WHERE pEmployee.Emp_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(arguments.employeeId)#">
        </cfquery>

        <cfreturn qEmployee>
	</cffunction>

    <cffunction name="getLastLoggedTimeUser" access="public" returntype="query">
        <cfargument name="employeeId" type="numeric" required="yes">

        <cfset var qLogon = ''>

        <cfquery name="qLogon" datasource="#variables.DataSrc#">
            SELECT Logon_Date 
            FROM #variables.prefixDbLookup#.Logon              
            WHERE Emp_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(arguments.employeeId)#">
            order by Logon_Date DESC limit 1
        </cfquery>

        <cfreturn qLogon>
	</cffunction>

    <cffunction name="checkTwoFACode" access="public" returntype="query">
        <cfargument name="code" type="numeric" required="yes">
        <cfargument name="employeeId" type="numeric" required="no">

        <cfset var qGetTwoFACode = ''>

        <cfquery name="qGetTwoFACode" datasource="#variables.DataSrc#">
            SELECT Two_FA_Code FROM #variables.prefixDbLookup#.pEmployee
            WHERE Two_FA_Code = <cfqueryparam value ="#trim(arguments.code)#" cfsqltype ="cf_sql_integer">
            <cfif StructKeyExists(arguments, "employeeId") AND IsValid(integer, arguments.employeeId)>
                WHERE Emp_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(arguments.employeeId)#">
            </cfif>
        </cfquery>

        <cfreturn qGetTwoFACode>
	</cffunction>

    <cffunction name="updateTwoFACode" access="public" returnType="boolean">
        <cfargument name="code" type="string" required="yes">
        <cfargument name="employeeId" type="numeric" required="no">

        <cfset var qUpdateTwoFaCode = ''>
        <cfset var success = false>

        <cftry>
            <cfquery name="qUpdateTwoFaCode" datasource="#Variables.dataSrc#">
                UPDATE #variables.prefixDbLookup#.pEmployee
                SET Two_FA_Code = <cfqueryparam value ="#trim(arguments.code)#" cfsqltype ="cf_sql_integer" null="#(arguments.code EQ 0)#">,
                Two_FA_CreationTime = <cfqueryparam value ="#now()#" cfsqltype ="cf_sql_timestamp" null="#(arguments.code EQ 0)#">
                <cfif StructKeyExists(arguments, "employeeId") AND IsValid('integer', arguments.employeeId)>
                    WHERE Emp_ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(arguments.employeeId)#">
                </cfif>   
            </cfquery>
            <cfset success = true>            
        <cfcatch>
            <cfset success = false>
        </cfcatch>
        </cftry>

        <cfreturn success>
	</cffunction>

    <cffunction name="updateTwoFAMethod" access="public" returnType="boolean">
        <cfargument name="authenticationType" type="numeric" required="yes">
        <cfargument name="emailOrTelephone" type="string" required="yes">
        <cfargument name="employeeId" type="numeric" required="yes">

        <cfset var qUpdateTwoFaCode = ''>
        <cfset var success = false>

        <cftry>
            <cfquery name="qUpdateTwoFaMethodAuthentication" datasource="#Variables.dataSrc#">
                UPDATE #variables.prefixDbLookup#.pEmployee
                SET Two_FA_Type = <cfqueryparam value ="#trim(arguments.authenticationType)#" cfsqltype ="cf_sql_integer">
                <cfif trim(arguments.emailOrTelephone) neq ""> 
                    <cfif trim(arguments.authenticationType) eq 1>
                        , Emp_Email = <cfqueryparam value ="#trim(arguments.emailOrTelephone)#" cfsqltype ="cf_sql_varchar" maxlength="100">
                    <cfelseif arguments.authenticationType eq 2>
                        , Emp_Telephone = <cfqueryparam value ="#trim(arguments.emailOrTelephone)#" cfsqltype ="cf_sql_varchar" maxlength="64">
                    </cfif>                
                </cfif>
                WHERE Emp_ID = <cfqueryparam value ="#trim(arguments.employeeId)#" cfsqltype ="cf_sql_integer">     
            </cfquery>
            <cfset success = true>            
        <cfcatch>
            <cfset success = false>
        </cfcatch>
        </cftry>

        <cfreturn success>
	</cffunction>

     <cffunction name="getPendingOrders" access="remote" returntype="query">
        <cfargument name="patient_Id" type="numeric" required="yes">

        <cfset var qPendingOrders = ''>

        <cfquery name="qPendingOrders" datasource="hhapowerpath">
            SELECT pPatients.Patient_ID,pCMS4857.Order_ID,pCMS4857.Date_Create,pCMS4857.Form_Type,LEFT(pCMS4857.Order_description , 25) AS description
            FROM #Request.prefix_db_agency#.pCMS4857 
            LEFT OUTER JOIN #Request.prefix_db_agency#.pAssessments ON pAssessments.Assmt_ID =  pCMS4857.Assmt_ID AND pAssessments.status =0 
            LEFT OUTER JOIN #Request.prefix_db_agency#.pPatients ON pPatients.Patient_ID =  pAssessments.Patient_ID AND pAssessments.status < 2
            WHERE 
             pCMS4857.Form_status = 'Sent via Fax' 
            AND pCMS4857.status = 0 
            AND pPatients.Patient_ID = <cfqueryparam value ="#trim(arguments.patient_Id)#" cfsqltype ="cf_sql_integer">
            GROUP BY pCMS4857.Order_ID
        </cfquery>

        <cfreturn qPendingOrders>
    </cffunction>


    <cffunction name="fax_udpate"   access="remote" returnFormat= "JSON" >
            <cfargument name="Order_ID" type="numeric" required="yes">
            <cfargument name="Fax_ID" type="numeric" required="yes">

           <cfquery name="Update_orders" datasource="#Application.DataSrc#">
               UPDATE #Request.prefix_db_agency#.pCMS4857  SET  Form_status = 'Signed & Received via Fax',
               Date_Change = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
               WHERE Order_ID =   <cfqueryparam value ="#trim(arguments.Order_ID)#" cfsqltype ="cf_sql_integer">
            </cfquery>

            <cfquery name="update_Received_faxes" datasource="#Application.DataSrc#">
               UPDATE #Request.prefix_db_lookup#.Received_faxes  SET  
               Order_ID =  <cfqueryparam value ="#trim(arguments.Order_ID)#" cfsqltype ="cf_sql_integer">,
               Agency_ID =  <cfqueryparam value ="#trim(session.agencyid)#" cfsqltype ="cf_sql_integer">,
                Change_by =  <cfqueryparam value ="#trim(session.employeeid)#" cfsqltype ="cf_sql_integer">,
                Date_Change = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
               WHERE ID =   <cfqueryparam value ="#trim(arguments.Fax_ID)#" cfsqltype ="cf_sql_integer">
            </cfquery>
            
            <cfset response_key={"statusCode"= 200,"statusText"= 'success',"data"= 'success' } />
            <cfreturn  response_key >
    </cffunction>


     <cffunction name="fax_patientudpate"   access="remote" returnFormat= "JSON" >
            <cfargument name="Patient_ID" type="numeric" required="yes">
            <cfargument name="Fax_ID" type="numeric" required="yes">
            <cfargument name="Order_ID" type="numeric" required="no" default="0">
            <cfif arguments.Order_ID NEQ 0 >
                 <cfquery name="Update_orders" datasource="#Application.DataSrc#">
                   UPDATE #Request.prefix_db_agency#.pCMS4857  SET  Form_status = 'Signed & Received via Fax',
                   Date_Change = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
                   WHERE Order_ID =   <cfqueryparam value ="#trim(arguments.Order_ID)#" cfsqltype ="cf_sql_integer">
                </cfquery>
            </cfif>

            <cfquery name="update_Received_faxes" datasource="#Application.DataSrc#">
               UPDATE #Request.prefix_db_lookup#.Received_faxes  SET  
               <cfif arguments.Order_ID NEQ 0 >
                    Order_ID =  <cfqueryparam value ="#trim(arguments.Order_ID)#" cfsqltype ="cf_sql_integer">,
                </cfif>
               Patient_ID =  <cfqueryparam value ="#trim(arguments.Patient_ID)#" cfsqltype ="cf_sql_integer">,
               Agency_ID =  <cfqueryparam value ="#trim(session.agencyid)#" cfsqltype ="cf_sql_integer">,
               Change_by =  <cfqueryparam value ="#trim(session.employeeid)#" cfsqltype ="cf_sql_integer">,
               Date_Change = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
               WHERE ID =   <cfqueryparam value ="#trim(arguments.Fax_ID)#" cfsqltype ="cf_sql_integer">
            </cfquery>
            
            <cfset response_key={"statusCode"= 200,"statusText"= 'success',"data"= 'success' } />
            <cfreturn  response_key >
    </cffunction>


    <cffunction name="fax_delete"   access="remote" returnFormat= "JSON" >
            <cfargument name="Fax_ID" type="numeric" required="yes">
            <cfargument name="status" type="numeric" required="no" default="0">

            <cfquery name="update_Received_faxes" datasource="#Application.DataSrc#">
               UPDATE #Request.prefix_db_lookup#.Received_faxes  SET  
                status =  <cfqueryparam value ="#trim(arguments.status)#" cfsqltype ="cf_sql_integer">,
                Change_by =  <cfqueryparam value ="#trim(session.employeeid)#" cfsqltype ="cf_sql_integer">,
               Date_Change = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
               WHERE ID =   <cfqueryparam value ="#trim(arguments.Fax_ID)#" cfsqltype ="cf_sql_integer">
            </cfquery>           
            <cfset response_key={"statusCode"= 200,"statusText"= 'success',"data"= 'success' } />
            <cfreturn  response_key >
    </cffunction>

    <cffunction name="cron_fax_update" access="public" returnType="struct">
        <cfargument name="agency_id" type="string" required="yes">
        <cfargument name="order_id" type="string" required="yes">
        <cfargument name="ID" type="string" required="yes">
        <cfset var response_key = {} />
        <cfset var success = false />

        <cftry>

            <cfset Request.prefix_db_agency = 'agency_' & #trim(arguments.agency_id)# />
            <!--- Update the pCMS4857 table with Form_status --->
            <cfquery name="Update_orders" datasource="#Application.DataSrc#">
               UPDATE #Request.prefix_db_agency#.pCMS4857 
                SET  Form_status = 'Signed & Received via Fax',
               Date_Change = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
               WHERE Order_ID =   <cfqueryparam value ="#trim(arguments.order_id)#" cfsqltype ="cf_sql_integer">
               AND Status = 0
            </cfquery>
             <!--- Update the Received_faxes table with agency_id and order_id --->
            <cfquery name="update_Received_faxes" datasource="#Application.DataSrc#">
               UPDATE #Request.prefix_db_lookup#.Received_faxes  SET  
               Order_ID =  <cfqueryparam value ="#trim(arguments.order_id)#" cfsqltype ="cf_sql_integer">,
               Agency_ID =  <cfqueryparam value ="#trim(arguments.agency_id)#" cfsqltype ="cf_sql_integer">,
                Change_by =  2,
                Date_Change = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
               WHERE ID =   <cfqueryparam value ="#trim(arguments.ID)#" cfsqltype ="cf_sql_integer">
               ANd status = 0
            </cfquery>
            <cfset response_key={"statusCode"= 200,"statusText"= 'success',"data"= 'success' } />
            <cfreturn  response_key >
         <cfcatch>
            <cfset response_key = {"statusCode" = 500, "statusText" = "error", "data" = "Error updating fax: #CFCATCH.Message#"} />
            
            <!--- Send error notification email --->
            <cftry>
                <cfmail to="velmurugan@myhomecarebiz.com" 
                        from="noreply@myhomecarebiz.com" 
                        subject="OCR Fax Processing Error" 
                        type="html">
                    <h3>OCR Fax Processing Error</h3>
                    <p><strong>Error Details:</strong></p>
                    <ul>
                        <li><strong>Error Message:</strong> #CFCATCH.Message#</li>
                        <li><strong>Error Detail:</strong> #CFCATCH.Detail#</li>
                        <li><strong>Error Type:</strong> #CFCATCH.Type#</li>
                        <li><strong>Timestamp:</strong> #now()#</li>
                    </ul>
                    <p><strong>Fax Information:</strong></p>
                    <ul>
                        <li><strong>Agency ID:</strong> #arguments.agency_id#</li>
                        <li><strong>Order ID:</strong> #arguments.order_id#</li>
                        <li><strong>Fax ID:</strong> #arguments.ID#</li>
                    </ul>
                    <p>Please investigate this error and take appropriate action.</p>
                </cfmail>
            <cfcatch>
                <!--- If email fails, log it but don't break the main process --->
                <cflog file="faxLogerror" text="Failed to send error notification email: #CFCATCH.Message#" type="error">
            </cfcatch>
            </cftry>
        </cfcatch>
        </cftry>

        <cfreturn response_key />
    </cffunction>


</cfcomponent>