<cfset billingSFTP = createObject("component", "components.billing.billing_sftp") />
<!--- Do not delete remote 277 files on stage/dev servers. --->
<cfset isNonProdServer = (
	CGI.SERVER_NAME EQ "127.0.0.1" OR CGI.SERVER_NAME EQ "localhost"
	OR CGI.SERVER_NAME EQ "52.23.186.30" OR CGI.SERVER_NAME EQ "dev.myhomecarebiz.com"
	OR CGI.SERVER_NAME EQ "98.87.35.139" OR CGI.SERVER_NAME EQ "devsecure.myhomecarebiz.com"
	OR CGI.SERVER_NAME EQ "54.175.136.41" OR CGI.SERVER_NAME EQ "stagesecure.myhomecarebiz.com"
) />
<!--- #10473: process all SFTP accounts (hcbserv shared + dedicated e.g. Evergreen 1195) --->
<cfset importConnections = billingSFTP.getImportConnections() />
<!--- #10393: STC codes from 277 stored in Invoices.claim_status --->
<cfset stcRejectedCodes = "F2,A3,A4,A6,A7,A8" />
<cfset canUseGeneralCFC = false />
<cfif isDefined("generalCFC") AND isObject(generalCFC)>
	<cfset canUseGeneralCFC = true />
<cfelse>
	<cftry>
		<cfset generalCFC = createObject("component", "components.general.Invoice") />
		<cfif isObject(generalCFC)>
			<cfset canUseGeneralCFC = true />
		</cfif>
		<cfcatch>
			<cfset canUseGeneralCFC = false />
		</cfcatch>
	</cftry>
</cfif>

<cfloop array="#importConnections#" index="importConn">
<cftry>
<cfset objFTPProperties = importConn.connection />
<cfset dedicatedAgencyId = importConn.dedicatedAgencyId />
<cfset sftpAccountLabel = objFTPProperties.Username />
<cfftp action="open" connection="objConnection" attributeCollection="#objFTPProperties#"/>
<cfset remote277Dir = "/outgoing/" />
<cfset local277Dir = getTempDirectory() & "claim_status_277/" />
<cfif NOT directoryExists(local277Dir)>
	<cfdirectory action="create" directory="#local277Dir#">
</cfif>
<cfftp connection="objConnection" action="GetCurrentDir" stoponerror="Yes"> 
<!--- output directory name ---> 
<cfoutput> 
	<h3>SFTP account: #sftpAccountLabel#<cfif len(dedicatedAgencyId)> (agency #dedicatedAgencyId#)</cfif> &mdash; current directory: #cfftp.returnvalue#</h3> 
</cfoutput> 
<!--- Get a listing of the directory. ---> 
<!--- Preferred Inovalon location; fallback handles spelling variant if needed. --->
<cftry>
	<cfftp connection="objConnection" action="listdir" directory="#remote277Dir#" name="dirlist" stoponerror="Yes">
	<cfcatch>
		<cfset remote277Dir = "/outgoing/" />
		<cfftp connection="objConnection" action="listdir" directory="#remote277Dir#" name="dirlist" stoponerror="Yes">
	</cfcatch>
</cftry>
<cfset claimStatusFileCutoff = DateAdd("d", -5, Now()) />
	<div class="portlet-title">
		<div class="caption">
			<i class="fa fa-gear"></i>FTP Directory Listing
		</div>
		<div class="tools">
			<a class="collapse" href="javascript:;" data-original-title="" title="">
			</a>
		</div>
	</div>
	<div class="portlet-body flip-scroll">
		<table class="table table-bordered table-striped table-condensed flip-content">
			<thead class="flip-content">
				<tr>
					<th width="20%">
						Name
					</th>
					<th class="numeric">
						Path
					</th>
					<th class="numeric">
						URL
					</th>
					<th class="numeric">
						Length
					</th>
					<th class="numeric">
						LastModified
					</th>
					<th class="numeric">
						IsDirectory
					</th>
				</tr>
			</thead>
			<tbody>
			<cfoutput query="dirlist">
				<cfif isdirectory contains "YES" OR (isDate(LastModified) AND LastModified GTE claimStatusFileCutoff)>
				<tr>
					<td>
						#name#
					</td>
					<td class="numeric">
						#path#
					</td>
					<td class="numeric">
						#url#
					</td>
					<td class="numeric">
						#length#
					</td>
					<td class="numeric">
					#DateFormat(LastModified, "yyyy-mm-dd")# #TimeFormat(LastModified, "hh:mm:ss")# 
					</td>
					<td class="numeric">
						#IsDirectory#
					</td>
				</tr>
				</cfif>
			</cfoutput>
			</tbody>
		</table>
	</div>
</div>
<cfset name2=ArrayNew(1) />
<cfloop query="dirlist">
	<cfset name1 = ListToArray("#name#",' ') />
	<cfloop from="1" to="#arraylen(name1)#" index="k">
		<cfif "#isdirectory#"  contains "YES" >
			<cfset k = k+1 />
			<cfelse>
				<!--- Only process files modified in the last 2 days. --->
				<cfif NOT isDate(LastModified) OR LastModified LT claimStatusFileCutoff>
					<cfcontinue />
				</cfif>
				<cfset filepath = remote277Dir />
				<cfset name2 = #name1[k]# />
				<!--- Only process 277 response files. --->
				<cfif listLast(lCase(name2), ".") NEQ "277">
					<cfcontinue />
				</cfif>
				<cfftp action="getfile" 
				remotefile="#filepath##name2#" 
				 localfile="#local277Dir##name2#"
				 failIfExists="no"
				 connection="objConnection" />
				<cffile action="read" source="#local277Dir##name2#"  variable="fileContent" file="#local277Dir##name2#" >
				<cfset strWords = #fileContent# />
				<cftry>
					<cfif findNoCase("ST*277", strWords)>
						<cfset ediSegments = listToArray(reReplace(strWords, "[\r\n]+", "", "all"), "~") />
						<cfset stcCode = "" />
						<cfset stcRaw = "" />
						<cfset stcDate = "" />
						<cfset stcErrorDesc = "" />
						<cfset trnControlNumber = "" />
						<cfset isClaimLevelTrn = false />

						<cfloop from="1" to="#arrayLen(ediSegments)#" index="i">
							<cfset segment = trim(ediSegments[i]) />
							<cfif left(segment,6) eq "TRN*2*">
								<cfset trnParts = listToArray(segment, "*") />
								<cfif arrayLen(trnParts) gte 3 AND len(trim(trnParts[3]))>
									<cfset trnControlNumber = trim(trnParts[3]) />
									<!--- Claim-level TRN uses agencyId-controlNumber (e.g. 1184-260526162106). --->
									<cfset isClaimLevelTrn = find("-", trnControlNumber) GT 0 />
								</cfif>
							<cfelseif left(segment,4) eq "STC*">
								<!--- Only use STC paired with claim-level TRN*2* (not batch-level STC*A2 after TRN*2*000004). --->
								<cfif NOT isClaimLevelTrn>
									<cfcontinue />
								</cfif>
								<cfset stcParts = listToArray(segment, "*") />
								<cfif arrayLen(stcParts) gte 2>
									<cfset stcRaw = trim(stcParts[2]) />
									<cfset stcDetail = listToArray(stcRaw, ":") />
									<cfset stcCode = uCase(trim(stcDetail[1])) />
									<cfset stcDate = "" />
									<cfset stcErrorDesc = "" />
									<cfif arrayLen(stcParts) gte 3 AND len(trim(stcParts[3])) EQ 8 AND isNumeric(trim(stcParts[3]))>
										<cfset stcDateObj = createObject("java","java.text.SimpleDateFormat").init("yyyyMMdd").parse(trim(stcParts[3]),createObject("java","java.text.ParsePosition").init(0*0)) />
										<cfset stcDate = dateFormat(stcDateObj,"yyyy-mm-dd") />
									</cfif>
									<!--- Free-text error after STC elements (e.g. INVALID GROUP NAME). --->
									<cfif arrayLen(stcParts) gt 5>
										<cfloop from="6" to="#arrayLen(stcParts)#" index="stcIdx">
											<cfset stcField = trim(stcParts[stcIdx]) />
											<cfif len(stcField)>
												<cfset stcErrorDesc = stcField />
												<cfbreak />
											</cfif>
										</cfloop>
										<cfif NOT len(stcErrorDesc)>
											<cfset lastStcField = trim(stcParts[arrayLen(stcParts)]) />
											<cfif len(lastStcField) AND NOT isNumeric(lastStcField) AND len(lastStcField) GT 2>
												<cfset stcErrorDesc = lastStcField />
											</cfif>
										</cfif>
									</cfif>
								</cfif>
								<cfif len(stcCode) AND len(trnControlNumber) AND isClaimLevelTrn>
									<cftry>
										<cfset controlnumber = reReplace(trnControlNumber, "[[:space:]]+", "", "all") />
										<cfset agencyIdFromControl = listFirst(controlnumber, "-") />
										<cfset targetAgencyDb = "" />
										<cfif len(agencyIdFromControl) AND isNumeric(agencyIdFromControl)>
											<cfset targetAgencyDb = "agency_" & agencyIdFromControl />
											<cfquery name="checkAgencySchema" dataSource="#Application.DataSrc#">
												SELECT SCHEMA_NAME
												FROM INFORMATION_SCHEMA.SCHEMATA
												WHERE SCHEMA_NAME = <cfqueryparam value="#targetAgencyDb#" cfsqltype="cf_sql_varchar">
											</cfquery>
											<cfif checkAgencySchema.recordcount EQ 0>
												<cfset targetAgencyDb = "" />
											</cfif>
										</cfif>
										<!--- Dedicated SFTP (e.g. 1195): only that agency. Shared hcbserv: all agencies (277 may land here for any). --->
										<cfset processThisClaim = true />
										<cfif len(dedicatedAgencyId) AND agencyIdFromControl NEQ dedicatedAgencyId>
											<cfset processThisClaim = false />
										</cfif>
										<cfif len(targetAgencyDb) AND processThisClaim>
											<cfset stcRawEsc = replace(stcRaw, "'", "''", "all") />
											<cfset stcCodeEsc = replace(stcCode, "'", "''", "all") />
											<cfset modifiedBy = (isDefined("Session.EmployeeId") AND len(trim(Session.EmployeeId))) ? Session.EmployeeId : 0 />
											<cfquery name="getInvoiceId" dataSource="#Application.DataSrc#">
												SELECT Invoice_ID FROM #targetAgencyDb#.Invoices
												WHERE Internal_control_number = <cfqueryparam value="#controlnumber#" cfsqltype="cf_sql_varchar">
											</cfquery>
											<cfif getInvoiceId.recordcount gt 0>
												<cfif canUseGeneralCFC>
													<cfset getsucess = generalCFC.AddInvoiceHistory(valueList(getInvoiceId.Invoice_ID)) />
												</cfif>
												<cfif listFindNoCase(stcRejectedCodes, stcCode)>
													<cfquery name="updateInvoicesFrom277" dataSource="#Application.DataSrc#">
														UPDATE #targetAgencyDb#.Invoices
														SET claim_status = <cfqueryparam value="#stcCode#" cfsqltype="cf_sql_varchar">,
															errors = <cfqueryparam value="#stcRaw#" cfsqltype="cf_sql_varchar">
															<cfif len(stcErrorDesc)>, Error_description = <cfqueryparam value="#stcErrorDesc#" cfsqltype="cf_sql_varchar"></cfif>
															<cfif len(stcDate)>, claim_rejected_date = <cfqueryparam value="#stcDate#" cfsqltype="cf_sql_date"></cfif>
															,Record_Modified_By = <cfqueryparam value="#modifiedBy#" cfsqltype="cf_sql_integer">
															,Record_Modified_Date = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
														WHERE Internal_control_number = <cfqueryparam value="#controlnumber#" cfsqltype="cf_sql_varchar">
														AND (IFNULL(Invoice_Lock,0) <> 1)
													</cfquery>
												<cfelse>
													<cfquery name="updateInvoicesFrom277" dataSource="#Application.DataSrc#">
														UPDATE #targetAgencyDb#.Invoices
														SET claim_status = <cfqueryparam value="#stcCode#" cfsqltype="cf_sql_varchar">,
															errors = <cfqueryparam value="#stcRaw#" cfsqltype="cf_sql_varchar">
															<cfif len(stcErrorDesc)>, Error_description = <cfqueryparam value="#stcErrorDesc#" cfsqltype="cf_sql_varchar"></cfif>
															<cfif len(stcDate)>, claim_received_date = <cfqueryparam value="#stcDate#" cfsqltype="cf_sql_date"></cfif>
															,Record_Modified_By = <cfqueryparam value="#modifiedBy#" cfsqltype="cf_sql_integer">
															,Record_Modified_Date = <cfqueryparam value="#now()#" cfsqltype="cf_sql_timestamp">
														WHERE Internal_control_number = <cfqueryparam value="#controlnumber#" cfsqltype="cf_sql_varchar">
														AND (IFNULL(Invoice_Lock,0) <> 1)
													</cfquery>
												</cfif>
											</cfif>
										</cfif>
										<cfcatch>
											<cfset claimStatusErrorContext = "277 claim update" />
											<cfset claimStatusErrorFile = name2 />
											<cfset claimStatusErrorControl = trnControlNumber />
											<cfinclude template="claim_status_error_email.cfm" />
										</cfcatch>
									</cftry>
									<cfset stcCode = "" />
									<cfset stcRaw = "" />
									<cfset stcDate = "" />
									<cfset stcErrorDesc = "" />
									<cfset trnControlNumber = "" />
									<cfset isClaimLevelTrn = false />
								</cfif>
							</cfif>
						</cfloop>
					<cfelseif listLast(lCase(name2), ".") NEQ "277">
						<cfset var1 = listToArray(#strWords#, createObject("java", "java.lang.System").getProperty("line.separator"))/>
						<cfloop from="1" to="#arraylen(var1)#" index="i">
							<cftry>
								<cfset arrGirls = ListToArray(#var1[i]#,'|') />
								<cfif #arrGirls[9]# contains 'x000'>
									<cfset controlnumber = #arrGirls[1]# />
									<cfset error  =  #arrGirls[9]# />
									<cfset dat1 = #arrGirls[11]# />
									<cfset Accepted_date = createObject("java","java.text.SimpleDateFormat").init("yyyyMMdd").parse(#dat1#,createObject("java","java.text.ParsePosition").init(0*0)) />
							 		<cfquery  name="getInvoiceId" dataSource="#Application.DataSrc#">
										SELECT * FROM  #Request.prefix_db_agency#.Invoices
										Where Internal_control_number='#controlnumber#'
									</cfquery>
									<cfif canUseGeneralCFC>
										<cfset getsucess= generalCFC.AddInvoiceHistory(valueList(getInvoiceId.Invoice_ID)) />
									</cfif>
									<cfset Accepteddate=#dateformat(Accepted_date,"yyyy-mm-dd")# />
									<cfquery  name="updateprocess" dataSource="#Application.DataSrc#">
										UPDATE  #Request.prefix_db_agency#.Invoices
										SET  claim_status ='A2',
										errors = '#error#',
										claim_received_date ='#Accepteddate#'
                    					,Record_Modified_By = '#Session.EmployeeId#'
                    					,Record_Modified_Date = #now()#

										Where Internal_control_number='#controlnumber#'
										AND (IFNULL(Invoice_Lock,0) <> 1)
									</cfquery>
								<cfelse>
									<cfset controlnumber = #arrGirls[1]# />
									<cfset dat = #arrGirls[9]# />
									<cfset error =#arrGirls[8]# />
									<cfset Rejected_date = createObject("java","java.text.SimpleDateFormat").init("yyyyMMdd").parse(#dat#,createObject("java","java.text.ParsePosition").init(0*0)) />
									<cfset Rejecteddate=#dateformat(Rejected_date,"yyyy-mm-dd")# />
									<cfquery  name="GetErrors" dataSource="#Application.DataSrc#">
										Select errors from  #Request.prefix_db_agency#.Invoices  Where Internal_control_number='#controlnumber#'
									</cfquery>
									<cfif GetErrors.recordcount gt 0> 
							   		<cfset err = ValueList(GetErrors.errors) />
							   		<cfset temp2 = ListAppend(err, "#error#")> 
							   		<cfquery  name="getInvoiceId" dataSource="#Application.DataSrc#">
										SELECT * FROM  #Request.prefix_db_agency#.Invoices
										Where Internal_control_number='#controlnumber#'
									</cfquery>
 									<cfif canUseGeneralCFC>
										<cfset getsucess= generalCFC.AddInvoiceHistory(valueList(getInvoiceId.Invoice_ID)) />
									</cfif>
									<cfset Accepteddate=#dateformat(Accepted_date,"yyyy-mm-dd")# />
							  		<cfquery  name="updateInvoices" dataSource="#Application.DataSrc#">
										UPDATE  #Request.prefix_db_agency#.Invoices
										SET  claim_status ='Rejected',
										errors = '#temp2#',
										claim_rejected_date = '#Rejecteddate#'
                    					,Record_Modified_By = '#Session.EmployeeId#'
                    					,Record_Modified_Date = #now()#
										Where Internal_control_number='#controlnumber#'
										AND (IFNULL(Invoice_Lock,0) <> 1)
									</cfquery>
									<cfelse>
									<cfquery  name="getInvoiceId" dataSource="#Application.DataSrc#">
										SELECT * FROM  #Request.prefix_db_agency#.Invoices
										Where Internal_control_number='#controlnumber#'
									</cfquery>
 									<cfif canUseGeneralCFC>
										<cfset getsucess= generalCFC.AddInvoiceHistory(valueList(getInvoiceId.Invoice_ID)) />
									</cfif>
									<cfset Accepteddate=#dateformat(Accepted_date,"yyyy-mm-dd")# />
									<cfquery  name="updateInvoices" dataSource="#Application.DataSrc#">
										UPDATE  #Request.prefix_db_agency#.Invoices
										SET  claim_status ='Rejected',
										errors = '#error#',
										claim_rejected_date = '#Rejecteddate#'
                    					,Record_Modified_By = '#Session.EmployeeId#'
                    					,Record_Modified_Date = #now()#
										Where Internal_control_number='#controlnumber#'
										AND (IFNULL(Invoice_Lock,0) <> 1)
									</cfquery>
									</cfif>
								</cfif>
								<cfcatch>
									<cfoutput>
										<script type="text/javascript">
											window.onload = function(){
											alert("Please Check  <cfoutput>#name2#</cfoutput> Fileline number  <cfoutput>#i#</cfoutput> has error occur.Other lines has updated.");
											return false;
											}
										</script>
									</cfoutput>
								</cfcatch>
							</cftry>
						</cfloop>
					<cfelse>
						<!--- File has .277 extension but does not contain a 277 ST segment; skip without hard error. --->
					</cfif>
					<cfcatch>
						<cfoutput>
							<script type="text/javascript">
							window.onload = function(){
							alert("Please Check  <cfoutput>#name2#</cfoutput> File,The files format is wrong");
							return false;
							}</script>
						</cfoutput>
					</cfcatch>
				</cftry>
		</cfif>
	</cfloop>
</cfloop>
<cfif NOT isNonProdServer>
  <cfloop query="dirlist">
	<cfset name1 = ListToArray("#name#",' ') />
	<cfloop from="1" to="#arraylen(name1)#" index="k">
		<cfif "#isdirectory#"  contains "YES" >
			<cfset k = k+1 />
			<cfelse>
			<cfset filepath = remote277Dir />
			<cfset name2 = #name1[k]# />
			<cfftp action="remove"  item="#filepath##name2#"  connection="objConnection"  stoponerror="yes" />
		</cfif>	
	</cfloop>
</cfloop>
</cfif>
<cfftp action="close" connection="objConnection"/>
<cfcatch type="any">
	<cfset claimStatusErrorContext = "SFTP connection #sftpAccountLabel#" />
	<cfinclude template="claim_status_error_email.cfm" />
	<cftry><cfftp action="close" connection="objConnection"/><cfcatch></cfcatch></cftry>
</cfcatch>
</cftry>
</cfloop>
<cfabort>