<cfcomponent extends="components.common.formObject">
	<cfset variables.idCapitalMovement=0>
	<cfset variables.idCapitalParticipantFrom=0>
	<cfset variables.capitalParticipantFrom="">
	<cfset variables.idCapitalParticipantTo=0>
	<cfset variables.capitalParticipantTo="">
	<cfset variables.idCurrency=1>
	<cfset variables.currency="">
	<cfset variables.idEmployee=0>
	<cfset variables.employee="">
	<cfset variables.dateRegistered="">
	<cfset variables.amount=0>
	<cfset variables.description="">
	<cfset module.list.orderBy="dateRegistered DESC">

	<cfset variables.previousCapitalMovement="">
	<cfset variables.dateStart="">
	<cfset variables.dateEnd="">
	
	<cffunction name="init" access="public" output="false">
		<cfset variables.idCapitalMovement=0>
		<cfset variables.idCapitalParticipantFrom=0>
		<cfset variables.capitalParticipantFrom="">
		<cfset variables.idCapitalParticipantTo=0>
		<cfset variables.capitalParticipantTo="">
		<cfset variables.idCurrency=1>
		<cfset variables.currency="">
		<cfset variables.idEmployee=0>
		<cfset variables.employee="">
		<cfset variables.dateRegistered="">
		<cfset variables.amount=0>
		<cfset variables.description="">

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

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

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

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

	<cffunction name="getIdCapitalParticipantFrom" access="public" returntype="numeric" output="false">
		<cfreturn variables.idCapitalParticipantFrom>
	</cffunction>
	
	<cffunction name="getCapitalParticipantFrom" access="public" returntype="components.corporate.capitalParticipant" output="false">
		<cfif not IsObject("variables.capitalParticipantFrom")><cfset variables.capitalParticipantFrom=CreateObject("component", "components.corporate.capitalParticipant")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.capitalParticipantFrom.isRetrievedFromDB()) or variables.capitalParticipantFrom.getIdCapitalParticipant() neq variables.idCapitalParticipantFrom>
			<cfset variables.capitalParticipantFrom=CreateObject("component", "components.corporate.capitalParticipant")>
			<cfset variables.capitalParticipantFrom.setIdCapitalParticipant(variables.idCapitalParticipantFrom)>
			<cfset variables.capitalParticipantFrom.get()>
		</cfif>
		<cfreturn variables.capitalParticipantFrom>
	</cffunction>
	
	<cffunction name="setIdCapitalParticipantTo" access="public" output="false">
		<cfargument name="idCapitalParticipantTo" type="numeric" required="yes" default="0">
		<cfset variables.idCapitalParticipantTo=arguments.idCapitalParticipantTo>
	</cffunction>

	<cffunction name="getIdCapitalParticipantTo" access="public" returntype="numeric" output="false">
		<cfreturn variables.idCapitalParticipantTo>
	</cffunction>
	
	<cffunction name="getCapitalParticipantTo" access="public" returntype="components.corporate.capitalParticipant" output="false">
		<cfif not IsObject("variables.capitalParticipantTo")><cfset variables.capitalParticipantTo=CreateObject("component", "components.corporate.capitalParticipant")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.capitalParticipantTo.isRetrievedFromDB()) or variables.capitalParticipantTo.getIdCapitalParticipant() neq variables.idCapitalParticipantTo>
			<cfset variables.capitalParticipantTo=CreateObject("component", "components.corporate.capitalParticipant")>
			<cfset variables.capitalParticipantTo.setIdCapitalParticipant(variables.idCapitalParticipantTo)>
			<cfset variables.capitalParticipantTo.get()>
		</cfif>
		<cfreturn variables.capitalParticipantTo>
	</cffunction>
	
	<cffunction name="setIdCurrency" access="public" output="false">
		<cfargument name="idCurrency" type="numeric" required="yes" default="0">
		<cfset variables.idCurrency=arguments.idCurrency>
	</cffunction>

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

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

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

	<cffunction name="getEmployee" access="remote" returntype="components.corporate.employee" output="true">
		<cfif not IsObject("variables.employee")><cfset variables.employee=CreateObject("component", "components.corporate.employee")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.employee.isRetrievedFromDB()) or variables.employee.getIdEmployee() neq variables.idEmployee>
			<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="setDateRegistered" access="remote" output="false">
		<cfargument name="dateRegistered" type="string" required="yes" default="">
		<cfset variables.dateRegistered=arguments.dateRegistered>
	</cffunction>

	<cffunction name="getDateRegistered" access="remote" returntype="string" output="false">
		<cfreturn variables.dateRegistered>
	</cffunction>

	<cffunction name="setAmount" access="public" output="false">
		<cfargument name="amount" type="string" required="yes" default="">
		<cfset variables.amount=parseCurrency(arguments.amount)>
	</cffunction>

	<cffunction name="getAmount" access="public" returntype="numeric" output="false">
		<cfreturn parseCurrency(variables.amount)>
	</cffunction>

	<cffunction name="setDescription" access="remote" output="false">
		<cfargument name="description" type="string" required="yes" default="">
		<cfset variables.description=arguments.description>
	</cffunction>

	<cffunction name="getDescription" access="remote" returntype="string" output="false">
		<cfreturn variables.description>
	</cffunction>

	<cffunction name="setVariablesFromQuery" access="private" output="false">
		<cfargument name="getQuery" type="query" required="yes">
		<cfif getQuery.recordcount gt 0>
			<cfset variables.idCapitalMovement=getQuery.idCapitalMovement>
			<cfset variables.idCapitalParticipantFrom=getQuery.idCapitalParticipantFrom>
			<cfset variables.idCapitalParticipantTo=getQuery.idCapitalParticipantTo>
			<cfset variables.idCurrency=getQuery.idCurrency>
			<cfset variables.idEmployee=getQuery.idEmployee>
			<cfset variables.dateRegistered=getQuery.dateRegistered>
			<cfset variables.amount=getQuery.amount>
			<cfset variables.description=getQuery.description>
		</cfif>
	</cffunction>

	<cffunction name="get" access="public" output="false">
		<cfquery name="getQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				capitalMovement.idCapitalMovement=<cfqueryparam value="#variables.idCapitalMovement#" 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 Len(variables.dateStart)>
					AND CAST(capitalMovement.dateRegistered AS DATE) >= <cfqueryparam value="#parseDate(variables.dateStart)#" cfsqltype="cf_sql_date">
				</cfif>
				<cfif Len(variables.dateEnd)>
					AND CAST(capitalMovement.dateRegistered AS DATE) <= <cfqueryparam value="#parseDate(variables.dateEnd)#" cfsqltype="cf_sql_date">
				</cfif>
			ORDER BY <cfif Len(arguments.orderBy)>#URLDecode(arguments.orderBy)#<cfelse>#URLDecode(module.list.orderBy)#</cfif>
		</cfquery>
		<cfreturn getListQuery>
	</cffunction>
	
	<cffunction name="getQueryString" access="private" output="false" returntype="string">
		<cfset var result="
				capitalMovement.idCapitalMovement,
				capitalMovement.idCapitalParticipantFrom, capitalParticipantFrom.name AS capitalParticipantFrom,
				capitalMovement.idCapitalParticipantTo, capitalParticipantTo.name AS capitalParticipantTo,
				capitalMovement.idCurrency, currency.name AS currency,
				capitalMovement.idEmployee, CONCAT(TRIM(CONCAT(employee.nameFirst, ' ', employee.nameFirst1)), ' ', TRIM(CONCAT(employee.nameLast, ' ', employee.nameLast1))) AS employee,
				capitalMovement.dateRegistered,
				capitalMovement.amount,
				capitalMovement.name
			FROM 
				capitalMovement
			LEFT JOIN capitalParticipant AS capitalParticipantFrom ON capitalMovement.idCapitalParticipantFrom=capitalParticipantFrom.idCapitalParticipant
			LEFT JOIN capitalParticipant AS capitalParticipantTo ON capitalMovement.idCapitalParticipantTo=capitalParticipantTo.idCapitalParticipant
			LEFT JOIN employee ON capitalMovement.idEmployee=employee.idEmployee
			LEFT JOIN currency ON capitalMovement.idCurrency=currency.idCurrency
			">
		<cfreturn result>
	</cffunction>

	<cffunction name="createOptions" access="public" returntype="numeric" output="true">
		<cfargument name="selected" required="yes" type="numeric" default="0">
		<cfset var list=getList("capitalMovement.dateRegistered")>
		<cfset var result=0>
		<cfif list.idCapitalMovement gt 0><cfset result=list.idCapitalMovement></cfif>
		<cfloop query="list">
			<cfif list.idCapitalMovement eq arguments.selected><cfset _selected=" selected"><cfset result=list.idCapitalMovement><cfelse><cfset _selected=""></cfif>
			<cfoutput><option value="#list.idCapitalMovement#"#_selected#>[#LSDateFormat(list.dateRegistered, "dd/mm/yyy)#] #list.capitalParticipantFrom# -> #list.capitalParticipantTo# (#list.amount#)</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 
				idCapitalMovement 
			FROM 
				capitalMovement 
			WHERE 
				idCapitalParticipantFrom=<cfqueryparam value="#variables.idCapitalParticipantFrom#" cfsqltype="cf_sql_integer">
				AND idCapitalParticipantTo=<cfqueryparam value="#variables.idCapitalParticipantTo#" cfsqltype="cf_sql_integer">
				AND dateRegistered=<cfqueryparam value="#parseDate(variables.dateRegistered)#" cfsqltype="cf_sql_timestamp">
				AND amount=<cfqueryparam value="#parseCurrency(variables.amount)#" cfsqltype="cf_sql_double">
				<cfif variables.idCapitalMovement gt 0>
				AND idCapitalMovement != <cfqueryparam value="#variables.idCapitalMovement#" cfsqltype="cf_sql_integer">
				</cfif>
		</cfquery>
		<cfif getIdQuery.recordcount gt 0>
			<cfset result.id=getIdQuery.idCapitalMovement>
		</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 variables.idCapitalParticipantFrom lt 1 or variables.idCapitalParticipantTo lt 1>
			<cfset result.message="Origen y destino son campos obligatorios">
			<cfreturn result>
		</cfif>
		<cfif not Len(variables.dateRegistered)>
			<cfset variables.dateRegistered=LSDateFormat(Now(), "dd/mm/yyyy") & " " & TimeFormat(Now(), "HH:mm:ss")>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Movimiento de capital con esos datos ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				INSERT INTO capitalMovement
					(
						idCapitalMovement, 
						idCapitalParticipantFrom, 
						idCapitalParticipantTo, 
						idCurrency, 
						idEmployee, 
						dateRegistered, 
						amount, 
						description
					) 
				VALUES 
					(
					<cfqueryparam value="#variables.idCapitalMovement#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idCapitalParticipantFrom#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idCapitalParticipantTo#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idCurrency#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idEmployee#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#parseDate(variables.dateRegistered)#" cfsqltype="cf_sql_timestamp">,
					<cfqueryparam value="#parseCurrency(variables.amount)#" cfsqltype="cf_sql_double">,
					<cfqueryparam value="#variables.description#" cfsqltype="cf_sql_clob">
					)
			</cfquery>
			<cfset result=getId()>
			<cfset variables.idCapitalMovement=result.id>
			<!--- crear el participante de movimientos --->
			<cfset createCapitalMovement()>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [capitalMovement.create()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>

	<cffunction name="update" access="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cfif variables.idCapitalParticipantFrom lt 1 or variables.idCapitalParticipantTo lt 1>
			<cfset result.message="Origen y destino son campos obligatorios">
			<cfreturn result>
		</cfif>
		<cfif not Len(variables.dateRegistered)>
			<cfset variables.dateRegistered=LSDateFormat(Now(), "dd/mm/yyyy") & " " & TimeFormat(Now(), "HH:mm:ss")>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Movimiento de capital con esos datos ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<!--- store data of previous capital movement --->
			<cfset variables.previousCapitalMovement=CreateObject("component", "components.corporate.capitalMovement")>
			<cfset variables.previousCapitalMovement.setIdCapitalMovement(variables.idCapitalMovement)>
			<cfset variables.previousCapitalMovement.get()>
			<cfquery name="updateQuery" datasource="#application.datasource#">
				UPDATE capitalMovement
				SET 
					idCapitalParticipantFrom=<cfqueryparam value="#variables.idCapitalParticipantFrom#" cfsqltype="cf_sql_integer">, 
					idCapitalParticipantTo=<cfqueryparam value="#variables.idCapitalParticipantTo#" cfsqltype="cf_sql_integer">, 
					idCurrency=<cfqueryparam value="#variables.idCurrency#" cfsqltype="cf_sql_integer">, 
					idEmployee=<cfqueryparam value="#variables.idEmployee#" cfsqltype="cf_sql_integer">, 
					amount=<cfqueryparam value="#parseCurrency(variables.amount)#" cfsqltype="cf_sql_double">,
					description=<cfqueryparam value="#variables.description#" cfsqltype="cf_sql_clob">
				WHERE 
					idCapitalMovement=<cfqueryparam value="#variables.idCapitalMovement#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfset result.id=variables.idCapitalMovement>
			<!--- catch any error --->
			<cfset updateCapitalMovement()>

			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [capitalMovement.update()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>

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

	<cffunction name="createCapitalMovement" access="private" output="false">
		<cfset var _capitalParticipantFrom=getCapitalParticipantFrom()>
		<cfset var _capitalParticipantTo=getCapitalParticipantTo()>
		<cfset var _capital="">
		<cfset var _amount=variables.amount>
		<!--- create change rate matrix --->
		<cfset var _changeRateMatrix=application.objectManager.getAppObject("currencyChangeRate").getChangeRateMatrix()>

		<cfif _capitalParticipantFrom.getIdCapital() gt 0>
			<!--- make this transaction unique --->
			<cflock scope="application" type="exclusive" timeout="20">
				<cfset _capital=_capitalParticipantFrom.getCapital()>
				<cfif _capital.getIdCurrency() neq variables.idCurrency>
					<cfset _changeRate=_changeRateMatrix[variables.idCurrency][_capital.getIdCurrency()]>
					<cfset _amount=_amount*_changeRate>
				</cfif>
				<cfset _capital.setAmount(_capital.getAmount()-_amount)>
				<cfset _capital.update()>
			</cflock>
		</cfif>
		<!--- restore amount --->
		<cfset _amount=variables.amount>
		<cfif _capitalParticipantTo.getIdCapital() gt 0>
			<!--- make this transaction unique --->
			<cflock scope="application" type="exclusive" timeout="20">
				<cfset _capital=_capitalParticipantTo.getCapital()>
				<cfif _capital.getIdCurrency() neq variables.idCurrency>
					<cfset _changeRate=_changeRateMatrix[variables.idCurrency][_capital.getIdCurrency()]>
					<cfset _amount=_amount*_changeRate>
				</cfif>
				<cfset _capital.setAmount(_capital.getAmount()+_amount)>
				<cfset _capital.update()>
			</cflock>
		</cfif>
	</cffunction>

	<cffunction name="updateCapitalMovement" access="private" output="false">
		<!--- prticipant from object --->
		<cfset var _capitalParticipantFrom=getCapitalParticipantFrom()>
		<!--- participant to object --->
		<cfset var _capitalParticipantTo=getCapitalParticipantTo()>
		<!--- capital object --->
		<cfset var _capital="">
		<!--- amount --->
		<cfset var _amount=variables.amount>
		<!--- amount que era registrado posteriormente --->
		<cfset var _amountBefore=variables.previousCapitalMovement.getAmount()>
		<!--- create change rate matrix --->
		<cfset var _changeRateObj=application.objectManager.getAppObject("currencyChangeRate")>
		<!--- matriz de valores de cambio a la fecha de movimiento --->
		<cfset var _changeRateMatrix=_changeRateObj.getChangeRateMatrix(variables.previousCapitalMovement.getDateRegistered())>

		<!--- la transaccion debe ser exclusiva --->
		<cflock scope="application" type="exclusive" timeout="20">
			<!--- verificamos si tenial el capital from posteriormanete --->
			<cfif variables.previousCapitalMovement.getCapitalParticipantFrom().getIdCapital() gt 0>
					<!--- restauramos el valor de antes de movimiento --->
					<cfset _capital=variables.previousCapitalMovement.getCapitalParticipantFrom().getCapital()>
					<cfif _capital.getIdCurrency() neq variables.previousCapitalMovement.getIdCurrency()>
						<cfset _changeRate=_changeRateMatrix[variables.previousCapitalMovement.getIdCurrency()][_capital.getIdCurrency()]>
						<cfset _amountBefore=_amountBefore*_changeRate>
					</cfif>
					<cfset _capital.setAmount(_capital.getAmount()+_amountBefore)>
					<cfset _capital.update()>
			</cfif>
			<!--- modifcamos el monto de capital from --->
			<cfif _capitalParticipantFrom.getIdCapital() gt 0>
					<!--- modificamos el valor actual --->
					<cfset _capital=_capitalParticipantFrom.getCapital()>
					<cfif _capital.getIdCurrency() neq variables.idCurrency>
						<cfset _changeRate=_changeRateMatrix[variables.idCurrency][_capital.getIdCurrency()]>
						<cfset _amount=_amount*_changeRate>
					</cfif>
					<cfset _capital.setAmount(_capital.getAmount()-_amount)>
					<cfset _capital.update()>
			</cfif>
			<!--- restore amount --->
			<cfset _amount=variables.amount>
			<cfset _amountBefore=variables.previousCapitalMovement.getAmount()>
			<!--- definimos si el movimiento anterior tenia un capital to --->
			<cfif variables.previousCapitalMovement.getCapitalParticipantTo().getIdCapital() gt 0>
					<!--- restauramos el valor anterior --->
					<cfset _capital=variables.previousCapitalMovement.getCapitalParticipantTo().getCapital()>
					<cfif _capital.getIdCurrency() neq variables.previousCapitalMovement.getIdCurrency()>
						<cfset _changeRate=_changeRateMatrix[variables.previousCapitalMovement.getIdCurrency()][_capital.getIdCurrency()]>
						<cfset _amountBefore=_amountBefore*_changeRate>
					</cfif>
					<cfset _capital.setAmount(_capital.getAmount()-_amountBefore)>
					<cfset _capital.update()>
			</cfif>
			<!--- modificamos el valor actual --->
			<cfif _capitalParticipantTo.getIdCapital() gt 0>
					<cfset _capital=_capitalParticipantTo.getCapital()>
					<cfif _capital.getIdCurrency() neq variables.idCurrency>
						<cfset _changeRate=_changeRateMatrix[variables.idCurrency][_capital.getIdCurrency()]>
						<cfset _amount=_amount*_changeRate>
					</cfif>
					<cfset _capital.setAmount(_capital.getAmount()+_amount)>
					<cfset _capital.update()>
			</cfif>
		</cflock>
	</cffunction>

	<cffunction name="deleteCapitalMovement" access="private" output="false">
		<cfset var _capitalParticipantFrom=getCapitalParticipantFrom()>
		<cfset var _capitalParticipantTo=getCapitalParticipantTo()>
		<cfset var _capital="">
		<cfset var _amount=variables.amount>
		<!--- create change rate matrix --->
		<cfset var _changeRateMatrix=application.objectManager.getAppObject("currencyChangeRate").getChangeRateMatrix(variables.dateRegistered)>

		<cfif _capitalParticipantFrom.getIdCapital() gt 0>
			<!--- make this transaction unique --->
			<cflock scope="application" type="exclusive" timeout="20">
				<cfset _capital=_capitalParticipantFrom.getCapital()>
				<cfif _capital.getIdCurrency() neq variables.idCurrency>
					<cfset _changeRate=_changeRateMatrix[variables.idCurrency][_capital.getIdCurrency()]>
					<cfset _amount=_amount*_changeRate>
				</cfif>
				<cfset _capital.setAmount(_capital.getAmount()+_amount)>
				<cfset _capital.update()>
			</cflock>
		</cfif>
		<!--- restore amount --->
		<cfset _amount=variables.amount>
		<cfif _capitalParticipantTo.getIdCapital() gt 0>
			<!--- make this transaction unique --->
			<cflock scope="application" type="exclusive" timeout="20">
				<cfset _capital=_capitalParticipantTo.getCapital()>
				<cfif _capital.getIdCurrency() neq variables.idCurrency>
					<cfset _changeRate=_changeRateMatrix[variables.idCurrency][_capital.getIdCurrency()]>
					<cfset _amount=_amount*_changeRate>
				</cfif>
				<cfset _capital.setAmount(_capital.getAmount()-_amount)>
				<cfset _capital.update()>
			</cflock>
		</cfif>
	</cffunction>

</cfcomponent>