<cfcomponent extends="components.common.formObject">
	<cfset variables.idProject=0>
	<cfset variables.idServerFile=0>
	<cfset variables.serverFile="">
	<cfset variables.idServerFile1=0>
	<cfset variables.serverFile1="">
	<cfset variables.name="">
	<cfset variables.idCurrency=0>
	<cfset variables.currency=CreateObject("component", "components.corporate.currency")>
	<cfset variables.idSalesPaymentPlan=0>
	<cfset variables.salesPaymentPlan="">
	<cfset module.list.orderBy="name">
	
	<cfset variables.projectRoles="">
	
	<cffunction name="init" access="public" output="false">
		<cfset variables.idProject=0>
		<cfset variables.idServerFile=0>
		<cfset variables.serverFile="">
		<cfset variables.idServerFile1=0>
		<cfset variables.serverFile1="">
		<cfset variables.name="">
		<cfset variables.currency=CreateObject("component", "components.corporate.currency")>
		<cfset variables.idSalesPaymentPlan=0>
		<cfset variables.salesPaymentPlan="">

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

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

	<cffunction name="getIdProject" access="public" returntype="numeric" output="false">
		<cfreturn variables.idProject>
	</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="getServerFile" access="public" returntype="components.corporate.serverFile" output="false">
		<cfif not IsObject("variables.serverFile")><cfset variables.serverFile=CreateObject("component", "components.corporate.serverFile")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.serverFile.isRetrievedFromDB()) or variables.serverFile.getIdServerFile() neq variables.idServerFile>
			<cfset variables.serverFile=CreateObject("component", "components.corporate.serverFile")>
			<cfset variables.serverFile.setIdServerFile(variables.idServerFile)>
			<cfset variables.serverFile.get()>
		</cfif>
		<cfreturn variables.serverFile>
	</cffunction>
	
	<cffunction name="setIdServerFile1" access="public" output="false">
		<cfargument name="idServerFile1" type="numeric" required="yes" default="0">
		<cfset variables.idServerFile1=arguments.idServerFile1>
	</cffunction>

	<cffunction name="getIdServerFile1" access="public" returntype="numeric" output="false">
		<cfreturn variables.idServerFile1>
	</cffunction>
	
	<cffunction name="getServerFile1" access="public" returntype="components.corporate.serverFile" output="false">
		<cfif not IsObject("variables.serverFile1")><cfset variables.serverFile1=CreateObject("component", "components.corporate.serverFile")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.serverFile1.isRetrievedFromDB()) or variables.serverFile1.getIdServerFile() neq variables.idServerFile1>
			<cfset variables.serverFile1=CreateObject("component", "components.corporate.serverFile")>
			<cfset variables.serverFile1.setIdServerFile(variables.idServerFile1)>
			<cfset variables.serverFile1.get()>
		</cfif>
		<cfreturn variables.serverFile1>
	</cffunction>
	
	<cffunction name="setName" access="public" output="false">
		<cfargument name="name" type="string" required="yes" default="">
		<cfset variables.name=arguments.name>
	</cffunction>

	<cffunction name="getName" access="public" returntype="string" output="false">
		<cfreturn variables.name>
	</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="public" returntype="components.corporate.currency" output="true">
		<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()) or variables.currency.getIdCurrency() neq variables.idCurrency>
			<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="setIdSalesPaymentPlan" access="public" output="false">
		<cfargument name="idSalesPaymentPlan" type="numeric" required="yes" default="0">
		<cfset variables.idSalesPaymentPlan=arguments.idSalesPaymentPlan>
	</cffunction>

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

	<cffunction name="getSalesPaymentPlan" access="public" returntype="components.corporate.salesPaymentPlan" output="false">
		<cfif not IsObject("variables.salesPaymentPlan")><cfset variables.salesPaymentPlan=CreateObject("component", "components.corporate.salesPaymentPlan")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.salesPaymentPlan.isRetrievedFromDB()) or variables.salesPaymentPlan.getIdSalesPaymentPlan() neq variables.idSalesPaymentPlan>
			<cfset variables.salesPaymentPlan=CreateObject("component", "components.corporate.salesPaymentPlan")>
			<cfset variables.salesPaymentPlan.setIdSalesPaymentPlan(variables.idSalesPaymentPlan)>
			<cfset variables.salesPaymentPlan.get()>
		</cfif>
		<cfreturn variables.salesPaymentPlan>
	</cffunction>

	<cffunction name="setVariablesFromQuery" access="private" output="false">
		<cfargument name="getQuery" type="query" required="yes">
		<cfif getQuery.recordcount gt 0>
			<cfset variables.idProject=getQuery.idProject>
			<cfif Len(getQuery.idServerFile)><cfset variables.idServerFile=getQuery.idServerFile><cfelse><cfset variables.idServerFile=0></cfif>
			<cfif Len(getQuery.idServerFile1)><cfset variables.idServerFile1=getQuery.idServerFile1><cfelse><cfset variables.idServerFile1=0></cfif>
			<cfif Len(getQuery.idCurrency)><cfset variables.idCurrency=getQuery.idCurrency><cfelse><cfset variables.idCurrency=0></cfif>
			<cfif Len(getQuery.idSalesPaymentPlan)><cfset variables.idSalesPaymentPlan=getQuery.idSalesPaymentPlan><cfelse><cfset variables.idSalesPaymentPlan=0></cfif>
			<cfset variables.name=getQuery.name>
		</cfif>
	</cffunction>

	<cffunction name="get" access="public" output="false">
		<cfquery name="getQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryStringFull()#
			WHERE
				project.idProject=<cfqueryparam value="#variables.idProject#" 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="true" returntype="query">
		<cfargument name="orderBy" required="no" type="string" default="">
		<cfquery name="getListQuery" datasource="#application.datasource#">
			SELECT 
			<cfif IsUserInRole("viewFull")>
				#getQueryStringFull()#
			<cfelse>
				#getQueryStringShort()#
			WHERE 
				employeeAccessProfile.idEmployee=<cfqueryparam value="#session.employee.getIdEmployee()#" cfsqltype="cf_sql_integer">
				AND employeeAccessProfile.idProject IS NOT NULL
			</cfif>
			ORDER BY <cfif Len(arguments.orderBy)>#arguments.orderBy#<cfelse>#module.list.orderBy#</cfif>
		</cfquery>
		<cfreturn getListQuery>
	</cffunction>
	
	<cffunction name="getQueryStringFull" access="private" output="false" returntype="string">
		<cfset var result="
				project.idProject,
				project.idServerFile, serverFile.serverFileName AS serverFile,
				project.idServerFile1, serverFile1.serverFileName AS serverFile1,
				project.idCurrency, currency.name AS currency,
				project.idSalesPaymentPlan, salesPaymentPlan.name AS salesPaymentPlan,
				project.name
			FROM 
				project
			LEFT JOIN serverFile ON project.idServerFile=serverFile.idServerFile
			LEFT JOIN serverFile AS serverFile1 ON project.idServerFile1=serverFile1.idServerFile
			LEFT JOIN currency ON project.idCurrency=currency.idCurrency
			LEFT JOIN salesPaymentPlan ON project.idSalesPaymentPlan=salesPaymentPlan.idSalesPaymentPlan
			">
		<cfreturn result>
	</cffunction>

	<cffunction name="getQueryStringShort" access="private" output="false" returntype="string">
		<cfset var result="
				project.idProject,
				project.idServerFile, serverFile.serverFileName AS serverFile,
				project.idServerFile1, serverFile1.serverFileName AS serverFile1,
				project.idCurrency, currency.name AS currency,
				project.idSalesPaymentPlan, salesPaymentPlan.name AS salesPaymentPlan,
				project.name
			FROM 
				employeeAccessProfile
			LEFT JOIN project ON employeeAccessProfile.idProject=project.idProject
			LEFT JOIN serverFile ON project.idServerFile=serverFile.idServerFile
			LEFT JOIN serverFile AS serverFile1 ON project.idServerFile1=serverFile1.idServerFile
			LEFT JOIN currency ON project.idCurrency=currency.idCurrency
			LEFT JOIN salesPaymentPlan ON project.idSalesPaymentPlan=salesPaymentPlan.idSalesPaymentPlan
			">
		<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("project.name")>
		<cfset var result=0>
		<cfif list.idProject gt 0><cfset result=list.idProject></cfif>
		<cfoutput><!-- arguments.selected=#arguments.selected# --></cfoutput>
		<cfloop query="list">
			<cfif list.idProject eq arguments.selected><cfset _selected=" selected"><cfset result=list.idProject><cfelse><cfset _selected=""></cfif>
			<cfoutput><!-- list.idProject=#list.idProject# : arguments.selected=#arguments.selected# --></cfoutput>
			<cfoutput><option value="#list.idProject#"#_selected#>#list.name#</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 
				idProject 
			FROM 
				project 
			WHERE 
				name=<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">
				<cfif variables.idProject gt 0>
				AND idProject != <cfqueryparam value="#variables.idProject#" cfsqltype="cf_sql_integer">
				</cfif>
		</cfquery>
		<cfif getIdQuery.recordcount gt 0>
			<cfset result.id=getIdQuery.idProject>
		</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.name)>
			<cfset result.message="Nombre de proyecto es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Proyecto con ese nombre ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				INSERT INTO project
					(
					idProject, idServerFile, idServerFile1, idCurrency, idSalesPaymentPlan, name
					) 
				VALUES 
					(
					<cfqueryparam value="#variables.idProject#" cfsqltype="cf_sql_integer">, 
					<cfif variables.idServerFile gt 0><cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					<cfif variables.idServerFile1 gt 0><cfqueryparam value="#variables.idServerFile1#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					<cfif variables.idCurrency gt 0><cfqueryparam value="#variables.idCurrency#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					<cfif variables.idSalesPaymentPlan gt 0><cfqueryparam value="#variables.idSalesPaymentPlan#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">
					)
			</cfquery>
			<cfif variables.idProject lt 1>
				<cfset result=getId()>
				<cfset variables.idProject=result.id>
			</cfif>
			<!--- create a capital --->
			<cfset createCapital()>
			<!---- notificar recursos humanos --->
			<cfset sendNotifications()>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [project.create()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>
	
	<cffunction name="createCapital" access="private" output="false">
		<cfset var _capital=CreateObject("component", "components.corporate.capital")>
		<cfset _capital.setIdProject(variables.idProject)>
		<cfset _capital.setIdCurrency(variables.idCurrency)>
		<cfset _capital.create()>
	</cffunction>
	
	<cffunction name="sendNotifications" access="public" output="false">
		<cfset var _employeeData=CreateObject("component", "components.corporate.employeeData")>
		<cfinvoke component="components.corporate.employeeAccessProfile" method="getEmployeeListByProfileNamePart" returnvariable="_employeeList">
			<cfinvokeargument name="accessProfileNamePart" value="Recursos humanos">
		</cfinvoke>
		<cfif _employeeList.recordcount gt 0>
			<cfloop query="_employeeList">
				<cfset _employeeData.init()>
				<cfset _employeeData.setIdEmployee(_employeeList.idEmployee)>
				<cfset _employeeData.get()>
				<cfif Len(_employeeData.getEmail())>
					<cfmail from="info@i-productiva.com" to="#_employeeData.getEmail()#" subject="[ERP] Un nuevo proyecto fue creado" type="html">
Un nuevo proyecto <b>#variables.name#</b> fue creado y es necesario que usted configure los permisos de acceso de los empleados involucrados en ese proyecto.
					</cfmail>
				</cfif>
			</cfloop>
		</cfif> 
	</cffunction>

	<cffunction name="update" access="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cfif not Len(variables.name)>
			<cfset result.message="Nombre de proyecto es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Proyecto con ese nombre ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="updateQuery" datasource="#application.datasource#">
				UPDATE project
				SET 
					idServerFile=<cfif variables.idServerFile gt 0><cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					idServerFile1=<cfif variables.idServerFile1 gt 0><cfqueryparam value="#variables.idServerFile1#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					idCurrency=<cfif variables.idCurrency gt 0><cfqueryparam value="#variables.idCurrency#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					idSalesPaymentPlan=<cfif variables.idSalesPaymentPlan gt 0><cfqueryparam value="#variables.idSalesPaymentPlan#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					name=<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">
				WHERE 
					idProject=<cfqueryparam value="#variables.idProject#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfset result.id=variables.idProject>
			<!--- create depending objects --->
			<!--- TODO --->
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [project.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>
			<cfquery name="deleteQuery" datasource="#application.datasource#">
				DELETE FROM project
				WHERE 
					idProject=<cfqueryparam value="#variables.idProject#" 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 [project.delete()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>
	
	<cffunction name="createFromHelper" access="public" output="false">
		<cfset var _projectActivity=application.objectManager.getAppObject("projectActivity")>
		<cfset var _projectTask=application.objectManager.getAppObject("projectTask")>
		<!--- set project ID --->
		<cfquery name="projectActivityList" datasource="#application.datasource#">
			SELECT idProjectActivity, name FROM projectActivityHelper
		</cfquery>
		<cfloop query="projectActivityList">
			<cfset _projectActivity.init()>
			<cfset _projectActivity.setIdProject(variables.idProject)>
			<cfset _projectActivity.setidCurrency(variables.idCurrency)>
			<cfset _projectActivity.setName(projectActivityList.name)>
			<cfset result=_projectActivity.create()>
			<cfif result.id gt 0>
				<cfquery name="projectTaskList" datasource="#application.datasource#">
					SELECT idProjectTask, idProjectActivity, name FROM projectTaskHelper
					WHERE idProjectActivity=<cfqueryparam value="#projectActivityList.idProjectActivity#" cfsqltype="cf_sql_integer">
				</cfquery>
				<cfloop query="projectTaskList">
					<cfset _projectTask.init()>
					<cfset _projectTask.setIdProject(variables.idProject)>
					<cfset _projectTask.setidCurrency(variables.idCurrency)>
					<cfset _projectTask.setName(projectTaskList.name)>
					<cfset _projectTask.setIdProjectActivity(_projectActivity.getIdProjectActivity())>
					<cfset _projectTask.create()>
				</cfloop>
			<cfelse>
				<cfthrow message=result.message>
			</cfif>
		</cfloop>
	</cffunction>

	<cffunction name="getProjectRoles" access="public" returntype="components.corporate.projectRoles" output="false">
		<cfif not IsObject("variables.projectRoles")><cfset variables.projectRoles=CreateObject("component", "components.corporate.projectRoles")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.projectRoles.isRetrievedFromDB()) or variables.projectRoles.getIdProject() neq variables.idProject>
			<cfset variables.projectRoles=CreateObject("component", "components.corporate.projectRoles")>
			<cfset variables.projectRoles.setIdProject(variables.idProject)>
			<cfset variables.projectRoles.get()>
		</cfif>
		<cfreturn variables.projectRoles>
	</cffunction>

</cfcomponent>