Versions Compared

Key

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

...

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

Anchor
ownerValidatorContract-anchor
ownerValidatorContract-anchor
ownerValidatorContract
Questa validazione controlla che esista almeno un responsabile scientifico nel tab "Soggetti interni".
Dal punto di vista del modello dati si tratta degli elementi di tipo owner
Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
Code Block
languagejs
linenumberstrue
collapsetrue
			if (object.getId()==null){
				if (object.getPersonMap().get("owner")==null)
					errors.rejectValue("personMap[owner]","error.contract.owner.required");
			} else {
				var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
				if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy")) && ownerSet.size()<1 &&  object.getPersonMap().get("owner")==null)
					errors.rejectAndLocate("error.contract.owner.atLeast1", "owner");
			}
		

...

Anchor
organizationUnitRoleValidatorContract-anchor
organizationUnitRoleValidatorContract-anchor
organizationUnitRoleValidatorContract
Questa validazione controlla che esista almeno un dipartimento specificato e che uno ed uno solo sia marcato come "Principale"
Per maggiori dettagli cfr. excel modello dati dell'entità in questione
Code Block
languagejs
linenumberstrue
collapsetrue
				
			var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
			if (orgUnitSet.size()<1){
				errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.atLeast1", "internalOrganizationUnit");
			} else {
				var internalOrganizationUnitCoordinatorRole=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.con.internalOrganizationUnit.role.main");
				if (!internalOrganizationUnitCoordinatorRole){
					throw "Configuration variable ap.con.internalOrganizationUnit.role.main MUST BE DEFINED"; 								
				} else {
					internalOrganizationUnitCoordinatorRole=new Packages.java.lang.Integer(internalOrganizationUnitCoordinatorRole);
				}
				var orgUnitSetIterator=orgUnitSet.iterator();
				var count=0;											
				while (orgUnitSetIterator.hasNext()){											
					var element=orgUnitSetIterator.next();												
					var ouRole=element.getWfDictionaryMap().get("roleId");
					if (ouRole!=null && internalOrganizationUnitCoordinatorRole.equals(ouRole.getId())){
						count++;	
					}												
				}
				if (count==0){
					errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.missingMain", "internalOrganizationUnit");
				}
				else if (count>1) {
					errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.tooManyMain", "internalOrganizationUnit");
				}
			}      								       										
		

Anchor
ownerAndOrganizationUnitMatchValidatorContract-anchor
ownerAndOrganizationUnitMatchValidatorContract-anchor
ownerAndOrganizationUnitMatchValidatorContract
Questa validazione controlla che esista per ogni responsabile scientifico del contratto, una unità organizzativa che sia interna nel momento della data di avvio del contratto (startDate) oppure se non c'è questa data, in questo momento.
dal punto di vista del modello sono dei dati di tipo: internalOrganizationUnit, owner
Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
Code Block
languagejs
linenumberstrue
collapsetrue
					
			var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
			var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
			var ownerDepartmentSet=new Packages.java.util.HashSet();
			var internalOrganizationUnitSet=new Packages.java.util.HashSet();
			
			var startDateFromWfItem=wfItem.getDateMap().get("startDate");
			if (startDateFromWfItem!=null){	
				startDateFromWfItem=startDateFromWfItem.getTime();	
			
				if (ownerSet.size()>0){
					var ownerSetIterator=ownerSet.iterator();			
					while (ownerSetIterator.hasNext()){
						var ownerElement=ownerSetIterator.next();			
						var person=ownerElement.getPersonMap().get("ownerId");
						
						var ownerDepartmentPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
						ownerDepartmentPositionSearch.setPersonId(person.getId());
						ownerDepartmentPositionSearch.setDate(startDateFromWfItem);
						ownerDepartmentPositionSearch.setOrganizationUnitTypeDescription("department");
						ownerDepartmentPositionSearch.setDiscriminator("research");							
						var ownerDepartmentPositionSet = gaService.getPositionSearchList(ownerDepartmentPositionSearch, 0);
						var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(ownerDepartmentPositionSet, "research", "department");
						
						var ownerDepartmentPositionSetIterator=ownerDepartmentPositionSet.iterator();							
						while (ownerDepartmentPositionSetIterator.hasNext()){
							var position=ownerDepartmentPositionSetIterator.next();
							if (maxPriority == null || maxPriority.equals(position.getPriority())) {
								ownerDepartmentSet.add(position.getOrganizationUnit());														
								break;
							}
						}
					}
				}
				if (ownerDepartmentSet.size()>0){
					if (orgUnitSet.size()>0){
			 			var orgUnitSetIterator=orgUnitSet.iterator();			
						while (orgUnitSetIterator.hasNext()){											
							var wfItemElement=orgUnitSetIterator.next();												
							var orgUnit=wfItemElement.getOrganizationUnitMap().get("ouId");
							internalOrganizationUnitSet.add(orgUnit);
						}
					}
				}
				
				if(!internalOrganizationUnitSet.containsAll(ownerDepartmentSet)){
					var nonMatchedDepartmentCollection=Packages.org.apache.commons.collections.CollectionUtils.subtract(ownerDepartmentSet, internalOrganizationUnitSet);
					var nonMatchedDepartmentCollectionIterator=nonMatchedDepartmentCollection.iterator();
					var nonMatchedDepartmentString="";
					var counter=0;
					while(nonMatchedDepartmentCollectionIterator.hasNext()){
						var nonMatchedDepartment=nonMatchedDepartmentCollectionIterator.next();
						if (counter++>0)
							nonMatchedDepartmentString+=", ";
						nonMatchedDepartmentString+=nonMatchedDepartment.getDescription();
					}
					var df =  Packages.org.apache.commons.lang.time.FastDateFormat.getInstance("dd/MM/yyyy");
					var dateAsString=df.format(startDateFromWfItem);
					errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.matchWithDepartmentOwnerNotFound", "internalOrganizationUnit", [dateAsString, nonMatchedDepartmentString], null);       								
				}        
			}								       										
		

...

Anchor
uniqueIdentifierContract-anchor
uniqueIdentifierContract-anchor
uniqueIdentifierContract
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.rejectrejectValue("identifier", "error.contract.identifier.notUnique");			
		

...

Code Block
languagejs
linenumberstrue
collapsetrue
	
			var reject = 0;
			var discriminator = ["fiscalCheckPerson", "fiscalCheckTariff", "fiscalCheckVatCode", "fiscalCheckNotes"];
			var column = ["person","string","string","string"];
			columnLen = column.length;
			var value = [];
			for (i = 0; i < columnLen; i++) {
				if(Packages.java.lang.Boolean.TRUE.equals(Packages.it.cilea.wf.util.WfUtil.isAttributeChanged(wfService, wfItem, column[i]+ "." +discriminator[i]))){
					reject = 1;
					break;
				}
			}
			if(reject > 0){
				errors.reject(rejectValue("personMap[fiscalCheckPerson]","error.contract.fiscalCheck.edit.notAllowed");
				errors.rejectValue("stringMap[fiscalCheckTariff]","error.contract.fiscalCheck.edit.notAllowed");
				errors.rejectValue("stringMap[fiscalCheckVatCode]","error.contract.fiscalCheck.edit.notAllowed");
				errors.rejectValue("stringMap[fiscalCheckNotes]","error.contract.fiscalCheck.edit.notAllowed");
			}	
		

...