<cfcomponent extends="components.common.formObject">
	<cfset variables.idCurrencyFrom=0>
	<cfset variables.currencyFrom="">
	<cfset variables.idCurrencyTo=0>
	<cfset variables.currencyTo="">
	<cfset variables.idEmployee=0>
	<cfset variables.employee="">
	<cfset variables.value=1>
	<cfset variables.dateRegistration=Now()>
	<cfset module.list.orderBy="currencyFrom">

	<cffunction name="init" access="public" output="false">
		<cfset variables.idCurrencyFrom=0>
		<cfset variables.currencyFrom="">
		<cfset variables.idCurrencyTo=0>
		<cfset variables.currencyTo="">
		<cfset variables.idEmployee=0>
		<cfset variables.employee="">
		<cfset variables.value=1>
		<cfset variables.dateRegistration=Now()>
	</cffunction>
	
	<cffunction name="getFormObjectId" access="public" output="false" returntype="numeric">
		<cfreturn getIdCurrencyFrom()>
	</cffunction>
	
	<cffunction name="setFormObjectId" access="public" output="false">
		<cfargument name="objectId" type="numeric" required="yes">
		<cfset setIdCurrencyFrom(arguments.objectId)>
	</cffunction>

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

	<cffunction name="getIdCurrencyFrom" access="public" returntype="numeric" output="false">
		<cfreturn variables.idCurrencyFrom>
	</cffunction>
	
	<cffunction name="getCurrencyFrom" access="public" returntype="components.corporate.currency" output="false">
		<cfif not IsObject("variables.currencyFrom")><cfset variables.currencyFrom=CreateObject("component", "components.corporate.currency")></cfif>
		<cfif Compare(module.form.pageAction, "add") and not variables.currencyFrom.isRetrievedFromDB()>
			<cfset variables.currencyFrom=CreateObject("component", "components.corporate.currency")>
			<cfset variables.currencyFrom.setIdCurrency(variables.idCurrencyFrom)>
			<cfset variables.currencyFrom.get()>
		</cfif>
		<cfreturn variables.currencyFrom>
	</cffunction>

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

	<cffunction name="getIdCurrencyTo" access="public" returntype="numeric" output="false">
		<cfreturn variables.idCurrencyTo>
	</cffunction>
	
	<cffunction name="getCurrencyTo" access="public" returntype="components.corporate.currency" output="false">
		<cfif not IsObject("variables.currencyTo")><cfset variables.currencyTo=CreateObject("component", "components.corporate.currency")></cfif>
		<cfif Compare(module.form.pageAction, "add") and not variables.currencyTo.isRetrievedFromDB()>
			<cfset variables.currencyTo=CreateObject("component", "components.corporate.currency")>
			<cfset variables.currencyTo.setIdCurrency(variables.idCurrencyTo)>
			<cfset variables.currencyTo.get()>
		</cfif>
		<cfreturn variables.currencyTo>
	</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="components.corporate.employee" output="false">
		<cfif not IsObject("variables.employee")><cfset variables.employee=CreateObject("component", "components.corporate.employee")></cfif>
		<cfif Compare(module.form.pageAction, "add") and not variables.serverFile.isRetrievedFromDB()>
			<cfset variables.employee=CreateObject("component", "components.corporate.employee")>
			<cfset variables.employee.setIdEmployee(variables.idEmployee)>
			<cfset variables.employee.get()>
		</cfif>
		<cfreturn variables.employee>
	</cffunction>

	<cffunction name="setValue" access="public" output="false">
		<cfargument name="value" type="numeric" required="yes" default="1">
		<cfset variables.value=arguments.value>
	</cffunction>

	<cffunction name="getValue" access="public" returntype="numeric" output="false">
		<cfreturn LSNumberFormat(variables.value, "____.0000")>
	</cffunction>

	<cffunction name="getDateRegistration" access="public" returntype="string" output="false">
		<cfset var result=LSDateFormat(variables.dateRegistration, "dd/mm/yyyy") & " " & LSTimeFormat(variables.dateRegistration, "HH:mm:ss")>
		<cfreturn result>
	</cffunction>

	<cffunction name="setVariablesFromQuery" access="private" output="false">
		<cfargument name="getQuery" type="query" required="yes">
		<cfif getQuery.recordcount gt 0>
			<cfset variables.idCurrencyFrom=getQuery.idCurrencyFrom>
			<cfset variables.idCurrencyTo=getQuery.idCurrencyTo>
			<cfif Len(getQuery.idEmployee)><cfset variables.idEmployee=getQuery.idEmployee><cfelse><cfset variables.idEmployee=0></cfif>
			<cfset variables.value=getQuery.value>
			<cfset variables.dateRegistration=getQuery.dateRegistration>
		</cfif>
	</cffunction>

	<cffunction name="get" access="public" output="false">
		<cfquery name="getQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE 
				currencyChangeRate.idCurrencyFrom=<cfqueryparam value="#variables.idCurrencyFrom#" cfsqltype="cf_sql_integer">
				AND currencyChangeRate.idCurrencyTo=<cfqueryparam value="#variables.idCurrencyTo#" cfsqltype="cf_sql_integer">
				AND currencyChangeRate.dateRegistration=(
					SELECT MAX(dateRegistration) FROM currencyChangeRate AS CCR 
					WHERE 
						CCR.idCurrencyFrom=currencyChangeRate.idCurrencyFrom 
						AND CCR.idCurrencyTo=currencyChangeRate.idCurrencyTo
					)
		</cfquery>
		<cfif getQuery.recordcount gt 0>
			<cfset setVariablesFromQuery(getQuery)>
		</cfif>
		<cfset module.retrievedFromDB=true>
	</cffunction>
	
	<cffunction name="getChangeRateMatrix" access="public" returntype="array" output="false">
		<cfargument name="requestedDate" type="string" default="" required="no">
		<cfset var result=ArrayNew(2)>
		<cfquery name="getListMatrixQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				currencyChangeRate.dateRegistration=(
					SELECT MAX(dateRegistration) FROM currencyChangeRate AS CCR 
					WHERE 
						CCR.idCurrencyFrom=currencyChangeRate.idCurrencyFrom 
						AND CCR.idCurrencyTo=currencyChangeRate.idCurrencyTo
						<cfif Len(arguments.requestedDate)>
						AND CCR.dateRegistration <= <cfqueryparam value="#parseDate(arguments.requestedDate)#" cfsqltype="cf_sql_timestamp">
						</cfif>
					)
		</cfquery>
		<cfloop query="getListMatrixQuery">
			<cfset result[getListMatrixQuery.idCurrencyFrom][getListMatrixQuery.idCurrencyTo]=getListMatrixQuery.value>
		</cfloop>
		<cfreturn result>
	</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.idCurrencyFrom gt 0>
				AND currencyChangeRate.idCurrencyFrom=<cfqueryparam value="#variables.idCurrencyFrom#" cfsqltype="cf_sql_integer">
				</cfif>
				<cfif variables.idCurrencyTo gt 0>
				AND currencyChangeRate.idCurrencyTo=<cfqueryparam value="#variables.idCurrencyTo#" cfsqltype="cf_sql_integer">
				</cfif>
				AND currencyChangeRate.dateRegistration=(
					SELECT MAX(dateRegistration) FROM currencyChangeRate AS CCR 
					WHERE 
						CCR.idCurrencyFrom=currencyChangeRate.idCurrencyFrom 
						AND CCR.idCurrencyTo=currencyChangeRate.idCurrencyTo
					)
			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="
				currencyChangeRate.idCurrencyFrom,
				currencyFrom.name as currencyFrom,
				currencyChangeRate.idCurrencyTo,
				currencyTo.name as currencyTo,
				currencyChangeRate.idEmployee,
				CONCAT(TRIM(employee.nameFirst),' ', TRIM(employee.nameFirst1),' ',TRIM(employee.nameLast),' ',TRIM(employee.nameLast1)) as employee,
				currencyChangeRate.value,
				currencyChangeRate.dateRegistration
			FROM 
				currencyChangeRate
			LEFT JOIN currency AS currencyFrom ON currencyChangeRate.idCurrencyFrom=currencyFrom.idCurrency
			LEFT JOIN currency AS currencyTo ON currencyChangeRate.idCurrencyTo=currencyTo.idCurrency
			LEFT JOIN employee ON currencyChangeRate.idEmployee=employee.idEmployee
			">
		<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 variables.value eq 0>
			<cfset result.message="Valor de cambio no puede ser 0">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				INSERT INTO currencyChangeRate
					(
					idCurrencyFrom, idCurrencyTo, idEmployee, value, dateRegistration
					) 
				VALUES 
					(
					<cfqueryparam value="#variables.idCurrencyFrom#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idCurrencyTo#" cfsqltype="cf_sql_integer">, 
					<cfif variables.idEmployee gt 0><cfqueryparam value="#variables.idEmployee#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					<cfqueryparam value="#LSParseNumber(variables.value)#" cfsqltype="cf_sql_double">, 
					<cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp">
					)
			</cfquery>
			<!--- in case of differen from and to values update a revers values --->
			<cfif variables.idCurrencyFrom neq variables.idCurrencyTo>
				<cfquery name="createQuery1" datasource="#application.datasource#">
					INSERT INTO currencyChangeRate
						(
						idCurrencyFrom, idCurrencyTo, idEmployee, value, dateRegistration
						) 
					VALUES 
						(
						<cfqueryparam value="#variables.idCurrencyTo#" cfsqltype="cf_sql_integer">, 
						<cfqueryparam value="#variables.idCurrencyFrom#" cfsqltype="cf_sql_integer">, 
						<cfif variables.idEmployee gt 0><cfqueryparam value="#variables.idEmployee#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
						<cfqueryparam value="#1/(LSParseNumber(variables.value))#" cfsqltype="cf_sql_double">, 
						<cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp">
						)
				</cfquery>
			</cfif>
			<cfset result.id=1>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [currencyChangeRate.create()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>

	<cffunction name="update" access="public" returntype="struct" output="false">
		<cfreturn create()>
	</cffunction>
</cfcomponent>