<cfcomponent extends="proventas31.common.formObject">
	<cfset variables.idServerFile=0>
	<cfset variables.idServerFileType=0>
	<cfset variables.serverFileType=CreateObject("component", "proventas31.corporate.serverFileType")>
	<cfset variables.idEmployee=0>
	<cfset variables.employee=CreateObject("component", "proventas31.corporate.employee")>
	<cfset variables.dateCreated="">
	<cfset variables.displayName="">
	<cfset variables.clientFileName="">
	<cfset variables.contentType="">
	<cfset variables.fileSize="">
	<cfset variables.serverFileName="">
	<cfset module.list.orderBy="displayName">
	
	<cffunction name="init" access="public" output="false">
		<cfset variables.idServerFile=0>
		<cfset variables.idServerFileType=0>
		<cfset variables.serverFileType=CreateObject("component", "proventas31.corporate.serverFileType")>
		<cfset variables.idEmployee=0>
		<cfset variables.employee=CreateObject("component", "proventas31.corporate.employee")>
		<cfset variables.dateCreated="">
		<cfset variables.displayName="">
		<cfset variables.clientFileName="">
		<cfset variables.contentType="">
		<cfset variables.fileSize="">
		<cfset variables.serverFileName="">
	</cffunction>

	<cffunction name="getFormObjectId" access="public" output="false" returntype="numeric">
		<cfreturn getIdServerFile()>
	</cffunction>
	
	<cffunction name="setFormObjectId" access="public" output="false">
		<cfargument name="objectId" type="numeric" required="yes">
		<cfset setIdServerFile(arguments.objectId)>
	</cffunction>

	<cffunction name="setIdServerFile" access="public" output="false">
		<cfargument name="idServerFile" type="numeric" required="yes" default="0">
		<cfset variables.idServerFile=arguments.idServerFile>
	</cffunction>

	<cffunction name="getIdServerFile" access="public" returntype="numeric" output="false">
		<cfreturn variables.idServerFile>
	</cffunction>

	<cffunction name="setIdServerFileType" access="public" output="false">
		<cfargument name="idServerFileType" type="numeric" required="yes" default="0">
		<cfset variables.idServerFileType=arguments.idServerFileType>
	</cffunction>

	<cffunction name="getIdServerFileType" access="public" returntype="numeric" output="false">
		<cfreturn variables.idServerFileType>
	</cffunction>

	<cffunction name="getServerFileType" access="public" returntype="proventas31.corporate.serverFileType" output="false">
		<cfset variables.serverFileType=CreateObject("component", "proventas31.corporate.serverFileType")>
		<cfset variables.serverFileType.setIdServerFileType(variables.idServerFileType)>
		<cfset variables.serverFileType.get()>
		<cfreturn variables.serverFileType>
	</cffunction>

	<cffunction name="setIdEmployee" access="public" output="false">
		<cfargument name="idEmployee" type="numeric" required="yes" default="0">
		<cfset variables.idEmployee=arguments.idEmployee>
	</cffunction>

	<cffunction name="getIdEmployee" access="public" returntype="numeric" output="false">
		<cfreturn variables.idEmployee>
	</cffunction>

	<cffunction name="getEmployee" access="public" returntype="proventas31.corporate.employee" output="false">
		<cfset variables.employee=CreateObject("component", "proventas31.corporate.employee")>
		<cfset variables.employee.setIdEmployee(variables.idEmployee)>
		<cfset variables.employee.get()>
		<cfreturn variables.employee>
	</cffunction>

	<cffunction name="setDateCreated" access="public" output="false">
		<cfargument name="dateCreated" type="string" required="yes" default="">
		<cfset variables.dateCreated=arguments.dateCreated>
	</cffunction>

	<cffunction name="getDateCreated" access="public" returntype="string" output="false">
		<cfreturn variables.dateCreated>
	</cffunction>

	<cffunction name="setDisplayName" access="public" output="false">
		<cfargument name="displayName" type="string" required="yes" default="">
		<cfset variables.displayName=arguments.displayName>
	</cffunction>

	<cffunction name="getDisplayName" access="public" returntype="string" output="false">
		<cfreturn variables.displayName>
	</cffunction>

	<cffunction name="setClientFileName" access="public" output="false">
		<cfargument name="clientFileName" type="string" required="yes" default="">
		<cfset variables.clientFileName=arguments.clientFileName>
	</cffunction>

	<cffunction name="getClientFileName" access="public" returntype="string" output="false">
		<cfreturn variables.clientFileName>
	</cffunction>

	<cffunction name="setContentType" access="public" output="false">
		<cfargument name="contentType" type="string" required="yes" default="">
		<cfset variables.contentType=arguments.contentType>
	</cffunction>

	<cffunction name="getContentType" access="public" returntype="string" output="false">
		<cfreturn variables.contentType>
	</cffunction>

	<cffunction name="setFileSize" access="public" output="false">
		<cfargument name="fileSize" type="string" required="yes" default="">
		<cfset variables.fileSize=arguments.fileSize>
	</cffunction>

	<cffunction name="getFileSize" access="public" returntype="string" output="false">
		<cfreturn variables.fileSize>
	</cffunction>

	<cffunction name="setServerFileName" access="public" output="false">
		<cfargument name="serverFileName" type="string" required="yes" default="">
		<cfset variables.serverFileName=arguments.serverFileName>
	</cffunction>

	<cffunction name="getServerFileName" access="public" returntype="string" output="false">
		<cfreturn variables.serverFileName>
	</cffunction>

	<cffunction name="setVariablesFromQuery" access="private" output="false">
		<cfargument name="query" type="query" required="yes">
		<cfif query.recordcount gt 0>
			<cfset variables.idServerFile=getQuery.idServerFile>

			<cfset variables.idServerFileType=getQuery.idServerFileType>
			<cfset variables.serverFileType=CreateObject("component", "proventas31.corporate.serverFileType")>
			<cfset variables.serverFileType.setIdServerFileType(variables.idServerFileType)>

			<cfset variables.idEmployee=getQuery.idEmployee>
			<cfset variables.employee=CreateObject("component", "proventas31.corporate.employee")>
			<cfset variables.employee.setIdEmployee(variables.idEmployee)>

			<cfset variables.dateCreated=getQuery.dateCreated>
			<cfset variables.displayName=getQuery.displayName>
			<cfset variables.clientFileName=getQuery.clientFileName>
			<cfset variables.contentType=getQuery.contentType>
			<cfset variables.fileSize=getQuery.fileSize>
			<cfset variables.serverFileName=getQuery.serverFileName>
		</cfif>
	</cffunction>

	<cffunction name="upload" displayname="upload" access="public" output="false" hint="Function to process the upload of the file">
		<cfargument name="fileField" required="yes">
		<!--- check that destination directory exists --->
		<cfif not DirectoryExists("#application.dir.file##variables.idServerFileType#")>
			<cfdirectory action="create" directory="#application.dir.file##variables.idServerFileType#">
		</cfif>
		<!--- upload the file --->
		<cffile action="upload" filefield="#arguments.fileField#" destination="#application.dir.file##variables.idServerFileType##application.slash#" nameconflict="makeunique">
		<cfif not cffile.fileWasSaved>
			<cfthrow message="Error saving file">
		</cfif>
		<!--- set the result variables --->
		<cfset variables.clientFileName=cffile.clientFile>
		<cfset variables.contentType=cffile.contentType & "/" & cffile.contentSubType>
		<cfset variables.fileSize=cffile.fileSize>
		<cfset variables.serverFileName=variables.idServerFileType & "/" & cffile.serverFile>
	</cffunction>
	
	<cffunction name="deleteFile" displayname="deleteFile" access="private" output="false" hint="function to delete file on server">
		<cfif variables.idServerFile gt 0>
			<cfquery name="fileInfo" datasource="#application.datasource#">
				SELECT 
					#getQueryString()#
				WHERE
					serverFile.idServerFile=<cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfif fileInfo.recordcount lt 1>
				<cfthrow message="There is no info about this file (delete)">
			</cfif>
			<cfif FileExists("#application.dir.file##URLDecode(fileInfo.serverFileName)#")>
				<cffile action="delete" file="#application.dir.file##URLDecode(fileInfo.serverFileName)#">
				<cfif FileExists("#application.dir.file##variables.serverFileName#")>
					<cffile action="move" source="#application.dir.file##variables.serverFileName#" destination="#application.dir.file##URLDecode(fileInfo.serverFileName)#">
					<cfset variables.serverFileName=URLDecode(fileInfo.serverFileName)>
				</cfif>
			</cfif>
		</cfif>
	</cffunction>

	<!---
	Getter for form values.
	Used to set variables structure accoridng to form parameters. 
	We must owervrite this method of formObject because of file upload posibility
	--->
	<cffunction name="getFormParamters" access="public" output="false">
		<cfargument name="form" type="struct" required="yes">
		<cfif StructKeyExists(arguments.form, module.name & "_orderBy")>
			<cfset setListOrderBy(arguments.form[module.name & "_orderBy"])>
		</cfif>
		<cfif StructKeyExists(arguments.form, module.name & "_pageNumber")>
			<cfset setListPageNumber(arguments.form[module.name & "_pageNumber"])>
		</cfif>
		<cfif StructKeyExists(arguments.form, module.name & "_pageAction")>
			<cfset setFormPageAction(arguments.form[module.name & "_pageAction"])>
		</cfif>
		<cfif StructKeyExists(arguments.form, module.name & "_objectId")>
			<cfset setFormObjectId(arguments.form[module.name & "_objectId"])>
		</cfif>
		<cfloop list="#StructKeyList(variables)#" index="parameterName">
			<cfset _parameterName=module.form.prefix & parameterName>
			<cfif StructKeyExists(arguments.form, _parameterName)>
				<cfset variables[parameterName]=arguments.form[_parameterName]>
			</cfif>
		</cfloop>
		<cfloop list="#StructKeyList(arguments.form)#" index="parameterName">
			<cfif FindNoCase("FUPFLD", parameterName) and Len(arguments.form[parameterName])>
				<cfset upload(parameterName)>
			</cfif>
		</cfloop>
	</cffunction>

	<cffunction name="get" access="public" output="false">
		<cfquery name="getQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				serverFile.idServerFile=<cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">
		</cfquery>
		<cfif getQuery.recordcount gt 0>
			<cfset setVariablesFromQuery(getQuery)>
		</cfif>
		<cfset module.retrievedFromDB=true>
	</cffunction>

	<cffunction name="getList" access="public" output="false" returntype="query">
		<cfargument name="orderBy" required="no" type="string" default="">

		<cfquery name="getListQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE 
				1=1
				<cfif variables.idServerFileType gt 0>
				AND serverFile.idServerFileType=<cfqueryparam value="#variables.idServerFileType#" cfsqltype="cf_sql_integer">
				</cfif>
				<cfif Len(variables.displayName)>
				AND serverFile.displayName LIKE <cfqueryparam value="%#variables.displayName#%" cfsqltype="cf_sql_varchar" maxlength="255">
				</cfif>
			ORDER BY <cfif Len(arguments.orderBy)>#arguments.orderBy#<cfelse>#module.list.orderBy#</cfif>
		</cfquery>
		<cfreturn getListQuery>
	</cffunction>
	
	<cffunction name="getQueryString" access="private" output="false" returntype="string">
		<cfset var result="
				serverFile.idServerFile, 
				serverFile.idServerFileType, serverFileType.name AS serverFileType,
				serverFile.idEmployee, CONCAT(TRIM(CONCAT(employee.nameFirst, ' ', employee.nameFirst1)), ' ', TRIM(CONCAT(employee.nameLast, ' ', employee.nameLast1))) AS employee,
				serverFile.dateCreated, 
				serverFile.displayName, 
				serverFile.clientFileName, 
				serverFile.contentType, 
				serverFile.fileSize,
				serverFile.serverFileName
			FROM 
				serverFile
				LEFT JOIN serverFileType ON serverFile.idServerFileType=serverFileType.idServerFileType
				LEFT JOIN employee ON serverFile.idEmployee=employee.idEmployee
			">
		<cfreturn result>
	</cffunction>
	
	<cffunction name="createOptions" access="public" returntype="numeric" output="true">
		<cfargument name="selected" required="yes" type="numeric" default="0">
		<cfargument name="idServerFileType" required="no" type="numeric" default="0">
		<cfset var list="">
		<cfset var result=0>
		<cfif arguments.idServerFileType gt 0><cfset variables.idServerFileType=arguments.idServerFileType></cfif>
		<cfset list=getList("serverFile.displayName")>
		<cfif list.idServerFile gt 0><cfset result=list.idServerFile></cfif>
		<cfloop query="list">
			<cfif list.idServerFile eq arguments.selected><cfset _selected=" selected"><cfset result=list.idServerFile><cfelse><cfset _selected=""></cfif>
			<cfoutput><option value="#list.idServerFile#"#_selected#>#list.displayName#</option></cfoutput>
		</cfloop>
		<cfreturn result>
	</cffunction>

	<cffunction name="getId" access="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<cfquery name="getIdQuery" datasource="#application.datasource#">
			SELECT 
				idServerFile 
			FROM 
				serverFile 
			WHERE 
				serverFile.idServerFileType=<cfqueryparam value="#variables.idServerFileType#" cfsqltype="cf_sql_integer">
				AND serverFile.displayName=<cfqueryparam value="#variables.displayName#" cfsqltype="cf_sql_varchar" maxlength="255">
				<cfif variables.idServerFile gt 0>
				AND serverFile.idServerFile != <cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">
				</cfif>
		</cfquery>
		<cfif getIdQuery.recordcount gt 0>
			<cfset result.id=getIdQuery.idServerFile>
		</cfif>
		<cfreturn result>
	</cffunction>
	
	<cffunction name="create" access="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cfif not Len(variables.dateCreated)>
			<cfset variables.dateCreated=Now()>
		<cfelse>
			<cfif not LSIsDate(variables.dateCreated)>
				<cfset variables.dateCreated=parseDate(variables.dateCreated)>
			</cfif>
		</cfif>
		<cfif not Len(variables.displayName)><cfset variables.displayName=variables.clientFileName></cfif>
		<cfif not Len(variables.displayName)>
			<cfset result.message="Nombre de archivo es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfif variables.idServerFileType lt 1>
			<cfset result.message="Tipo de archivo es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Archivo con nombre y tipo ya esta existe en el sistema">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				INSERT INTO serverFile
					(
					idServerFile, 
					idServerFileType, 
					idEmployee,
					dateCreated, 
					displayName, 
					clientFileName, 
					contentType,
					fileSize, 
					serverFileName
					) 
				VALUES 
					(
					<cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idServerFileType#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idEmployee#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.dateCreated#" cfsqltype="cf_sql_timestamp">,
					<cfqueryparam value="#variables.displayName#" cfsqltype="cf_sql_varchar" maxlength="255">,
					<cfqueryparam value="#variables.clientFileName#" cfsqltype="cf_sql_varchar" maxlength="255">,
					<cfqueryparam value="#variables.contentType#" cfsqltype="cf_sql_varchar" maxlength="255">,
					<cfqueryparam value="#variables.fileSize#" cfsqltype="cf_sql_integer">,
					<cfqueryparam value="#variables.serverFileName#" cfsqltype="cf_sql_varchar" maxlength="255">
					)
				ON DUPLICATE KEY UPDATE 
					idServerFileType=<cfqueryparam value="#variables.idServerFileType#" cfsqltype="cf_sql_integer">, 
					idEmployee=<cfqueryparam value="#variables.idEmployee#" cfsqltype="cf_sql_integer">, 
					dateCreated=<cfqueryparam value="#variables.dateCreated#" cfsqltype="cf_sql_timestamp">
					<cfif Len(variables.displayName)>,displayName=<cfqueryparam value="#variables.displayName#" cfsqltype="cf_sql_varchar" maxlength="255"></cfif>
					<cfif Len(variables.clientFileName)>,clientFileName=<cfqueryparam value="#variables.clientFileName#" cfsqltype="cf_sql_varchar" maxlength="255"></cfif>
					<cfif Len(variables.contentType)>,contentType=<cfqueryparam value="#variables.contentType#" cfsqltype="cf_sql_varchar" maxlength="255"></cfif>
					<cfif variables.fileSize gt 0>,fileSize=<cfqueryparam value="#variables.fileSize#" cfsqltype="cf_sql_integer"></cfif>
					<cfif Len(variables.serverFileName)>,serverFileName=<cfqueryparam value="#variables.serverFileName#" cfsqltype="cf_sql_varchar" maxlength="255"></cfif>
			</cfquery>
			<cfif variables.idServerFile lt 1>
				<cfset result=getId()>
				<cfset variables.idServerFile=result.id>
			<cfelse>
				<cfset result.id=variables.idServerFile>
			</cfif>
			<!--- create depending objects --->
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [serverFile.create()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>

	<cffunction name="update" access="public" returntype="struct" output="true">
		<cfif Len(variables.serverFileName)>
			<cfset deleteFile()>
		</cfif>
		<cfreturn create()>
	</cffunction>

	<cffunction name="delete" access="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- delete file --->
		<cfif Len(variables.serverFileName)>
			<cfset deleteFile()>
		</cfif>
		<cftry>
			<cfquery name="deleteQuery" datasource="#application.datasource#">
				DELETE FROM serverFile
				WHERE 
					idServerFile=<cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfset result.id=0>
			<cfset init()>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [serverFile.delete()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>
</cfcomponent>