Versions Compared

Key

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

...

Anchor
isNotLegacyAndYearIsGreaterOrEqualThan2019Project-anchor
isNotLegacyAndYearIsGreaterOrEqualThan2019Project-anchor
isNotLegacyAndYearIsGreaterOrEqualThan2019Project
Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le altre validazioni altrimenti no.
Oltre al check previsto da isNotLegacy , verifica anche che il progetto in questione sia relativo ad un anno maggiore o uguale del 2019, altrimenti vengono disattivate le validazioni e le sincronizzazioni.
Questo approccio è stao scelto per evitare lo scatenarsi delle validazioni su vecchi progetti che non rispettano le nuove e più stringenti validazioni, ed evitare quindi di dovere fare una bonifica a tappeto.
Code Block
languagejs
linenumberstrue
collapsetrue
			(
				object.getYear()!=null 
				&& 
				object.getYear().compareTo(2019)>=0
			) 
			&& 
			(
				object.getBooleanMap().get('legacy')==null 
				|| 
				Packages.java.lang.Boolean.FALSE.equals(object.getBooleanMap().get('legacy'))
			)
		

Anchor
wfIdentityLogicHeadOfDepartmentProjectTruePermissionsJs-anchor
wfIdentityLogicHeadOfDepartmentProjectTruePermissionsJs-anchor
wfIdentityLogicHeadOfDepartmentProjectTruePermissionsJs
Questa è una permissions logic che costruisce dinamicamente i permessi per i progetti per i team dipartimentali.
Se la variabile di configurazione ap.project-centralized-bis-flow.headOfDepartment.enable è settata a true o non è valorizzata allora vengono assegnati al team dipartimentale i seguenti permessi:

  • draft: rwfd
  • added: rwfd
  • submitted: rwf
  • approvedUnderNegotiation: rwf

...

  • draft: none
  • added: none
  • submitted: r
  • approvedUnderNegotiation: r

...

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);
			
		

Anchor
wfStartLogicProject-anchor
wfStartLogicProject-anchor
wfStartLogicProject
Questa logica viene eseguita in fase di creazione di un nuovo progetto.
Vengono effettuate le seguenti operazioni:

...

Anchor
ownerWithSameDepartmentAsHeadValidator-anchor
ownerWithSameDepartmentAsHeadValidator-anchor
ownerWithSameDepartmentAsHeadValidator
Questa validazione viene triggerata in fase di creazione di un nuovo oggetto solo se l'utente è in visione dipartimentale e la configurazione ap.<tipologia>.owner.internalOrganizationUnit.mandatory è settata a true.
Se questa configurazione non viene trovata la validazione NON viene eseguita.
Verifica che l'utente che sta creando un nuovo oggetto a livello dipartimentale, specifichi come responsabile scientifico una persona che afferisce al proprio dipartimento (alla data specificata).
Il nome del metadato che contiene la data viene estratta dalla configurazione ap.<tipologia>.ownerWithSameDepartmentAsHeadValidator.dateMap.discriminator.
Se questa configurazione NON è presente viene usato il metadato startDate.

Con <tipologia> viene inteso il codice a tre lettere in minuscolo che indica la tipologia radice dell'oggetto in questione come ad esempio : lab, eqp, inm, prj, ...
Per un elenco esaustivo fare riferimento all'"Alberatura tipologie RM/AP"
Code Block
languagejs
linenumberstrue
collapsetrue
			//validator per headofdepartment
			//prima controllo che non ci siano stati errori		
			if(!errors.hasErrors()){				
				var list=gaAuthorizationService.getAuthoritiesInfoSelectableDisplayList("/DEPARTMENT/ap.profile");
				//controllo per verificare se sono in visione dipartimentale o no
				
				if(list.get(0).getIdentifyingValue()!=-1){
					if (object.getId()==null){			
						//gli altri controlli non li faccio, ci pensano gli altri validator
						
						var owner= object.getPersonMap().get("owner");		
						var ownerPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
						ownerPositionSearch.setPersonId(owner.getId());
						
						var typeForConfig = wfService.getWfItemType(object.getWfItemTypeId());
						if (!typeForConfig.getParentWfItemTypeSet().isEmpty()) {
							var parentSetIterator = typeForConfig.getParentWfItemTypeSet().iterator();
							while (parentSetIterator.hasNext()){
								typeForConfig = parentSetIterator.next();
								if (!typeForConfig.getParentWfItemTypeSet().isEmpty()) {
									var parentParentSetIterator = typeForConfig.getParentWfItemTypeSet().iterator();
									while (parentParentSetIterator.hasNext()){
										typeForConfig = parentParentSetIterator.next();
										break;
									}
								}
								break;
							}
						}
					
						var dateDiscriminator = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap." + typeForConfig.getIdentifier().toLowerCase() + ".ownerWithSameDepartmentAsHeadValidator.dateMap.discriminator");
						if(dateDiscriminator == null){
							dateDiscriminator = 'startDate';
						}
						
						if (object.getDateMap().get(dateDiscriminator)==null)						
							throw ("Cannot retrieve "+dateDiscriminator+". Check configuration ap.&lt;type&gt;.ownerWithSameDepartmentAsHeadValidator.dateMap.discriminator");						
						
						ownerPositionSearch.setDate(object.getDateMap().get(dateDiscriminator).getTime());
						ownerPositionSearch.setOrganizationUnitTypeDescription("department");
						ownerPositionSearch.setDiscriminator("research");
						var ownerPositionSet = gaService.getPositionSearchList(ownerPositionSearch, 0);
						var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(ownerPositionSet, "research", "department");						
						var mandatory=Packages.it.cilea.wf.util.WfUtil.getMandatory(object,"owner");							
						if(mandatory){
							//ciclo posittion in cerca del dipartimento della person
							var department=null;
							var ownerPositionSetIterator=ownerPositionSet.iterator();							
							while (ownerPositionSetIterator.hasNext()){
								var position=ownerPositionSetIterator.next();
								if (maxPriority == null || maxPriority.equals(position.getPriority())) {
									department=position.getOrganizationUnit();
									//log.error("department id: "+department.getOrganizationUnitId());
								}
							}						
							//uso un flag dato che devo ciclare su tutti i possibili dipartimenti
							var flag=false;
							var listIterator=list.iterator();
							if (department!=null){
								while(listIterator.hasNext()){
									var selectable=listIterator.next();
									//log.error("selectable getIdentifyingValue: "+selectable.getIdentifyingValue());							
									if(department.getOrganizationUnitId()==selectable.getIdentifyingValue()){
										flag=true;
									}	
								}
							}						
							if(!flag){
								errors.reject("error.owner.mustBeSameAsHead");
							}
						}
					}
				}
			}
		

...