Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Anchor
grantorValidatorCall-anchor
grantorValidatorCall-anchor
grantorValidatorCall
Questa validazione controlla che esista almeno un ente finanziatore nel tab "Dati generali".
Dal punto di vista del modello dati si tratta degli elementi di tipo grantor
Code Block
languagejs
linenumberstrue
collapsetrue
					
			var grantorSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "grantor", wfService);			
			if (grantorSet.size()<1){
				errors.rejectAndLocate("error.project.grantor.atLeast1", "grantor");				
			}				

		

Anchor
uniqueCodeValidator-anchor
uniqueCodeValidator-anchor
uniqueCodeValidator
Questa validazione controlla l'unicità del campo Codice bando.
Code Block
languagejs
linenumberstrue
collapsetrue
	
			if(object.getStringMap().get("code") != null){
				var paramMap = new Packages.java.util.HashMap();
				paramMap.put("code", object.getStringMap().get("code"));	
				paramMap.put("wfItemIdNot", object.getId());			
				var count=searchBuilderTemplate.getSingleObject("getAllCallByCode", paramMap);
				if (count>=1)
					errors.rejectValue("stringMap[code]", "error.call.code.notUnique");
			}
		

Anchor
wfStartLogicContinuousTraining-anchor
wfStartLogicContinuousTraining-anchor
wfStartLogicContinuousTraining
Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
In base alla visione in cui è stato creato l'oggetto, viene effettuato un setup diverso:
-Visione completa:
-Viene estratto il dipartimento dal Direttore del Corso e viene inserito tra i Dipartimenti con ruolo di Organizzatore
-Viene estratto l'Ateneo dalla configurazione OBBLIGATORIA rm.orgunit.external.myOrganization e viene inserito tra i Soggetti terzi, con ruolo di Coordinatore
Visione dipartimentale:
-Viene estratto il dipartimento dal Direttore del Corso e viene inserito tra i Dipartimenti, con ruolo di Coordinatore
Per maggiori dettagli cfr. modello dati dell'entità continuousTraining
Code Block
languagejs
linenumberstrue
collapsetrue
			var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","owner", wfService);

				if(!ownerWfElementSet.isEmpty()){
				
					var ownerWfElement = ownerWfElementSet.iterator().next();
					var owner = ownerWfElement.getPersonMap().get("ownerId");
					
					if(owner != null){
					
						var checkDate = WfUtil.getCheckDate(object, wfService);
						var positionContext = WfUtil.getPositionContext(object, wfService);
						var ownerPositionSet = WfUtil.getPositionSet(owner, checkDate, positionContext, "department", gaService);		
						var department = GaUtil.getPriorityOrganizationUnit(ownerPositionSet, positionContext, "department");
						
						wfItem.getNumberMap().put("receivedFinancing", Packages.java.math.BigDecimal.valueOf(0));
						wfItem.getNumberMap().put("totalSubscriptionFees", Packages.java.math.BigDecimal.valueOf(0));
						wfItem.getNumberMap().put("otherFinancing", Packages.java.math.BigDecimal.valueOf(0));
						wfItem.getNumberMap().put("totalIncome", Packages.java.math.BigDecimal.valueOf(0));
						wfItem.getNumberMap().put("percentageOfEUFinacing", Packages.java.math.BigDecimal.valueOf(0));
						wfItem.getNumberMap().put("percentageOfNationalFinacing", Packages.java.math.BigDecimal.valueOf(0));
						
						//in teoria inutile, ma comportamento strano su cint
						wfItem.getIntegerMap().put("numberOfInternalTeachers", Packages.java.lang.Integer.valueOf(1));
						
						var coordinatorDictionaryId = WfUtil.getDictionaryByCode(wfService, "ouRoleContinuousTraining.coordinator");
						var coordinatorDictionary = wfService.getWfDictionary(coordinatorDictionaryId);
						
						//syso.println("coordinatorDictionaryId: "+ coordinatorDictionaryId);
						//syso.println("coordinatorDictionary: "+ coordinatorDictionary);
						
						if(Packages.java.lang.Boolean.FALSE.equals(GaUtil.isCurrentUserInDepartmentView(gaAuthorizationService))){
							//syso.println("visione completa");
						
							/*
							var myOrganizationIdString = ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
							
							if(myOrganizationIdString != null){
							
								//syso.println("myOrganizationIdString: "+ myOrganizationIdString);
								
								//syso.println("wfItem.getId(): "+ wfItem.getId());
								
								var myOrganizationId = Packages.java.lang.Integer.parseInt(myOrganizationIdString);
								
								//syso.println("myOrganizationId: "+ myOrganizationId);
								
								var myOrganization = gaService.getOrganizationUnit(myOrganizationId);
							
								var externalOrganizationUnitElement = new Packages.it.cilea.wf.model.WfItemElement();						
								externalOrganizationUnitElement.setDiscriminator("externalOrganization");
								externalOrganizationUnitElement.setWfItemId(wfItem.getId());
								externalOrganizationUnitElement.getOrganizationUnitMap().put("ouId", myOrganization);
								externalOrganizationUnitElement.getWfDictionaryMap().put("roleId", coordinatorDictionary);
								
								wfService.saveOrUpdate(externalOrganizationUnitElement);
								wfItem.getWfItemElementSet().add(externalOrganizationUnitElement);
								wfService.saveOrUpdate(wfItem);
								
								if(department != null){
									
									var organizatorDictionaryId = WfUtil.getDictionaryByCode(wfService, "ouRoleContinuousTraining.organizator");
									var organizatorDictionary = wfService.getWfDictionary(organizatorDictionaryId);
						
									//syso.println("organizatorDictionaryId: "+ organizatorDictionaryId);
									//syso.println("organizatorDictionary: "+ organizatorDictionary);
									
									var internalOrganizationUnitWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
									var internalOrganizationUnitWfElement = internalOrganizationUnitWfElementSet.iterator().next();
									
									internalOrganizationUnitWfElement.getWfDictionaryMap().put("roleId", organizatorDictionary);
									
									wfService.saveOrUpdate(internalOrganizationUnitWfElement);
									wfService.saveOrUpdate(wfItem);
								}
								
							}else{
								throw "Per creare un nuovo corso di Formazione Continua in visione completa è necessario che sia impostata correttamente la configuration rm.orgunit.external.myOrganization.Contattare Helpdesk";
							}
							*/
						}else{
							//syso.println("visione dipartimentale");
							
							if(department != null){
								
								var internalOrganizationUnitWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
								var internalOrganizationUnitWfElement = internalOrganizationUnitWfElementSet.iterator().next();
																
								internalOrganizationUnitWfElement.getWfDictionaryMap().put("roleId", coordinatorDictionary);
								
								wfService.saveOrUpdate(internalOrganizationUnitWfElement);
								wfService.saveOrUpdate(wfItem);
							}
						}
					}
				}
						
			true;
		

...

Anchor
wfIdentityLogicResearchDivisionProjectPermissionsJs-anchor
wfIdentityLogicResearchDivisionProjectPermissionsJs-anchor
wfIdentityLogicResearchDivisionProjectPermissionsJs
Questa è una permissions logic che costruisce dinamicamente i permessi per i contratti per il team Divisione Ricerca.
Se l'utente che sta effettuando la creazione del contratto appartiene alla Divisione Ricerca, vengono assegnati i permessi di scrittura a questo team e quelli di sola lettura a livello dipartimentale.
Code Block
languagejs
linenumberstrue
collapsetrue
			var wfTask = object;
			var wfItem = wfService.getWfItem(wfTask.getWfItemId());
			var permissions = "r";			
			var hasPowerPermissions = Packages.it.cilea.wf.util.WfUtil.isAnyItemCreatorIdentityMatchingThisTaskIdentity(wfTask, wfService);			
			if (Packages.java.lang.Boolean.TRUE.equals(hasPowerPermissions))
				hasPowerPermissions=true;
			else 
				hasPowerPermissions=false;
			
			var hasHelpdeskStartedFlow=Packages.it.cilea.wf.util.WfUtil.isAnyItemCreatorIdentityMatchingAuthoritiesWithThisResource(wfTask, "/HELPDESK/ap/contract.profile", wfService, gaAuthorizationService);
			if (Packages.java.lang.Boolean.TRUE.equals(hasHelpdeskStartedFlow))
				hasHelpdeskStartedFlow=true;
			else 
				hasHelpdeskStartedFlow=false;				
						
			switch("" + String(wfItem.getWfState().getDescription())){
				case "draft": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow) 
						permissions="crwfd" 
					else 
						permissions="r";
				break;
				
				case "inquiry": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow) 
						permissions="rwfd" 
					else 
						permissions="r";
				break;
				
				case "fiscalCheck": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow)
						permissions="r" 
					else 
						permissions="r";
				break;
				
				case "revisionAfterFiscalCheck": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow) 
						permissions="rwf" 
					else 
						permissions="r";
				break;
				
				case "approval": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow) 
						permissions="rwf" 
					else 
						permissions="r";
				break;
				
				case "approvedAwaitingCountersignedContract": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow)
						permissions="rwf" 
					else 
						permissions="r";
				break;				
				
				case "signed": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow)
						permissions="rwf" 
					else 
						permissions="r";
				break;
				
				case "closed": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow)
						permissions="rwf" 
					else 
						permissions="r";
				break;
				
				case "suspended": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow)
						permissions="rwf" 
					else 
						permissions="r";
				break;
			}
			
			wfTask.setPermissions(permissions);
			
		

Anchor
wfIdentityLogicMultipleHeadOfDepartmentProjectPermissionsJs-anchor
wfIdentityLogicMultipleHeadOfDepartmentProjectPermissionsJs-anchor
wfIdentityLogicMultipleHeadOfDepartmentProjectPermissionsJs
Questa è una permissions logic che costruisce dinamicamente i permessi per i contratti per il team dipartimentali
Se l'utente che sta effettuando la creazione del contratto è in visione dipartimentale e appartiene ad un team dipartimentale, vengono assegnati i permessi di scrittura a questo team e quelli di sola lettura a livello Divisione Ricerca.
Code Block
languagejs
linenumberstrue
collapsetrue
			var wfTask = object;
			var wfItem = wfService.getWfItem(wfTask.getWfItemId());
			var permissions = "r";	
			var formViews = object.getFormViews();
			var isOnlyRead=true;
			
			//recupero l'unità organizzativa associata (dipartimento) all'identity/team di questo task
			var organizationUnitFromIdentity=Packages.it.cilea.ga.util.GaUtil.getOrganizationUnitFromIdentyForDepartment(gaAuthorizationService.getIdentity(wfTask.getIdentityId()), gaService);			
			
			//recupero dall'item la lista dei dipartimenti
			var internalOrganizationUnitList=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem,
				"it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
			var internalOrganizationUnitListIterator = internalOrganizationUnitList.iterator();
			
			//controllo il ruolo del dipartimento
			//isOnlyRead è false se il dipartimento è principale
			//isOnlyRead è true se il dipartimento è aggregato
			while(internalOrganizationUnitListIterator.hasNext()){
				var internalOrganizationUnit=internalOrganizationUnitListIterator.next();
				var ou = internalOrganizationUnit.getOrganizationUnitMap().get("ouId");
				
				if (ou.getId().equals(organizationUnitFromIdentity.getId())){
					//cerco prima roleId che è il ruolo standard.
					//se non lo trovo ricado in ouRole che è quello legacy
					var role=internalOrganizationUnit.getWfDictionaryMap().get("roleId");
					//if (role==null)
					//	role=internalOrganizationUnit.getWfDictionaryMap().get("ouRole");
					isOnlyRead=Packages.it.cilea.wf.util.WfUtil.isOnlyReadPermission(role, wfItem, "wfIdentityLogicMultipleHeadOfDepartment");
					if (Packages.java.lang.Boolean.TRUE.equals(isOnlyRead))
						isOnlyRead=true;
					else
						isOnlyRead=false;

					break;
				}					
			}
			
			//verifico se c'è match tra le identity di chi ha creato l'item e l'identity di questo task
			//serve per capire se il contratto in questione è stato creato da Divisione Ricerca o da Dipartimento
			//e per dare "power permissions" solo al team che ha fatto la creazione.
			var hasPowerPermissions=Packages.it.cilea.wf.util.WfUtil.isAnyItemCreatorIdentityMatchingThisTaskIdentity(wfTask, wfService);
			
			if (Packages.java.lang.Boolean.TRUE.equals(hasPowerPermissions))
				hasPowerPermissions=true;
			else {
				//se hasPowerPermissions è false allora dovrebbe essere stato creato dalla Divisione Ricerca
				//se però viene cambiato in corso d'opera il dipartimento, non ci sarà più match tra il team dipartimentale che ha creato l'item e il team dipartimentale che dovrebbe accederci.
				//per gestire questo scenario controllo se le identity di chi ha effettuao la creazione sono quelle dipartimentali.				
				var isItemCreatedByDepartmentAuthority=Packages.it.cilea.wf.util.WfUtil.isAllItemCreatorIdentityOfGivenAuthority(wfTask, wfService, gaAuthorizationService, "ROLE_DEPARTMENT");
				
				//se chi ha creato aveva identity dipartimentali...
				if (Packages.java.lang.Boolean.TRUE.equals(isItemCreatedByDepartmentAuthority)){															
					if (isOnlyRead)
						hasPowerPermissions=false;
					else 
						hasPowerPermissions=true;
				} else {
					//se chi ha creato NON aveva identity dipartimentali (Helpdesk o Divisione Ricerca)...
					hasPowerPermissions=false;
				}				
			}
			
			switch("" + String(wfItem.getWfState().getDescription())){
				case "draft": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="crwfd" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;
				
				case "inquiry": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="rwfd" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;
				
				case "fiscalCheck": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="r" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;
				
				case "revisionAfterFiscalCheck": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="rwf" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;
				
				case "approval": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="rwf" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;
				
				case "approvedAwaitingCountersignedContract": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="rwf" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;				
				
				case "signed": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="rwf" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;
				
				case "closed": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="rwf" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;
				
				case "suspended": 
					if(hasPowerPermissions && !isOnlyRead) 
						permissions="rwf" 
					else if(!hasPowerPermissions && !isOnlyRead){
						permissions = "rw";
						formViews = "contract/form1.display,contract/form2.display,contract/form3.display,contract/form4.display,contract/form5.display,contract/form6.display,contract/form7";
					} else 
						permissions="r";
				break;	
			}
			
			wfTask.setPermissions(permissions);		
			wfTask.setFormViews(formViews);
					
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
			var wfTask=object;			
			var wfItem=wfService.getWfItem(wfTask.getWfItemId());
			var permissions=wfTask.getPermissions();
			
			var headOfDepartmentPreFlowEnableParam = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project-centralized-bis-flow.headOfDepartment.enable");						
			
			var headOfDepartmentPreFlowEnable=("true"==headOfDepartmentPreFlowEnableParam||!headOfDepartmentPreFlowEnableParam)?true:false;
						
			switch("" + String(wfItem.getWfState().getDescription())){
				case "draft": 
					if(headOfDepartmentPreFlowEnable) 
						permissions="crwfd" 
					else 
						permissions="";	
				break;
				
				case "added": 
					if(headOfDepartmentPreFlowEnable) 
						permissions="rwfd" 
					else 
						permissions="";
				break;
				
				case "submitted": 
					if(headOfDepartmentPreFlowEnable)
						permissions="rwf" 
					else 
						permissions="r";
				break;
				
				case "approvedUnderNegotiation": 
					if(hasPowerPermissions||hasHelpdeskStartedFlow) 
						permissions="rwf" 
					else 
						permissions="r";
				break;
			}
			
			wfTask.setPermissions(permissions);
			
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
		
			var requestedIouCostValidationList=[
				{"totalValueDiscriminator":"requestedInternalCost", "elementDiscriminator":"internalOrganizationUnitCost", "elementValueDiscriminator":"ouRequestedCost"},
				{"totalValueDiscriminator":"requestedInternalContribution", "elementDiscriminator":"internalOrganizationUnitCost", "elementValueDiscriminator":"ouRequestedContribution"},
				{"totalValueDiscriminator":"requestedInternalCofinancing", "elementDiscriminator":"internalOrganizationUnitCost", "elementValueDiscriminator":"ouRequestedCofinancing"}				
			];
			var requestedPartnerCostValidationList=[
				{"totalValueDiscriminator":"requestedGlobalCost", "elementDiscriminator":"partnerCost", "elementValueDiscriminator":"partnerRequestedCost"},
				{"totalValueDiscriminator":"requestedGlobalContribution", "elementDiscriminator":"partnerCost", "elementValueDiscriminator":"partnerRequestedContribution"}							
			];
			
			var assignedIouCostValidationList=[
				{"totalValueDiscriminator":"internalCost", "elementDiscriminator":"internalOrganizationUnitCost", "elementValueDiscriminator":"ouCost"},
				{"totalValueDiscriminator":"internalContribution", "elementDiscriminator":"internalOrganizationUnitCost", "elementValueDiscriminator":"ouContribution"},
				{"totalValueDiscriminator":"internalCofinancing", "elementDiscriminator":"internalOrganizationUnitCost", "elementValueDiscriminator":"ouCofinancing"}
			];
			var assignedPartnerCostValidationList=[
				{"totalValueDiscriminator":"globalCost", "elementDiscriminator":"partnerCost", "elementValueDiscriminator":"partnerCost"},
				{"totalValueDiscriminator":"globalContribution", "elementDiscriminator":"partnerCost", "elementValueDiscriminator":"partnerContribution"}
			];
			
			var allValidations=[];
			
			var globalRequestedEnabled=ConfigurationUtil.getLenientBoolean("ap.project.financing.requested.enabled");
			
			var iouCostRequestedEnabled=ConfigurationUtil.getLenientBoolean("ap.project.financing.internalOrganizationUnitCost.requested.enabled");
			var iouCostRequestedValidationEnabled=ConfigurationUtil.getLenientBoolean("ap.project.financing.internalOrganizationUnitCost.consistence.requested.validation.enabled");
			var iouCostAssignedValidationEnabled=ConfigurationUtil.getLenientBoolean("ap.project.financing.internalOrganizationUnitCost.consistence.assigned.validation.enabled");
			
			var partnerCostRequestedEnabled=ConfigurationUtil.getLenientBoolean("ap.project.financing.partnerCost.requested.enabled");
			var partnerCostRequestedValidationEnabled=ConfigurationUtil.getLenientBoolean("ap.project.financing.partnerCost.consistence.requested.validation.enabled");
			var partnerCostAssignedValidationEnabled=ConfigurationUtil.getLenientBoolean("ap.project.financing.partnerCost.consistence.assigned.validation.enabled");
			
			if (iouCostAssignedValidationEnabled)
				for(var i=0; i<assignedIouCostValidationList.length; i++)
					allValidations.push(assignedIouCostValidationList[i]);
			
			if (partnerCostAssignedValidationEnabled)
				for(var i=0; i<assignedPartnerCostValidationList.length; i++)
					allValidations.push(assignedPartnerCostValidationList[i]);
				
			if (globalRequestedEnabled && iouCostRequestedEnabled && iouCostRequestedValidationEnabled)
				for(var i=0; i<requestedIouCostValidationList.length; i++)
					allValidations.push(requestedIouCostValidationList[i]);			
				
			
			if (globalRequestedEnabled && partnerCostRequestedEnabled && partnerCostAssignedValidationEnabled)
				for(var i=0; i<requestedPartnerCostValidationList.length; i++)
					allValidations.push(requestedPartnerCostValidationList[i]);
			
			for(var i=0; i<allValidations.length; i++)	{
				var validation=allValidations[i];
				WfUtil.totalCheckerRejecter(wfItem, new Packages.java.lang.String(validation.totalValueDiscriminator), new Packages.java.lang.String(validation.elementDiscriminator), new Packages.java.lang.String(validation.elementValueDiscriminator), wfService, errors);
			}
		

Anchor
uniqueIdentifierProject-anchor
uniqueIdentifierProject-anchor
uniqueIdentifierProject
Questa validazione controlla l'unicità dell'identificativo dell'oggetto.
Questa verifica viene fatta per i casi di generazione di codice "parlante" con possibile collisione con identificativi già presenti.
Code Block
languagejs
linenumberstrue
collapsetrue
			
			var paramMap = new Packages.java.util.HashMap();
			paramMap.put("identifier", object.getIdentifier());			
			
			var count=searchBuilderTemplate.getSingleObject("getWfItemCount", paramMap);
			if (count>1)
				errors.reject("error.project.identifier.notUnique");			
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
			var creationByCallEnabled = ConfigurationUtil.getConfigValue("ap.prj.create-by-call.enabled");
			var onlyApprovedCallEnabled = ConfigurationUtil.getConfigValue("ap.prj.create-by-call.only-approved-call.enabled");
			var onlyCallWithGrantorEnabled = ConfigurationUtil.getConfigValue("ap.prj.create-by-call.grantor.required.enabled");
			var isCreationByCall=wfItem.getBooleanMap().get("isCreationByCall");
			if (creationByCallEnabled=="true" && Packages.java.lang.Boolean.TRUE.equals(isCreationByCall)){
				var callId=wfItem.getIntegerMap().get("callId");				
				if (callId==null)				
					errors.rejectValue("integerMap[callId]","error.prj.start.callId.required");					
				else {
					var call=wfService.getWfItem(callId);
					if (call==null)
						errors.rejectValue("integerMap[callId]","error.prj.callId.malformed");
					else {
						if ("true"==onlyApprovedCallEnabled && "approved"!=call.getWfState().getDescription())
							errors.rejectValue("integerMap[callId]","error.prj.callId.notApproved");
						else {
							var projectTypeIdentifier=call.getStringMap().get("linkedProjectType");
							if (projectTypeIdentifier==null)
								errors.rejectValue("integerMap[callId]","error.prj.callId.defaultProjectType.required");
							else {
								var wfItemTypeList=wfService.getWfItemTypeByIdentifier(projectTypeIdentifier, 0);
								if (CollectionUtils.isEmpty(wfItemTypeList) || wfItemTypeList.size()>1)
									errors.rejectValue("integerMap[callId]","error.prj.callId.defaultProjectType.malformed");
							}
							
							var grantorIdFromCallgrantorFromCallSet=call.getOrganizationUnitMap().getgetWfItemElementSet("grantor");
							if ("true"==onlyCallWithGrantorEnabled && grantorIdFromCall(grantorFromCallSet==null || grantorFromCallSet.size()==0))
								errors.rejectValue("integerMap[callId]","error.prj.callId.grantor.required");
						}
					}		
				}
			}
		

...

Anchor
publicInvolvedAtLeastOneValidatorPublicEngagement-anchor
publicInvolvedAtLeastOneValidatorPublicEngagement-anchor
publicInvolvedAtLeastOneValidatorPublicEngagement
Questa validazione controlla che esista almeno un elemento publicInvolved, se la tipologia dell'iniziativa è "PEN.FORMAZIONE-COMUNICAZIONE" ("Giornate organizzate di formazione alla comunicazione - rivolta a PTA o docenti")
Dal punto di vista del modello dati si tratta degli elementi publicInvolved
Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block
languagejs
linenumberstrue
collapsetrue
			var itemTypeIdentifier = object.getWfItemType().getIdentifier();

			if (Packages.org.apache.commons.lang.StringUtils.equals("PEN.FORMAZIONE-COMUNICAZIONE", itemTypeIdentifier)) {

		    var publicInvolvedSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "publicInvolved", wfService);
		    if (publicInvolvedSet.isEmpty()) {
		        errors.reject("error.publicEngagement.publicInvolved.atLeast1");
		    } else {
		        var publicInvolvedSetIterator = publicInvolvedSet.iterator();
		        while (publicInvolvedSetIterator.hasNext()) {
		            var publicInvolved = publicInvolvedSetIterator.next();
		            var dictionary = publicInvolved.getWfDictionaryMap().get("dictionary");
		            var code = dictionary.getStringMap().get("code");
		            if (new String("publicInvolvedPublicEngagement.other-professors").valueOftoString() != new String(code).valueOftoString() && new String("publicInvolvedPublicEngagement.other-administratives").valueOftoString() != new String(code).valueOftoString() && new String("publicInvolvedPublicEngagement.other-unstructored-research-staff").valueOftoString() != new String(code).valueOftoString() && new String("publicInvolvedPublicEngagement.other-students-phd").valueOftoString() != new String(code).valueOftoString()) {
		                errors.reject("error.publicEngagement.publicInvolved.consistent");
		            }
		        }
		    }
		}
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
		
			var wfTask = object;
			var wfItem = wfService.getWfItem(wfTask.getWfItemId());
			var permissions = "r";			
			var isOnlyRead = true;
			
			var internalOrganizationUnitWfItemElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem,
				"it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
				
			//log.error("xxx got ouSet");			

			//recupero l'unità organizzativa associata (dipartimento) all'identity/team di questo task
			var organizationUnitFromIdentity = Packages.it.cilea.ga.util.GaUtil.getOrganizationUnitFromIdentyForDepartment(gaAuthorizationService.getIdentity(wfTask.getIdentityId()), gaService);
			
			//log.error("xxx got organizationUnitFromIdentity: " + organizationUnitFromIdentity.getDescription());
			
			var isManagerPresent = Packages.it.cilea.wf.util.WfUtil.isRoleIdPresent(wfService, "roleId", "ouRolePublicEngagement.manager", internalOrganizationUnitWfItemElementSet);
			
			var hasOrgUnitPowerPermissions = false;
			
			if(Packages.java.lang.Boolean.FALSE.equals(isManagerPresent)){
				
				var isPartecipantPresent = Packages.it.cilea.wf.util.WfUtil.isRoleIdPresent(wfService, "roleId", "ouRolePublicEngagement.participant", internalOrganizationUnitWfItemElementSet);
				
				if(Packages.java.lang.Boolean.FALSE.equals(isPartecipantPresent)){
					
					var isAfferentPresent = Packages.it.cilea.wf.util.WfUtil.isRoleIdPresent(wfService, "roleId", "ouRolePublicEngagement.afferent", internalOrganizationUnitWfItemElementSet);
					
					if(Packages.java.lang.Boolean.FALSE.equals(isAfferentPresent)){
						
						//log.error("xxx nothing is present");
						//altri ruoli non previsti
						hasOrgUnitPowerPermissions = false;
						
					}else{
						//log.error("xxx isAfferentPresent");
						hasOrgUnitPowerPermissions = Packages.it.cilea.wf.util.WfUtil.hasOrgUnitPowerPermissions(wfService, "ouId", organizationUnitFromIdentity.getId(), "roleId", "ouRolePublicEngagement.afferent", internalOrganizationUnitWfItemElementSet);
					}
					
				}else{
					//log.error("xxx isPartecipantPresent");
					hasOrgUnitPowerPermissions = Packages.it.cilea.wf.util.WfUtil.hasOrgUnitPowerPermissions(wfService, "ouId", organizationUnitFromIdentity.getId(), "roleId", "ouRolePublicEngagement.participant", internalOrganizationUnitWfItemElementSet);
				}
				
			}else{
				//log.error("xxx isManagerPresent");
				hasOrgUnitPowerPermissions = Packages.it.cilea.wf.util.WfUtil.hasOrgUnitPowerPermissions(wfService, "ouId", organizationUnitFromIdentity.getId(), "roleId", "ouRolePublicEngagement.manager", internalOrganizationUnitWfItemElementSet);
			}

			//log.error("xxx hasOrgUnitPowerPermissions: " + hasOrgUnitPowerPermissions);
			
			/*
			draft	crwfd
			approved	rf
			submitted	rwf
			reopened	rwfd
			rejected	rfd
			preapproval	r
			concluded	r
			*/
			
			switch("" + String(wfItem.getWfState().getDescription())){
				case "draft": 
					if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions)) 
						permissions="crwfd";
					else 
						permissions="r";
				break;
				
				case "approved": 
					if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions)) 
						permissions="rf";
					else 
						permissions="r";
				break;
				
				case "submitted": 
					if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions))
						permissions="rwf";
					else 
						permissions="r";
				break;
				
				case "reopened": 
					if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions))
						permissions="rwfd";
					else 
						permissions="r";
				break;
				
				case "rejected": 
					if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions))
						permissions="rfd";
					else 
						permissions="r";
				break;
				
				/*
				case "preapproval": 
					if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions))
						permissions="rwf";
					else 
						permissions="r";
				break;
				
				case "concluded": 
					if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions))
						permissions="rwf";
					else 
						permissions="r";
				break;
				*/
				
				default:
					permissions="r";
				break;
				
					
			}
			
			//log.error("xxx permissions: " + permissions);
			wfTask.setPermissions(permissions);
		
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
			var departmentIdConf = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.identifier.logic.department-id");
			departmentIdConf=(!departmentIdConf)?"csa":departmentIdConf;
			var departmentId = null;
			var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "owner", wfService);
			var person = Packages.it.cilea.wf.util.WfUtil.getOwnerForIdentifier(ownerWfElementSet, wfService);
			
			if (person != null) {
				var checkDate = WfUtil.getCheckDate(wfItem, wfService);
				var positionContext = WfUtil.getPositionContext(wfItem, wfService);
				var ownerPositionSet = WfUtil.getPositionSet(person, checkDate, positionContext, "department", gaService);
				var department = GaUtil.getPriorityOrganizationUnit(ownerPositionSet, positionContext, "department");
				if (department == null) {
					throw "To use wfStartLogicDepartmentAndOwnerDependentIdentifier you MUST specify department for that person ";
				}
			} else {
				throw "To use wfStartLogicDepartmentAndOwnerDependentIdentifier you MUST specify department";
			}		
			switch("" + String(departmentIdConf)){
				case "csa":
					departmentId = department.getStringMap().get("idCsa");
					if (departmentId == null) {
						throw "To use wfStartLogicDepartmentAndOwnerDependentIdentifier you MUST specify code department [idCsa]";
					}
				break;
				
				case "ugov": 
					departmentId = department.getStringMap().get("idAb");
					if (departmentId == null) {
						throw "To use wfStartLogicDepartmentAndOwnerDependentIdentifier you MUST specify code department [idAb]";
					}
				break;
				
				case "iris": 
					departmentId = String(department.getId());
				break;
				case "acronym": 
					departmentId = department.getStringMap().get("acronym");
					if (departmentId == null) {
						throw "To use wfStartLogicDepartmentAndOwnerDependentIdentifier you MUST specify code department [acronym]";
					}
				break;
				default:
					departmentId = department.getStringMap().get("idCsa");
					if (departmentId == null) {
						throw "To use wfStartLogicDepartmentAndOwnerDependentIdentifier you MUST specify code department [idCsa]";
					}
			}
			var lastName = person.getLastName().replaceAll("\s", "");
			lastName = lastName.replaceAll("'", "");
			lastName = (lastName.length() >= 4) ? lastName.substring(0, 5) : lastName.substring(0, lastName.length());
			lastName = lastName.toUpperCase();
			
			var dateDiscriminators = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.identifier.logic.date.discriminators");
			var discriminator = "proposalStartDate";
			if (dateDiscriminators != null) {
			    var discriminatorArray = dateDiscriminators.split(",");
			    for (i in discriminatorArray) {
			        if (wfItem.getDateMap().get(discriminatorArray[i]) != null) {
			            discriminator = discriminatorArray[i];
			            break;
			        }
			    }
			}
			
			var startDate = wfItem.getDateMap().get(discriminator);
			var year = startDate.get(Packages.java.util.Calendar.YEAR);
			var yearString = new Packages.java.lang.Integer(year).toString();
			yearString = yearString.substring(2);
			var sourceItemTypeCode = wfService.getWfItemType(wfItem.getWfItemTypeId()).getCode();
			
			
			var stringBuilder = new Packages.java.lang.StringBuilder(departmentId);
			stringBuilder.append(sourceItemTypeCode);
			stringBuilder.append(yearString);
			stringBuilder.append(lastName);
			
			var identifier = stringBuilder.toString();
			
			if (wfItem.getIdentifier() == null || !(wfItem.getIdentifier().substring(0, wfItem.getIdentifier().lastIndexOf("_"))).equals(identifier)) {
				var paramMap = new Packages.java.util.HashMap();
				paramMap.put("identifier", identifier);
				paramMap.put("excludeIdentifier", identifier+"M");
				var count = searchBuilderTemplate.getSingleObject("getMaxItemCountForGivenIdentifier", paramMap);
				var countString = "";
				if (count < 9)
					countString += "0";			
				countString += (count.intValue()+1);
				identifier += "_" + countString;
			    wfItem.setIdentifier(identifier);
			}
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
			var wfTask=object;			
			var wfItem=wfService.getWfItem(wfTask.getWfItemId());
			var permissions=wfTask.getPermissions();
			
			var headOfDepartmentContractCentralizedEnableParam = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.contract-centralized-flow.headOfDepartment.enable");
			var headOfDepartmentContractCentralizedEnable=("true"==headOfDepartmentContractCentralizedEnableParam||!headOfDepartmentContractCentralizedEnableParam)?true:false;
						
			switch("" + String(wfItem.getWfState().getDescription())){
				case "draft": 
					if(headOfDepartmentContractCentralizedEnable)
						permissions="crwfd" 
					else 
						permissions="";	
				break;
				
				case "validated": 
					if(headOfDepartmentContractCentralizedEnable) 
						permissions="rwf" 
					else 
						permissions="";
				break;
				
				case "signed": 
					if(headOfDepartmentContractCentralizedEnable)
						permissions="rwf" 
					else 
						permissions="r";
				break;
				
				case "archived": 
					if(headOfDepartmentContractCentralizedEnable)
						permissions="rwfd" 
					else 
						permissions="";
				break;
				
				case "closed": 
					if(headOfDepartmentContractCentralizedEnable) 
						permissions="rwf" 
					else 
						permissions="r";
				break;
			}
			
			wfTask.setPermissions(permissions);
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
			var wfTask=object;			
			var wfItem=wfService.getWfItem(wfTask.getWfItemId());
			var permissions=wfTask.getPermissions();
			var definition = wfItem.getWfItemType().getWfDefaultDefinition().getDescription();
			
			var ownerCreateConf = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap."+definition+".owner.create");
			var ownerCreateConfBoolean=("true"==ownerCreateConf||!ownerCreateConf)?true:false;
						
			switch("" + String(wfItem.getWfState().getDescription())){
				case "draft": 
					if(ownerCreateConfBoolean) 
						permissions="crwfd" 
					else 
						permissions="rwf";	
				break;
				
				case "reopened": 
					if(ownerCreateConfBoolean) 
						permissions="rwfd" 
					else 
						permissions="rwf";
				break;
			}
			
			wfTask.setPermissions(permissions);
		

...

Anchor
checkEffectiveDepartmentAccess-anchor
checkEffectiveDepartmentAccess-anchor
checkEffectiveDepartmentAccess
Questa validazione serve per verificare che i referenti dipartimentali, che possono effettuare modifiche, siano i referenti dipartimentali SOLO per quella specifica entità (es: Progetti, Contratti, etc).
Nella configurazione va inserito l'ID del team a cui afferiscono i referenti.
Questa validazione cerca la configurazione ap.ANCESTOR_TYPE.headOfDepartment.additionalTeamCheck,
se la configurazione non è popolata allora: NON viene fatto nessun altro controllo,
se la configurazione è popolata, viene controllato, se l'utente è in visione dipartimentale, se questa condizione è vera viene controllato,
se tra i suoi team, compare il team indicato nella configurazione, se non è presente viene sollevato un messaggio di errore.
Code Block
languagejs
linenumberstrue
collapsetrue
			var ancestorType = wfItem.getWfItemType().getRootWfItemType().getIdentifier();
			var additionalTeamCheck = ConfigurationUtil.getConfigValue("ap." + ancestorType.toLowerCase() + ".headOfDepartment.additionalTeamCheck");
			if (additionalTeamCheck != null) {
				var isCurrentUserInDepartmentView = Packages.it.cilea.ga.util.GaUtil.isCurrentUserInDepartmentView(gaAuthorizationService);
				if (Packages.java.lang.Boolean.TRUE.equals(isCurrentUserInDepartmentView)) {
					var user = Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();
					var userId = user.getUserId();
					var teamSearchCommand = new Packages.it.cilea.ga.command.TeamSearchCommand();
					teamSearchCommand.setUserId(userId);
					var teamUserList = gaService.getTeamSearchList(teamSearchCommand, 0);
					var teamUserListIterator = teamUserList.iterator();
					var foundTeam = false;
					while (teamUserListIterator.hasNext()) {
						var team = teamUserListIterator.next();
						if (new String(team.getId()).valueOftoString() == new String(additionalTeamCheck).valueOftoString()) {
							foundTeam = true;
						}
					}
					if (foundTeam == false) {
					errors.reject("error." + ancestorType.toLowerCase() + ".headOfDepartment.additionalTeamCheck");
					}
				}
			}
		

...

Anchor
childAndParentDetectorDeleteValidator-anchor
childAndParentDetectorDeleteValidator-anchor
childAndParentDetectorDeleteValidator
Questa è una validazione che viene chiamata in ogni flusso di Laboratori, Grupppi di Ricerca, Grandi Attrezzature, Public-Engagement e Progetti quando si prova ad eliminare l'oggetto.
Essa impedisce che si possa eliminare l'oggetto in questione se è collegato (sia da parte di padre sia da parte di figlio) ad un qualsiasi altro oggetto.
In caso trovasse questi collegamenti, verrà presentato un messaggio di errore che mostrerà un elenco con tutti gli oggetti trovati.
Il messaggio di errore viene ricavato dall'etichetta con chiave error.delete.link.childAndParentDetected
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block
languagejs
linenumberstrue
collapsetrue
						
			var wfItemFull = wfService.getWfItem(wfItem.getWfItemId());
			var listOfLinksDetected = '<ul>';
			var myList=" ";
			
			var childWfItemLinkSet = wfItemFull.getChildWfItemLinkSet();
			
			var childWfItemLinkSetIterator = childWfItemLinkSet.iterator();									
			while (childWfItemLinkSetIterator.hasNext()){
			
				var childLink = childWfItemLinkSetIterator.next();
				
				//considero solo quelli che non sono version
				if(!childLink.getDiscriminator().equals('version')){
				
					var childWfItem = childLink.getChild();
					myList+=" "+childWfItem.getIdentifier()+" ";
					listOfLinksDetected += '<li>' + childWfItem.getIdentifier() + ' - ' + childWfItem.getDescription() + '</li>';
				}
			}
				
			var parentWfItemLinkSet = wfItemFull.getParentWfItemLinkSet();
			
			var parentWfItemLinkSetIterator = parentWfItemLinkSet.iterator();									
			while (parentWfItemLinkSetIterator.hasNext()){
			
				var parentLink = parentWfItemLinkSetIterator.next();
				
				//considero solo quelli che non sono version
				if(!parentLink.getDiscriminator().equals('version')){
				
					var parentWfItem = parentLink.getParent();
					myList+=" "+parentWfItem.getIdentifier()+" ";
					listOfLinksDetected += '<li>' + parentWfItem.getIdentifier() + ' - ' + parentWfItem.getDescription() + '</li>';
				}
			}
			
			listOfLinksDetected += '</ul>';
			
			if(listOfLinksDetected != '<ul></ul>'){
				//var messageContainer = [listOfLinksDetected];
				var messageContainer = [myList];
				errors.reject("error.delete.link.childAndParentDetected", messageContainer, "error.delete.link.childAndParentDetected.default");
			}