Versions Compared

Key

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

...

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");
						
						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", coordinatorDictionaryId);
								
								wfService.saveOrUpdate(internalOrganizationUnitWfElement);
								wfService.saveOrUpdate(wfItem);
							}
						}
					}
				}
						
			true;
		

Anchor
isTypeFCO-anchor
isTypeFCO-anchor
isTypeFCO
Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le altre validazioni altrimenti no.
Questa regola considera la tipologia (WfItemType) e attiva la validazione solo per la Formazione Continua generica, non quindi quella di Medicina
Per tutti gli oggetti che hanno questo attributo valorizzato a true vengono disattivate le validazioni e le eventuali sincronizzazioni.
Code Block
languagejs
linenumberstrue
collapsetrue
			(
				object.getWfItemType().getIdentifier() == "FCO.FCO"
			)
		

Anchor
configurationPresentValidatorFCO-anchor
configurationPresentValidatorFCO-anchor
configurationPresentValidatorFCO
Questa validazione controlla che sia valorizzata la configurazione rm.orgunit.external.myOrganization sia valorizzata.
Nel caso in cui non lo sia, impedisce la creazione del Corso di Formazione Continua.
Essa deve essere valorizzata con l'ID Iris della Organizzazione Esterna che rappresenta l'Ateneo
Code Block
languagejs
linenumberstrue
collapsetrue

		
			var myOrganizationIdString = ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
			
			if(myOrganizationIdString == null)
				errors.reject("error.continuousTraining.configurationPresentValidatorFCO");

		

Anchor
continuousTrainingOrganizationUnitRoleValidator-anchor
continuousTrainingOrganizationUnitRoleValidator-anchor
continuousTrainingOrganizationUnitRoleValidator
Questa validazione controlla che
ogni Dipartimento (internalOrganizationUnit) abbia un ruolo associato
solo un Dipartimento o Soggetto terzo abbia il ruolo di Coordinatore
Per maggiori dettagli cfr. modello dati dell'entità in questione.
Code Block
languagejs
linenumberstrue
collapsetrue
			
		
			var internalOrganizationUnitWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
			
			var coordinatorCount = 0;
			
			if(internalOrganizationUnitWfElementSet.isEmpty() == false){
			
				var isInternalOuRoleMissing = false;
				
				var internalOuIterator = internalOrganizationUnitWfElementSet.iterator();
				while( internalOuIterator.hasNext() ){
				
					var internalOuWfItemElement = internalOuIterator.next();
					
					var internalOuRole = internalOuWfItemElement.getWfDictionaryMap().get("roleId");
					
					if(internalOuRole != null){
					
						internalOuRole = wfService.getWfDictionary(internalOuRole.getId());
						
						var internalOuRoleCode = internalOuRole.getStringMap().get("code");
						
						if(internalOuRoleCode.compareTo("ouRoleContinuousTraining.coordinator") == 0){
							coordinatorCount++;
						}
					}else{
						isInternalOuRoleMissing = true;
					}
				}
				
				if(isInternalOuRoleMissing)
					errors.reject("error.continuousTraining.continuousTrainingOrganizationUnitRoleValidator.internalOrganizationUnit.role.missing");
				
			}
			
			var externalOrganizationWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","externalOrganization", wfService);
			
			if(externalOrganizationWfElementSet.isEmpty() == false){
			
				var externalOuIterator = externalOrganizationWfElementSet.iterator();
				while( externalOuIterator.hasNext() ){
				
					var externalOuWfItemElement = externalOuIterator.next();
					
					var externalOuRole = externalOuWfItemElement.getWfDictionaryMap().get("roleId");
					
					if(externalOuRole != null){
					
						externalOuRole = wfService.getWfDictionary(externalOuRole.getId());
						
						var externalOuRoleCode = externalOuRole.getStringMap().get("code");
						
						if(externalOuRoleCode.compareTo("ouRoleContinuousTraining.coordinator") == 0){
							coordinatorCount++;
						}
					}
				}
			}
			
			if(coordinatorCount > 1)
				errors.reject("error.continuousTraining.continuousTrainingOrganizationUnitRoleValidator.role.coordinator.tooMany");
			
		

...

Anchor
changeItemTypeForNotSynchronizedItemValidator-anchor
changeItemTypeForNotSynchronizedItemValidator-anchor
changeItemTypeForNotSynchronizedItemValidator
Questa validazione viene scatenata in fase di cambio di Tipo dell'oggetto.
Non è possibile cambiare la tipologia, SE la scheda è già stata sincronizzata con U-GOV o l'utente non possiede i permessi sulla nuova tipologia selezionata.
Code Block
languagejs
linenumberstrue
collapsetrue
	
			//estraggo il wfItemId			
			var myNEWWfItemType = object.getWfItemTypeId();
			var myOLDWfItemType = object.getIntegerMap().get("wfItemTypeIdPreviousValue");
			var sourceItemType = wfService.getWfItemType(myNEWWfItemType);
			
			if(WfUtil.getParametricConfiguration("ap.<wfItemType>.itemTypeChange.enabled", sourceItemType).equalsIgnoreCase("true")){
				if (myOLDWfItemType==null)
					throw "To use changeItemTypeValidator you MUST specify wfItemTypeIdPreviousValue hidden value";
				
				//confronto le due tipologie, se sono diverse e ho già sincronizzato vuol dire che il cambio di tipologia non è compatibile			
				if(myNEWWfItemType != myOLDWfItemType){			
							if(WfUtil.getParametricConfiguration("ap.<wfItemType>.itemTypeChange.enabled", sourceItemType).equalsIgnoreCase("true")){
					var saveLogicIdentifier = Packages.it.cilea.wf.util.WfUtil.getParametricConfiguration("ap.<wfItemType>.identifier.logic", sourceItemType);
					if(saveLogicIdentifier == null){
						object.setWfItemTypeId(myOLDWfItemType);
						errors.reject("error.ap.itemTypeError.startLogic");
					}					
					if(object.getStringMap().get("ugovIdentifier") != null){
						object.setWfItemTypeId(myOLDWfItemType);
						errors.reject("error.ap.itemTypeError");
					} else {
						var isCreateAllowed = Packages.it.cilea.wf.util.WfUtil.isWfItemTypeAllowedForCurrentUser(myOLDWfItemType, applicationContext);
						if(!Packages.java.lang.Boolean.TRUE.equals(isCreateAllowed)){
							object.setWfItemTypeId(myOLDWfItemType);
							errors.reject("error.ap.itemTypeError");
						}
					}			
				}
			} else {
					object.setWfItemTypeId(myOLDWfItemType);
					errors.reject("error.ap.itemTypeError.notEnabled");
				}			
			} 
		

Anchor
changeItemTypeForSynchronizedItemValidator-anchor
changeItemTypeForSynchronizedItemValidator-anchor
changeItemTypeForSynchronizedItemValidator
Questa validazione viene scatenata in fase di cambio di Tipo dell'oggetto in un determinato stato del flusso.
Non è possibile cambiare la tipologia in questo stato del flusso in quanto non compatibile con altri stati di altri flussi.
Code Block
languagejs
linenumberstrue
collapsetrue
	
			//estraggo il wfItemId
			
			var myNEWWfItemType = object.getWfItemTypeId();
			var myOLDWfItemType = object.getIntegerMap().get("wfItemTypeIdPreviousValue");
			if (myOLDWfItemType==null)
				throw "To use changeItemTypeValidator you MUST specify wfItemTypeIdPreviousValue hidden value";
			
			if(myNEWWfItemType != myOLDWfItemType){
				object.setWfItemTypeId(myOLDWfItemType);
				errors.reject("error.ap.itemTypeError.step2");
			}
		

...

Anchor
wfActionLogicTransitionLogger-anchor
wfActionLogicTransitionLogger-anchor
wfActionLogicTransitionLogger
Questa logica serve per la gestione del logging delle transizioni di stato nel metadato transitionLog.
Se il metadato NON è presente nel modello dati, non sarà visibile nell'interfaccia web.
Questa logica viene inserita come enter action logic per tutti gli stati nei flussi per i quali si vuole abilitare il logging delle transizioni di stato.
Se necessario, è possibile richiedere all'utente che sta effettuando la transizione di stato di inserire un messaggio che giustifichi la transizione di stato: questo messaggio verrà conservato nel log.
La gestione del messaggio opzionale è gestito con il metadato transitionComment che deve essere configurato come metadato @Required. per la validazione di enter.
Code Block
languagejs
linenumberstrue
collapsetrue
		
			var versionize=request.getParameter("versionize");
			if ("false"!=versionize){
				var formatter=new Packages.java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
				var currentDate="["+formatter.format(new Packages.java.util.Date())+"]";
				var user=Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();			
				
				var message="";
				if(Packages.org.apache.commons.lang.StringUtils.isNotBlank(wfItem.getClobMap().get("transitionsLog"))){
					message+="_______________________________________________________________"+ "

";
				} else {				
					wfItem.getClobMap().put("transitionsLog", "");
				}
				if (user!=null){
					message+=currentDate+" <strong>"+user.getLastName()+" "+user.getFirstName()+"</strong> ("+user.getUsername()+")"+"
";
				} else {
					message+=currentDate+" <strong>system</strong>
";
				}
				
				message+="Transizione verso "<strong>"+wfItem.getWfState().getDisplayValue()+"</strong>" ("+wfItem.getWfState().getDescription()+")";
				if (Packages.org.apache.commons.lang.StringUtils.isNotBlank(wfItem.getStringMap().get("transitionComment"))){			
					message+="
<strong>Motivazione transizione di stato</strong>
";
					message+="<i>"+wfItem.getStringMap().get("transitionComment")+"</i>";				
				}
				message+="
";			
				wfItem.getClobMap().put("transitionsLog", wfItem.getClobMap().get("transitionsLog")+message);
				wfItem.getStringMap().put("transitionComment", null);
			}			
		

Anchor
wfActionLogicWarningHandler-anchor
wfActionLogicWarningHandler-anchor
wfActionLogicWarningHandler
Questa logica serve per la gestione dei messaggi di warning.
E' necessario inserirla come enter action logic per tutti gli stati di tutti i flussi che prevedono messaggi di warning.
La gestione dei warning è pilotata dall'attributo booleano warningAcknowlegement che deve essere configurato come validazione di enter con il validator @Boolean.TRUE specificando di volta in volta il messaggio di warning da presentare. Per maggiori dettagli cfr. modello dati dell'entità in oggetto
Code Block
languagejs
linenumberstrue
collapsetrue
			wfItem.getBooleanMap().put("warningAcknowlegement", null);
		

...