Anchor |
---|
| checkDataAndEndValidator-anchor |
---|
| checkDataAndEndValidator-anchor |
---|
|
checkDataAndEndValidator Questa validazione controlla che se il bando di finanziamento viene marcato come "con scadenza" allora deve essere specificata la data di scadenza
Per maggiori dettagli cfr. excel modello dati dell'entità Bando di finanziamento
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(object.getBooleanMap().get("openEnded")!=null){
if((object.getBooleanMap().get("openEnded")==false)&&(object.getDateMap().get("endDate")==null)){
errors.reject("error.date.startDateEndDateNotCompatible");
}
}
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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", 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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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 |
---|
| continuousTrainingFinancingValidator-anchor |
---|
| continuousTrainingFinancingValidator-anchor |
---|
|
continuousTrainingFinancingValidator Questa validazione controlla che la somma dei vari finanziamenti inserita(calcolata) sia quella effettivamente corretta.
I dati che sono presi in considerazione sono:
Eventuale importo percepito per la convenzione (receivedFinancing)
Eventuali quote totali di iscrizione al corso (totalSubscriptionFees)
Eventuali altre entrate (otherFinancing)
Introiti complessivi (totalIncome)
Per maggiori dettagli cfr. modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var receivedFinancing = object.getNumberMap().get("receivedFinancing");
var totalSubscriptionFees = object.getNumberMap().get("totalSubscriptionFees");
var otherFinancing = object.getNumberMap().get("otherFinancing");
if(receivedFinancing == null && totalSubscriptionFees == null && otherFinancing == null){
errors.reject("error.continuousTraining.continuousTrainingFinancingValidator.atLeastOne");
}else{
receivedFinancing = receivedFinancing == null ? 0 : receivedFinancing.floatValue();
totalSubscriptionFees = totalSubscriptionFees == null ? 0 : totalSubscriptionFees.floatValue();
otherFinancing = otherFinancing == null ? 0 : otherFinancing.floatValue();
//log.error("receivedFinancing: "+receivedFinancing);
//log.error("totalSubscriptionFees: "+totalSubscriptionFees);
//log.error("otherFinancing: "+otherFinancing);
var totalIncome = object.getNumberMap().get("totalIncome").floatValue();
//log.error("totalIncome: "+totalIncome);
var calculatedTotalIncome = receivedFinancing + totalSubscriptionFees + otherFinancing;
//log.error("calculatedTotalIncome: "+calculatedTotalIncome);
if(totalIncome != calculatedTotalIncome)
errors.reject("error.continuousTraining.continuousTrainingFinancingValidator.totalIncome");
}
|
Anchor |
---|
| continuousTrainingParticipantsValidator-anchor |
---|
| continuousTrainingParticipantsValidator-anchor |
---|
|
continuousTrainingParticipantsValidator Questa validazione controlla che la somma dei vari partecipanti 'inserita'(calcolata) sia quella effettivamente corretta.
I dati che sono presi in considerazione sono:
Numero Istituzioni Pubbliche (numberOfPublicInstitutions)
Numero di Imprese (numberOfCompanies)
Numero di imprese del Terzo Settore (numberOfThirdSector)
Numero totali di partecipanti al corso (totalNumberOfParticipants)
Per maggiori dettagli cfr. modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var numberOfPublicInstitutions = object.getIntegerMap().get("numberOfPublicInstitutions");
var numberOfCompanies = object.getIntegerMap().get("numberOfCompanies");
var numberOfThirdSector = object.getIntegerMap().get("numberOfThirdSector");
if(numberOfPublicInstitutions == null && numberOfCompanies == null && numberOfThirdSector == null){
errors.reject("error.continuousTraining.continuousTrainingParticipantsValidator.atLeastOne");
}else{
numberOfPublicInstitutions = numberOfPublicInstitutions == null ? 0 : numberOfPublicInstitutions.intValue();
numberOfCompanies = numberOfCompanies == null ? 0 : numberOfCompanies.intValue();
numberOfThirdSector = numberOfThirdSector == null ? 0 : numberOfThirdSector.intValue();
//log.error("numberOfPublicInstitutions: "+numberOfPublicInstitutions);
//log.error("numberOfCompanies: "+numberOfCompanies);
//log.error("numberOfThirdSector: "+numberOfThirdSector);
var totalNumberOfParticipants = object.getIntegerMap().get("totalNumberOfParticipants").intValue();
//log.error("totalNumberOfParticipants: "+totalNumberOfParticipants);
var calculatedTotalNumberOfParticipants = numberOfPublicInstitutions + numberOfCompanies + numberOfThirdSector;
//log.error("calculatedTotalNumberOfParticipants: "+calculatedTotalNumberOfParticipants);
if(totalNumberOfParticipants != calculatedTotalNumberOfParticipants)
errors.reject("error.continuousTraining.continuousTrainingParticipantsValidator.totalNumberOfParticipants");
}
|
Anchor |
---|
| continuousTrainingMultipleContributorValidator-anchor |
---|
| continuousTrainingMultipleContributorValidator-anchor |
---|
|
continuousTrainingMultipleContributorValidator Questa validazione verifica che esista almeno un Docente interno (contributor)
Per maggiori dettagli cfr. il modello modello dati dell entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var contributorWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","contributor", wfService);
if(contributorWfElementSet.isEmpty()){
errors.reject("error.continuousTraining.contributor.required");
}
|
Anchor |
---|
| continuousTrainingNumberOfInternalTeachersValidator-anchor |
---|
| continuousTrainingNumberOfInternalTeachersValidator-anchor |
---|
|
continuousTrainingNumberOfInternalTeachersValidator Questa validazione verifica che la somma dei docenti inserita (Numero dei docenti interni coinvolti nel corso - numberOfInternalTeachers) sia quella effettivamente corretta
Per maggiori dettagli cfr. il modello modello dati dell entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","owner", wfService);
var ownerCount = ownerWfElementSet.size();
var contributorWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","contributor", wfService);
var contributorCount = contributorWfElementSet.size();
var numberOfInternalTeachers = object.getIntegerMap().get("numberOfInternalTeachers");
if(numberOfInternalTeachers != null){
numberOfInternalTeachers = numberOfInternalTeachers.intValue();
}else{
numberOfInternalTeachers = 0;
}
var calculatedNumberOfInternalTeachers = ownerCount + contributorCount;
if(numberOfInternalTeachers != calculatedNumberOfInternalTeachers)
errors.reject("error.continuousTraining.continuousTrainingNumberOfInternalTeachersValidator");
|
Anchor |
---|
| continuousTrainingAttachmentTypeValidator-anchor |
---|
| continuousTrainingAttachmentTypeValidator-anchor |
---|
|
continuousTrainingAttachmentTypeValidator Questa validazione controlla che esista almeno un allegato di tipo "Convenzione" o "Delibera di attivazione del corso"
Per maggiori dettagli cfr. modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var attachmentWfItemElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","attachment", wfService);
if(attachmentWfItemElementSet.isEmpty() == false){
var conventionCount = 0;
var courseActivationResolutionCount = 0;
var attachmentIterator = attachmentWfItemElementSet.iterator();
while( attachmentIterator.hasNext() ){
var attachmentWfItemElement = attachmentIterator.next();
var attachmentType = internalOuWfItemElement.getWfDictionaryMap().get("attachmentTypeId");
if(attachmentType != null){
var attachmentTypeCode = attachmentType.getStringMap().get("code");
if(attachmentTypeCode.compareTo("continuousTrainingAttachmentType.courseActivationResolution") == 0)
courseActivationResolutionCount++;
if(attachmentTypeCode.compareTo("continuousTrainingAttachmentType.convention") == 0)
conventionCount++;
}
}
if(courseActivationResolutionCount == 0 && conventionCount == 0)
errors.reject("error.continuousTraining.continuousTrainingAttachmentTypeValidator.atLeastOne");
}else{
errors.reject("error.continuousTraining.continuousTrainingAttachmentTypeValidator.atLeastOne");
}
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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 |
---|
| wfIdentityLogicHeadOfDepartmentContractPermissionsJs-anchor |
---|
| wfIdentityLogicHeadOfDepartmentContractPermissionsJs-anchor |
---|
|
wfIdentityLogicHeadOfDepartmentContractPermissionsJs Questa è una permissions logic che costruisce dinamicamente i permessi per i contratti per i team dipartimentali.
Se la variabile di configurazione
ap.contract-centralized-flow.headOfDepartment.enable è settata a
true o
non è valorizzata allora vengono assegnati al team dipartimentale i seguenti permessi:
- draft: crwfd
- validated: rwf
- signed: rwf
- archived: rwfd
- closed: rwf
Se la variabile di configurazione
ap.contract-centralized-flow.headOfDepartment.enable è settata a
false allora vengono assegnati al team dipartimentale i seguenti permessi:
- draft:
- validated:
- signed: r
- archived:
- closed: r
Se la variabile di configurazione
ap.contract-centralized-flow.headOfDepartment.enable è settata a
true o
non è valorizzata allora viene consentita la creazione di nuovi progetti ai team dipartimentali.
Se la variabile di configurazione
ap.contract-centralized-flow.headOfDepartment.enable è settata a
false allora
NON viene consentita la creazione di nuovi progetti ai team dipartimentali.
In caso di modifica di queste variabili di configurazione procedere con un reload delle Configurazioni ed effettuare un nuovo upload della tassonomia per forzare anche il reload delle risorse che pilotano la visibilità dei bottoni di creazione dell'oggetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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);
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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.reject("error.contract.owner.atLeast1");
}
|
Anchor |
---|
| administrativeOwnerValidatorContract-anchor |
---|
| administrativeOwnerValidatorContract-anchor |
---|
|
administrativeOwnerValidatorContract Questa validazione controlla che esista almeno un referente amministrativo nel tab "Soggetti interni".
Dal punto di vista del modello dati si tratta degli elementi di tipo
administrativeOwner Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "administrativeOwner", wfService);
if (ownerSet.size()<1)
errors.reject("error.contract.administrativeOwner.atLeast1");
|
Anchor |
---|
| organizationUnitValidatorContract-anchor |
---|
| organizationUnitValidatorContract-anchor |
---|
|
organizationUnitValidatorContract Questa validazione controlla che esista almeno una unità organizzativa interna nel tab "Soggetti interni".
Dal punto di vista del modello dati si tratta degli elementi di tipo
internalOrganizationUnit Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
if (orgUnitSet.size()<1)
errors.reject("error.contract.multipleInternalOrganization.atLeast1");
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
if (orgUnitSet.size()<1){
errors.reject("error.contract.multipleInternalOrganization.atLeast1");
} 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.reject("error.contract.multipleInternalOrganization.missingMain");
}
else if (count>1) {
errors.reject("error.contract.multipleInternalOrganization.tooManyMain");
}
}
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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.reject("error.contract.multipleInternalOrganization.matchWithDepartmentOwnerNotFound", [dateAsString, nonMatchedDepartmentString], null);
}
}
|
Anchor |
---|
| customerValidatorContract-anchor |
---|
| customerValidatorContract-anchor |
---|
|
customerValidatorContract Questa validazione controlla che esista almeno un committente nel tab "Dati generali".
Dal punto di vista del modello dati si tratta degli elementi di tipo
customer Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var customerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "customer", wfService);
if (customerSet.size()<1)
errors.reject("error.contract.customer.atLeast1");
|
Anchor |
---|
| currencyAndTotalAmountValidatorContract-anchor |
---|
| currencyAndTotalAmountValidatorContract-anchor |
---|
|
currencyAndTotalAmountValidatorContract Questa validazione controlla che nel tab "Corrispettivi", nel caso di selezione di valuta diversa da EURO, vengano specificati
- importo in valuta originaria
- tasso di cambio
- data rilevazione tasso di cambio
Dal punto di vista del modello dati si tratta degli attributi:
- totalAmountOriginalCurrency
- exchangeRate
- exchangeRateDate
Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var currency = object.getWfDictionaryMap().get("currency");
if(currency != null){
var currencyId = object.getWfDictionaryMap().get("currency").getId();
var dictionary = wfService.getWfDictionary(currencyId);
var currencyCode = dictionary.getStringMap().get("code");
if (currencyCode != "currency.eur"){
if (!object.getNumberMap().get("totalAmountOriginalCurrency")){
errors.rejectValue("numberMap[totalAmountOriginalCurrency]","error.contract.funding.totalAmountOriginalCurrency.required");
}
if (!object.getNumberMap().get("exchangeRate")){
errors.rejectValue("numberMap[exchangeRate]","error.contract.funding.exchangeRate.required");
}
if (!object.getDateMap().get("exchangeRateDate")){
errors.rejectValue("dateMap[exchangeRateDate]","error.contract.funding.exchangeRateDate.required");
}
}
}
|
Anchor |
---|
| wfUgovPjSenderValidatorContract-anchor |
---|
| wfUgovPjSenderValidatorContract-anchor |
---|
|
wfUgovPjSenderValidatorContract Questa logica, effettua check di consistenza sulle mappature degli oggetti IRIS/UGOV e, se superati, invia il contratto verso UGOV PJ rispettando le regole di NON SOVRASCRITTURA lato UGOV PJ.
Per maggiori dettagli su queste regole consultare il team di UGOV PJ.
Le controparti dei contratti IRIS vengono create su UGOV con le regole di mappature delle tassonomie che vengono condivise in fase di attivazione.
Se in corso d'opera dovesse nascere l'esigenza di censire delle nuove tipologie è possibile contattare l'HD.
Di seguito vengono riportate le informazioni inviate ad UGOV PJ, con la specifica dell'attributo del modello dell'entità Contratto IRIS
- Codice contratto: identifier
- Nome contratto: description troncata a 255 caratteri per limitazioni lato UGOV PJ
- Importo contratto totalAmount
L'invio viene effettuato se l'importo è non nullo e maggiore di zero. - Data inizio validità: startDate
- Data fine validità: endDate
- Riferimento Data Management System (Sistema Documentale): externalDmsIdentifier
Inviato l'identifier del contratto se valorizzata a true la variabile di configurazione ap.con.externalDmsIdentifier.autogenerated, di default questa NON è definita.
In tutti gli altri casi viene inviato externalDmsIdentifier. - Responsabili scientifici: owner
Inviate anche date di inizio e fine se valorizzata a true la variabile di configurazione ap.contract.owner.starDate.required, di default questa NON è definita. - Partecipanti: contributor
Inviate anche date di inizio e fine se valorizzata a true la variabile di configurazione ap.contract.contributor.starDate.required, di default questa NON è definita. - Unità organizzative interne: internalOrganizationUnit
- Enti Committenti: customer
Inviato se valorizzata a true (che è anche il valore di default) la variabile di configurazione ap.contract.customer.send2ugov.enable. - Tipo contratto: come da mappatura tassonomia ap-item-type.xls
- Schema di finanziamento: come da mappatura tassonomia ap-item-type.xls
- Stato contratto: come da mappatura tassonomia ap-item-type.xls
Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var Logic = function(wfItem, dtoPj, superLogic, errors, messageUtil, request, gaService, wfService, wfTaskService, searchBuilderTemplate, log) {
this.wfItem=wfItem;
this.dtoPj=dtoPj;
this.superLogic=superLogic;
this.errors=errors;
this.messageUtil=messageUtil;
this.request=request;
this.gaService=gaService;
this.wfService=wfService;
this.wfTaskService=wfTaskService;
this.searchBuilderTemplate=searchBuilderTemplate;
this.log=log;
this.setInternalOrgUnitList = function() {
var internalOrganizationUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
var internalOrganizationUnitSetIterator = internalOrganizationUnitSet.iterator();
while (internalOrganizationUnitSetIterator.hasNext()){
var element = internalOrganizationUnitSetIterator.next();
var orgUnit = element.getOrganizationUnitMap().get("ouId");
var orgUnitRole = element.getWfDictionaryMap().get("roleId");
dtoPj.getDTOUoPjs().add(superLogic.getOrganizationUnit(orgUnit, orgUnitRole, errors));
}
};
this.setFinanciers = function() {
var sendCustomer2Ugov=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.contract.customer.send2ugov.enable");
if (sendCustomer2Ugov && sendCustomer2Ugov.trim().equalsIgnoreCase("true")){
var contractorSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "customer",wfService);
var contractorSetIterator=contractorSet.iterator();
while (contractorSetIterator.hasNext()){
var element = contractorSetIterator.next();
//var organizationUnit = element.getOrganizationUnitMap().get("customerId");
var enteFinanziatore = superLogic.getEnteFinanziatore(element, this.getFinancing(), contractorSet.size(), errors);
dtoPj.getDTOEfPjs().add(enteFinanziatore);
}
}
};
this.setPartners = function() {};
this.getResearchNature = function() {
return null;
};
this.getContribution = function() {
return null;
};
this.getCofinancing = function() {
return null;
};
this.getFinancing = function() {
return wfItem.getNumberMap().get("totalAmount");
};
this.getStartDate = function() {
return wfItem.getDateMap().get("startDate");
};
this.getEndDate = function() {
return wfItem.getDateMap().get("endDate");
};
this.getExpenditureStartDate = function() {
return wfItem.getDateMap().get("startDate");
};
this.getExpenditureEndDate = function() {
return wfItem.getDateMap().get("endDate");
};
this.getCurrentEndDate = function() {
return null;
};
this.getIdentifier = function() {
return wfItem.getIdentifier();
};
this.getIdPj = function() {
if(wfItem.getIntegerMap().get("ugovId") != null){
return wfItem.getIntegerMap().get("ugovId");
} else {
return null;
}
};
this.getDescription = function() {
if(wfItem.getDescription()!=null){
var length=wfItem.getDescription().length();
return wfItem.getDescription().substring(0,(length>255)?255:length);
} else {
return null;
}
};
this.getCup = function() {
var sendCup2Ugov = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.con.cup.send2ugov.enable");
if (sendCup2Ugov && sendCup2Ugov.trim().equalsIgnoreCase("true")){
return wfItem.getStringMap().get("cup");
} else {
return null;
}
};
this.getAcronym = function() {
if(wfItem.getStringMap().get("acronym") != null){
var length = wfItem.getStringMap().get("acronym").length();
return wfItem.getStringMap().get("acronym").substring(0,(length>50)?50:length);
} else {
return null;
}
};
this.getExternalDmsIdentifier = function() {
var externalDmsIdentifierAutogenerated = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.con.externalDmsIdentifier.autogenerated");
if("true".equals(externalDmsIdentifierAutogenerated)){
return wfItem.getIdentifier();
}else {
return wfItem.getStringMap().get("externalDmsIdentifier");
}
};
this.isSynchronizable = function() {
var financing=this.getFinancing();
var legacy=wfItem.getBooleanMap().get("legacy");
if (Packages.java.lang.Boolean.TRUE.equals(legacy) || financing==null || Packages.java.math.BigDecimal.ZERO.equals(financing))
return Packages.java.lang.Boolean.FALSE;
else
return Packages.java.lang.Boolean.TRUE;
};
this.getProjectType = function() {
return superLogic.getProjectType(wfItem);
};
this.getFinanceSchema = function() {
return this.getProjectType();
};
this.getPjInternalCode = function() {
return null;
};
this.isContributorStartDateRequired = function() {
var contributorStartDateRequired=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.contract.contributor.starDate.required");
if (contributorStartDateRequired){
if (contributorStartDateRequired.trim().equalsIgnoreCase("true")){
return Packages.java.lang.Boolean.TRUE;
} else if (contributorStartDateRequired.trim().equalsIgnoreCase("false")){
return Packages.java.lang.Boolean.FALSE;
} else {
throw "ap.contract.contributor.starDate.required MUST BE true or false";
}
} else {
return Packages.java.lang.Boolean.TRUE;
}
};
this.isOwnerStartDateRequired = function() {
var ownerStartDateRequired=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.contract.owner.starDate.required");
if (ownerStartDateRequired){
if (ownerStartDateRequired.trim().equalsIgnoreCase("true")){
return Packages.java.lang.Boolean.TRUE;
} else if (ownerStartDateRequired.trim().equalsIgnoreCase("false")){
return Packages.java.lang.Boolean.FALSE;
} else {
throw "ap.contract.owner.starDate.required MUST BE true or false";
}
} else {
return Packages.java.lang.Boolean.TRUE;
}
};
};
new Logic(wfItem, dtoPj, superLogic, errors, messageUtil, request, gaService, wfService, wfTaskService, searchBuilderTemplate, log);
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var paramMap = new Packages.java.util.HashMap();
paramMap.put("identifier", object.getIdentifier());
var count=searchBuilderTemplate.getSingleObject("getWfItemCount", paramMap);
if (count>1)
errors.reject("error.contract.identifier.notUnique");
|
Anchor |
---|
| fiscalCheckFieldsetValidatorContract-anchor |
---|
| fiscalCheckFieldsetValidatorContract-anchor |
---|
|
fiscalCheckFieldsetValidatorContract Questa validazione impedisce l'edit degli attributi
- fiscalCheckPerson
- fiscalCheckTariff
- fiscalCheckVatCode
- fiscalCheckNotes
relativi alla sezione "Controllo fiscale" del tab "Corrispettivi"
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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("error.contract.fiscalCheck.edit.notAllowed");
}
|
Anchor |
---|
| isYearGreaterOrEqualThanConfigurationContract-anchor |
---|
| isYearGreaterOrEqualThanConfigurationContract-anchor |
---|
|
isYearGreaterOrEqualThanConfigurationContract Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le altre validazioni altrimenti no.
Verifica anche che il contratto in questione sia relativo ad un anno maggiore o uguale a quello definito nella configurazione
ap.con.year.validation.threashold.
Se la configurazione NON è definita o non può essere convertita in un numero intero valido viene settato uguale a 0.
Come default, NON viene definita nel sistema.
Questo approccio serve per evitare lo scatenarsi delle validazioni su vecchi contratti che non rispettano nuove e più stringenti validazioni, ed evitare quindi di dovere fare una bonifica a tappeto.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var yearTreasholdConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.con.year.validation.threashold");
var year=new Packages.java.lang.Integer(0);
if (yearTreasholdConf!=null){
try{
year=new Packages.java.lang.Integer(Packages.org.apache.commons.lang.StringUtils.trim(yearTreasholdConf));
}catch(e){}
}
(
object.getYear()!=null
&&
object.getYear().compareTo(year)>=0
)
|
Anchor |
---|
| areWarningEnabledContract-anchor |
---|
| areWarningEnabledContract-anchor |
---|
|
areWarningEnabledContract Questa è un'applicability rule che pilota i messaggi di warning per i contratti.
Se la configurazione
ap.con.warningAcknowlegement.validation.enabled è settata a true o non è valorizzata i messaggi di warning sono abilitati.
Se la configurazione
ap.con.warningAcknowlegement.validation.enabled è settata a false i messaggi di warning NON sono abilitati.
Come default, NON viene valorizzata nel sistema.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var warningAcknowlegementFlagConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.con.warningAcknowlegement.validation.enabled");
warningAcknowlegementFlagConf=Packages.org.apache.commons.lang.StringUtils.trim(warningAcknowlegementFlagConf);
(!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",warningAcknowlegementFlagConf))
|
Anchor |
---|
| isExternalDmsEnabledContract-anchor |
---|
| isExternalDmsEnabledContract-anchor |
---|
|
isExternalDmsEnabledContract Questa è un'applicability rule che pilota le validazioni relative fascicolo del DMS di Ateneo (Document Management System).
Se la variabile
ap.con.externalDmsIdentifier.enabled validazione è abilitata
Se la variabile
ap.con.externalDmsIdentifier.enabled è settata a false la validazione NON è abilitata
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var flagConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.con.externalDmsIdentifier.enabled");
flagConf=Packages.org.apache.commons.lang.StringUtils.trim(flagConf);
(!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",flagConf))
|
Anchor |
---|
| wfActionLogicCreateRmItem-anchor |
---|
| wfActionLogicCreateRmItem-anchor |
---|
|
wfActionLogicCreateRmItem Questa logica viene chiamata in ingresso nello stato approved e crea un nuovo rmItem a partire da quello di AP.
Se esiste già, allora lo aggiorna.
Questo è collegato all'item di AP essendo il suo identificativo presente fra i suoi metadati (e viceversa).
Vengono aggiunti/aggiornati anche i dipartimenti associati all'item.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
function createNewOrgUnitElementEquipment(department, rmItem){
var orgUnitElement = new Packages.it.cilea.ga.model.OrganizationUnitElement();
orgUnitElement.setDiscriminator("equipment");
orgUnitElement.setOrganizationUnit(department);
orgUnitElement.setOrganizationUnitId(department.getOrganizationUnitId());
orgUnitElement.getRmItemMap().put("equipment", rmItem);
return orgUnitElement;
}
var wfItem= wfService.getWfItem(object.getId());
var rmItemMap=wfItem.getRmItemMap();
var rmItem=rmItemMap.get("equipment");
if(rmItem==null){
rmItem = new Packages.it.cilea.ga.model.RmItem();
var today = new Packages.java.util.Date();
rmItem.setCreateDate(today);
rmItem.setRmItemTypeId(10);
rmItem.getIntegerMap().put("apItemSourceId", object.getId());
}
rmItem.setDescription(wfItem.getDescription());
rmItem.getStringMap().put("apItemSourceIdentifier", object.getIdentifier());
//aggiungo o sovrascrivo l'rmItem
rmItemMap.put("equipment", rmItem);
//sovrascrivo la mappa, ci metto quella aggiornata
wfItem.setRmItemMap(rmItemMap);
//mi tengo da parte l'id prima del salvataggio
//lo userò dopo per vedere se devo cercare orgUnitElement
var rmItemId=rmItem.getId();
//salvo
gaService.saveOrUpdate(rmItem);
wfService.saveOrUpdate(wfItem);
//PARTE PER AGGIUNTA AL DIPARTIMENTO
//prima tolgo tutti gli orgUnitElement, se ce ne sono attaccati all'rmItem
//poi li riaggiungo tutti
if(rmItemId != null){
var paramMap = new Packages.java.util.HashMap();
paramMap.put("rmItemValueId", rmItem.getId());
var orgUnitElementList = searchBuilderTemplate.query("getOrganizationUnitElementByRmItemId", paramMap);
var orgUnitElementListIter = orgUnitElementList.iterator();
while(orgUnitElementListIter.hasNext()){
var orgUnitElement = orgUnitElementListIter.next();
gaService.deleteOrganizationUnitElement(orgUnitElement.getId());
}
}
/*
var paramMap = new Packages.java.util.HashMap();
paramMap.put("rmItemValueId", 10);
var orgUnitList=searchBuilderTemplate.query("getOrganizationUnitElementByRmItemId", paramMap);
*/
var departmentSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
var departmentSetIterator = departmentSet.iterator();
while(departmentSetIterator.hasNext()){
var departmentElement = departmentSetIterator.next();
var departmentEmpty = departmentElement.getOrganizationUnitMap().get("ouId");
var department = gaService.getOrganizationUnit(departmentEmpty.getId());
//a differenza della versione di prima, so già che non ci sono orgUnitElement attaccati al mio rmItem
//quindi ne aggiungo direttamente uno
department.getOrganizationUnitElementSet().add(
createNewOrgUnitElementEquipment(department, rmItem)
);
gaService.saveOrUpdate(department);
}
|
Anchor |
---|
| wfActionLogicDeleteRmItem-anchor |
---|
| wfActionLogicDeleteRmItem-anchor |
---|
|
wfActionLogicDeleteRmItem Questa logica viene chiamata in ingresso nello stato submitted ed elimina il rmItem agganciato precedentemente (se presente) a quello di AP.
Questo è collegato all'item di AP essendo il suo identificativo presente fra i suoi metadati (e viceversa).
Vengono eliminati anche i dati dei dipartimenti associati all'item.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
/* Logica che viene chiamata in enter allo stato submitted (In Validazione)
Se proviene da approved(Approvato) avrà sicuramente un rmItem collegato che devo eliminare
In ordine quindi devo scollegare-eliminare dati/link)
-dai dipartimenti agganciati
-dalla versione che è stata creata poco prima
-eliminare l'rmItem poichè inutile
*/
//log.error("Sono in wfActionLogicDeleteRmItem");
var wfItem = wfService.getWfItem(object.getId());
var rmItemMap =wfItem.getRmItemMap();
var rmItem = rmItemMap.get("equipment");
//log.error("rmItem ricavato" + rmItem);
// eseguo tutta la procedura solo se effettivamente ho anche un rmItem collegato (in precedenza)
if(rmItem != null){
//log.error("rmItem non nullo");
var paramMap = new Packages.java.util.HashMap();
paramMap.put("rmItemValueId", rmItem.getId());
//ricerco le organizzazioni a cui sganciare l'equipment
var orgUnitElementList = searchBuilderTemplate.query("getOrganizationUnitElementByRmItemId", paramMap);
//log.error("orgUnitElementList size: " + orgUnitElementList.size());
var orgUnitElementListIter = orgUnitElementList.iterator();
while(orgUnitElementListIter.hasNext()){
var orgUnitElement = orgUnitElementListIter.next();
//log.error(" orgUnitElement id: " + orgUnitElement.getId());
gaService.deleteOrganizationUnitElement(orgUnitElement.getId());
//var orgUnitId = gaService.getOrganizationUnit orgUnitElement.getOrganizationUnitId();
//dovrei anche salvare la orgUnit?
//log.error(" orgUnitElement deleted ");
}
//ricerco le altre possibili versioni che hanno questo dato equipment agganciato
var wfItemDataList = searchBuilderTemplate.query("getWfItemDataByRmItemId", paramMap);
//log.error("wfItemDataList size: " + wfItemDataList.size());
var wfItemDataListIter = wfItemDataList.iterator();
while(wfItemDataListIter.hasNext()){
var wfItemData = wfItemDataListIter.next();
var wfItem = wfService.getWfItem(wfItemData.getWfItem().getId());
//log.error(" wfItem id: " + wfItemData.getWfItem().getId());
//log.error(" wfItem: " + wfItem);
//rmItemMap.put("equipment", null);
//wfItem.setRmItemMap(rmItemMap);
wfItem.getRmItemMap().put("equipment", null);
wfService.saveOrUpdate(wfItem);
//log.error(" wfItem saved and data deleted ");
}
//una volta che ho cancellato gli elementi a cui poteva essere agganciato
//posso andare a cancellare l'rmItem
gaService.deleteRmItem(rmItem.getId());
//log.error("RM_ITEM DELETED");
//facendo così dovrei eliminare anche tutti dati agganciati all'rmItem
}
|
Anchor |
---|
| deleteRmItemEquipmentValidator-anchor |
---|
| deleteRmItemEquipmentValidator-anchor |
---|
|
deleteRmItemEquipmentValidator Questa validazione va a cancellare i dati relativi al'rmItem equipment quando viene cancellato l'oggetto padre wfItem
Per maggiori dettagli cfr. il modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono in deleteRmItemEquipmentValidator");
var wfItem = wfService.getWfItem(object.getId());
var rmItemMap =wfItem.getRmItemMap();
var rmItem = rmItemMap.get("equipment");
if (rmItem != null){
var paramMap = new Packages.java.util.HashMap();
paramMap.put("rmItemValueId", rmItem.getId());
var paramMap = new Packages.java.util.HashMap();
paramMap.put("rmItemValueId", rmItem.getId());
//ricerco le organizzazioni a cui sganciare l'equipment
var orgUnitElementList = searchBuilderTemplate.query("getOrganizationUnitElementByRmItemId", paramMap);
//log.error("orgUnitElementList size: " + orgUnitElementList.size());
var orgUnitElementListIter = orgUnitElementList.iterator();
while(orgUnitElementListIter.hasNext()){
var orgUnitElement = orgUnitElementListIter.next();
gaService.deleteOrganizationUnitElement(orgUnitElement.getId());
}
//ricerco le altre possibili versioni che hanno questo dato equipment agganciato
var wfItemDataList = searchBuilderTemplate.query("getWfItemDataByRmItemId", paramMap);
//log.error("wfItemDataList size: " + wfItemDataList.size());
var wfItemDataListIter = wfItemDataList.iterator();
while(wfItemDataListIter.hasNext()){
var wfItemData = wfItemDataListIter.next();
var wfItem = wfService.getWfItem(wfItemData.getWfItem().getId());
wfItem.getRmItemMap().put("equipment", null);
wfService.saveOrUpdate(wfItem);
}
//una volta che ho cancellato gli elementi a cui poteva essere agganciato
//posso andare a cancellare l'rmItem
gaService.deleteRmItem(rmItem.getId());
//facendo così dovrei eliminare anche tutti dati agganciati all'rmItem
}
//se non fosse popolato sarebbe strano
|
Anchor |
---|
| emailValidator-anchor |
---|
| emailValidator-anchor |
---|
|
emailValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItemElement=object;
var contactTypeId=wfItemElement.getGaDictionaryMap().get("contactType").getId();
var contactTypeDictionary=gaService.getGaDictionary(contactTypeId);
if (contactTypeDictionary.getDescription().equals("mail")){
var pattern = Packages.java.util.regex.Pattern
.compile("^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[\-A-Za-z0-9]+(\.[\-A-Za-z0-9]+)*(\.[A-Za-z]{2,})$");
var matcher = pattern.matcher(wfItemElement.getStringMap().get("description"));
if (!matcher.matches()) {
errors.rejectValue("stringMap[description]", "error.equipment.contact.mail.invalidValue");
}
}
|
Anchor |
---|
| isEquipmentPlaceRequired-anchor |
---|
| isEquipmentPlaceRequired-anchor |
---|
|
isEquipmentPlaceRequired Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le validazioni a cui è agganciata altrimenti no.
Questa regola ritorna true se la configurazione
ap.eqp.place.required è settata a true.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
"true"==StringUtils.trimToEmpty(ConfigurationUtil.getConfigValue("ap.eqp.place.required"))
)
|
Anchor |
---|
| isEquipmentPurchaseValueRequired-anchor |
---|
| isEquipmentPurchaseValueRequired-anchor |
---|
|
isEquipmentPurchaseValueRequired Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le validazioni a cui è agganciata altrimenti no.
Questa regola ritorna true se la configurazione
ap.eqp.purchaseValue.required è settata a true.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
"true"==StringUtils.trimToEmpty(ConfigurationUtil.getConfigValue("ap.eqp.purchaseValue.required"))
)
|
Anchor |
---|
| isEquipmentInUseRequired-anchor |
---|
| isEquipmentInUseRequired-anchor |
---|
|
isEquipmentInUseRequired Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le validazioni a cui è agganciata altrimenti no.
Questa regola ritorna true se la configurazione
ap.eqp.inUse.required è settata a true.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
"true"==StringUtils.trimToEmpty(ConfigurationUtil.getConfigValue("ap.eqp.inUse.required"))
)
|
Anchor |
---|
| isEquipmentEsfriClassificationRequired-anchor |
---|
| isEquipmentEsfriClassificationRequired-anchor |
---|
|
isEquipmentEsfriClassificationRequired Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le validazioni a cui è agganciata altrimenti no.
Questa regola ritorna true se la configurazione
ap.eqp.esfriClassification.required è settata a true.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
"true"==StringUtils.trimToEmpty(ConfigurationUtil.getConfigValue("ap.eqp.esfriClassification.required"))
)
|
Anchor |
---|
| urlPublicCalendarEquipmentValidator-anchor |
---|
| urlPublicCalendarEquipmentValidator-anchor |
---|
|
urlPublicCalendarEquipmentValidator Questa validazione verifica che sia presente il metadato
urlPublicCalendar se il metadato
publicCalendar è valorizzato a true.
Il messaggio di errore è contenuto nell'etichetta
error.equipment.urlPublicCalendar.required Per maggiori dettagli cfr. il modello modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (Boolean.TRUE.equals(object.getBooleanMap().get("publicCalendar"))){
if (StringUtils.isBlank(object.getStringMap().get("urlPublicCalendar"))){
errors.rejectValue("stringMap[urlPublicCalendar]","error.equipment.urlPublicCalendar.required");
}
}
|
Anchor |
---|
| repairabilityEquipmentValidator-anchor |
---|
| repairabilityEquipmentValidator-anchor |
---|
|
repairabilityEquipmentValidator Questa validazione verifica che sia presente il metadato
repairability se il metadato
inUse è valorizzato a false.
Il messaggio di errore è contenuto nell'etichetta
error.equipment.repairability.required Per maggiori dettagli cfr. il modello modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (Boolean.FALSE.equals(object.getBooleanMap().get("inUse"))){
if (StringUtils.isBlank(object.getWfDictionaryMap().get("repairability"))){
errors.rejectValue("wfDictionaryMap[repairability]","error.equipment.repairability.required");
}
}
|
Anchor |
---|
| tariffEquipmentValidator-anchor |
---|
| tariffEquipmentValidator-anchor |
---|
|
tariffEquipmentValidator Questa validazione verifica che sia presente il metadato
tariff se è presente il dizionario di valore
applications.tariff (RM - Attrezzature - Applicazioni) nella sezione Applicazioni.
Il messaggio di errore è contenuto nell'etichetta
error.equipment.tariff.required Per maggiori dettagli cfr. il modello modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var applicationsSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","applications", wfService);
var applicationsSetIterator=applicationsSet.iterator();
while(applicationsSetIterator.hasNext()){
var applicationsElement=applicationsSetIterator.next();
var dictionary=applicationsElement.getWfDictionaryMap().get("application");
if (dictionary!=null && "applications.tariff"==dictionary.getStringMap().get("code")){
if (StringUtils.isBlank(object.getStringMap().get("tariff"))){
errors.rejectValue("stringMap[tariff]","error.equipment.tariff.required");
}
}
}
|
Anchor |
---|
| externalOrganizationOwnerEquipmentValidator-anchor |
---|
| externalOrganizationOwnerEquipmentValidator-anchor |
---|
|
externalOrganizationOwnerEquipmentValidator Questa validazione verifica che sia presente il metadato
externalOrganizationOwner se il metadato
internalOwnership è valorizzato a false.
Il messaggio di errore è contenuto nell'etichetta
error.equipment.externalOrganizationOwner.required Per maggiori dettagli cfr. il modello modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (Boolean.FALSE.equals(object.getBooleanMap().get("internalOwnership"))){
if (object.getOrganizationUnitMap().get("externalOrganizationOwner")==null){
errors.rejectValue("organizationUnitMap[externalOrganizationOwner]","error.equipment.externalOrganizationOwner.required");
}
}
|
Anchor |
---|
| wfStartLogicEquipment-anchor |
---|
| wfStartLogicEquipment-anchor |
---|
|
wfStartLogicEquipment Questa logica viene eseguita in fase di creazione di una nuova attrezzatura.
Effettua il setup dei seguenti attributi con i valori tra parentesi
- publicCalendar (false)
- internalOwnership (true)
Per maggiori dettagli cfr. modello dati dell'entità equipment.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(wfItem.getBooleanMap().get("publicCalendar")==null){
wfItem.getBooleanMap().put("publicCalendar",false);
}
if(wfItem.getBooleanMap().get("internalOwnership")==null){
wfItem.getBooleanMap().put("internalOwnership",true);
}
true;
|
Anchor |
---|
| equipmentValidatorLaboratory-anchor |
---|
| equipmentValidatorLaboratory-anchor |
---|
|
equipmentValidatorLaboratory Questa validazione controlla che, se esiste una grande attrezzatura collegata al laboratorio, questa attrezzatura sia in stato "approved", altrimenti lancia un errore.
Dal punto di vista del modello dati si tratta degli elementi di tipo
laboratoryEquipmentLink Per maggiori dettagli cfr. modello dati delle entità laboratorio e grande attrezzatura
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("entro nel validator");
var equipmentSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getChildWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "laboratoryEquipmentLink", wfService);
//log.error("equipmentSet size= "+equipmentSet.size());
if(equipmentSet.size()>0){
var equipmentSetIterator = equipmentSet.iterator();
while (equipmentSetIterator.hasNext()) {
var equipmentElement = equipmentSetIterator.next();
var equipment = equipmentElement.getChild();
var equipmentState = equipment.getWfState().getDescription();
//log.error("stato dell'equipment"+equipmentState);
if(!Packages.org.apache.commons.lang.StringUtils.equals("approved", equipmentState)){
//log.error("trovato un laboratory non approvato");
errors.reject("error.laboratory.equipment.mustBeApproved");
}
}
}
|
Anchor |
---|
| wfActionLogicCreatePersonElementIncoming-anchor |
---|
| wfActionLogicCreatePersonElementIncoming-anchor |
---|
|
wfActionLogicCreatePersonElementIncoming Questa logica viene triggerata in ingresso nello stato validated.
Crea un nuovo elemento nella sezione della mobilità in ingresso all'interno del profilo personale (CV Scientifico)
Se esiste già allora lo aggiorna.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
function obtainIncomingTypeDictionary(incomingTypeDescription){
//prima di tutto ne cerco
var incomingTypeDictionaryList = gaService.getGaDictionarySearchList(incomingTypeDescription, "incomingType", null, null, null);
//se non ne trovo allora creo da zero il dizionario, lo salvo e lo restituisco
if(incomingTypeDictionaryList.size() == 0){
var newIncomingTypeDictionary = new Packages.it.cilea.ga.model.GaDictionary();
newIncomingTypeDictionary.setDescription(incomingTypeDescription);
newIncomingTypeDictionary.setDiscriminator("incomingType");
newIncomingTypeDictionary.getStringMap().put("MANAGED_BY", "system"); //in modo tale che non possa essere modificato da interfaccia
gaService.saveOrUpdate(newIncomingTypeDictionary);
return newIncomingTypeDictionary;
}else{
//altrimenti lo restituisco direttamente
//non vado a ciclare tutta la lista, ne ho solo uno di dictionary fatto così
return incomingTypeDictionaryList.get(0);
}
}
var wfItem = wfService.getWfItem(object.getId());
var wfItemId = wfItem.getId();
var wfItemIdentifier = wfItem.getIdentifier();
//poi vado a ricavare tutti i tutor inseriti
var tutorWfItemElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement","tutor", wfService);
//solo se ne trovo, allora eseguo il resto della procedura
if(!tutorWfItemElementSet.isEmpty()){
//ora vado a ciclare ogni wfItemElement, ricavando poi la persona collegata
var tutorWfItemElementSetIterator = tutorWfItemElementSet.iterator();
while(tutorWfItemElementSetIterator.hasNext()){
var tutorWfItemElement = tutorWfItemElementSetIterator.next();
var tutorPerson = tutorWfItemElement.getPersonMap().get("contributorId"); //restituisce la person completa?
tutorPerson = gaService.getPerson(tutorPerson.getId()); //nel dubbio la ricavo dal service
//ora che ho la persona, ne vado a ricavare gli element di incoming che mi servono
var incomingPersonElementSet = tutorPerson.getPersonElementSet("incoming");
var incomingPersonElementSetIterator = incomingPersonElementSet.iterator();
//vado a ciclare il set per vedere se quell'element esiste già
//se esiste già, lo rimuovo
//e dopo ne aggiungo uno nuovo nuovo appena creato
while(incomingPersonElementSetIterator.hasNext()){
var incomingPersonElement = incomingPersonElementSetIterator.next();
var incomingPersonElementSourceIdentifier = incomingPersonElement.getStringMap().get("apItemSourceIdentifier");
var incomingPersonElementSourceId = incomingPersonElement.getIntegerMap().get("apItemSourceId");
//doppio controllo, così gestisco il caso in cui l'item non abbia un identifier come può succedere se proviene da tabelle di frontiera
if(Packages.org.apache.commons.lang.StringUtils.equals(wfItemIdentifier, incomingPersonElementSourceIdentifier) || (wfItemId==incomingPersonElementSourceId) ){
//lo sgancio dalla persona, lo elimino e salvo la persona
tutorPerson.getPersonElementSet().remove(incomingPersonElement);
gaService.deletePersonElement(incomingPersonElement.getId());
gaService.saveOrUpdate(tutorPerson);
}
}
//ora che mi sono accertato che per certo non ho quel personElement, me ne vado a creare uno completamente nuovo ed aggiornato
var newPersonElementIncoming = new Packages.it.cilea.ga.model.PersonElement();
//ed ora passo ad agganciarci tutte le informazioni che gli servono
newPersonElementIncoming.setPersonId(tutorPerson.getPersonId());
newPersonElementIncoming.setDiscriminator("incoming");
newPersonElementIncoming.getPersonMap().put("tutoree", wfItem.getPersonMap().get("owner"));
//visto che il miurExternalOrganization è un element ma unico, ricavo il primo elemento e da lì il tutto
var miurExternalOrganizationUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement","miurExternalOrganization", wfService);
//controllo ulteriore nel caso in cui cambino le validazioni e non sia più obbligatorio
if(!miurExternalOrganizationUnitSet.isEmpty()){
var miurExternalOrganizationUnit = miurExternalOrganizationUnitSet.iterator().next().getOrganizationUnitMap().get("externalOrganization");
newPersonElementIncoming.getOrganizationUnitMap().put("miurExternalOrganization", miurExternalOrganizationUnit);
}
newPersonElementIncoming.getStringMap().put("apItemSourceIdentifier", wfItemIdentifier);
newPersonElementIncoming.getIntegerMap().put("apItemSourceId", wfItemId);
if(tutorWfItemElement.getDateMap().get("startDate")!=null)
newPersonElementIncoming.getDateMap().put("startDate", tutorWfItemElement.getDateMap().get("startDate"));
if(tutorWfItemElement.getDateMap().get("endDate")!=null)
newPersonElementIncoming.getDateMap().put("endDate", tutorWfItemElement.getDateMap().get("endDate"));
//gestione dictionary
var incomingTypeDescription = wfItem.getWfItemType().getDescription();
var incomingTypeDictionary = obtainIncomingTypeDictionary(incomingTypeDescription);
newPersonElementIncoming.getDictionaryMap().put("incomingType", incomingTypeDictionary);
//aggiungo metadato per marcare come è stato gestito
newPersonElementIncoming.getStringMap().put("managedBy", "system");
//ora che è completo, vado a salvarlo
gaService.saveOrUpdate(newPersonElementIncoming);
//lo aggiungo alla person e salvo la person
tutorPerson.getPersonElementSet().add(newPersonElementIncoming);
gaService.saveOrUpdate(tutorPerson);
}
}
|
Anchor |
---|
| deleteAllPersonElementsLinkedToMobility-anchor |
---|
| deleteAllPersonElementsLinkedToMobility-anchor |
---|
|
deleteAllPersonElementsLinkedToMobility Questa logica si occupa di eliminare dai profili personali del tutor/persona in ingresso (CV Scientifico) il collegamento tra le due persone
Questa logica viene triggerata in fase di eliminazione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItem = wfService.getWfItem(object.getId());
var wfItemId = wfItem.getId();
var wfItemIdentifier = wfItem.getIdentifier();
var tutorWfItemElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement","tutor", wfService);
if(!tutorWfItemElementSet.isEmpty()){
var tutorWfItemElementSetIterator = tutorWfItemElementSet.iterator();
while(tutorWfItemElementSetIterator.hasNext()){
var tutorWfItemElement = tutorWfItemElementSetIterator.next();
var tutorPerson = tutorWfItemElement.getPersonMap().get("contributorId"); //restituisce la person completa?
tutorPerson = gaService.getPerson(tutorPerson.getId()); //nel dubbio la ricavo dal service
var incomingPersonElementSet = tutorPerson.getPersonElementSet("incoming");
var incomingPersonElementSetIterator = incomingPersonElementSet.iterator();
//vado a ciclare il set per vedere se quell'element esiste già
//se esiste già, lo rimuovo
while(incomingPersonElementSetIterator.hasNext()){
var incomingPersonElement = incomingPersonElementSetIterator.next();
var incomingPersonElementSourceIdentifier = incomingPersonElement.getStringMap().get("apItemSourceIdentifier");
var incomingPersonElementSourceId = incomingPersonElement.getIntegerMap().get("apItemSourceId");
//doppio controllo, così gestisco il caso in cui l'item non abbia un identifier come può succedere se proviene da tabelle di frontiera
if(Packages.org.apache.commons.lang.StringUtils.equals(wfItemIdentifier, incomingPersonElementSourceIdentifier) || (wfItemId==incomingPersonElementSourceId) ){
tutorPerson.getPersonElementSet().remove(incomingPersonElement);
gaService.deletePersonElement(incomingPersonElement.getId());
gaService.saveOrUpdate(tutorPerson);
}
}
}
}
|
Anchor |
---|
| externalOrganizationValidatorMobilityIncoming-anchor |
---|
| externalOrganizationValidatorMobilityIncoming-anchor |
---|
|
externalOrganizationValidatorMobilityIncoming Questa validazione controlla che sia presente una istituzione esterna
Per maggiori dettagli cfr. modello dati della Mobilità in ingresso
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var miurExternalOrganizationSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","miurExternalOrganization", wfService);
if(miurExternalOrganizationSet.size()==0)
errors.reject("error.person.internal.mobilityIncoming.externalOrganization");
|
Anchor |
---|
| externalOrganizationAndRequestPendingValidatorMobilityIncoming-anchor |
---|
| externalOrganizationAndRequestPendingValidatorMobilityIncoming-anchor |
---|
|
externalOrganizationAndRequestPendingValidatorMobilityIncoming Questa validazione controlla che non sia presente sia una istituzione esterna (da anagrafica) che la richiesta di inserimento
Per maggiori dettagli cfr. modello dati della Mobilità in ingresso
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var miurExternalOrganizationSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","miurExternalOrganization", wfService);
if(miurExternalOrganizationSet.size()>0 && object.getStringMap().get("miurExternalOrganizationsRequested")!=null){
errors.reject("error.person.internal.mobilityIncoming.miurExternalOrganizationsRequested");
}
|
Anchor |
---|
| ercValidatorMobilityIncoming-anchor |
---|
| ercValidatorMobilityIncoming-anchor |
---|
|
ercValidatorMobilityIncoming Questa validazione verifica che non siano presenti più di 3 parole chiave ERC.
Per maggiori dettagli cfr. modello dati della Mobilità in ingresso
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ercSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","ercKeyword", wfService);
if(!ercSet.isEmpty()){
if(ercSet.size()>3){
errors.reject("error.mobilityIncoming.tooMany.ERC");
}
}
|
Anchor |
---|
| deletePersonElementFromOldTutor-anchor |
---|
| deletePersonElementFromOldTutor-anchor |
---|
|
deletePersonElementFromOldTutor Questa logica si occupa di eliminare dal profilo personale del tutor/persona in ingresso (CV Scientifico) il collegamento tra le due persone
Questa logica viene triggerata in fase di salvataggio.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Inside deletePersonElementFromOldTutor");
var wfItem = wfService.getWfItem(object.getId());
var wfItemId = wfItem.getId();
var wfItemIdentifier = wfItem.getIdentifier();
//ricavo i vecchi tutor memorizzati su db
var tutorApItemElementSetOLD = wfItem.getWfItemElementSet("tutor");
//ricavo i tutor aggiornati dal fragment
var tutorApItemElementSetNEW = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement","tutor", wfService);
//ciclo quelli ricavati dal DB per andare a ricavare quelli che sono stati eliminati
var tutorApItemElementSetOLDIterator = tutorApItemElementSetOLD.iterator();
while(tutorApItemElementSetOLDIterator.hasNext()){
//log.error("inside old tutor set");
//if(tutorApItemElementSetOLDIterator != null){
var tutorApItemElement = tutorApItemElementSetOLDIterator.next();
if(!tutorApItemElementSetNEW.contains(tutorApItemElement)){
//log.error("Found old tutor");
var tutorPerson = tutorApItemElement.getPersonMap().get("contributorId");
tutorPerson = gaService.getPerson(tutorPerson.getId());
//log.error("is: " + tutorPerson.getDisplayValue());
var incomingPersonElementSet = tutorPerson.getPersonElementSet("incoming");
var incomingPersonElementSetIterator = incomingPersonElementSet.iterator();
while(incomingPersonElementSetIterator.hasNext()){
//log.error("inside incoming set of tutor");
var incomingPersonElement = incomingPersonElementSetIterator.next();
var incomingPersonElementSourceIdentifier = incomingPersonElement.getStringMap().get("apItemSourceIdentifier");
var incomingPersonElementSourceId = incomingPersonElement.getIntegerMap().get("apItemSourceId");
if( Packages.org.apache.commons.lang.StringUtils.equals(wfItemIdentifier, incomingPersonElementSourceIdentifier) ||
(wfItemId == incomingPersonElementSourceId) ){
tutorPerson.getPersonElementSet().remove(incomingPersonElement);
gaService.deletePersonElement(incomingPersonElement.getId());
gaService.saveOrUpdate(tutorPerson);
//log.error("deleted old personelement and person saved");
}
}
}
//}else{
//log.error("tutorApItemElementSetOLDIterator IS NULL");
//}
}
|
Anchor |
---|
| isTypePlantVariety-anchor |
---|
| isTypePlantVariety-anchor |
---|
|
isTypePlantVariety 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 le proprietà intellettuali di tipo
Varietà vegetale.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
wfService.refresh(object);
object.getWfItemType().getIdentifier() == "PAT.PLANT-VARIETY"
|
Anchor |
---|
| isTypeIndustrial-anchor |
---|
| isTypeIndustrial-anchor |
---|
|
isTypeIndustrial 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 le proprietà intellettuali di tipo
Brevetto industriale.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
wfService.refresh(object);
object.getWfItemType().getIdentifier() == "PAT.INDUSTRIAL"
|
Anchor |
---|
| intellectualPropertyInventionLinkValidator-anchor |
---|
| intellectualPropertyInventionLinkValidator-anchor |
---|
|
intellectualPropertyInventionLinkValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var linkSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getParentWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "inventionIntellectualPropertyLink", wfService);
if (linkSet.isEmpty()){
errors.reject("error.intellectualProperty.invention.required");
}else{
var withdrawnInventions = 0;
var linkSetIterator = linkSet.iterator();
while(linkSetIterator.hasNext()){
var link = linkSetIterator.next();
var invetionParent = wfService.getWfItem(link.getParentId());
if(!invetionParent.getWithdrawn())
withdrawnInventions++;
}
if(linkSet.size() == withdrawnInventions)
errors.reject("error.intellectualProperty.invention.required");
}
|
Anchor |
---|
| wfStartLogicPatent-anchor |
---|
| wfStartLogicPatent-anchor |
---|
|
wfStartLogicPatent Questa logica viene eseguita in fase di creazione di una nuova proprietà intellettuale.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var applicationNumber=wfItem.getStringMap().get("applicationNumber");
wfItem.setIdentifier(applicationNumber);
wfItem.getStringMap().put("applicationNumberEpoDocCompliant", applicationNumber);
var applicationDate=wfItem.getDateMap().get("applicationDate");
if (applicationDate!=null){
var year=applicationDate.get(Packages.java.util.Calendar.YEAR);
wfItem.setYear(year);
}
wfItem.getBooleanMap().put("visibleOnPortal", true);
if(wfItem.getBooleanMap().get("recoveryMetadataFromEPO")==null || Packages.java.lang.Boolean.FALSE.equals(wfItem.getBooleanMap().get("recoveryMetadataFromEPO"))){
var linkedInventionId = wfItem.getIntegerMap().get("linkedInventionId");
var linkedInvention = wfService.getWfItem(linkedInventionId);
var inventionOwnerSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(linkedInvention, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
var inventionOwnerSetIterator = inventionOwnerSet.iterator();
while (inventionOwnerSetIterator.hasNext()){
var inventionOwner=inventionOwnerSetIterator.next();
var patentOwnerSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
var patentOwnerSetIterator = patentOwnerSet.iterator();
while (patentOwnerSetIterator.hasNext()){
var patentOwner=patentOwnerSetIterator.next();
if (inventionOwner.getPersonMap().get("ownerId").getId()!=patentOwner.getPersonMap().get("ownerId").getId()){
var ownerElement=new WfItemElement();
ownerElement.setDiscriminator("owner");
ownerElement.setWfItemId(wfItem.getId());
ownerElement.getPersonMap().put("ownerId", inventionOwner.getPersonMap().get("ownerId"));
wfService.saveOrUpdate(ownerElement);
}
}
}
}
if(wfItem.getBooleanMap().get("recoveryMetadataFromEPO")==null || Packages.java.lang.Boolean.FALSE.equals(wfItem.getBooleanMap().get("recoveryMetadataFromEPO"))){
var inventionIntellectualPropertyLink = new Packages.it.cilea.wf.model.WfItemLink();
inventionIntellectualPropertyLink.setParentId(linkedInventionId);
inventionIntellectualPropertyLink.setChildId(wfItem.getId());
inventionIntellectualPropertyLink.setDiscriminator("inventionIntellectualPropertyLink");
var parentWfItemLinkSet = wfItem.getParentWfItemLinkSet();
parentWfItemLinkSet.add(inventionIntellectualPropertyLink);
wfItem.setParentWfItemLinkSet(parentWfItemLinkSet);
wfItem.getIntegerMap().put("linkedInventionId", null);
wfItem.getBooleanMap().put("isPriority", false);
wfService.saveOrUpdate(inventionIntellectualPropertyLink);
}
wfService.saveOrUpdate(wfItem);
|
Anchor |
---|
| intellectualPropertyOwnerValidator-anchor |
---|
| intellectualPropertyOwnerValidator-anchor |
---|
|
intellectualPropertyOwnerValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerInMap = object.getPersonMap().get("owner");
var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","owner", wfService);
if(ownerInMap==null){
if(ownerWfElementSet.isEmpty())
errors.reject("error.intellectualProperty.owner.required");
}
|
Anchor |
---|
| intellectualPropertyApplicantValidator-anchor |
---|
| intellectualPropertyApplicantValidator-anchor |
---|
|
intellectualPropertyApplicantValidator Questa validazione controlla le percentuali di titolarità.
Verifica che sia presente almeno un titolare.
Verifica che se almeno un titolare ha la percentuale di titolarità, allora anche gli altri devono avere una percentuale.
Questa validazione scatta sempre, per disattivarla bisogna settare a false la configurazione
ap.pat.ownership.percentage.enabled.
Se la configurazione
ap.pat.ownership.percentage.enabled è settata a false nel fragment della titolarità non verrà visualizzato il campo relativo alla percentuale.
Per maggiori dettagli cfr. excel modello dati dell'entità Proprietà Intellettuali.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var percentageEnableConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.pat.ownership.percentage.enabled");
if(!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",percentageEnableConf)){
var applicantSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","applicant", wfService);
var applicantSetIterator=applicantSet.iterator();
var applicantWithPercentageCount=0;
var applicantTotalPercentageOwnership=BigDecimal.ZERO;
while (applicantSetIterator.hasNext()){
var currentApplicant=applicantSetIterator.next();
var percentage=currentApplicant.getNumberMap().get("ownershipPercentage");
if (percentage!=null){
applicantWithPercentageCount++;
applicantTotalPercentageOwnership=applicantTotalPercentageOwnership.add(percentage);
}
}
if (applicantSet.size()==0){
errors.reject("error.patent.applicant.required");
}
if (applicantWithPercentageCount>0 && applicantWithPercentageCount!=applicantSet.size()){
errors.reject("error.patent.applicant.ownershipPercentage");
}
}
|
Anchor |
---|
| intellectualPropertyOwnershipValidator-anchor |
---|
| intellectualPropertyOwnershipValidator-anchor |
---|
|
intellectualPropertyOwnershipValidator Questa validazione controlla che la somma delle percentuali di titolarità sia 100.
Questa validazione scatta sempre, per disattivarla bisogna settare a false la configurazione
ap.pat.ownership.percentage.enabled.
Se la configurazione
ap.pat.ownership.percentage.enabled è settata a false nel fragment della titolarità non verrà visualizzato il campo relativo alla percentuale.
Per maggiori dettagli cfr. excel modello dati dell'entità Proprietà Intellettuali.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var percentageEnableConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.pat.ownership.percentage.enabled");
if(!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",percentageEnableConf)){
var applicantSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","applicant", wfService);
var applicantSetIterator=applicantSet.iterator();
var applicantWithPercentageCount=0;
var applicantTotalPercentageOwnership=BigDecimal.ZERO;
while (applicantSetIterator.hasNext()){
var currentApplicant=applicantSetIterator.next();
var percentage=currentApplicant.getNumberMap().get("ownershipPercentage");
if (percentage!=null){
applicantWithPercentageCount++;
applicantTotalPercentageOwnership=applicantTotalPercentageOwnership.add(percentage);
}
}
if (!applicantTotalPercentageOwnership.equals(new BigDecimal(100))){
errors.reject("error.patent.applicant.totalOwnershipPercentage");
}
}
|
Anchor |
---|
| intellectualPropertyLegalStatusValidator-anchor |
---|
| intellectualPropertyLegalStatusValidator-anchor |
---|
|
intellectualPropertyLegalStatusValidator Validator che controlla che sia inserito lo stato legale della proprietà intellettuale collegata
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var legalStatusSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","legalStatus", wfService);
if (legalStatusSet.isEmpty()){
errors.reject("error.intellectualProperty.legalStatus.required");
}
|
Anchor |
---|
| uniquePatentValidator-anchor |
---|
| uniquePatentValidator-anchor |
---|
|
uniquePatentValidator Validator che controlla la presenza dell'owner sia nella personMap(dove viene memorizzato in start) sia tra gli element (dove viene poi salvato normalmente)
Viene usato per le intellectualProperty, anche perchè l'owner non è chiamato Responsabile ma Inventore
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var applicationNumber = object.getStringMap().get("applicationNumber");
//se è null, c'è già un validator che lo controlla
if(applicationNumber != null){
var wfItemDataSearchCommand = new Packages.it.cilea.wf.command.WfItemDataSearchCommand();
wfItemDataSearchCommand.setStringValue(applicationNumber);
wfItemDataSearchCommand.setDiscriminator("applicationNumber");
var wfItemDataSet = wfService.getWfItemDataSearchList(wfItemDataSearchCommand, 0);
var wfItemDataSetIterator = wfItemDataSet.iterator();
while(wfItemDataSetIterator.hasNext()){
var wfItemData = wfItemDataSetIterator.next();
var wfItemObtained = wfService.getWfItem(wfItemData.getWfItem().getId());
if(wfItemObtained.getId() != object.getId() && !wfItemObtained.getWithdrawn())
errors.reject("error.patent.nonUniqueApplicationNumber");
}
}
|
Anchor |
---|
| wfActionLogicSaveRPDFV3Evaluation-anchor |
---|
| wfActionLogicSaveRPDFV3Evaluation-anchor |
---|
|
wfActionLogicSaveRPDFV3Evaluation Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.rpdf.WfActionLogicSaveRPDFV3Evaluation |
Anchor |
---|
| wfStartLogicProjectDepartmentFundYear-anchor |
---|
| wfStartLogicProjectDepartmentFundYear-anchor |
---|
|
wfStartLogicProjectDepartmentFundYear Questa logica viene eseguita in fase di creazione di un progetto per il fondo di Ateneo (ATE).
Viene impostato il valore dell anno della campagna in corso.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var year = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("DEPARTMENT_FUND_YEAR");
wfItem.setYear(new Packages.java.lang.Integer(year));
true;
|
Anchor |
---|
| wfStartLogicProjectDepartmentFundPositionLastDate-anchor |
---|
| wfStartLogicProjectDepartmentFundPositionLastDate-anchor |
---|
|
wfStartLogicProjectDepartmentFundPositionLastDate Questa logica viene eseguita in fase di creazione di un progetto per il fondo di Ateneo (ATE).
Viene impostato il valore del dipartimento di riferimento per ogni singola scheda avviata.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(wfItem.getOrganizationUnitMap().get("department") == null){
var positionlastDate = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("DEPARTMENT_FUND_POSITION_LAST_DATE");
//25/02/2020
var lastYear = positionlastDate.substring(6, 10);
var intLastYear = parseInt(lastYear);
var positionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
positionSearch.setPersonId(wfItem.getPersonMap().get("owner").getId());
positionSearch.setYear(intLastYear);
positionSearch.setOrganizationUnitTypeDescription("department");
var positionList = gaService.getPositionSearchList(positionSearch, 0);
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(positionList, null, positionSearch.getOrganizationUnitTypeDescription());
var positionListIterator=positionList.iterator();
while (positionListIterator.hasNext()){
var position = positionListIterator.next();
if (maxPriority==null || maxPriority.equals(position.getPriority())){
wfItem.getOrganizationUnitMap().put("department", position.getOrganizationUnit());
}
}
}
true;
|
Anchor |
---|
| projectDepartmentFundCreateValidator-anchor |
---|
| projectDepartmentFundCreateValidator-anchor |
---|
|
projectDepartmentFundCreateValidator Questa validazione viene eseguita in ingresso allo stato draft per i progetti per il fondo di Ateneo (ATE).
Viene consentita la creazione di una nuova scheda solo nell'intervallo previsto per la campagna in corso.
Questo intervallo viene definito con le configurazioni:
- DEPARTMENT_FUND_START_DATE
- DEPARTMENT_FUND_END_DATE
Le date devono avere il seguente formato yyyy-MM-dd HH:mm:ss
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var configurationStart = "DEPARTMENT_FUND_START_DATE";
var configurationEnd = "DEPARTMENT_FUND_END_DATE";
var startDate = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue(configurationStart);
var endDate = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue(configurationEnd);
if (startDate == null || endDate == null)
throw "Configuration variables DEPARTMENT_FUND_START_DATE and DEPARTMENT_FUND_END_DATE must be defined with format yyyy-MM-dd HH:mm:ss";
var formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
var now = new java.util.Date();
var ateStart = formatter.parse(startDate);
var ateEnd = formatter.parse(endDate);
if (!(now.after(ateStart) && now.before(ateEnd))) {
errors.reject("error.operation.notallowed");
}
|
Anchor |
---|
| projectDepartmentFundTeamValidator-anchor |
---|
| projectDepartmentFundTeamValidator-anchor |
---|
|
projectDepartmentFundTeamValidator Questa validazione viene eseguita in ingresso allo stato draft per i progetti per il fondo di Ateneo (ATE).
Viene avviata una nuova scheda solo se il responsabile è contenuto nell apposito team denominato:
Team docenti e ricercatori per i progetti di Ateneo.
La validazione consente la creazione della scheda solo se la persona selezioata ha un utente agganciato censito nel team con id presente nella conf
ap.project.departmentFund.team.start La validazione usa anche le seguenti conf:
- DEPARTMENT_FUND_POSITION_SERVICE_DATE
- DEPARTMENT_FUND_POSITION_LAST_DATE
Il formato di queste date è dd/MM/yyyy
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(object.getPersonMap().get("owner") != null){
var findUser = 0;
var ownerId = object.getPersonMap().get("owner").getId();
var userSet = gaService.getPerson(ownerId).getUserSet()
userSetIterator = userSet.iterator();
while (userSetIterator.hasNext()){
var user = userSetIterator.next();
var userId = user.getId();
var searchCommand = new Packages.it.cilea.ga.command.TeamUserLinkSearchCommand();
searchCommand.setUserId(userId);
var linkList = gaService.getTeamUserLinkSearchList(searchCommand, 0);
var listIterator = linkList.iterator();
while(listIterator.hasNext()){
var teamUserLink = listIterator.next();
var teamId = teamUserLink.getTeamId();
if(teamId == Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.departmentFund.team.start")){
findUser = 1;
break;
}
}
if(findUser == 1){
break;
}
}
if(findUser == 0){
errors.reject("error.start.position.team.departmentFund", [ConfigurationUtil.getConfigValue("DEPARTMENT_FUND_POSITION_SERVICE_DATE"),ConfigurationUtil.getConfigValue("DEPARTMENT_FUND_POSITION_LAST_DATE")], null);
}
}
|
Anchor |
---|
| projectDepartmentFundCheckDateEnterValidator-anchor |
---|
| projectDepartmentFundCheckDateEnterValidator-anchor |
---|
|
projectDepartmentFundCheckDateEnterValidator Questa validazione viene eseguita in ingresso ad ogni stato per i progetti per il fondo di Ateneo (ATE).
Vengono controllate le date delle fasi successive prima di procedere con lo spostamento di stato per evitare
di portare troppo in avanti nel flusso il progetto rispetto alle date previste dalla campagna.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var gaUserDetail = Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();
if (!"ROLE_ADMIN".equals(gaUserDetail.getCurrentAuthorityIdentifier())){
var state = wfItem.getWfState().getDescription();
var configurationKeyStart = "DEPARTMENT_FUND_STATE_START_DATE_" + state.toUpperCase();
var configurationKeyEnd = "DEPARTMENT_FUND_STATE_END_DATE_" + state.toUpperCase();
var stateStartDate = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue(configurationKeyStart);
var stateEndDate = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue(configurationKeyEnd);
var formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
var now = new java.util.Date();
var start = formatter.parse(stateStartDate);
var end = formatter.parse(stateEndDate);
if(!(now.after(start) && now.before(end))){
errors.reject("error.operation.notallowed");
}
}
|
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
Se la variabile di configurazione
ap.project-centralized-bis-flow.headOfDepartment.enable è settata a
false allora vengono assegnati al team dipartimentale i seguenti permessi:
- draft: none
- added: none
- submitted: r
- approvedUnderNegotiation: r
Se la variabile di configurazione
ap.project-centralized-bis-flow.headOfDepartment.create è settata a
true o
non è valorizzata allora viene consentita la creazione di nuovi progetti ai team dipartimentali.
Se la variabile di configurazione
ap.project-centralized-bis-flow.headOfDepartment.create è settata a
false allora
NON viene consentita la creazione di nuovi progetti ai team dipartimentali.
In caso di modifica di queste variabili di configurazione procedere con un reload delle Configurazioni ed effettuare un nuovo upload della tassonomia per forzare anche il reload delle risorse che pilotano la visibilità dei bottoni di creazione dell'oggetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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 |
---|
| isYearGreaterOrEqualThanConfigurationProject-anchor |
---|
| isYearGreaterOrEqualThanConfigurationProject-anchor |
---|
|
isYearGreaterOrEqualThanConfigurationProject Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le altre validazioni altrimenti no.
Verifica anche che il progetto in questione sia relativo ad un anno maggiore o uguale a quello definito nella configurazione
ap.prj.year.validation.threashold.
Se la configurazione NON è definita o non può essere convertita in un numero intero valido viene settato uguale a 0.
Questo approccio serve per evitare lo scatenarsi delle validazioni su vecchi progetti che non rispettano nuove e più stringenti validazioni, ed evitare quindi di dovere fare una bonifica a tappeto.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var yearTreasholdConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.year.validation.threashold");
var year=new Packages.java.lang.Integer(0);
if (yearTreasholdConf!=null){
try{
year=new Packages.java.lang.Integer(Packages.org.apache.commons.lang.StringUtils.trim(yearTreasholdConf));
}catch (e){}
}
(
object.getYear()!=null
&&
object.getYear().compareTo(year)>=0
)
|
Anchor |
---|
| areWarningEnabledProject-anchor |
---|
| areWarningEnabledProject-anchor |
---|
|
areWarningEnabledProject Questa è un'applicability rule che pilota i messaggi di warning per i progetti.
Se la variabile
ap.prj.warningAcknowlegement.validation.enabled è settata a true o non è valorizzata i messaggi di warning sono abilitati
Se la variabile
ap.prj.warningAcknowlegement.validation.enabled è settata a false i messaggi di warning NON sono abilitati
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var warningAcknowlegementFlagConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.warningAcknowlegement.validation.enabled");
warningAcknowlegementFlagConf=Packages.org.apache.commons.lang.StringUtils.trim(warningAcknowlegementFlagConf);
(!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",warningAcknowlegementFlagConf))
|
Anchor |
---|
| isExternalDmsEnabledProject-anchor |
---|
| isExternalDmsEnabledProject-anchor |
---|
|
isExternalDmsEnabledProject Questa è un'applicability rule che pilota le validazioni relative fascicolo del DMS di Ateneo (Document Management System).
Se la variabile
ap.prj.externalDmsIdentifier.enabled validazione è abilitata
Se la variabile
ap.prj.externalDmsIdentifier.enabled è settata a false la validazione NON è abilitata
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var flagConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.externalDmsIdentifier.enabled");
flagConf=Packages.org.apache.commons.lang.StringUtils.trim(flagConf);
(!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",flagConf))
|
Anchor |
---|
| isCupRequiredProject-anchor |
---|
| isCupRequiredProject-anchor |
---|
|
isCupRequiredProject Questa è un'applicability rule che pilota le validazioni di obbligatorietà relative al CUP (
cup).
Se la variabile
ap.prj.cup.required è settata a true o non è valorizzata la validazione è abilitata
Se la variabile
ap.prj.cup.required è settata a false la validazione NON è abilitata
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var flagConf=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.cup.required");
flagConf=Packages.org.apache.commons.lang.StringUtils.trim(flagConf);
(!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",flagConf))
|
Anchor |
---|
| wfUgovPjSenderValidatorProject-anchor |
---|
| wfUgovPjSenderValidatorProject-anchor |
---|
|
wfUgovPjSenderValidatorProject Questa logica, effettua check di consistenza sulle mappature degli oggetti IRIS/UGOV e, se superati, invia il progetto verso UGOV PJ rispettando le regole di NON SOVRASCRITTURA lato UGOV PJ.
Per maggiori dettagli su queste regole consultare il team di UGOV PJ.
Le controparti dei progetti IRIS vengono create su UGOV con le regole di mappature delle tassonomie che vengono condivise in fase di attivazione.
Se in corso d'opera dovesse nascere l'esigenza di censire delle nuove tipologie è possibile contattare l'HD.
Di seguito vengono riportate le informazioni inviate ad UGOV PJ, con la specifica dell'attributo del modello dell'entità Progetto IRIS
- Codice progetto: identifier
- Nome progetto: description troncata a 255 caratteri per limitazioni lato UGOV PJ
- Importo progetto
Viene valutata la variabile di configurazione ap.project.financing.internalCost.send2ugov.forced.
Se valorizzata a true allora viene usato l'attributo internalCost
Se NON valorizzata a true allora - Se l'ateneo è capofila allora viene inviato il risultato della seguente formula globalCost-(globalCost-globalContribution-internalCofinancing). E' possibile disabilitare questa verifica su una determinata tipologia di progetti (itemType), e di conseguenza non verrà inviato il risultato della seguente formula globalCost-(globalCost-globalContribution-internalCofinancing) (per la Ricerca non competitiva), settando a false la variabile di configurazione ap.PARAMETRIC_TYPE_LOWER_CASE.partner.main.required. In tutti gli altri casi il controllo verrà fatto.
- Se l'ateneo NON è capofila allora viene inviato internalCost
L'invio viene effettuato se l'importo è non nullo e maggiore di zero. - Data inizio validità:
Viene usato l'attributo startDate. - Data fine validità:
Viene usato l'attributo endDate se non sono prensenti delle proroghe (elementi di tipo extension).
Viene usato l'attributo originalEndDate se sono prensenti delle proroghe (elementi di tipo extension). - Data inizio validità del progetto dal punto di vista contabile:
Viene usato l'attributo expenditureStartDate. - Data fine validità del progetto dal punto di vista contabile:
Viene usato l'attributo expenditureEndDate. - Data proroga uffciale:
Viene usato l'attributo endDate se sono prensenti delle proroghe (elementi di tipo extension).
Viene inviato null se non sono prensenti delle proroghe (elementi di tipo extension). - CUP: cup
Inviato se valorizzata a true la variabile di configurazione ap.project.cup.send2ugov.enable. - Riferimento Data Management System (Sistema Documentale): externalDmsIdentifier
Inviato l'identifier del progetto se valorizzata a true la variabile di configurazione ap.prj.externalDmsIdentifier.autogenerated, in tutti gli altri casi viene inviato externalDmsIdentifier. - Responsabili scientifici: owner
Inviate anche date di inizio e fine se valorizzata a true la variabile di configurazione ap.project.owner.starDate.required.
Per i Responsabili scientifici, nella scheda, può essere visibile il Ruolo (visibilità pilotata da configuration ap.prj.owner.role.enabled con default false)
E' buona cosa inserire prima nel flusso, in caso di attivazione dei ruoli, la validazione ownerRoleSend2UgovValidatorProject, a cui è delegata la correttezza dei dati. - Partecipanti: contributor
Inviate anche date di inizio e fine se valorizzata a true la variabile di configurazione ap.project.contributor.starDate.required. - Unità organizzative interne: internalOrganizationUnit
- Finanziatori: grantor
Inviato se valorizzata a true la variabile di configurazione ap.project.grantor.send2ugov.enable.
Se valorizzata a true la configurazione ap.prj.grantor.financingQuota.enabled nel form è possibile inserire anche le quote di finanziamento associate, che vengono inviate a PJ - Partner: partner
Inviato se valorizzata a true la variabile di configurazione ap.project.partner.send2ugov.enable. - Tipo progetto: come da mappatura tassonomia ap-item-type.xls
- Schema di finanziamento: come da mappatura tassonomia ap-item-type.xls
- Stato progetto: come da mappatura tassonomia ap-item-type.xls
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var Logic = function(wfItem, dtoPj, superLogic, errors, messageUtil, request, gaService, wfService, wfTaskService, searchBuilderTemplate, log) {
this.wfItem=wfItem;
this.dtoPj=dtoPj;
this.superLogic=superLogic;
this.errors=errors;
this.messageUtil=messageUtil;
this.request=request;
this.gaService=gaService;
this.wfService=wfService;
this.wfTaskService=wfTaskService;
this.searchBuilderTemplate=searchBuilderTemplate;
this.log=log;
this.setInternalOrgUnitList = function() {
var internalOrganizationUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
var internalOrganizationUnitSetIterator=internalOrganizationUnitSet.iterator();
while (internalOrganizationUnitSetIterator.hasNext()){
var element = internalOrganizationUnitSetIterator.next();
var orgUnit = element.getOrganizationUnitMap().get("ouId");
var orgUnitRole = element.getWfDictionaryMap().get("roleId");
dtoPj.getDTOUoPjs().add(superLogic.getOrganizationUnit(orgUnit, orgUnitRole, errors));
}
};
this.setFinanciers = function() {
var sendGrantor2Ugov = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.grantor.send2ugov.enable");
if (sendGrantor2Ugov && sendGrantor2Ugov.trim().equalsIgnoreCase("true")){
var contractorSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "grantor",wfService);
var contractorSetIterator = contractorSet.iterator();
while (contractorSetIterator.hasNext()){
var element = contractorSetIterator.next();
//var organizationUnit = element.getOrganizationUnitMap().get("grantorId");
var enteFinanziatore = superLogic.getEnteFinanziatore(element, this.getFinancing(), contractorSet.size(), errors);
dtoPj.getDTOEfPjs().add(enteFinanziatore);
}
}
};
this.setPartners = function() {
var sendPartner2Ugov = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.send2ugov.enable");
if (sendPartner2Ugov && sendPartner2Ugov.trim().equalsIgnoreCase("true")){
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "partner",wfService);
var partnerSetIterator=partnerSet.iterator();
while (partnerSetIterator.hasNext()){
var element=partnerSetIterator.next();
var organizationUnit = element.getOrganizationUnitMap().get("partnerId");
var partnerRole = element.getWfDictionaryMap().get("partnerRole");
var partecipante = superLogic.getPartecipante(organizationUnit, partnerRole, errors);
dtoPj.getDTOPartPjs().add(partecipante)
}
}
};
this.getContribution = function() {
return wfItem.getNumberMap().get("internalContribution");
};
this.getCofinancing = function() {
return wfItem.getNumberMap().get("internalCofinancing");
};
this.getFinancing = function() {
var coordinatorRoleId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.role.main");
var myOrganization = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
var forcedPjInternalCost = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.financing.internalCost.send2ugov.forced");
if (forcedPjInternalCost == null)
forcedPjInternalCost = false;
else if (forcedPjInternalCost.equalsIgnoreCase("true")){
forcedPjInternalCost=true;
} else {
forcedPjInternalCost=false;
}
if (!forcedPjInternalCost){
if (coordinatorRoleId==null || myOrganization==null){
throw "Configuration variables ap.project.partner.role.main and rm.orgunit.external.myOrganization MUST BE DEFINED";
} else {
coordinatorRoleId=new Packages.java.lang.Integer(coordinatorRoleId);
myOrganization=new Packages.java.lang.Integer(myOrganization);
}
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "partner",wfService);
var partnerSetIterator=partnerSet.iterator();
while (partnerSetIterator.hasNext()){
var element=partnerSetIterator.next();
var orgUnitRole = element.getWfDictionaryMap().get("partnerRole");
if (orgUnitRole==null){
errors.reject("error.project.partner.missingRole");
throw "Detected partner without role";
}
var confVal=Packages.it.cilea.wf.util.WfUtil.getParametricConfiguration("ap.<itemType>.partner.main.required", object.getWfItemType());
if (!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",confVal)){
var orgUnit = element.getOrganizationUnitMap().get("partnerId");
if(myOrganization.equals(orgUnit.getId()) && coordinatorRoleId.equals(orgUnitRole.getId())){
var globalCost=wfItem.getNumberMap().get("globalCost");
if (globalCost==null)
globalCost=Packages.java.math.BigDecimal.ZERO;
var globalContribution=wfItem.getNumberMap().get("globalContribution");
if (globalContribution==null)
globalContribution=Packages.java.math.BigDecimal.ZERO;
var internalCofinancing=wfItem.getNumberMap().get("internalCofinancing");
if (internalCofinancing==null)
internalCofinancing=Packages.java.math.BigDecimal.ZERO;
return globalCost.subtract(globalCost.subtract(globalContribution).subtract(internalCofinancing));
}
}
}
}
return wfItem.getNumberMap().get("internalCost");
};
this.getStartDate = function() {
return wfItem.getDateMap().get("startDate");
};
this.getEndDate = function() {
var extensionSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "extension", wfService);
if(extensionSet.isEmpty()){
return wfItem.getDateMap().get("endDate");
} else {
return wfItem.getDateMap().get("originalEndDate");
}
};
this.getExpenditureStartDate = function() {
return wfItem.getDateMap().get("expenditureStartDate");
};
this.getExpenditureEndDate = function() {
return wfItem.getDateMap().get("expenditureEndDate");
};
this.getCurrentEndDate = function() {
var extensionSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "extension", wfService);
if(extensionSet.isEmpty()){
return null;
} else {
return wfItem.getDateMap().get("endDate");
}
};
this.getIdentifier = function() {
return wfItem.getIdentifier();
};
this.getIdPj = function() {
if(wfItem.getIntegerMap().get("ugovId") != null){
return wfItem.getIntegerMap().get("ugovId");
} else {
return null;
}
};
this.getDescription = function() {
if(wfItem.getDescription() != null){
var length=wfItem.getDescription().length();
return wfItem.getDescription().substring(0,(length>255)?255:length);
} else {
return null;
}
};
this.getCup = function() {
var sendCup2Ugov = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.cup.send2ugov.enable");
if (sendCup2Ugov && sendCup2Ugov.trim().equalsIgnoreCase("true")){
return wfItem.getStringMap().get("cup");
} else {
return null;
}
};
this.getAcronym = function() {
if(wfItem.getStringMap().get("acronym") != null){
var length = wfItem.getStringMap().get("acronym").length();
return wfItem.getStringMap().get("acronym").substring(0,(length>50)?50:length);
} else {
return null;
}
};
this.getExternalDmsIdentifier = function() {
var externalDmsIdentifierAutogenerated = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.externalDmsIdentifier.autogenerated");
if("true".equals(externalDmsIdentifierAutogenerated)){
return wfItem.getIdentifier();
}else {
return wfItem.getStringMap().get("externalDmsIdentifier");
}
};
this.isSynchronizable = function() {
var legacy = wfItem.getBooleanMap().get("legacy");
var financing = this.getFinancing();
if (Packages.java.lang.Boolean.TRUE.equals(legacy) || financing==null || Packages.java.math.BigDecimal.ZERO.equals(financing))
return Packages.java.lang.Boolean.FALSE;
else
return Packages.java.lang.Boolean.TRUE;
};
this.getResearchNature = function() {
if(wfItem.getWfDictionaryMap().get("researchNature") == null){
return null;
} else {
return wfItem.getWfDictionaryMap().get("researchNature").getStringMap().get("sourceId");
}
};
this.getProjectType = function() {
return superLogic.getProjectType(wfItem);
};
this.getFinanceSchema = function() {
return this.getProjectType();
};
this.getPjInternalCode = function() {
return null;
};
this.isContributorStartDateRequired = function() {
var contributorStartDateRequired=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.contributor.starDate.required");
if (contributorStartDateRequired){
if (contributorStartDateRequired.trim().equalsIgnoreCase("true")){
return Packages.java.lang.Boolean.TRUE;
} else if (contributorStartDateRequired.trim().equalsIgnoreCase("false")){
return Packages.java.lang.Boolean.FALSE;
} else {
throw "ap.project.contributor.starDate.required MUST BE true or false";
}
} else {
return Packages.java.lang.Boolean.TRUE;
}
};
this.isOwnerStartDateRequired = function() {
var ownerStartDateRequired = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.owner.starDate.required");
if (ownerStartDateRequired){
if (ownerStartDateRequired.trim().equalsIgnoreCase("true")){
return Packages.java.lang.Boolean.TRUE;
} else if (ownerStartDateRequired.trim().equalsIgnoreCase("false")){
return Packages.java.lang.Boolean.FALSE;
} else {
throw "ap.project.owner.starDate.required MUST BE true or false";
}
} else {
return Packages.java.lang.Boolean.TRUE;
}
};
};
new Logic(wfItem, dtoPj, superLogic, errors, messageUtil, request, gaService, wfService, wfTaskService, searchBuilderTemplate, log);
|
Anchor |
---|
| ethicCommiteeDeleteInconsistentDataProject-anchor |
---|
| ethicCommiteeDeleteInconsistentDataProject-anchor |
---|
|
ethicCommiteeDeleteInconsistentDataProject Questa validazione controlla che se non sono previste attività di ricerca che prevedono sperimentazioni passibili di giudizio da parte del Comitato Etico
e controlla che se non E' stata presentata la richiesta di parere all'OPBA o al Comitato Etico di Ateneo di riferimento o al Comitato Etico di un Ente Terzo che ha facoltà di concedere questo tipo di autorizzazioni.
I dati particolari di queste sottosezioni vengono svuotati se viene selezionato NO.
Dal punto di vista del modello dati si tratta degli elementi di tipo
ethicCommiteeTopic Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//questa funzione elimina tutti i dati del tab, tranne ovviamente ethicCommiteeApplicability
//viene chiamata quando non è applicabile
function deleteAll(){
//dati riguardanti il topic
var wfItemElementSet = object.getWfItemElementSet();
var ethicCommiteeTopicSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "ethicCommiteeTopic", wfService);
var ethicCommiteeTopicSetIterator=ethicCommiteeTopicSet.iterator();
while(ethicCommiteeTopicSetIterator.hasNext()){
var wfItemElement=ethicCommiteeTopicSetIterator.next();
var ethicCommiteeTopic= wfItemElement.getWfDictionaryMap().get("ethicCommiteeTopicId");
var description= ethicCommiteeTopic.getDescription();
//log.error("Topic description (ethicCommiteeTopicSet): "+description);
wfService.deleteWfItemElement(wfItemElement.getId());
//log.error("Eliminato con wfService");
wfItemElementSet.remove(wfItemElement);
//log.error("Eliminato dal set");
}
object.setWfItemElementSet(wfItemElementSet);
//log.error("Sostituito set con nuovo");
//dati riguardanti l'autorizzazione
//log.error("ethicCommiteeSubmitted: "+object.getBooleanMap().get("ethicCommiteeSubmitted"));
object.getBooleanMap().put("ethicCommiteeSubmitted", null);
//log.error("ethicCommiteeSubmitDate: "+object.getDateMap().get("ethicCommiteeSubmitDate"));
object.getDateMap().put("ethicCommiteeSubmitDate", null);
//log.error("ethicCommiteeAuthorization: "+object.getWfDictionaryMap().get("ethicCommiteeAuthorization"));
object.getWfDictionaryMap().put("ethicCommiteeAuthorization", null);
deleteAuthorizationData();
}
//questa funzione elimina i dati riguardanti l'autorizzazione
//viene chiamata quando non viene concessa
function deleteAuthorizationData(){
//log.error("ethicCommiteeAuthorizationNumber: "+object.getNumberMap().get("ethicCommiteeAuthorizationNumber"));
object.getNumberMap().put("ethicCommiteeAuthorizationNumber", null);
//log.error("ethicCommiteeAuthorizationDate: "+object.getDateMap().get("ethicCommiteeAuthorizationDate"));
object.getDateMap().put("ethicCommiteeAuthorizationDate", null);
//log.error("ethicCommiteeAuthorizationOrganization: "+object.getOrganizationUnitMap().get("ethicCommiteeAuthorizationOrganization"));
var orgUnitMap=object.getOrganizationUnitMap().put("ethicCommiteeAuthorizationOrganization", null);
wfService.saveOrUpdate(object);
//log.error("SALVATO!");
}
//quando elimino da una mappa, non mi importa gestire se fosse popolata o meno
//al massimo il remove mi restituisce null
//log.error("Sono nel ethicCommiteeDeleteInconsistentData");
//prima di tutto vado a vedere ethicCommiteeApplicability
//SE NON E' SI (true), allora cancello tutti i dati sottostanti
var ethicCommiteeApplicability = object.getBooleanMap().get("ethicCommiteeApplicability");
if (ethicCommiteeApplicability!=true){
//chiamo la funzione per eliminare tutto
deleteAll();
}else{
//non mi interessa ethicCommiteeSubmitted, deve essere per forza true se sono qui
//SE E' SI, allora vado a vedere ethicCommiteeAuthorization
var ethicCommiteeAuthorization= object.getWfDictionaryMap().get("ethicCommiteeAuthorization");
//SE NON E' SPECIFICATO (null) O 'NON CONCESSO', allora cancello i dati relativi
//TRANNE la data di presentazione
//ci può essere il caso che sia stata fatta la richiesta e si stia aspettando il responso
//non specificato, caso per evitare eccezioni
if(ethicCommiteeAuthorization==null){
deleteAuthorizationData();
}else{
var ethicCommiteeAuthorizationDescription= wfService.getWfDictionary(ethicCommiteeAuthorization.getId()).getDescription();
if (!Packages.org.apache.commons.lang.StringUtils.equals("Concessa", ethicCommiteeAuthorizationDescription)){
deleteAuthorizationData();
}
}
}
|
Anchor |
---|
| ownerValidatorProject-anchor |
---|
| ownerValidatorProject-anchor |
---|
|
ownerValidatorProject 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à Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (object.getId()==null){
if (object.getPersonMap().get("owner")==null)
errors.rejectValue("personMap[owner]","error.project.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.reject("error.project.owner.atLeast1");
}
|
Anchor |
---|
| onlyOneOwnerValidatorProject-anchor |
---|
| onlyOneOwnerValidatorProject-anchor |
---|
|
onlyOneOwnerValidatorProject Questa validazione controlla che esista un solo 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à Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
if(ownerSet.size() > 1){
errors.reject("error.project.owner.max1");
}
|
Anchor |
---|
| ownerValidatorWithStartEndDateProject-anchor |
---|
| ownerValidatorWithStartEndDateProject-anchor |
---|
|
ownerValidatorWithStartEndDateProject Questa validazione opera sugli elementi
owner (responsabile scientifico) figli dell'oggetto radice.
Viene verificato che esista almeno un responsabile scientifico e, se specificato un intervallo di validità per il singolo owner, viene verificato che sia compreso all'interno della validità dell'oggetto padre.
Gli attributi per le date di inizio e fine sono
startDate e
endDate sia per l'elemento
owner che per l'oggetto padre.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (object.getId()==null){
if (object.getPersonMap().get("owner")==null)
errors.rejectValue("personMap[owner]","error.project.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"))){
if (ownerSet.size()<1 && object.getPersonMap().get("owner")==null)
errors.reject("error.project.owner.atLeast1");
var ownerSetIterator=ownerSet.iterator();
var wfItemStartDate=object.getDateMap().get("startDate");
var wfItemEndDate=object.getDateMap().get("endDate");
var formatter = Packages.org.apache.commons.lang.time.FastDateFormat.getInstance("dd/MM/yyyy");
var ownerWithWrongInterval=[];
while (ownerSetIterator.hasNext()){
var owner=ownerSetIterator.next();
var wfItemElementStartDate=owner.getDateMap().get("startDate");
if( wfItemElementStartDate!= null && wfItemStartDate && (wfItemElementStartDate.before(wfItemStartDate) || (wfItemEndDate!=null && wfItemElementStartDate.after(wfItemEndDate))) ){
ownerWithWrongInterval.push(owner.getPersonMap().get("ownerId").getDisplayValue());
}
}
if (ownerWithWrongInterval.length>0){
errors.reject("error.project.owner.wrongInterval", [ownerWithWrongInterval.toString()], "error.project.owner.wrongInterval");
}
}
}
|
Anchor |
---|
| dateIntervalOwnerValidatorProject-anchor |
---|
| dateIntervalOwnerValidatorProject-anchor |
---|
|
dateIntervalOwnerValidatorProject Questa validazione opera sugli elementi
owner (responsabile scientifico) figli dell'oggetto radice.
Gli attributi per le date di inizio e fine sono
startDate e
endDate sia per l'elemento
owner che per l'oggetto padre.
Per i Responsabili scientifici, nella scheda, può essere visibile il Ruolo (visibilità pilotata da configuration ap.prj.owner.role.enabled con default false).
La logica prende in considerazione una configuration (ap.prj.owner.date.interval.enabled) che abilita il controllo per la non sovrapposizione degli intervalli.
La validazione puà combinare la verifica degli intervalli con l'eventuale definizione di quali ruoli coinvolgere nel controllo (vedi configuration ap.prj.owner.date.interval.roles).
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var roleEnabled = ConfigurationUtil.getConfigValue("ap.prj.owner.role.enabled");
var checkInterval = ConfigurationUtil.getConfigValue("ap.prj.owner.date.interval.enabled");
var checkIntervalRoles = ConfigurationUtil.getConfigValue("ap.prj.owner.date.interval.roles");
var isOwnerStartDateRequired = ConfigurationUtil.getConfigValue("ap.project.owner.starDate.required");
var checkIntervalRolesArray = null;
if (checkIntervalRoles != null) {
checkIntervalRolesArray = checkIntervalRoles.split(",");
}
var ownerToCheck = [];
var ownerSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
if (ownerSet.size() > 0) {
var ownerElement = null;
var ownerSetIterator = ownerSet.iterator();
while (ownerSetIterator.hasNext()) {
ownerElement = ownerSetIterator.next();
if (roleEnabled && roleEnabled.equalsIgnoreCase("true")) {
if (checkIntervalRolesArray != null && checkIntervalRolesArray.length > 0) {
if (!Packages.java.util.Arrays.asList(checkIntervalRolesArray).contains((ownerElement.getWfDictionaryMap().get("roleId").getInternalSourceIdentifier()))) {
continue;
}
}
}
if (isOwnerStartDateRequired && checkInterval) {
var intervalError = 0;
for (i in ownerToCheck) {
var start = ownerToCheck[i].getDateMap().get("startDate");
var end = ownerToCheck[i].getDateMap().get("endDate");
if (ownerElement.getDateMap().get("startDate").before(start) || ownerElement.getDateMap().get("startDate").equals(start)) {
if (ownerElement.getDateMap().get("endDate") == null) {
intervalError = 1;
break;
} else if (ownerElement.getDateMap().get("endDate").after(start) || ownerElement.getDateMap().get("endDate").equals(start)) {
intervalError = 1;
break;
}
} else if (ownerElement.getDateMap().get("startDate").after(start) || ownerElement.getDateMap().get("startDate").equals(start)) {
if (end != null) {
if (ownerElement.getDateMap().get("startDate").before(end) || ownerElement.getDateMap().get("startDate").equals(end)) {
intervalError = 1;
break;
}
} else {
intervalError = 1;
break;
}
}
}
if (intervalError < 1) {
ownerToCheck.push(ownerElement);
} else {
errors.reject("error.project.owner.dateRange.invalid");
}
}
}
}
|
Anchor |
---|
| ownerRoleSend2UgovValidatorProject-anchor |
---|
| ownerRoleSend2UgovValidatorProject-anchor |
---|
|
ownerRoleSend2UgovValidatorProject Questa validazione opera sugli elementi
owner (responsabile scientifico) figli dell'oggetto radice.
Viene verificato che esista almeno un responsabile scientifico.
Gli attributi per le date di inizio e fine sono
startDate e
endDate sia per l'elemento
owner che per l'oggetto padre.
Per i Responsabili scientifici, nella scheda, può essere visibile il Ruolo (visibilità pilotata da configuration ap.prj.owner.role.enabled con default false) (A)
In tal caso la logica prende in considerazione due altre configuration:
- quali ruoli devono essere sincronizzati con PJ (ap.prj.owner.send2ugov.roles con formato comma separated dei codici di dizionario) (B);
- il numero massimo di Responsabili da sincronizzare (ap.prj.owner.send2ugov.number) (C).
Le possibili combinazioni della configurazioni sono (AB) oppure (AC) oppure (ABC).
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var roleEnabled = ConfigurationUtil.getConfigValue("ap.prj.owner.role.enabled");
var rolesSend2UgovArrayConfiguration = ConfigurationUtil.getConfigValue("ap.prj.owner.send2ugov.roles");
var maxToSendConfiguration = ConfigurationUtil.getConfigValue("ap.prj.owner.send2ugov.number");
var rolesArray = null;
if (rolesSend2UgovArrayConfiguration != null) {
rolesSend2UgovArray = rolesSend2UgovArrayConfiguration.split(",");
}
var ownerToSend = [];
if (roleEnabled && roleEnabled.equalsIgnoreCase("true") && ((rolesSend2UgovArray != null && rolesSend2UgovArray.length < 1 && (maxToSendConfiguration == null || maxToSendConfiguration == 0)) || (maxToSendConfiguration != null && maxToSendConfiguration == 0))) {
errors.reject("error.project.ugov.pj.invalidOwnerRoleConfiguration");
throw "The configurations ap.prj.owner.send2ugov.roles and ap.prj.owner.send2ugov.number MUST BE defined";
}
var ownerSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
if (ownerSet.size() > 0) {
var ownerElement = null;
var ownerSetIterator = ownerSet.iterator();
while (ownerSetIterator.hasNext()) {
ownerElement = ownerSetIterator.next();
if (roleEnabled && roleEnabled.equalsIgnoreCase("true")) {
if (rolesSend2UgovArray != null && rolesSend2UgovArray.length > 0) {
if (!Packages.java.util.Arrays.asList(rolesSend2UgovArray).contains((ownerElement.getWfDictionaryMap().get("roleId").getInternalSourceIdentifier()))) {
continue;
}
}
}
ownerToSend.push(ownerElement);
}
}
if (maxToSendConfiguration != null && maxToSendConfiguration < ownerToSend.length) {
errors.reject("error.project.ugov.pj.invalidOwnersNumber", [maxToSendConfiguration.toString()], null);
} else if (ownerToSend.length == 0) {
errors.reject("error.project.ugov.pj.noOwner");
}
|
Anchor |
---|
| organizationUnitValidatorProject-anchor |
---|
| organizationUnitValidatorProject-anchor |
---|
|
organizationUnitValidatorProject Questa validazione controlla che esista almeno una unità organizzativa interna nel tab "Soggetti interni".
Dal punto di vista del modello dati si tratta degli elementi di tipo
internalOrganizationUnit Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
if (orgUnitSet.size()<1)
errors.reject("error.project.multipleInternalOrganization.atLeast1");
|
Anchor |
---|
| internalOrganizationUnitCostRequiredValidatorProject-anchor |
---|
| internalOrganizationUnitCostRequiredValidatorProject-anchor |
---|
|
internalOrganizationUnitCostRequiredValidatorProject Questa validazione controlla l'esistenza di "Strutture Interne" presente sul tab "Finanziamento", prelevate dall'insieme già presente in "Strutture Interne" nel tab "Soggetti interni".
Viene abilitata, in presenza della configurazione:
ap.prj.internalOrganizationUnitCost.required.number, che può assumere diversi valori:
1 = inserire 1 "Strutture Interne" sul tab "Finanziamento" già presente sul tab "Soggetti interni"
2 o numero maggiore = inserire almeno 2 "Strutture Interne" sul tab "Finanziamento" già presenti sul tab "Soggetti interni"
Dal punto di vista del modello dati si tratta degli elementi di tipo
internalOrganizationUnitCost Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var internalOrganizationUnitCostConf = ConfigurationUtil.getConfigValue("ap.prj.internalOrganizationUnitCost.required.number");
var internalOrganizationUnitCostSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnitCost", wfService);
var numberToCheck = internalOrganizationUnitCostSet.size();
if(internalOrganizationUnitCostConf){
var iouCostNumber = Integer.parseInt(internalOrganizationUnitCostConf);
if(iouCostNumber > 1){
var internalOrganizationUnitSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
var ouSize = internalOrganizationUnitSet.size();
if(ouSize > 1){
if(ouSize != numberToCheck){
errors.reject("error.project.internalOrganizationUnitCost.aggregate.atLeast2");
}
}
} else if(iouCostNumber == 1) {
if(numberToCheck < 1 ){
errors.reject("error.project.internalOrganizationUnitCost.atLeast1");
}
}
}
|
Anchor |
---|
| ethicCommiteeApplicabilityValidatorProject-anchor |
---|
| ethicCommiteeApplicabilityValidatorProject-anchor |
---|
|
ethicCommiteeApplicabilityValidatorProject Questa validazione controlla che venga dichiarato se
sono previste attività di ricerca che prevedono sperimentazioni passibili di giudizio da parte del Comitato Etico.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ethicCommiteeApplicability = object.getBooleanMap().get("ethicCommiteeApplicability");
if(ethicCommiteeApplicability == null){
errors.reject("error.project.ethicCommiteeApplicability.required");
}
|
Anchor |
---|
| ethicCommiteeTopicValidatorProject-anchor |
---|
| ethicCommiteeTopicValidatorProject-anchor |
---|
|
ethicCommiteeTopicValidatorProject Questa validazione controlla che esista almeno un Comitato Etico nel tab "Comitato Etico".
Dal punto di vista del modello dati si tratta degli elementi di tipo
ethicCommiteeTopic Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeTopicValidatorProject");
var ethicCommiteeApplicability = object.getBooleanMap().get("ethicCommiteeApplicability");
if (ethicCommiteeApplicability==true){
//log.error("ethicCommiteeApplicability è true")
//var ethicCommiteeTopicSet= object.getWfItemElementSet("ethicCommiteeTopic");
var ethicCommiteeTopicSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "ethicCommiteeTopic", wfService);
if(ethicCommiteeTopicSet.isEmpty()){
//log.error("Nessun topic!");
errors.reject("error.project.ethicCommiteeTopic.atLeast1");
}
}
|
Anchor |
---|
| ethicCommiteeSubmittedValidatorProject-anchor |
---|
| ethicCommiteeSubmittedValidatorProject-anchor |
---|
|
ethicCommiteeSubmittedValidatorProject Questa validazione controlla che deve essere stata presentata la richiesta di parere all'OPBA o al Comitato Etico di Ateneo di riferimento o al Comitato Etico di un Ente Terzo che ha facoltà di concedere questo tipo di autorizzazioni nel tab "Comitato Etico".
Dal punto di vista del modello dati si tratta degli elementi di tipo
ethicCommiteeTopic Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeSubmittedValidatorProject");
var ethicCommiteeApplicability = object.getBooleanMap().get("ethicCommiteeApplicability");
if (ethicCommiteeApplicability==true){
//log.error("ethicCommiteeApplicability è true")
var ethicCommiteeSubmitted= object.getBooleanMap().get("ethicCommiteeSubmitted");
if(ethicCommiteeSubmitted!=true){
//log.error("ethicCommiteeSubmitted è falso!");
errors.reject("error.project.ethicCommiteeSubmitted.required");
}
}
|
Anchor |
---|
| ethicCommiteeAuthorizationNumberValidatorProject-anchor |
---|
| ethicCommiteeAuthorizationNumberValidatorProject-anchor |
---|
|
ethicCommiteeAuthorizationNumberValidatorProject Questa validazione controlla che se l'autorizzazione del Comitato Etico è stata concessa, deve essere presente il relativo numero identificativo nel tab "Comitato Etico".
Dal punto di vista del modello dati si tratta degli elementi di tipo
ethicCommiteeTopic Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeAuthorizationNumberValidatorProject");
var ethicCommiteeApplicability = object.getBooleanMap().get("ethicCommiteeApplicability");
//prima di tutto si deve attivare solo se ethicCommiteeApplicability è su true
if (ethicCommiteeApplicability==true){
var ethicCommiteeSubmitted = object.getBooleanMap().get("ethicCommiteeSubmitted");
//poi solo se ethicCommiteeSubmitted è su true
if(ethicCommiteeSubmitted==true){
var ethicCommiteeAuthorizationDictionary= object.getWfDictionaryMap().get("ethicCommiteeAuthorization");
if(ethicCommiteeAuthorizationDictionary!=null){
var ethicCommiteeAuthorizationDictionaryDescription= wfService.getWfDictionary(ethicCommiteeAuthorizationDictionary.getId()).getDescription();
if (ethicCommiteeAuthorizationDictionaryDescription.equals("Concessa")){
//se concessa allora il validator si deve attivare
var ethicCommiteeAuthorizationNumber = object.getNumberMap().get("ethicCommiteeAuthorizationNumber");
if(ethicCommiteeAuthorizationNumber==null){
errors.reject("error.project.ethicCommiteeAuthorizationNumber.requiredIfGranted");
}
}
}
}
}
|
Anchor |
---|
| ethicCommiteeAuthorizationDateValidatorProject-anchor |
---|
| ethicCommiteeAuthorizationDateValidatorProject-anchor |
---|
|
ethicCommiteeAuthorizationDateValidatorProject Questa validazione controlla che se l'autorizzazione del Comitato Etico è stata concessa, deve essere presente la relativa data di concessione nel tab "Comitato Etico".
Dal punto di vista del modello dati si tratta degli elementi di tipo
ethicCommiteeTopic Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeAuthorizationDateValidatorProject");
var ethicCommiteeApplicability = object.getBooleanMap().get("ethicCommiteeApplicability");
//prima di tutto si deve attivare solo se ethicCommiteeApplicability è su true
if (ethicCommiteeApplicability==true){
var ethicCommiteeSubmitted = object.getBooleanMap().get("ethicCommiteeSubmitted");
//poi solo se ethicCommiteeSubmitted è su true
if(ethicCommiteeSubmitted==true){
var ethicCommiteeAuthorizationDictionary= object.getWfDictionaryMap().get("ethicCommiteeAuthorization");
if(ethicCommiteeAuthorizationDictionary!=null){
var ethicCommiteeAuthorizationDictionaryDescription= wfService.getWfDictionary(ethicCommiteeAuthorizationDictionary.getId()).getDescription();
if (ethicCommiteeAuthorizationDictionaryDescription.equals("Concessa")){
//se concessa allora il validator si deve attivare
var ethicCommiteeAuthorizationDate = object.getDateMap().get("ethicCommiteeAuthorizationDate");
if(ethicCommiteeAuthorizationDate==null){
errors.reject("error.project.ethicCommiteeAuthorizationDate.requiredIfGranted");
}
}
}
}
}
|
Anchor |
---|
| ethicCommiteeAuthorizationOrganizationValidatorProject-anchor |
---|
| ethicCommiteeAuthorizationOrganizationValidatorProject-anchor |
---|
|
ethicCommiteeAuthorizationOrganizationValidatorProject Questa validazione controlla che Se l'autorizzazione è stata concessa, deve essere presente l'ente che l'ha concessa nel tab "Comitato Etico".
Dal punto di vista del modello dati si tratta degli elementi di tipo
ethicCommiteeTopic Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeAuthorizationOrganizationValidatorProject");
var ethicCommiteeApplicability = object.getBooleanMap().get("ethicCommiteeApplicability");
//prima di tutto si deve attivare solo se ethicCommiteeApplicability è su true
if (ethicCommiteeApplicability==true){
var ethicCommiteeSubmitted = object.getBooleanMap().get("ethicCommiteeSubmitted");
//poi solo se ethicCommiteeSubmitted è su true
if(ethicCommiteeSubmitted==true){
var ethicCommiteeAuthorizationDictionary= object.getWfDictionaryMap().get("ethicCommiteeAuthorization");
if(ethicCommiteeAuthorizationDictionary!=null){
var ethicCommiteeAuthorizationDictionaryDescription= wfService.getWfDictionary(ethicCommiteeAuthorizationDictionary.getId()).getDescription();
if (ethicCommiteeAuthorizationDictionaryDescription.equals("Concessa")){
//se concessa allora il validator si deve attivare
var ethicCommiteeAuthorizationOrganization = object.getOrganizationUnitMap().get("ethicCommiteeAuthorizationOrganization");
if(ethicCommiteeAuthorizationOrganization==null){
errors.reject("error.project.ethicCommiteeAuthorizationOrganization.requiredIfGranted");
}
}
}
}
}
|
Anchor |
---|
| expenditureStartDateAndExpenditureEndDateValidator-anchor |
---|
| expenditureStartDateAndExpenditureEndDateValidator-anchor |
---|
|
expenditureStartDateAndExpenditureEndDateValidator Questa validazione controlla che la data di ammissibilità delle spese preceda la data di fine validità del progetto
Dal punto di vista del modello dati si tratta degli attributi
expenditureStartDate e
expenditureEndDate Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(object.getDateMap().get("expenditureEndDate") != null && object.getDateMap().get("expenditureStartDate") != null){
if(object.getDateMap().get("expenditureStartDate").getTime().after(object.getDateMap().get("expenditureEndDate").getTime())){
errors.reject("error.date.expenditureStartDateEndDateNotCompatible");
}
}
|
Anchor |
---|
| researchNatureValidatorProject-anchor |
---|
| researchNatureValidatorProject-anchor |
---|
|
researchNatureValidatorProject Questa validazione controlla che il campo Natura della Ricerca sia stato compilato.
La validazione è attivata dalla configurazione
ap.prj.researchNature.required con valore true.
Dal punto di vista del modello dati si tratta dell'attributo
researchNature.
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (ConfigurationUtil.getConfigValue("ap.prj.researchNature.required").equalsIgnoreCase("true")){
if(object.getWfDictionaryMap().get("researchNature") == null){
errors.reject("error.project.researchNature.required");
}
}
|
Anchor |
---|
| organizationUnitRoleValidatorProject-anchor |
---|
| organizationUnitRoleValidatorProject-anchor |
---|
|
organizationUnitRoleValidatorProject Questa validazione controlla che esista almeno una unità organizzativa interna, se esiste un ruolo principale deve essere definito.
Ci deve essere uno e un solo ruolo Principale (Main)
Dal punto di vista del modello dati si tratta degli elementi di tipo
internalOrganizationUnit Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
if (orgUnitSet.size()<1){
errors.reject("error.project.multipleInternalOrganization.atLeast1");
} else {
var internalOrganizationUnitCoordinatorRole=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.internalOrganizationUnit.role.main");
if (!internalOrganizationUnitCoordinatorRole){
throw "Configuration variable ap.prj.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.reject("error.project.multipleInternalOrganization.missingMain");
}
else if (count>1) {
errors.reject("error.project.multipleInternalOrganization.tooManyMain");
}
}
|
Anchor |
---|
| ownerRoleForIdentifierValidatorProject-anchor |
---|
| ownerRoleForIdentifierValidatorProject-anchor |
---|
|
ownerRoleForIdentifierValidatorProject Questa validazione controlla che esista almeno un responsabile con il ruolo che è configurato fra quelli utili
al calcolo del codice del Progetto.
Dal punto di vista del modello dati si tratta degli elementi di tipo
owner Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (WfUtil.getParametricConfiguration("ap.<itemType>.owner.role.enabled", object.getWfItemType()).equalsIgnoreCase("true")){
var ownerSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
var ownerRolesForIdentifier = WfUtil.getParametricConfiguration("ap.<itemType>.owner.identifier.roles", wfService.getWfItemType(wfItem.getWfItemTypeId()));
if (ownerRolesForIdentifier != null) {
var rolesArray = ownerRolesForIdentifier.split(",");
var ownerSetIterator = ownerSet.iterator();
var count = 0;
while (ownerSetIterator.hasNext()){
var element = ownerSetIterator.next();
var role = element.getWfDictionaryMap().get("roleId").getInternalSourceIdentifier();
if (Packages.java.util.Arrays.asList(rolesArray).contains(role)){
count++;
break;
}
}
if (count == 0){
var rolesError = rolesArray.join(",");
errors.reject("error.project.owner.missingRoleForIdentifier");
}
} else {
throw "Configuration variable ap.<itemType>.owner.identifier.roles MUST BE DEFINED";
}
}
|
Anchor |
---|
| ownerAndOrganizationUnitMatchValidatorProject-anchor |
---|
| ownerAndOrganizationUnitMatchValidatorProject-anchor |
---|
|
ownerAndOrganizationUnitMatchValidatorProject Questa validazione controlla che esista per ogni responsabile scientifico del progetto, una unità organizzativa che sia interna nel momento della data di avvio del progetto (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à Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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.reject("error.project.multipleInternalOrganization.matchWithDepartmentOwnerNotFound", [dateAsString, nonMatchedDepartmentString], null);
}
}
|
Anchor |
---|
| contributorRoleValidatorProject-anchor |
---|
| contributorRoleValidatorProject-anchor |
---|
|
contributorRoleValidatorProject Questa validazione controlla che il ruolo del partecipante venga inserito (se è visibile nel form)
Dal punto di vista del modello dati si tratta dell' attributo
roleId Per maggiori dettagli cfr. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.contributor.role.enabled").equalsIgnoreCase("true")){
if(object.getWfDictionaryMap().get("roleId") == null ){
errors.reject("error.project.contributor.role.required");
}
}
|
Anchor |
---|
| ownerRoleValidatorProject-anchor |
---|
| ownerRoleValidatorProject-anchor |
---|
|
ownerRoleValidatorProject Questa validazione controlla che il ruolo del responsabile venga inserito (se è visibile nel form)
Dal punto di vista del modello dati si tratta dell' attributo
roleId Per maggiori dettagli cfr. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.owner.role.enabled").equalsIgnoreCase("true")){
if(object.getWfDictionaryMap().get("roleId") == null ){
errors.reject("error.project.owner.role.required");
}
}
|
Anchor |
---|
| grantorValidatorProject-anchor |
---|
| grantorValidatorProject-anchor |
---|
|
grantorValidatorProject 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 Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var grantorSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "grantor", wfService);
if (grantorSet.size()<1)
errors.reject("error.project.grantor.atLeast1");
|
Anchor |
---|
| grantorFinancingQuotaRequiredValidatorProject-anchor |
---|
| grantorFinancingQuotaRequiredValidatorProject-anchor |
---|
|
grantorFinancingQuotaRequiredValidatorProject Questa validazione controlla viene attivata dalla configuration
ap.prj.grantor.financingQuota.enabled.
Verfica che vengano inserite le quote di finanziamento associate a ogni ente e che la loro somma sia corretta.
Dal punto di vista del modello dati si tratta degli elementi di tipo
grantor.
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(ConfigurationUtil.getConfigValue("ap.prj.grantor.financingQuota.enabled") != null){
if(ConfigurationUtil.getConfigValue("ap.prj.grantor.financingQuota.enabled").equalsIgnoreCase("true")){
var grantorSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "grantor", wfService);
var grantorSetIterator = grantorSet.iterator();
var sum = BigDecimal.ZERO;
while (grantorSetIterator.hasNext()){
var element = grantorSetIterator.next();
sum = sum.add(element.getNumberMap().get("financingQuota") != null ? element.getNumberMap().get("financingQuota") : BigDecimal.ZERO);
}
if(!sum.equals(object.getNumberMap().get("internalContribution"))){
errors.reject("error.project.grantor.quota.inconsistent");
}
}
}
|
Anchor |
---|
| topicValidatorProject-anchor |
---|
| topicValidatorProject-anchor |
---|
|
topicValidatorProject Questa validazione controlla che esista almeno una area tematica nel tab "Dati generali".
Dal punto di vista del modello dati si tratta degli elementi di tipo
topic Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var topicSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "topic", wfService);
if (topicSet.size()<1)
errors.reject("error.project.topic.atLeast1");
|
Anchor |
---|
| evaluationValidatorProject-anchor |
---|
| evaluationValidatorProject-anchor |
---|
|
evaluationValidatorProject 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 Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var evaluationSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "evaluation", wfService);
if (evaluationSet.size()<1)
errors.reject("error.project.evaluation.atLeast1");
|
Anchor |
---|
| administrativeOwnerValidatorProject-anchor |
---|
| administrativeOwnerValidatorProject-anchor |
---|
|
administrativeOwnerValidatorProject Questa validazione controlla che esista almeno un referente amministrativo nel tab "Soggetti interni".
Dal punto di vista del modello dati si tratta degli elementi di tipo
administrativeOwner Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "administrativeOwner", wfService);
if (ownerSet.size()<1)
errors.reject("error.project.administrativeOwner.atLeast1");
|
Anchor |
---|
| currencyAndInternalContributionValidatorProject-anchor |
---|
| currencyAndInternalContributionValidatorProject-anchor |
---|
|
currencyAndInternalContributionValidatorProject Questa validazione controlla che nel tab "Finanziamento", nel caso di selezione di valuta diversa da EURO, vengano specificati
- importo in valuta originaria
- tasso di cambio
- data rilevazione tasso di cambio
Dal punto di vista del modello dati si tratta degli attributi:
- internalContributionOriginalCurrency
- exchangeRate
- exchangeRateDate
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var currency = object.getWfDictionaryMap().get("currency");
if(currency != null){
var currencyId = object.getWfDictionaryMap().get("currency").getId();
var dictionary = wfService.getWfDictionary(currencyId);
var currencyCode = dictionary.getStringMap().get("code");
if (currencyCode != "currency.eur"){
if (!object.getNumberMap().get("internalContributionOriginalCurrency")){
errors.rejectValue("numberMap[internalContributionOriginalCurrency]","error.project.funding.internalContributionOriginalCurrency.required");
}
if (!object.getNumberMap().get("exchangeRate")){
errors.rejectValue("numberMap[exchangeRate]","error.project.funding.exchangeRate.required");
}
if (!object.getDateMap().get("exchangeRateDate")){
errors.rejectValue("dateMap[exchangeRateDate]","error.project.funding.exchangeRateDate.required");
}
}
}
|
Anchor |
---|
| checkPartnerValidatorProject-anchor |
---|
| checkPartnerValidatorProject-anchor |
---|
|
checkPartnerValidatorProject Questa validazione controlla la coerenza delle informazioni inserite nel tab "Partner".
Precisamente viene verificato che:
- sia presente un partner
- ci sia uno ed un solo partner marcato come Coordinatore (ad eccezione del caso in cui l'Ateneo sia Partner Unico)
- nel caso in cui l'Ateneo sia Partner unico non devono essere presenti altri partner
- l'Ateneo sia presente una ed una sola volta tra i partner
E' possobile disabilitare la verifica su una determinata tipologia di progetti (itemType) del fatto che sia presente un partner coordinatore se ci sono altri partner (per la Ricerca non competitiva), settando a false la variabile di configurazione
ap.PARAMETRIC_TYPE_LOWER_CASE.partner.main.required. In tutti gli altri casi il controllo verrà fatto.
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto.
Questa validazione si aspetta che siano definite le seguenti variabili di configurazione:
- ap.project.partner.role.main: identificativo del dizionario relativo al ruolo partner "Coordinatore"
- partnerRole.uniquePartner: identificativo del dizionario relativo al ruolo partner "Partner unico"
- rm.orgunit.external.myOrganization: identificativo dell'unità organizzativa relativa all'Ateneo con mappatura verso UGOV AC
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var coordinatorRoleId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.role.main");
var uniquePartnerRoleId = WfUtil.getDictionaryByCode(wfService, "partnerRole.uniquePartner");
var myOrganization = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
if (coordinatorRoleId == null || myOrganization == null || uniquePartnerRoleId == null){
throw "Configuration variables ap.project.partner.role.main and Dictionary variables partnerRole.uniquePartner, rm.orgunit.external.myOrganization MUST BE DEFINED";
} else {
coordinatorRoleId = new Packages.java.lang.Integer(coordinatorRoleId);
uniquePartnerRoleId = new Packages.java.lang.Integer(uniquePartnerRoleId);
myOrganization = new Packages.java.lang.Integer(myOrganization);
}
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement", "partner",wfService);
var partnerSetIterator=partnerSet.iterator();
var counterOtherPartner=0;
var counterCoordinator=0;
var counterUniquePartner=0;
var counterMyOrganization=0;
while (partnerSetIterator.hasNext()){
var element=partnerSetIterator.next();
var orgUnitRole = element.getWfDictionaryMap().get("partnerRole");
if (orgUnitRole==null){
errors.reject("error.project.partner.missingRole");
break;
}
var orgUnit = element.getOrganizationUnitMap().get("partnerId");
if (orgUnit==null){
errors.reject("error.project.partner.missingOrgUnit");
break;
}
if (coordinatorRoleId.equals(orgUnitRole.getId())){
counterCoordinator++;
} else if (uniquePartnerRoleId.equals(orgUnitRole.getId())){
counterUniquePartner++;
} else {
counterOtherPartner++;
}
if(myOrganization.equals(orgUnit.getId())){
counterMyOrganization++;
}
}
if (!errors.hasErrors()){
if (counterCoordinator > 1){
errors.reject("error.project.partner.tooManyMain");
} else if (counterUniquePartner > 1){
errors.reject("error.project.partner.tooManyUniquePartner");
} else if (counterMyOrganization > 1){
errors.reject("error.project.partner.tooManyMyOrganization");
} else if (partnerSet.size() > 0){
if (counterMyOrganization == 0){
errors.reject("error.project.partner.myOrganizationRequired");
} else if (counterCoordinator>0 && counterUniquePartner>0){
errors.reject("error.project.partner.coordinatorAndUniquePartner");
} else {
var confVal=Packages.it.cilea.wf.util.WfUtil.getParametricConfiguration("ap.<itemType>.partner.main.required", object.getWfItemType());
if (!Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase("false",confVal)){
if (counterOtherPartner>0 && counterCoordinator==0) {
errors.reject("error.project.partner.missingMain");
} else if (counterOtherPartner>0 && counterUniquePartner>0){
errors.reject("error.project.partner.otherPartnerAndUniquePartner");
} else if (counterOtherPartner==0 && counterCoordinator>0) {
errors.reject("error.project.partner.coordinatorAndNoOtherPartner");
}
} else if (counterOtherPartner>0 && counterUniquePartner>0){
errors.reject("error.project.partner.otherPartnerAndUniquePartner");
} else if (counterOtherPartner==0 && counterCoordinator>0) {
errors.reject("error.project.partner.coordinatorAndNoOtherPartner");
}
}
} else if(partnerSet.size() == 0){
errors.reject("error.project.partner.required");
}
}
|
Anchor |
---|
| partnerAndRequestedGlobalCostValidatorProject-anchor |
---|
| partnerAndRequestedGlobalCostValidatorProject-anchor |
---|
|
partnerAndRequestedGlobalCostValidatorProject Nel caso in cui l'Ateneo risulti Coordinatore viene imposto che siano compilati i seguenti attributi nel fieldset "Dati finanziamento richiesto" del tab "Finanziamento":
- Contributo globale del Progetto per tutto il partenariato (EURO) - requestedGlobalContribution
- Costo globale del Progetto per tutto il partenariato (EURO) - requestedGlobalCost
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto.
Questa validazione si aspetta che siano definite le seguenti variabili di configurazione:
- partnerRole.main:: identificativo del dizionario relativo al ruolo partner "Coordinatore"
- partnerRole.uniquePartner: identificativo del dizionario relativo al ruolo partner "Partner unico"
- rm.orgunit.external.myOrganization: identificativo dell'unità organizzativa relativa all'Ateneo con mappatura verso UGOV AC
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var coordinatorRoleId = WfUtil.getDictionaryByCode(wfService, "partnerRole.main");
var uniquePartnerRoleId = WfUtil.getDictionaryByCode(wfService, "partnerRole.uniquePartner");
var myOrganization = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
if (coordinatorRoleId == null || myOrganization == null || uniquePartnerRoleId == null){
throw "Dictionary partnerRole.uniquePartner, partnerRole.main and Configuration rm.orgunit.external.myOrganization MUST BE DEFINED";
} else {
coordinatorRoleId = new Packages.java.lang.Integer(coordinatorRoleId);
uniquePartnerRoleId = new Packages.java.lang.Integer(uniquePartnerRoleId);
myOrganization = new Packages.java.lang.Integer(myOrganization);
}
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement", "partner",wfService);
var partnerSetIterator=partnerSet.iterator();
while (partnerSetIterator.hasNext()){
var element=partnerSetIterator.next();
var orgUnitRole = element.getWfDictionaryMap().get("partnerRole");
var orgUnit = element.getOrganizationUnitMap().get("partnerId");
if(myOrganization.equals(orgUnit.getId()) && coordinatorRoleId.equals(orgUnitRole.getId())){
if (!object.getNumberMap().get("requestedGlobalContribution")){
errors.rejectValue("numberMap[requestedGlobalContribution]","error.project.funding.globalContribution.required");
}
if (!object.getNumberMap().get("requestedGlobalCost")){
errors.rejectValue("numberMap[requestedGlobalCost]","error.project.funding.globalCost.required");
}
if (!object.getWfDictionaryMap().get("requestedCurrency")){
errors.rejectValue("wfDictionaryMap[requestedCurrency]","error.project.funding.currency.required");
}
}
}
|
Anchor |
---|
| partnerAndGlobalCostValidatorProject-anchor |
---|
| partnerAndGlobalCostValidatorProject-anchor |
---|
|
partnerAndGlobalCostValidatorProject Nel caso in cui l'Ateneo risulti Coordinatore viene imposto che siano compilati i seguenti attributi nel fieldset "Dati finanziamento assegnato" del tab "Finanziamento":
- Contributo globale del Progetto per tutto il partenariato (EURO) - globalContribution
- Costo globale del Progetto per tutto il partenariato (EURO) - globalCost
- Costo globale del Progetto per tutto il partenariato (NON EURO) - globalCostOriginalCurrency
- Contributo globale del Progetto per tutto il partenariato (NON EURO) - globalContributiontOriginalCurrency
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto.
Questa validazione si aspetta che siano definite le seguenti variabili di configurazione:
- partnerRole.main: identificativo del dizionario relativo al ruolo partner "Coordinatore"
- partnerRole.uniquePartner: identificativo del dizionario relativo al ruolo partner "Partner unico"
- rm.orgunit.external.myOrganization: identificativo dell'unità organizzativa relativa all'Ateneo con mappatura verso UGOV AC
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var coordinatorRoleId = WfUtil.getDictionaryByCode(wfService, "partnerRole.main");
var uniquePartnerRoleId = WfUtil.getDictionaryByCode(wfService, "partnerRole.uniquePartner");
var myOrganization = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
if (coordinatorRoleId == null || myOrganization == null || uniquePartnerRoleId == null){
throw "Dictionary partnerRole.uniquePartner, partnerRole.main and Configuration rm.orgunit.external.myOrganization MUST BE DEFINED";
} else {
coordinatorRoleId = new Packages.java.lang.Integer(coordinatorRoleId);
uniquePartnerRoleId = new Packages.java.lang.Integer(uniquePartnerRoleId);
myOrganization = new Packages.java.lang.Integer(myOrganization);
}
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement", "partner",wfService);
var partnerSetIterator = partnerSet.iterator();
while (partnerSetIterator.hasNext()){
var element=partnerSetIterator.next();
var orgUnitRole = element.getWfDictionaryMap().get("partnerRole");
var orgUnit = element.getOrganizationUnitMap().get("partnerId");
if(myOrganization.equals(orgUnit.getId()) && coordinatorRoleId.equals(orgUnitRole.getId())){
if (!object.getNumberMap().get("globalContribution")){
errors.rejectValue("numberMap[globalContribution]","error.project.funding.globalContribution.required");
}
if (!object.getNumberMap().get("globalCost")){
errors.rejectValue("numberMap[globalCost]","error.project.funding.globalCost.required");
}
var currency = object.getWfDictionaryMap().get("currency");
if(currency != null){
var currencyId = object.getWfDictionaryMap().get("currency").getId();
var dictionary = wfService.getWfDictionary(currencyId);
var currencyCode = dictionary.getStringMap().get("code");
if (currencyCode != "currency.eur"){
if (!object.getNumberMap().get("globalCostOriginalCurrency")){
errors.rejectValue("numberMap[globalCostOriginalCurrency]","error.project.funding.globalCostOriginalCurrency.required");
}
if (!object.getNumberMap().get("globalContributionOriginalCurrency")){
errors.rejectValue("numberMap[globalContributionOriginalCurrency]","error.project.funding.globalContributionOriginalCurrency.required");
}
}
}
}
}
|
Anchor |
---|
| checkInconsistentFundingValidatorProject-anchor |
---|
| checkInconsistentFundingValidatorProject-anchor |
---|
|
checkInconsistentFundingValidatorProject Questa validazione controlla la coerenza delle informazioni di finanziamento assegnato sia per le
internalOganizationUnit (unità organizzative interne) che per i
partner (Partner)
Viene controllato che le somme dei costi, contributi e cofinanziamenti per internalOrganizationUnit e partner coincidano con i totali specificati a livello di progetto.
Questa validazione viene attivata SOLO se
ap.project.financing.consistence.validation.enabled=true Viene fatta anche la validazione del finanziamento richiesto se e solo se
ap.project.finacing.requested.enabled=true Per maggiori dettagli cfr. excel modello dati dell'entità Progetto.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.financing.consistence.validation.enabled").equalsIgnoreCase("true")){
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
var checkRequested = false;
var complete = true;
if (!Packages.java.lang.Boolean.TRUE.equals(Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.finacing.requested.enabled"))){
checkRequested = true;
}
var iouSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement", "internalOrganizationUnitCost", wfService);
var size = new Packages.java.lang.Integer(iouSet.size());
var iouSetIterator = iouSet.iterator();
var cost = Packages.java.math.BigDecimal.ZERO;
var contribution = Packages.java.math.BigDecimal.ZERO;
var cofinancing = Packages.java.math.BigDecimal.ZERO;
var cost2 = Packages.java.math.BigDecimal.ZERO;
var contribution2 = Packages.java.math.BigDecimal.ZERO;
var cofinancing2 = Packages.java.math.BigDecimal.ZERO;
var costMap = new Packages.java.util.HashMap();
var contributionMap = new Packages.java.util.HashMap();
var cofinancingMap = new Packages.java.util.HashMap();
var cost2Map = new Packages.java.util.HashMap();
var contribution2Map = new Packages.java.util.HashMap();
var cofinancing2Map = new Packages.java.util.HashMap();
var i = new Packages.java.lang.Integer(0);
var one = new Packages.java.lang.Integer(1);
costMap.put(i, cost);
contributionMap.put(i, contribution);
cofinancingMap.put(i, cofinancing);
cost2Map.put(i, cost2);
contribution2Map.put(i, contribution2);
cofinancing2Map.put(i, cofinancing2);
while (iouSetIterator.hasNext()){
var element = iouSetIterator.next();
if(checkRequested){
if(element.getNumberMap().get("ouRequestedCost") == null){
if(wfItem.getNumberMap().get("requestedInternalCost") != null){
errors.reject("error.project.internalOrganizationUnitCost.ouRequestedCost.required");
complete = false;
}
costMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), costMap.get(i).add(cost));
} else {
costMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), costMap.get(i).add(element.getNumberMap().get("ouRequestedCost")));
}
if(element.getNumberMap().get("ouRequestedContribution") == null){
if(wfItem.getNumberMap().get("requestedInternalContribution") != null){
errors.reject("error.project.internalOrganizationUnitCost.ouRequestedContribution.required");
complete = false;
}
contributionMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), contributionMap.get(i).add(contribution));
} else {
contributionMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), contributionMap.get(i).add(element.getNumberMap().get("ouRequestedContribution")));
}
if(element.getNumberMap().get("ouRequestedCofinancing") == null){
if(wfItem.getNumberMap().get("requestedInternalCofinancing") != null){
errors.reject("error.project.internalOrganizationUnitCost.ouRequestedCofinancing.required");
complete = false;
}
cofinancingMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), cofinancingMap.get(i).add(cofinancing));
} else {
cofinancingMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), cofinancingMap.get(i).add(element.getNumberMap().get("ouRequestedCofinancing")));
}
}
if(element.getNumberMap().get("ouCost") != null){
cost2Map.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), cost2Map.get(i).add(element.getNumberMap().get("ouCost")));
}
if(element.getNumberMap().get("ouContribution") != null){
contribution2Map.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), contribution2Map.get(i).add(element.getNumberMap().get("ouContribution")));
}
if(element.getNumberMap().get("ouCofinancing") == null){
if(wfItem.getNumberMap().get("internalCofinancing") != null){
errors.reject("error.project.internalOrganizationUnitCost.ouCofinancing.required");
complete = false;
}
cofinancing2Map.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), cofinancing2Map.get(i).add(cofinancing));
} else {
cofinancing2Map.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), cofinancing2Map.get(i).add(element.getNumberMap().get("ouCofinancing")));
}
i = new Packages.java.lang.Integer(i.intValue() + one.intValue());
if(!complete){
break;
}
}
if(complete){
if(!(costMap.get(size)).equals(cost)){
if((wfItem.getNumberMap().get("requestedInternalCost") != null && wfItem.getNumberMap().get("requestedInternalCost") != costMap.get(size))
|| wfItem.getNumberMap().get("requestedInternalCost") == null){
errors.rejectValue("numberMap[requestedInternalCost]","error.project.internalOrganizationUnit.requested.cost.inconsistent");
}
}
if(!(contributionMap.get(size)).equals(contribution)){
if((wfItem.getNumberMap().get("requestedInternalContribution") != null && wfItem.getNumberMap().get("requestedInternalContribution") != contributionMap.get(size))
|| wfItem.getNumberMap().get("requestedInternalContribution") == null){
errors.rejectValue("numberMap[requestedInternalContribution]","error.project.internalOrganizationUnit.requested.contribution.inconsistent");
}
}
if(!(cofinancingMap.get(size)).equals(cofinancing)){
if((wfItem.getNumberMap().get("requestedInternalCofinancing") != null && wfItem.getNumberMap().get("requestedInternalCofinancing") != cofinancingMap.get(size))
|| wfItem.getNumberMap().get("requestedInternalCofinancing") == null){
errors.rejectValue("numberMap[requestedInternalCofinancing]","error.project.internalOrganizationUnit.requested.cofinancing.inconsistent");
}
}
if(!(cost2Map.get(size)).equals(cost2)){
if((wfItem.getNumberMap().get("internalCost") != null && wfItem.getNumberMap().get("internalCost") != cost2Map.get(size))
|| wfItem.getNumberMap().get("internalCost") == null){
errors.rejectValue("numberMap[internalCost]","error.project.internalOrganizationUnit.cost.inconsistent");
}
}
if(!(contribution2Map.get(size)).equals(contribution2)){
if((wfItem.getNumberMap().get("internalContribution") != null && wfItem.getNumberMap().get("internalContribution") != contribution2Map.get(size))
|| wfItem.getNumberMap().get("internalContribution") == null){
errors.rejectValue("numberMap[internalContribution]","error.project.internalOrganizationUnit.contribution.inconsistent");
}
}
if(!(cofinancing2Map.get(size)).equals(cofinancing2)){
if((wfItem.getNumberMap().get("internalCofinancing") != null && wfItem.getNumberMap().get("internalCofinancing") != cofinancing2Map.get(size))
|| wfItem.getNumberMap().get("internalCofinancing") == null){
errors.rejectValue("numberMap[internalCofinancing]","error.project.internalOrganizationUnit.cofinancing.inconsistent");
}
}
}
complete = true;
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement", "partnerCost", wfService);
var size2 = new Packages.java.lang.Integer(partnerSet.size());
var partnerSetIterator = partnerSet.iterator();
costMap = new Packages.java.util.HashMap();
contributionMap = new Packages.java.util.HashMap();
cost2Map = new Packages.java.util.HashMap();
contribution2Map = new Packages.java.util.HashMap();
i = new Packages.java.lang.Integer(0);
costMap.put(i, cost);
contributionMap.put(i, contribution);
cost2Map.put(i, cost2);
contribution2Map.put(i, contribution2);
while (partnerSetIterator.hasNext()){
var element = partnerSetIterator.next();
if(checkRequested){
if(element.getNumberMap().get("partnerRequestedCost") == null){
if(wfItem.getNumberMap().get("requestedGlobalCost") != null){
errors.reject("error.project.partnerCost.partnerRequestedCost.required");
complete = false;
break;
}
costMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), costMap.get(i).add(cost));
} else {
costMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), costMap.get(i).add(element.getNumberMap().get("partnerRequestedCost")));
}
if(element.getNumberMap().get("partnerRequestedContribution") == null){
if(wfItem.getNumberMap().get("requestedGlobalContribution") != null){
errors.reject("error.project.partnerCost.partnerRequestedContribution.required");
complete = false;
break;
}
contributionMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), contributionMap.get(i).add(contribution));
} else {
contributionMap.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), contributionMap.get(i).add(element.getNumberMap().get("partnerRequestedContribution")));
}
}
if(element.getNumberMap().get("partnerCost") != null){
cost2Map.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), cost2Map.get(i).add(element.getNumberMap().get("partnerCost")));
}
if(element.getNumberMap().get("partnerContribution") != null){
contribution2Map.put(new Packages.java.lang.Integer(i.intValue() + one.intValue()), contribution2Map.get(i).add(element.getNumberMap().get("partnerContribution")));
}
i = new Packages.java.lang.Integer(i.intValue() + one.intValue());
}
if(complete){
if(!(costMap.get(size2)).equals(cost)){
if((wfItem.getNumberMap().get("requestedGlobalCost") != null && wfItem.getNumberMap().get("requestedGlobalCost") != costMap.get(size2))
|| wfItem.getNumberMap().get("requestedGlobalCost") == null){
errors.rejectValue("numberMap[requestedGlobalCost]","error.project.partner.requested.cost.inconsistent");
}
}
if(!(contributionMap.get(size2)).equals(contribution)){
if((wfItem.getNumberMap().get("requestedGlobalContribution") != null && wfItem.getNumberMap().get("requestedGlobalContribution") != contributionMap.get(size2))
|| wfItem.getNumberMap().get("requestedGlobalContribution") == null){
errors.rejectValue("numberMap[requestedGlobalContribution]","error.project.partner.requested.contribution.inconsistent");
}
}
if(!(cost2Map.get(size2)).equals(cost2)){
if((wfItem.getNumberMap().get("globalCost") != null && wfItem.getNumberMap().get("globalCost") != cost2Map.get(size2))
|| wfItem.getNumberMap().get("globalCost") == null){
errors.rejectValue("numberMap[globalCost]","error.project.partner.cost.inconsistent");
}
}
if(!(contribution2Map.get(size2)).equals(contribution2)){
if((wfItem.getNumberMap().get("globalContribution") != null && wfItem.getNumberMap().get("globalContribution") != contribution2Map.get(size2))
|| wfItem.getNumberMap().get("globalContribution") == null){
errors.rejectValue("numberMap[globalContribution]","error.project.partner.contribution.inconsistent");
}
}
}
}
}
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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");
|
Anchor |
---|
| financingSumProjectValidator-anchor |
---|
| financingSumProjectValidator-anchor |
---|
|
financingSumProjectValidator Questa validazione controlla che la somma dei campi Contributo totale Ateneo e Cofinanziamento Ateneo coincida con il valore del Costo totale del progetto per l'Ateneo.
Viene attivata dalla configurazione
ap.prj.financing.sum.validation.enabled Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (ConfigurationUtil.getConfigValue("ap.prj.financing.sum.validation.enabled").equalsIgnoreCase("true")){
var cost = wfItem.getNumberMap().get("internalCost") != null ? wfItem.getNumberMap().get("internalCost") : BigDecimal.ZERO;
var contribution = wfItem.getNumberMap().get("internalContribution") != null ? wfItem.getNumberMap().get("internalContribution") : BigDecimal.ZERO;
var cofinancing = wfItem.getNumberMap().get("internalCofinancing") != null ? wfItem.getNumberMap().get("internalCofinancing") : BigDecimal.ZERO;
if(!cost.stripTrailingZeros().equals(contribution.add(cofinancing).stripTrailingZeros())){
errors.reject("error.project.financing.sum");
}
}
|
Anchor |
---|
| internalOrganizationUnitEditValidator-anchor |
---|
| internalOrganizationUnitEditValidator-anchor |
---|
|
internalOrganizationUnitEditValidator Questa validazione impedisce la modifica della Struttura in
internalOganizationUnit se tale Struttura è presente in
internalOganizationUnitCost (finanziamenti associati a unità organizzative interne).
Agisce in caso di modifica dei valori del fragment.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getWfItem().getBooleanMap().get("legacy"))){
var iouSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
var iouCostSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnitCost", wfService);
var iouSetIterator=iouSet.iterator();
var iouCostSetIterator=iouCostSet.iterator();
var ouSet = new Packages.java.util.HashSet();
while (iouSetIterator.hasNext()){
var element = iouSetIterator.next();
ouSet.add(element.getOrganizationUnitMap().get("ouId"));
}
var ouCostSet = new Packages.java.util.HashSet();
while (iouCostSetIterator.hasNext()){
var element = iouCostSetIterator.next();
ouCostSet.add(element.getOrganizationUnitMap().get("ouId"));
}
if(!ouSet.containsAll(ouCostSet)){
errors.reject("error.project.internalOrganizationUnit.editOrDelete");
}
}
|
Anchor |
---|
| internalOrganizationUnitDeleteValidator-anchor |
---|
| internalOrganizationUnitDeleteValidator-anchor |
---|
|
internalOrganizationUnitDeleteValidator Questa validazione impedisce l'eliminazione di un elemento in
internalOganizationUnit se la Struttura associata è presente in
internalOganizationUnitCost (finanziamenti associati a unità organizzative interne).
Agisce in caso di eliminazione dei valori del fragment
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getWfItem().getBooleanMap().get("legacy"))){
var iouCostSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnitCost", wfService);
var iouCostSetIterator=iouCostSet.iterator();
var ouCostSet = new Packages.java.util.HashSet();
while (iouCostSetIterator.hasNext()){
var element = iouCostSetIterator.next();
ouCostSet.add(element.getOrganizationUnitMap().get("ouId"));
}
if(ouCostSet.contains(object.getOrganizationUnitMap().get("ouId"))){
errors.reject("error.project.internalOrganizationUnit.editOrDelete");
}
}
|
Anchor |
---|
| internalOrganizationUnitCostEditValidator-anchor |
---|
| internalOrganizationUnitCostEditValidator-anchor |
---|
|
internalOrganizationUnitCostEditValidator Questa validazione impedisce la modifica della Struttura in
internalOganizationUnitCost (finanziamenti associati a unità organizzative interne)
se tale Struttura è presente in
internalOganizationUnit.
Agisce in caso di modifica dei valori del fragment
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getWfItem().getBooleanMap().get("legacy"))){
var iouSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
var iouSetIterator=iouSet.iterator();
var ouSet = new Packages.java.util.HashSet();
while (iouSetIterator.hasNext()){
var element = iouSetIterator.next();
ouSet.add(element.getOrganizationUnitMap().get("ouId"));
}
if(!ouSet.contains(object.getOrganizationUnitMap().get("ouId"))){
errors.reject("error.project.internalOrganizationUnitCost.editOrAdd");
}
}
|
Anchor |
---|
| partnerEditValidator-anchor |
---|
| partnerEditValidator-anchor |
---|
|
partnerEditValidator Questa validazione impedisce la modifica del Partner in
partner se tale Partner è presente in
partnerCost (finanziamenti associati a partner).
Agisce in caso di modifica dei valori del fragment.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getWfItem().getBooleanMap().get("legacy"))){
var partnerSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "partner", wfService);
var partnerCostSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "partnerCost", wfService);
var partnerSetIterator = partnerSet.iterator();
var partnerCostSetIterator = partnerCostSet.iterator();
var partnerSet = new Packages.java.util.HashSet();
while (partnerSetIterator.hasNext()){
var element = partnerSetIterator.next();
partnerSet.add(element.getOrganizationUnitMap().get("partnerId"));
}
var partnerCostSet = new Packages.java.util.HashSet();
while (partnerCostSetIterator.hasNext()){
var element = partnerCostSetIterator.next();
partnerCostSet.add(element.getOrganizationUnitMap().get("partnerId"));
}
if(!partnerSet.containsAll(partnerCostSet)){
errors.reject("error.project.partner.editOrDelete");
}
}
|
Anchor |
---|
| partnerDeleteValidator-anchor |
---|
| partnerDeleteValidator-anchor |
---|
|
partnerDeleteValidator Questa validazione impedisce l'eliminazione di un elemento in
partner se il Partner associata è presente in
partnerCost (finanziamenti associati a partner).
Agisce in caso di eliminazione dei valori del fragment.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getWfItem().getBooleanMap().get("legacy"))){
var partnerCostSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "partnerCost", wfService);
var partnerCostSetIterator= partnerCostSet.iterator();
var partnerCostSet = new Packages.java.util.HashSet();
while (partnerCostSetIterator.hasNext()){
var element = partnerCostSetIterator.next();
partnerCostSet.add(element.getOrganizationUnitMap().get("partnerId"));
}
if(partnerCostSet.contains(object.getOrganizationUnitMap().get("partnerId"))){
errors.reject("error.project.partner.editOrDelete");
}
}
|
Anchor |
---|
| partnerCostEditValidator-anchor |
---|
| partnerCostEditValidator-anchor |
---|
|
partnerCostEditValidator Questa validazione impedisce la modifica del Partner in
partnerCost (finanziamenti associati a partner)
se tale Partner è presente in
partner.
Agisce in caso di modifica dei valori del fragment.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getWfItem().getBooleanMap().get("legacy"))){
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object.getWfItem(), "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "partner", wfService);
var partnerSetIterator = partnerSet.iterator();
var partnerSet = new Packages.java.util.HashSet();
while (partnerSetIterator.hasNext()){
var element = partnerSetIterator.next();
partnerSet.add(element.getOrganizationUnitMap().get("partnerId"));
}
if(!partnerSet.contains(object.getOrganizationUnitMap().get("partnerId"))){
errors.reject("error.project.partnerCost.editOrAdd");
}
}
|
Anchor |
---|
| notEditableByOwnerValidator-anchor |
---|
| notEditableByOwnerValidator-anchor |
---|
|
notEditableByOwnerValidator TODO
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var reject = 0;
var discriminator = [null, null, "acronym"];
var column = ["wfItemTypeId", "description","string"];
columnLen = column.length;
var value = [];
for (i = 0; i < columnLen; i++) {
var discriminatorString = discriminator[i] == null ? '' : "." + discriminator[i];
if(Packages.java.lang.Boolean.TRUE.equals(Packages.it.cilea.wf.util.WfUtil.isAttributeChanged(wfService, wfItem, column[i] + discriminatorString))){
reject = 1;
break;
}
}
if(reject > 0){
errors.reject("error.project.ownerGeneralData.edit.notAllowed");
}
|
Anchor |
---|
| itemTypeAndTeamEditableValidator-anchor |
---|
| itemTypeAndTeamEditableValidator-anchor |
---|
|
itemTypeAndTeamEditableValidator Questa validazione controlla che l'utente corrente NON appartenga al team "Ufficio Erasmus - Progetti con caricamento delle persone abilitate".
Questo è un team con agganciata la funzione "Risorsa per Ufficio Erasmus cui negare accesso in modifica ai Progetti" (/ap/project/erasmusTeam/onlyRead.function)
La visione completa consente a chiunque appartenga al team di accedere con i diritti di helpdesk SOLO al flusso per i Progetti di Formazione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var gaUserDetail = Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();
var userId = gaUserDetail.getUserId();
var searchCommand = new Packages.it.cilea.ga.command.TeamUserLinkSearchCommand();
searchCommand.setUserId(userId);
var linkList = gaService.getTeamUserLinkSearchList(searchCommand, 0);
var listIterator = linkList.iterator();
var foundTeam = 0;
var erasmusItemType = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.onlyRead.erasmusItemType");
while(listIterator.hasNext()){
var teamUserLink = listIterator.next();
if(teamUserLink.getTeamId() == Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.onlyRead.erasmusTeam")){
foundTeam = 1;
if(erasmusItemType != null){
if(!erasmusItemType.contains(object.getWfItemType().getIdentifier())){
errors.reject("error.project.erasmus.operation.itemType.notAllowed");
}
} else {
errors.reject("error.project.erasmus.operation.itemType.notAllowed");
}
break;
}
}
if(foundTeam == 0){
if(erasmusItemType != null){
if(erasmusItemType.contains(object.getWfItemType().getIdentifier())){
errors.reject("error.project.erasmus.operation.team.notAllowed");
}
}
}
|
Anchor |
---|
| itemTypeAndTeamCreatableValidator-anchor |
---|
| itemTypeAndTeamCreatableValidator-anchor |
---|
|
itemTypeAndTeamCreatableValidator Questa validazione controlla che l'utente corrente NON appartenga al team "Ufficio Erasmus - Progetti con caricamento delle persone abilitate".
Questo è un team con agganciata la funzione "Risorsa per Ufficio Erasmus cui negare accesso in modifica ai Progetti" (/ap/project/erasmusTeam/onlyRead.function)
La visione completa consente a chiunque appartenga al team di creare una scheda SOLO per il flusso per i Progetti di Formazione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var gaUserDetail = Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();
var authority = gaUserDetail.getCurrentAuthorityIdentifier();
if(authority == "ROLE_ADMIN"){
var validateLogic = Packages.it.cilea.wf.WfConstant.VALIDATE_LOGIC_MAP.get("itemTypeAndTeamEditableValidator");
validateLogic.validate(request, object, errors);
}
|
Anchor |
---|
| projectCallValidator-anchor |
---|
| projectCallValidator-anchor |
---|
|
projectCallValidator Questa validazione viene eseguita solo e solamente se sono state abilitate le validazioni e l'invio verso UGOV-PJ.
Questa validazione controlla che esista uno ed un solo
bando di finanziamento associato a questo progetto nel tab "Dati generali".
Viene verificato inoltre che il bando di finanziamento sia in stato
approvato Se viene rilevata una riga anomala, cioè con un Bando vuoto, segnala l'errore
Dal punto di vista del modello dati si tratta degli elementi di tipo
callProjectLink Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var linkSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getParentWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "callProjectLink", wfService);
//log.error("linkSet: " + linkSet);
if(linkSet != null){
if (linkSet.size()>1){
errors.reject("error.project.call.moreThanOne");
} else if (linkSet.size()==1){
var linkSetIterator = linkSet.iterator();
if( linkSetIterator.hasNext() ){
var linkElement = linkSetIterator.next();
var call = linkElement.getParent();
if(call != null){
var callState = call.getWfState().getDescription();
if (!Packages.org.apache.commons.lang.StringUtils.equals("approved", callState)){
errors.reject("error.project.call.notApproved");
}
}else{
errors.reject("error.project.call.emptyRow");
}
}
}
}
|
Anchor |
---|
| isAlphaNumeric-anchor |
---|
| isAlphaNumeric-anchor |
---|
|
isAlphaNumeric Verifica che il campo isScoraNumeric sia a TRUE
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
!object.getBooleanMap().get('isScoreNumeric').booleanValue();
|
Anchor |
---|
| wfStartLogicPublicEngagement-anchor |
---|
| wfStartLogicPublicEngagement-anchor |
---|
|
wfStartLogicPublicEngagement Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Effettua il setup dei seguenti attributi con i valori tra parentesi
- periodicEvent (false)
- istitutionalInitiative (false)
- evaluationEnable (false)
- externalFinancing (0)
- totalBudget (0)
- numTotalDay (1)
Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(wfItem.getBooleanMap().get("periodicEvent")==null){
wfItem.getBooleanMap().put("periodicEvent",false);
}
if(wfItem.getBooleanMap().get("istitutionalInitiative")==null){
wfItem.getBooleanMap().put("istitutionalInitiative",false);
}
if(wfItem.getBooleanMap().get("evaluationEnable")==null){
wfItem.getBooleanMap().put("evaluationEnable",false);
}
if(wfItem.getNumberMap().get("externalFinancing")==null){
wfItem.getNumberMap().put("externalFinancing",new java.math.BigDecimal("0"));
}
if(wfItem.getNumberMap().get("totalBudget")==null){
wfItem.getNumberMap().put("totalBudget", new java.math.BigDecimal("0"));
}
if(wfItem.getNumberMap().get("numTotalDay")==null){
wfItem.getNumberMap().put("numTotalDay", new java.math.BigDecimal("1"));
}
if(wfItem.getBooleanMap().get("personOrDepartment")!=null){
wfItem.getBooleanMap().put("personOrDepartment",null);
}
true;
|
Anchor |
---|
| wfStartLogicAcademicAreaFromOwner-anchor |
---|
| wfStartLogicAcademicAreaFromOwner-anchor |
---|
|
wfStartLogicAcademicAreaFromOwner Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Recupera l'Area Accademica del Responsabile Scientifico (
owner) ed estrae la sua Area Accademica, aggiungendo quindi un nuovo elemento "Aree scientifiche coinvolte"(
scientificAreasInvolved)
La data alla quale estrarre l'Area Accademica del responsabile è quella contenuta nel metadato con il nome recuperabile dalla configurazione
ap.<tipologia>.owner.position.date.
Se questa configurazione
- NON è presente, viene usato la data inserita nel metadato startDate
- è presente ed ha valore uguale a CURRENT viene usata la data corrente
- è presente ed ha valore uguale a CURRENT_OR_LAST viene usata l'ultima Area Accademica disponibile (attiva o cessata)
- è presente ed NON ha un valore tra quelli elencati allora viene usata la data presente nel metadato con il nome specificato
E' possibile decidere se settare in automatico il metadato startDate per il responsabile.
Se la configurazione
ap.<tipologia>.owner.startDate.enabled:
- NON è presente, allora NON viene abilitato l'automatismo di recupero della startDate
- è uguale a false allora NON viene abilitato l'automatismo di recupero della startDate
- è uguale a true allora viene inserita come startDate lo stesso valore recuperato con le logiche descritte al punto prima
- altrimenti NON viene abilitato l'automatismo di recupero della startDate
E' inoltre possibile stabilire quali siano i contesti all'interno dei quali cercare l'Area Accademica per il responsabile scientifico.
Questo viene pilotato dalla configurazione
ap.<tipologia>.owner.position.context.
Se questa configurazione
- NON è presente, viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a research allora viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a support allora viene usato il solo contesto di supporto (TA)
- è uguale a ALL allora vengono usati entrambi i contesti
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 maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//logica di start che va a popolare l'academicArea (scientificAreasInvolved Aree scientifiche coinvolte )
//con l'area ministeriale estratta dall'owner in start
//lavora in coppia con la logica di save per gli owner(?)
//devo usare per forza il metodo lungo perchè l'owner è già stato spostato negli element
var ownerElementSet = wfItem.getWfItemElementSet("owner");
var ownerElementSetIterator = ownerElementSet.iterator();
while(ownerElementSetIterator.hasNext()){
var ownerElement = ownerElementSetIterator.next();
var person = gaService.getPerson(ownerElement.getPersonMap().get("ownerId").getId());
var checkDate = WfUtil.getCheckDate(wfItem, wfService);
var positionContext = WfUtil.getPositionContext(wfItem, wfService);
var personPositionSet = WfUtil.getPositionSet(person, checkDate, positionContext, "academicArea", gaService);
//var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(personPositionSet, positionContext, "academicArea");
var academicAreaOrgUnit = GaUtil.getPriorityOrganizationUnit(personPositionSet, positionContext, "academicArea");
var personPositionSetIterator = personPositionSet.iterator();
if(academicAreaOrgUnit != null){
//log.error("FOUND ONE!");
var saiElement = new Packages.it.cilea.wf.model.WfItemElement();
saiElement.setDiscriminator("scientificAreasInvolved");
saiElement.setWfItemId(wfItem.getId());
saiElement.getOrganizationUnitMap().put("ouId", academicAreaOrgUnit);
wfService.saveOrUpdate(saiElement);
wfItem.getWfItemElementSet().add(saiElement);
}
}
true;
|
Anchor |
---|
| validatorDepartmentPublicEngagement-anchor |
---|
| validatorDepartmentPublicEngagement-anchor |
---|
|
validatorDepartmentPublicEngagement Questa validazione verifica in creazione di una nuova iniziativa, se la configurazione
"ap.pen.owner.internalOrganizationUnit.mandatory" è settata a true, che la persona abbia un ruolo di ricerca e afferisca ad un dipartimento.
Il valore di default è true.
Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var personOrDepartment =wfItem.getBooleanMap().get("personOrDepartment");
if (personOrDepartment==true){
var person=wfItem.getPersonMap().get("owner");
if(person!=null){
var mandatory=Packages.it.cilea.wf.util.WfUtil.getMandatory(object,"owner");
if(mandatory){
person=gaService.getPerson(person.getId());
var startDate=wfItem.getDateMap().get("startDate");
if(startDate!=null){
//setto il positionSearch in modo da trovare se ho delle position di ricerca per quella data
var ownerPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
ownerPositionSearch.setPersonId(person.getId());
ownerPositionSearch.setDate(startDate.getTime());
ownerPositionSearch.setOrganizationUnitTypeDescription("department");
ownerPositionSearch.setDiscriminator("research");
var ownerPositionSet = gaService.getPositionSearchList(ownerPositionSearch, 0);
if(ownerPositionSet.isEmpty()){
errors.reject("error.publicEngagement.start.organizationUnitMap.required");
}
}else {
errors.reject("error.startDate.required");
}
}
}
}
|
Anchor |
---|
| ownerStartValidatorPublicEngagement-anchor |
---|
| ownerStartValidatorPublicEngagement-anchor |
---|
|
ownerStartValidatorPublicEngagement Questa validazione controlla che esista almeno un Responsabile scientifico e Dipartimento obbligatorio in fase di creazione.
Per maggiori dettagli cfr. modello dati dell'entità
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (object.getId()==null){
var personOrDepartment =object.getBooleanMap().get("personOrDepartment");
if ((personOrDepartment==true)&&(object.getPersonMap().get("owner")==null)){
errors.rejectValue("personMap[owner]","error.publicEngagement.owner.required");
}else if ((personOrDepartment==false)&&(object.getOrganizationUnitMap().get("ouId")==null)){
errors.rejectValue("organizationUnitMap[ouId]","error.publicEngagement.organizationUnitMap.required");
}
}
|
Anchor |
---|
| checkToolEvaluation-anchor |
---|
| checkToolEvaluation-anchor |
---|
|
checkToolEvaluation Questa validazione controlla che, se l'attributo evaluationEnable è true, siano presenti gli strumenti di valutazione obbligatori.
Dal punto di vista del modello dati si tratta degli elementi
evaluationTool Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var isToolEnable=object.getBooleanMap().get("evaluationEnable");
var listEvaluation=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "evaluationTool", wfService);
if ((isToolEnable==true)&&(listEvaluation.size()==0)){
errors.rejectValue("booleanMap[evaluationEnable]","error.publicEngagement.toolEvaluationEngagement.required");
} |
Anchor |
---|
| suardDepartmentHelpdeskInitiativeValidatorPublicEngagement-anchor |
---|
| suardDepartmentHelpdeskInitiativeValidatorPublicEngagement-anchor |
---|
|
suardDepartmentHelpdeskInitiativeValidatorPublicEngagement Validazione per SUARD (non attiva)
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var suardUniversityInitiative =wfItem.getBooleanMap().get("suardUniversityInitiative");
if (suardUniversityInitiative==false){
var actualDipartment =object.getOrganizationUnitMap().get("suardDepartmentInitiative");
if(actualDipartment==null){
errors.reject("error.publicEngagement.organizationUnitMap.required");
}else {
var wfItem= wfService.getWfItem(object.getWfItemId());
var dipartementList=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
var departmentWfElementSetIterator=dipartementList.iterator();
var isPresent=false;
while(departmentWfElementSetIterator.hasNext()){
var department=departmentWfElementSetIterator.next();
var departmentOwner =department.getOrganizationUnitMap().get("ouId");
if(actualDipartment.getId().equals(departmentOwner.getId())){
isPresent=true;
break;
}
}
if(false==isPresent){
errors.reject("error.publicEngagement.notallowed.suardDepartmentInitiative");
}
}
}
|
Anchor |
---|
| suardDepartmentInitiativeValidatorPublicEngagement-anchor |
---|
| suardDepartmentInitiativeValidatorPublicEngagement-anchor |
---|
|
suardDepartmentInitiativeValidatorPublicEngagement Viene controllato che siano presenti nella Public Engagement almeno un dipartimento relativo all'inziativa SUARD.
Dal punto di vista del modello dati si tratta degli elementi
internalOrganizationUnit Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var suardUniversityInitiative =wfItem.getBooleanMap().get("suardUniversityInitiative");
if (suardUniversityInitiative==false){
var actualDipartment =object.getOrganizationUnitMap().get("suardDepartmentInitiative");
if(actualDipartment==null){
errors.reject("error.publicEngagement.organizationUnitMap.required");
}else {
var wfItem= wfService.getWfItem(object.getWfItemId());
var dipartementList=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
var departmentWfElementSetIterator=dipartementList.iterator();
var isPresent=false;
while(departmentWfElementSetIterator.hasNext()){
var department=departmentWfElementSetIterator.next();
var departmentOwner =department.getOrganizationUnitMap().get("ouId");
if(actualDipartment.getId().equals(departmentOwner.getId())){
isPresent=true;
break;
}
}
if(false==isPresent){
errors.reject("error.publicEngagement.notallowed.suardDepartmentInitiative");
}
}
}else {
errors.reject("error.publicEngagement.notallowed");
}
|
Anchor |
---|
| deleteValidatorParentDetectorPublicEngagement-anchor |
---|
| deleteValidatorParentDetectorPublicEngagement-anchor |
---|
|
deleteValidatorParentDetectorPublicEngagement Questa validazione impedisce l'eliminazione dell'item nel caso in cui sia collegato ad altri publicEngagement (sia loro 'figlio')
Dal punto di vista del modello dati si tratta degli elementi
publicEngagementLink Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItem = wfService.getWfItem(object.getWfItemId());
var identifier = wfItem.getIdentifier();
if(!wfItem.getChildWfItemLinkSet("publicEngagementLink").isEmpty())
errors.reject("error.publicEngagement.childDetected");
|
Anchor |
---|
| deleteValidatorChildDetectorPublicEngagement-anchor |
---|
| deleteValidatorChildDetectorPublicEngagement-anchor |
---|
|
deleteValidatorChildDetectorPublicEngagement Questa validazione impedisce l'eliminazione dell'item nel caso in cui sia collegato ad altri publicEngagement (sia loro 'padre')
Dal punto di vista del modello dati si tratta degli elementi
publicEngagementLink Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItem = wfService.getWfItem(object.getWfItemId());
var identifier = wfItem.getIdentifier();
if(!wfItem.getParentWfItemLinkSet("publicEngagementLink").isEmpty())
errors.reject("error.publicEngagement.parentDetected");
|
Anchor |
---|
| periodicityValidatorPublicEngagement-anchor |
---|
| periodicityValidatorPublicEngagement-anchor |
---|
|
periodicityValidatorPublicEngagement Questa validazione verifica che, se l'evento è periodico (periodicEvent settato a true), sia presente la periodicità (periodicity).
Dal punto di vista del modello dati si tratta degli attributi
command.booleanMap[periodicEvent] e
command.wfDictionaryMap[periodicity] Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItem = wfService.getWfItem(object.getWfItemId());
var periodicEvent = wfItem.getBooleanMap().get("periodicEvent");
if (periodicEvent != null && periodicEvent == true){
if(wfItem.getWfDictionaryMap().get("periodicity") == null)
errors.reject("error.publicEngagement.periodicEvent.periodicityNotIndicated");
}
|
Anchor |
---|
| scientificAreasInvolvedValidatorPublicEngagement-anchor |
---|
| scientificAreasInvolvedValidatorPublicEngagement-anchor |
---|
|
scientificAreasInvolvedValidatorPublicEngagement Questa validazione controlla che esista almeno un'Area scientifica coinvolta nella sezione "Aree scientifiche coinvolte" nel tab "Classificazioni".
Dal punto di vista del modello dati si tratta degli elementi
scientificAreasInvolved Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var scientificAreasInvolvedSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "scientificAreasInvolved", wfService);
if(scientificAreasInvolvedSet.isEmpty()){
errors.reject("error.publicEngagement.scientificAreasInvolved.atLeast1");
}
|
Anchor |
---|
| transitionCommentValidatorPublicEngagement-anchor |
---|
| transitionCommentValidatorPublicEngagement-anchor |
---|
|
transitionCommentValidatorPublicEngagement Questa validazione controlla che venga popolata la motivazione di transizione di stato.
Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//si deve attivare ogni volta che si TORNA in bozza
if(object.getIntegerMap().get("wfItemTypeIdPreviousValue") != null){
if(object.getStringMap().get("transitionComment") == null){
//uso la rejectValue così mi segna il campo da compilare e si attiva la visualizzazione
errors.rejectValue("stringMap[transitionComment]","error.publicEngagement.transitionComment.required");
}
}
|
Anchor |
---|
| impactIndicatorsValidatorPublicEngagement-anchor |
---|
| impactIndicatorsValidatorPublicEngagement-anchor |
---|
|
impactIndicatorsValidatorPublicEngagement Questa validazione controlla che non venga caricata la stessa tipologia di impactIndicators più volte
Dal punto di vista del modello dati si tratta degli elementi
impactIndicators Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement = object;
var wfItem = wfService.getWfItem(wfItemElement.getWfItemId());
var impactIndicatorType = wfItemElement.getWfDictionaryMap().get("dictionary");
if(impactIndicatorType != null){
var impactIndicatorsSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "impactIndicators", wfService);
var impactIndicatorsSetIterator = impactIndicatorsSet.iterator();
while(impactIndicatorsSetIterator.hasNext()){
var impactIndicatorsElement = impactIndicatorsSetIterator.next();
//controllo per non confrontare lo stesso oggetto
if(wfItemElement.getId() != impactIndicatorsElement.getId()){
var dictionary = impactIndicatorsElement.getWfDictionaryMap().get("dictionary");
if(impactIndicatorType.getId() == dictionary.getId()){
errors.reject("error.publicEngagement.impactIndicators.typeAlreadyPresent");
}
}
}
}
|
Anchor |
---|
| publicInvolvedDuplicatedValidatorPublicEngagement-anchor |
---|
| publicInvolvedDuplicatedValidatorPublicEngagement-anchor |
---|
|
publicInvolvedDuplicatedValidatorPublicEngagement Questa validazione controlla che non venga caricata la stessa tipologia di publicInvolved più volte.
Dal punto di vista del modello dati si tratta degli elementi
publicInvolved Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement = object;
var wfItem = wfService.getWfItem(wfItemElement.getWfItemId());
var publicInvolvedType = wfItemElement.getWfDictionaryMap().get("dictionary");
if(publicInvolvedType != null){
var publicInvolvedSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "publicInvolved", wfService);
var publicInvolvedSetIterator = publicInvolvedSet.iterator();
while(publicInvolvedSetIterator.hasNext()){
var publicInvolvedElement = publicInvolvedSetIterator.next();
//controllo per non confrontare lo stesso oggetto
if(wfItemElement.getId() != publicInvolvedElement.getId()){
var dictionary = publicInvolvedElement.getWfDictionaryMap().get("dictionary");
if(publicInvolvedType.getId() == dictionary.getId()){
errors.reject("error.publicEngagement.publicInvolved.typeAlreadyPresent");
}
}
}
}
|
Anchor |
---|
| specificOtherValuePopulatedValidatorPublicEngagement-anchor |
---|
| specificOtherValuePopulatedValidatorPublicEngagement-anchor |
---|
|
specificOtherValuePopulatedValidatorPublicEngagement Questa validazione controlla che venga popolata il campo per specificare l'attributo
specificOtherValue nel caso venga selezionata la tipologia Altro (publicInvolvedPublicEngagement.other) per il dizionario publicInvolvedType.
Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement = object;
var wfItem = wfService.getWfItem(wfItemElement.getWfItemId());
var publicInvolvedType = wfItemElement.getWfDictionaryMap().get("dictionary");
if(publicInvolvedType != null){
//log.error("publicInvolvedType: "+publicInvolvedType);
publicInvolvedType = wfService.getWfDictionary(publicInvolvedType.getId());
var publicInvolvedTypeCode = publicInvolvedType.getInternalSourceIdentifier();
//log.error("publicInvolvedType-Code: "+publicInvolvedTypeCode);
if(Packages.org.apache.commons.lang.StringUtils.equals("publicInvolvedPublicEngagement.other", publicInvolvedTypeCode) &&
wfItemElement.getStringMap().get("specificOtherValue") == null){
errors.rejectValue("stringMap[specificOtherValue]","error.publicEngagement.publicInvolved.specificOtherValue.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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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").valueOf() != new String(code).valueOf() && new String("publicInvolvedPublicEngagement.other-administratives").valueOf() != new String(code).valueOf() && new String("publicInvolvedPublicEngagement.other-unstructored-research-staff").valueOf() != new String(code).valueOf() && new String("publicInvolvedPublicEngagement.other-students-phd").valueOf() != new String(code).valueOf()) {
errors.reject("error.publicEngagement.publicInvolved.consistent");
}
}
}
}
|
Anchor |
---|
| addScientificAreaInvolvedFromNewOwnerValidatorPublicEngagement-anchor |
---|
| addScientificAreaInvolvedFromNewOwnerValidatorPublicEngagement-anchor |
---|
|
addScientificAreaInvolvedFromNewOwnerValidatorPublicEngagement Questa "validazione" va a popolare la sezione "Aree scientifiche coinvolte" nel tab "Classificazioni" ogni volta che viene aggiunto un nuovo owner.
Dal punto di vista del modello dati si tratta degli elementi
scientificAreasInvolved Per maggiori dettagli cfr. modello dati dell'entità publicEngagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(!errors.hasErrors()){
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement = object;
var wfItem = wfService.getWfItem(wfItemElement.getWfItemId());
var fragmentInfo = Packages.it.cilea.core.fragment.util.FragmentUtil.getFragmentableInfo(wfItemElement);
var newOwnerToAdd = wfItemElement.getPersonMap().get(fragmentInfo.getDiscriminator()+"Id");
var person = gaService.getPerson(newOwnerToAdd.getPersonId());
var positionLastSet = person.getPositionLastSet();
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(positionLastSet, "research", "academicArea");
positionLastSetIterator = positionLastSet.iterator();
while (positionLastSetIterator.hasNext()){
var position = positionLastSetIterator.next();
if (maxPriority == null || maxPriority.equals(position.getPriority())) {
if ("research".equals(position.getDiscriminator())
&& "academicArea".equals(position.getOrganizationUnit().getOrganizationUnitType().getDescription())) {
//log.error("FOUND ONE!");
//ora che ho trovato l'academicArea, vado a vedere se non è già presente
var scientificAreasInvolvedElementSet = wfItem.getWfItemElementSet("scientificAreasInvolved");
var scientificAreasInvolvedElementSetIterator = scientificAreasInvolvedElementSet.iterator();
var alreadyAdded = false;
while(scientificAreasInvolvedElementSetIterator.hasNext()){
var scientificAreasInvolvedElement = scientificAreasInvolvedElementSetIterator.next();
var orgUnit = scientificAreasInvolvedElement.getOrganizationUnitMap().get("ouId");
if(orgUnit.getOrganizationUnitId() == position.getOrganizationUnitId()){
alreadyAdded = true;
}
}
//se alla fine non l'ho trovata, allora la inserisco
if(!alreadyAdded){
var saiElement = new Packages.it.cilea.wf.model.WfItemElement();
saiElement.setDiscriminator("scientificAreasInvolved");
saiElement.setWfItemId(wfItem.getId());
saiElement.getOrganizationUnitMap().put("ouId", position.getOrganizationUnit());
wfService.saveOrUpdate(saiElement);
wfItem.getWfItemElementSet().add(saiElement);
//UTILIZZARE QUESTO Packages.it.cilea.core.fragment.util.FragmentUtil.addNewFragment(ouIe, wfService);
break;
}
}
}
}
}
|
Anchor |
---|
| transitionCommentRequired-anchor |
---|
| transitionCommentRequired-anchor |
---|
|
transitionCommentRequired Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le altre validazioni altrimenti no.
Prevede l'inserimento obbligatorio della motivazione quando l'iniziativa viene inviata nello stato "In validazione" a partire dallo stato "Riaperto".
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var penState = object.getWfState().getDescription();
var ownerStrictValidation = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.publicEngagement-validation-flow.owner.strictValidation.enable");
(ownerStrictValidation == "true" && Packages.org.apache.commons.lang.StringUtils.equals("reopened", penState))
|
Anchor |
---|
| wfIdentityLogicMultipleOwnerPublicEngagementStatesJs-anchor |
---|
| wfIdentityLogicMultipleOwnerPublicEngagementStatesJs-anchor |
---|
|
wfIdentityLogicMultipleOwnerPublicEngagementStatesJs Questa è una state logic che costruisce dinamicamente gli stati successivi raggiungibili dallo stato "
reopened" per i publicEngagement per i responsabili (owner).
Se la variabile di configurazione
ap.publicEngagement-validation-flow.owner.strictValidation.enable è valorizzata a
true allora viene applicato il flusso con validazione
strict.
Questo vuol dire che il responsabile, se riapre un item, dovrà necessariamente ripassare per lo step di validazione (
submitted) in carico agli organi dipartimentali o all'ufficio centrale.
Se la variabile invece non è definita o è settata ad un valore diverso allora verrà applicato il flusso di validazione
lenient ovvero a seguito di riapertura NON sarà necessario nuovo step di validazione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfTask = object;
var wfItem = wfService.getWfItem(wfTask.getWfItemId());
var ownerStrictValidationEnabledParam = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.publicEngagement-validation-flow.owner.strictValidation.enable");
var ownerStrictValidationEnabled=("true"==ownerStrictValidationEnabledParam)?true:false;
if (ownerStrictValidationEnabled){
wfTask.setWfNextStates("submitted");
} else {
wfTask.setWfNextStates("approved");
}
|
Anchor |
---|
| wfIdentityLogicMultipleHeadOfDepartmentPublicEngagementPermissionsJs-anchor |
---|
| wfIdentityLogicMultipleHeadOfDepartmentPublicEngagementPermissionsJs-anchor |
---|
|
wfIdentityLogicMultipleHeadOfDepartmentPublicEngagementPermissionsJs Questa è una permission logic che costruisce dinamicamente i permessi per i publicEngagement per i team dipartimentali (headOfDepartment).
Assegna i diritti di validazione ai referenti dei dipartimenti censiti.
Nel caso di pù dipartimenti vengono assegnati questi diritti al primo dipartimento che specifica uno di questi ruoli (nell'ordine specificato):
- RM - Public Engagement - Ruolo dipartimento (Coordinatore/Organizzatore - ouRolePublicEngagement.manager)
- RM - Public Engagement - Ruolo dipartimento (Partecipante - ouRolePublicEngagement.participant)
- RM - Public Engagement - Ruolo dipartimento (Afferenza del responsabile/partecipante - ouRolePublicEngagement.afferent)
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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("roleId", "ouRolePublicEngagement.manager", internalOrganizationUnitWfItemElementSet);
var hasOrgUnitPowerPermissions = false;
if(Packages.java.lang.Boolean.FALSE.equals(isManagerPresent)){
var isPartecipantPresent = Packages.it.cilea.wf.util.WfUtil.isRoleIdPresent("roleId", "ouRolePublicEngagement.participant", internalOrganizationUnitWfItemElementSet);
if(Packages.java.lang.Boolean.FALSE.equals(isPartecipantPresent)){
var isAfferentPresent = Packages.it.cilea.wf.util.WfUtil.isRoleIdPresent("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("ouId", organizationUnitFromIdentity.getId(), "roleId", "ouRolePublicEngagement.afferent", internalOrganizationUnitWfItemElementSet);
}
}else{
//log.error("xxx isPartecipantPresent");
hasOrgUnitPowerPermissions = Packages.it.cilea.wf.util.WfUtil.hasOrgUnitPowerPermissions("ouId", organizationUnitFromIdentity.getId(), "roleId", "ouRolePublicEngagement.participant", internalOrganizationUnitWfItemElementSet);
}
}else{
//log.error("xxx isManagerPresent");
hasOrgUnitPowerPermissions = Packages.it.cilea.wf.util.WfUtil.hasOrgUnitPowerPermissions("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);
|
Anchor |
---|
| wfStartLogicResearchCentre-anchor |
---|
| wfStartLogicResearchCentre-anchor |
---|
|
wfStartLogicResearchCentre Questa logica, in caso di creazione di un centro di ricerca interniversitario crea come partner di default l'Ateneo.
L'unità organizzativa associata all'Ateneo viene estratta dalla variabile
rm.orgunit.external.myOrganization Viene infine associato di default a questo partner il ruolo principale (researchCentrePartnerRole.main-seat)
Dal punto di vista del modello dati si tratta di
partner Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//se la tipologia selezionata è un qualsiasi figlio di "Centri di ricerca interuniversitari"
//inserire tra i partner l'ateneo con il ruolo sede principale
var parentWfItemTypeSet = wfItem.getWfItemType().getParentWfItemTypeSet();
if(parentWfItemTypeSet != null && !parentWfItemTypeSet.isEmpty()){
var parentWfItemTypeSetIterator = parentWfItemTypeSet.iterator();
while(parentWfItemTypeSetIterator.hasNext()){
var parentWfItemType = parentWfItemTypeSetIterator.next();
if(Packages.org.apache.commons.lang.StringUtils.equals("RSC.INT", parentWfItemType.getIdentifier())){
var externalOrgUnitRootId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
if(externalOrgUnitRootId != null){
var externalOrgUnitRoot = gaService.getOrganizationUnit(externalOrgUnitRootId);
var partnerElement = new Packages.it.cilea.wf.model.WfItemElement();
partnerElement.setDiscriminator("partner");
partnerElement.setWfItemId(wfItem.getId());
partnerElement.getOrganizationUnitMap().put("partnerId", externalOrgUnitRoot);
var researchCentrePartnerRoleWfDictionaryList = wfService.getWfDictionaryList("researchCentrePartnerRole", null, null);
var researchCentrePartnerRoleWfDictionaryListIterator = researchCentrePartnerRoleWfDictionaryList.iterator();
var researchCentrePartnerRoleMainSeat = null;
while(researchCentrePartnerRoleWfDictionaryListIterator.hasNext()){
var researchCentrePartnerRoleWfDictionary = researchCentrePartnerRoleWfDictionaryListIterator.next();
var dictionaryCode = researchCentrePartnerRoleWfDictionary.getStringMap().get("code");
if(Packages.org.apache.commons.lang.StringUtils.equals("researchCentrePartnerRole.main-seat", dictionaryCode)){
researchCentrePartnerRoleMainSeat = researchCentrePartnerRoleWfDictionary;
}
}
if(researchCentrePartnerRoleMainSeat != null){
partnerElement.getWfDictionaryMap().put("roleId", researchCentrePartnerRoleMainSeat);
wfService.saveOrUpdate(partnerElement);
wfItem.getWfItemElementSet().add(partnerElement);
wfService.saveOrUpdate(wfItem);
break;
}
}else{
// errors.reject("error.researchCentre.rm.orgunit.external.myOrganization.configuration.required");
}
}
}
}
true;
|
Anchor |
---|
| researchCentreAttachmentValidator-anchor |
---|
| researchCentreAttachmentValidator-anchor |
---|
|
researchCentreAttachmentValidator Validator per controllare presenza di almeno un allegato di tipo "Decreto" (researchCenterAttachmentType.decree)
Dal punto di vista del modello dati si tratta degli attributi
attachment Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var attachmentWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "attachment", wfService);
if(attachmentWfElementSet.isEmpty()){
errors.reject("error.researchCentre.attachment.required");
}else{
var flag = false;
var attachmentWfElementSetIterator = attachmentWfElementSet.iterator();
while(attachmentWfElementSetIterator.hasNext()){
var attachmentWfElement = attachmentWfElementSetIterator.next();
var attachmentTypeWfDictionary = attachmentWfElement.getWfDictionaryMap().get("attachmentTypeId");
var attachmentTypeWfDictionaryCode = attachmentTypeWfDictionary.getStringMap().get("code");
if(Packages.org.apache.commons.lang.StringUtils.equals("researchCenterAttachmentType.decree", attachmentTypeWfDictionaryCode)){
flag = true;
}
}
if(!flag){
errors.reject("error.researchCentre.attachment.required");
}
}
|
Anchor |
---|
| researchCentreInternalOrganizationUnitValidator-anchor |
---|
| researchCentreInternalOrganizationUnitValidator-anchor |
---|
|
researchCentreInternalOrganizationUnitValidator Validator per controllare la presenza di almeno un Dipartimento inserito e che non vi siano più Dipartimenti con ruolo "Sede Principale"
Dal punto di vista del modello dati si tratta degli attributi
internalOrganizationUnit Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var internalOrganizationUnitWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
if(internalOrganizationUnitWfElementSet.isEmpty()){
errors.reject("error.researchCentre.internalOrganizationUnit.required");
}else{
var counter = 0;
var internalOrganizationUnitWfElementSetIterator = internalOrganizationUnitWfElementSet.iterator();
while(internalOrganizationUnitWfElementSetIterator.hasNext()){
var internalOrganizationUnitWfElement = internalOrganizationUnitWfElementSetIterator.next();
if(internalOrganizationUnitWfElement.getWfDictionaryMap().get("roleId") != null){
var roleWfDictionary = internalOrganizationUnitWfElement.getWfDictionaryMap().get("roleId");
var roleWfDictionaryCode = roleWfDictionary.getStringMap().get("code");
if(Packages.org.apache.commons.lang.StringUtils.equals("researchCentreRole.main-seat", roleWfDictionaryCode)){
counter++;
}
}
}
if(counter > 1){
errors.reject("error.researchCentre.internalOrganizationUnit.onlyOneMainSeat");
}
if(counter = 0){
errors.reject("error.researchCentre.internalOrganizationUnit.oneMainSeatRequired");
}
}
|
Anchor |
---|
| researchCentreInternalOrganizationUnitRoleValidator-anchor |
---|
| researchCentreInternalOrganizationUnitRoleValidator-anchor |
---|
|
researchCentreInternalOrganizationUnitRoleValidator Validator per controllare non siano inseriti più Dipartimenti con ruolo "Sede Principale"
Dal punto di vista del modello dati si tratta degli attributi
internalOrganizationUnit Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//inutile, ma mi serve per ricordarmi il contesto
var internalOrgUnitWfElementObject = object;
var orgUnitRole = internalOrgUnitWfElementObject.getWfDictionaryMap().get("roleId");
if(orgUnitRole != null){
orgUnitRole = wfService.getWfDictionary(orgUnitRole.getId());
var orgUnitRoleCode = orgUnitRole.getStringMap().get("code");
if(Packages.org.apache.commons.lang.StringUtils.equals("researchCentreRole.main-seat", orgUnitRoleCode)){
var wfItem = wfService.getWfItem(internalOrgUnitWfElementObject.getWfItemId());
var internalOrgUnitWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
var internalOrgUnitWfElementSetIterator = internalOrgUnitWfElementSet.iterator();
var counter = 1;
while(internalOrgUnitWfElementSetIterator.hasNext()){
var internalOrgUnitWfElement = internalOrgUnitWfElementSetIterator.next();
var roleWfDictionary = internalOrgUnitWfElement.getWfDictionaryMap().get("roleId");
if(roleWfDictionary != null){
var roleWfDictionaryCode = roleWfDictionary.getStringMap().get("code");
if((internalOrgUnitWfElementObject.getId() != internalOrgUnitWfElement.getId()) && Packages.org.apache.commons.lang.StringUtils.equals("researchCentreRole.main-seat", roleWfDictionaryCode)){
counter++;
}
}
}
if (counter > 1){
errors.reject("error.researchCentre.internalOrganizationUnit.onlyOneMainSeat");
}
}
}
|
Anchor |
---|
| researchCentrePartnerValidator-anchor |
---|
| researchCentrePartnerValidator-anchor |
---|
|
researchCentrePartnerValidator Validator per controllare:
-se la tipologia selezionata è un qualsiasi figlio di "Centri di ricerca interuniversitari", la presenza dell'Ateneo inserito tra i Partner con un ruolo settato; se diverso da "Sede principale" deve essere compilato il campo Referenti esterni
-se la tipologia selezionata è un qualsiasi figlio di "Centri di ricerca interuniversitari", la presenza di almeno un altro Partner inserito con un ruolo diverso da "Sede principale"
-la presenza di un solo Partner marcato con ruolo "Sede principale"
Dal punto di vista del modello dati si tratta degli attributi
partner Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var parentWfItemTypeSet = wfItem.getWfItemType().getParentWfItemTypeSet();
if(parentWfItemTypeSet != null && !parentWfItemTypeSet.isEmpty()){
//so già che ho un solo parent, lo ricavo subito
var parentWfItemType = parentWfItemTypeSet.iterator().next();
var isRscIntType = Packages.org.apache.commons.lang.StringUtils.equals("RSC.INT", parentWfItemType.getIdentifier());
var partnerWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "partner", wfService);
if(partnerWfElementSet.isEmpty() && isRscIntType){
errors.reject("error.researchCentre.partner.RSC_INT.required");
}else{
var externalOrgUnitRoot = null;
if(isRscIntType){
var externalOrgUnitRootId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
if(externalOrgUnitRootId != null){
externalOrgUnitRoot = gaService.getOrganizationUnit(externalOrgUnitRootId);
}else{
// errors.reject("error.researchCentre.rm.orgunit.external.myOrganization.configuration.required");
}
}
var isUniversityPresent = false;
var isUniversityMainSeat = false;
var mainSeatRolePartnerCounter = 0;
var partnerWfElementSetIterator = partnerWfElementSet.iterator();
while(partnerWfElementSetIterator.hasNext()){
var partnerWfElement = partnerWfElementSetIterator.next();
var partnerRoleWfDictionary = partnerWfElement.getWfDictionaryMap().get("roleId");
var partnerIdOrgUnit = partnerWfElement.getOrganizationUnitMap().get("partnerId");
var isPartnerRoleMainSeat = Packages.org.apache.commons.lang.StringUtils.equals("researchCentrePartnerRole.main-seat", partnerRoleWfDictionary.getInternalSourceIdentifier());
if(isRscIntType && externalOrgUnitRoot !=null
&& partnerIdOrgUnit.getId() == externalOrgUnitRoot.getId()){
isUniversityPresent = true;
if(isPartnerRoleMainSeat){
isUniversityMainSeat = true;
}
}
if(isPartnerRoleMainSeat){
mainSeatRolePartnerCounter++;
}
}
if(isRscIntType){
if(!isUniversityPresent){
errors.reject("error.researchCentre.partner.RSC_INT.required");
}else{
if(!isUniversityMainSeat && wfItem.getStringMap().get("externalCommiteeReferee") == null){
errors.reject("error.researchCentre.partner.RSC_INT.required");
}
}
if(mainSeatRolePartnerCounter == partnerWfElementSet.size()){
errors.reject("error.researchCentre.partner.RSC_INT.otherPartnerWithRole");
}
}
if(mainSeatRolePartnerCounter > 1){
errors.reject("error.researchCentre.partner.onlyOneMainSeat");
}
}
}
|
Anchor |
---|
| researchCentrePartnerRoleValidator-anchor |
---|
| researchCentrePartnerRoleValidator-anchor |
---|
|
researchCentrePartnerRoleValidator Validator per controllare non siano inseriti più Partner con ruolo "Sede Principale"
Dal punto di vista del modello dati si tratta degli attributi
partner Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//inutile, ma mi serve per ricordarmi il contesto
var partnerWfElementObject = object;
var orgUnitRole = partnerWfElementObject.getWfDictionaryMap().get("roleId");
if(orgUnitRole != null){
orgUnitRole = wfService.getWfDictionary(orgUnitRole.getId());
var orgUnitRoleCode = orgUnitRole.getStringMap().get("code");
if(Packages.org.apache.commons.lang.StringUtils.equals("researchCentrePartnerRole.main-seat", orgUnitRoleCode)){
var wfItem = wfService.getWfItem(partnerWfElementObject.getWfItemId());
var partnerWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "partner", wfService);
var partnerWfElementSetIterator = partnerWfElementSet.iterator();
var counter = 1;
while(partnerWfElementSetIterator.hasNext()){
var partnerWfElement = partnerWfElementSetIterator.next();
var roleWfDictionary = partnerWfElement.getWfDictionaryMap().get("roleId");
roleWfDictionary = wfService.getWfDictionary(roleWfDictionary.getId());
var roleWfDictionaryCode = roleWfDictionary.getStringMap().get("code");
if((partnerWfElementObject.getId() != partnerWfElement.getId()) && Packages.org.apache.commons.lang.StringUtils.equals("researchCentrePartnerRole.main-seat", roleWfDictionaryCode)){
counter++;
}
}
if (counter > 1){
errors.reject("error.researchCentre.partner.onlyOneMainSeat");
}
}
}
|
Anchor |
---|
| researchCentreOwnerEndDateValidator-anchor |
---|
| researchCentreOwnerEndDateValidator-anchor |
---|
|
researchCentreOwnerEndDateValidator Validator per controllare non siano inseriti più di un Responsabile (owner) con data di fine nulla
Dal punto di vista del modello dati si tratta degli attributi
owner Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//inutile, ma mi serve per ricordarmi il contesto
var ownerWfElementObject = object;
if(ownerWfElementObject.getDateMap().get("endDate") == null){
var wfItem = wfService.getWfItem(ownerWfElementObject.getWfItemId());
var ownerWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "owner", wfService);
var ownerWfElementSetIterator = ownerWfElementSet.iterator();
var counter = 1;
while(ownerWfElementSetIterator.hasNext()){
var ownerWfElement = ownerWfElementSetIterator.next();
if((ownerWfElementObject.getId() != ownerWfElement.getId()) && (ownerWfElement.getDateMap().get("endDate") == null)){
counter++;
}
}
if(counter > 1){
errors.reject("error.researchCentre.owner.onlyOneEndDateNull");
}
}
|
Anchor |
---|
| researchCentreOwnerDatesValidator-anchor |
---|
| researchCentreOwnerDatesValidator-anchor |
---|
|
researchCentreOwnerDatesValidator Validator per controllare che le date di un Responsabile (owner) siano coerenti con le date di inizio e fine del centro di ricerca.
Si attiva quando :
- la data di inizio del Resposanbile è precedente alla data di inizio del Centro di Ricerca
- la data di fine del Responsabile è successiva alla data di fine del Centro di Ricerca
Dal punto di vista del modello dati si tratta degli attributi
owner.dateMap[startDate] e
owner.dateMap[endDate] Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//inutile, ma mi serve per ricordarmi il contesto
var ownerWfElement = object;
var wfItem = wfService.getWfItem(ownerWfElement.getWfItemId());
//non mi preoccupo di andare a scatenare errori sulle date nulle, ci sono già i validator appositi
if(ownerWfElement.getDateMap().get("startDate") != null){
if(wfItem.getDateMap().get("startDate") != null){
if(wfItem.getDateMap().get("startDate").after(ownerWfElement.getDateMap().get("startDate"))){
errors.reject("error.researchCentre.owner.dates.outOfRange");
}
}
}
if(ownerWfElement.getDateMap().get("endDate") != null){
if(wfItem.getDateMap().get("endDate") != null){
if(wfItem.getDateMap().get("endDate").before(ownerWfElement.getDateMap().get("endDate"))){
errors.reject("error.researchCentre.owner.dates.outOfRange");
}
}
}
|
Anchor |
---|
| researchCentreStartDateCoveredValidator-anchor |
---|
| researchCentreStartDateCoveredValidator-anchor |
---|
|
researchCentreStartDateCoveredValidator Questa validazione controlla che esista un intervallo in cui sia previsto un responsabile (owner) con la data di inizio del centro di ricerca (dateMap[startDate])
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(wfItem.getDateMap().get("startDate") != null){
var wfItemStartDate = wfItem.getDateMap().get("startDate");
var ownerWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "owner", wfService);
if(ownerWfElementSet.size() != 0){
var flag = false;
var ownerWfElementSetIterator = ownerWfElementSet.iterator();
while(ownerWfElementSetIterator.hasNext()){
var ownerWfElement = ownerWfElementSetIterator.next();
if(ownerWfElement.getDateMap().get("startDate") != null){
var ownerStartDate = ownerWfElement.getDateMap().get("startDate");
if(wfItemStartDate.after(ownerStartDate) || (wfItemStartDate.compareTo(ownerStartDate) == 0)){
flag = true;
}
}else{
//nel caso in cui un owner non abbia la data di inizio settata, allora è un errore e lo segnalo
//è improbabile, ma può essere l'owner di partenza (non completo)
errors.reject("error.researchCentre.owner.startDate.required");
}
}
if(!flag){
errors.reject("error.researchCentre.startDate.covered");
}
}else{
errors.reject("error.researchCentre.startDate.covered");
}
}
|
Anchor |
---|
| historicalDescriptionDateValidator-anchor |
---|
| historicalDescriptionDateValidator-anchor |
---|
|
historicalDescriptionDateValidator Validator per controllare che non ci sia sovrapposizione tra le date di inizio e fine dei elementi Storicizzazione denominazione e titolarità.
Dal punto di vista del modello dati si tratta degli attributi
historicalDescription Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfElementHistoricalDescriptionSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "historicalDescription", wfService);
var wfElementHistoricalDescriptionSetIterator = wfElementHistoricalDescriptionSet.iterator();
loop:
while (wfElementHistoricalDescriptionSetIterator.hasNext()) {
var wfElement = wfElementHistoricalDescriptionSetIterator.next();
var wfElementHistoricalDescriptionSetTemp = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "historicalDescription", wfService);
var wfElementHistoricalDescriptionSetIteratorTemp = wfElementHistoricalDescriptionSetTemp.iterator();
if(object.getDateMap().get("startDate").before(wfElement.getDateMap().get("endDate"))){
errors.reject("error.researchCentre.historicalDescription.beforeRoot");
}
while (wfElementHistoricalDescriptionSetIteratorTemp.hasNext()) {
var wfElementTemp = wfElementHistoricalDescriptionSetIteratorTemp.next();
if (((wfElementTemp.getDateMap().get("startDate").after(wfElement.getDateMap().get("startDate")) && wfElementTemp.getDateMap().get("startDate").before(wfElement.getDateMap().get("endDate"))) || (wfElementTemp.getDateMap().get("endDate").after(wfElement.getDateMap().get("startDate")) && wfElementTemp.getDateMap().get("endDate").before(wfElement.getDateMap().get("endDate"))))) {
errors.reject("error.researchCentre.historicalDescription.intervalDate");
break loop;
}
}
}
|
Anchor |
---|
| researchCentreEndDateCoveredValidator-anchor |
---|
| researchCentreEndDateCoveredValidator-anchor |
---|
|
researchCentreEndDateCoveredValidator Validator per controllare se nel caso in cui la data di fine sia popolata, esista un intervallo in cui sia previsto un owner con quella data di fine
Dal punto di vista del modello dati si tratta degli attributi
dateMap[endDate] Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(wfItem.getDateMap().get("endDate") != null){
var wfItemEndDate = wfItem.getDateMap().get("endDate");
var ownerWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "owner", wfService);
if(ownerWfElementSet.size() != 0){
var flag = false;
var ownerWfElementSetIterator = ownerWfElementSet.iterator();
while(ownerWfElementSetIterator.hasNext()){
var ownerWfElement = ownerWfElementSetIterator.next();
if(ownerWfElement.getDateMap().get("endDate") != null){
var ownerEndDate = ownerWfElement.getDateMap().get("endDate");
if(wfItemEndDate.before(ownerEndDate) || (wfItemEndDate.compareTo(ownerEndDate) == 0)){
flag = true;
}
}else{
//nel caso in cui un owner non abbia la data di fine settata, significa che è associato al Centro di Ricerca fino alla sua fine
flag = true;
}
}
if(!flag){
errors.reject("error.researchCentre.endDate.covered");
}
}else{
errors.reject("error.researchCentre.endDate.covered");
}
}
|
Anchor |
---|
| researchCentreFullCoveredWithNoOverlapsOrDiscontinuityValidator-anchor |
---|
| researchCentreFullCoveredWithNoOverlapsOrDiscontinuityValidator-anchor |
---|
|
researchCentreFullCoveredWithNoOverlapsOrDiscontinuityValidator Validator per verificare continuità degli intervalli temporali dei Responsabili a partire dalla data di inizio e controlla la non sovrapposizione.
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItemEndDate = wfItem.getDateMap().get("endDate");
var ownerWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "owner", wfService);
var checkResult = wfService.isThereOverlapOrDiscontinuity(ownerWfElementSet);
if(checkResult > 0){
errors.reject("error.researchCentre.owner.thereIsDiscontinuity");
}
if(checkResult < 0){
errors.reject("error.researchCentre.owner.thereIsOverLap");
}
|
Anchor |
---|
| laboratoryValidatorWorkgroup-anchor |
---|
| laboratoryValidatorWorkgroup-anchor |
---|
|
laboratoryValidatorWorkgroup Questa validazione controlla che se per ogni laboratorio collegato al gruppo di lavoro, questo sia in stato "Approved" o in stato "Reopened", altrimenti solleva un errore.
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupLaboratoryLink Per maggiori dettagli cfr. il modello dati dell'entità Gruppi di Lavoro
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dal fragment dei laboratory
var laboratorySet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getChildWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "workgroupLaboratoryLink", wfService);
//controllo banale, controllo che ci sia almeno un link, sennò non vado avanti
if(laboratorySet.size()>0){
//ricavo l'iteratore lo uso per ciclare il set
var laboratorySetIterator = laboratorySet.iterator();
while( laboratorySetIterator.hasNext() ){
//ricavo il singolo link e prendo il child che è il laboratory
var laboratoryLinkElement = laboratorySetIterator.next();
var laboratory= laboratoryLinkElement.getChild();
//poi ricavo il suo stato e controllo che sia in approved
var laboratoryState = laboratory.getWfState().getDescription();
if(!(Packages.org.apache.commons.lang.StringUtils.equals("approved", laboratoryState) || Packages.org.apache.commons.lang.StringUtils.equals("reopened", laboratoryState))){
//se non è approved o reopened allora lancia l'errore
errors.reject("error.workgroup.laboratory.mustBeApproved");
}
}
}
|
Anchor |
---|
| equipmentValidatorWorkgroup-anchor |
---|
| equipmentValidatorWorkgroup-anchor |
---|
|
equipmentValidatorWorkgroup Validazione che controlla che se esiste almeno una Grande Attrezzatura collegata al gruppo di lavoro, questa Attrezzatura deve essere in stato "Approved" o in stato "Reopened", altrimenti lancia un errore.
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupEquipmentLink Per maggiori dettagli cfr. modello dati dell'entità Gruppi di Lavoro
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dal fragment dei equipment
var equipmentSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getChildWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "workgroupEquipmentLink", wfService);
//controllo banale, controllo che ci sia almeno un link, sennò non vado avanti
if(equipmentSet.size()>0){
//ricavo l'iteratore lo uso per ciclare il set
var equipmentSetIterator = equipmentSet.iterator();
while( equipmentSetIterator.hasNext() ){
//ricavo il singolo link e prendo il child che è il equipment
var equipmentLinkElement = equipmentSetIterator.next();
var equipment= equipmentLinkElement.getChild();
//poi ricavo il suo stato e controllo che sia in approved
var equipmentState = equipment.getWfState().getDescription();
if(!(Packages.org.apache.commons.lang.StringUtils.equals("approved", equipmentState) || Packages.org.apache.commons.lang.StringUtils.equals("reopened", equipmentState))){
//se non è approved o reopened allora lancia l'errore
errors.reject("error.workgroup.equipment.mustBeApproved");
}
}
}
|
Anchor |
---|
| selfLinkedWorkgroupValidator-anchor |
---|
| selfLinkedWorkgroupValidator-anchor |
---|
|
selfLinkedWorkgroupValidator Questa validazione controlla che, il gruppo non venga collegato in un rapporto padre-figlio a se stesso
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupLink Per maggiori dettagli cfr. modello dati dell'entità Gruppi di Lavoro
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dal fragment dei workgroup
var workgroupSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getChildWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "workgroupLink", wfService);
//controllo banale, controllo che ci sia almeno un link, sennò non vado avanti
if(workgroupSet.size()>0){
//ricavo l'iteratore lo uso per ciclare il set
var workgroupSetIterator = workgroupSet.iterator();
while( workgroupSetIterator.hasNext() ){
//ricavo il singolo link e prendo il child che è il workgroup collegato
var workgroupLinkElement = workgroupSetIterator.next();
var workgroup= workgroupLinkElement.getChild();
if(object.getWfItemId()==workgroup.getWfItemId()){
//se sono uguali allora lancia l'errore
errors.reject("error.workgroup.workgroupLink.linkedToItself");
}
}
}
|
Anchor |
---|
| selfLinkedWorkgroupParentValidator-anchor |
---|
| selfLinkedWorkgroupParentValidator-anchor |
---|
|
selfLinkedWorkgroupParentValidator Questa validazione controlla che, il gruppo non venga collegato in un rapporto figlio-padre a se stesso
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupLink Per maggiori dettagli cfr. modello dati dell'entità Gruppi di Lavoro
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dal fragment dei workgroup
var workgroupSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getParentWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "workgroupLink", wfService);
//controllo banale, controllo che ci sia almeno un link, sennò non vado avanti
if(workgroupSet.size()>0){
//ricavo l'iteratore lo uso per ciclare il set
var workgroupSetIterator = workgroupSet.iterator();
while( workgroupSetIterator.hasNext() ){
//ricavo il singolo link e prendo il child che è il workgroup collegato
var workgroupLinkElement = workgroupSetIterator.next();
var workgroup= workgroupLinkElement.getParent();
if(object.getWfItemId()==workgroup.getWfItemId()){
//se sono uguali allora lancia l'errore
errors.reject("error.workgroup.workgroupLinkParent.linkedToItself");
}
}
}
|
Anchor |
---|
| approvedWorkgroupValidator-anchor |
---|
| approvedWorkgroupValidator-anchor |
---|
|
approvedWorkgroupValidator Validazione che controlla che, mentre viene collegato ad altri gruppi di lavoro in un rapporto padre-figlio, il Gruppo non venga collegato a Gruppi che non siano in stato "approved" o "reopened",
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupLink Per maggiori dettagli cfr. modello dati dell'entità Gruppi di Lavoro
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dal fragment dei workgroup
var workgroupSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getChildWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "workgroupLink", wfService);
//controllo banale, controllo che ci sia almeno un link, sennò non vado avanti
if(workgroupSet.size()>0){
//ricavo l'iteratore lo uso per ciclare il set
var workgroupSetIterator = workgroupSet.iterator();
while( workgroupSetIterator.hasNext() ){
//ricavo il singolo link e prendo il child che è il workgroup collegato
var workgroupLinkElement = workgroupSetIterator.next();
var workgroup= workgroupLinkElement.getChild();
//poi ricavo il suo stato e controllo che sia in approved o reopened
var workgroupState= workgroup.getWfState().getDescription();
if(!(Packages.org.apache.commons.lang.StringUtils.equals("approved", workgroupState) || Packages.org.apache.commons.lang.StringUtils.equals("reopened", workgroupState))){
//se non è approved o reopened allora lancia l'errore
errors.reject("error.workgroup.workgroupLink.mustBeApproved");
}
}
}
|
Anchor |
---|
| approvedWorkgroupParentValidator-anchor |
---|
| approvedWorkgroupParentValidator-anchor |
---|
|
approvedWorkgroupParentValidator Validazione che controlla che, mentre viene collegato ad altri gruppi di lavoro in un rapporto figlio-padre, il Gruppo non venga collegato a Gruppi che non siano in stato "approved" o "reopened",
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupLink Per maggiori dettagli cfr. modello dati dell'entità Gruppi di Lavoro
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dal fragment dei workgroup
var workgroupSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getParentWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "workgroupLink", wfService);
//controllo banale, controllo che ci sia almeno un link, sennò non vado avanti
if(workgroupSet.size()>0){
//ricavo l'iteratore lo uso per ciclare il set
var workgroupSetIterator = workgroupSet.iterator();
while( workgroupSetIterator.hasNext() ){
//ricavo il singolo link e prendo il parent che è il workgroup collegato
var workgroupLinkElement = workgroupSetIterator.next();
var workgroup= workgroupLinkElement.getParent();
//poi ricavo il suo stato e controllo che sia in approved o reopened
var workgroupState= workgroup.getWfState().getDescription();
if(!(Packages.org.apache.commons.lang.StringUtils.equals("approved", workgroupState) || Packages.org.apache.commons.lang.StringUtils.equals("reopened", workgroupState))){
//se non è approved o reopened allora lancia l'errore
errors.reject("error.workgroup.workgroupLinkParent.mustBeApproved");
}
}
}
|
Anchor |
---|
| projectValidatorWorkgroup-anchor |
---|
| projectValidatorWorkgroup-anchor |
---|
|
projectValidatorWorkgroup Questa validazione controlla che per ogni progetto collegato al gruppo di lavoro, questo sia in uno stato che è contenuto nella variabile
ap.wkg.workgroupProjectLink.csvAllowedProjectState altrimenti solleva un errore.
Questa variabile di configurazione deve essere popolata con elenco (separato da virgola) degli stati accettabili per i progetti aggaciabili.
Gli stati configurati di default sono operative, concluded
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupProjectLink Per maggiori dettagli cfr. modello dati dell'entità Gruppi di Lavoro
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dal fragment dei project
var projectSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getChildWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "workgroupProjectLink", wfService);
//controllo banale, controllo che ci sia almeno un link, sennò non vado avanti
if(projectSet.size()>0){
//variabile che mi servirà più tardi
var configStatesArray=[];
//controllo per vedere se è definita la variabile di configurazione con gli stati accettati
var csvAllowedProjectState=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.wkg.workgroupProjectLink.csvAllowedProjectState");
if (!csvAllowedProjectState){
//nel caso non sia definita
throw "Configuration variable ap.wkg.workgroupProjectLink.csvAllowedProjectState MUST BE DEFINED";
}else{
//vado a immettere in una lista tutti gli stati ricavati
configStatesArray = csvAllowedProjectState.split(',');
}
//ricavo l'iteratore lo uso per ciclare il set
var projectSetIterator = projectSet.iterator();
while( projectSetIterator.hasNext() ){
//ricavo il singolo link e prendo il child che è il project
var projectLinkElement = projectSetIterator.next();
var project = projectLinkElement.getChild();
//poi ricavo il suo stato e controllo che sia in uno degli stati ricavati dalla config
var projectState = project.getWfState().getDescription();
//vado a confrontare lo stato del progetto con tutti quelli ricavati
//se non è tra quelli in configurazione, scateno il messaggio di errore
//variabile per controllo, viene rigenerata per ogni progetto collegato
var isPermited=false;
for(var i=0; i<configStatesArray.length; i++){
if(Packages.org.apache.commons.lang.StringUtils.equals(configStatesArray[i], projectState))
isPermited=true;
}
if(isPermited==false){
//uso questo stratagemma visto che non conosco quanti stati possano essere accettati
var arrayStatesNamesAllArray = [];
var arrayStatesNamesAllString="";
//ciclo i nomi degli stati permessi e vado a ricavare il loro nome 'normale'
for(var i=0; i<configStatesArray.length; i++){
if(i>0)
arrayStatesNamesAllString+=", ";
arrayStatesNamesAllString += Packages.it.cilea.core.util.MessageUtilConstant.messageUtil.findMessage("wfState." + configStatesArray[i]);
}
arrayStatesNamesAllArray.push(arrayStatesNamesAllString);
errors.reject("error.workgroup.project.stateMustBeAccepted", arrayStatesNamesAllArray, null);
}
}
}
|
Anchor |
---|
| emailValidator-anchor |
---|
| emailValidator-anchor |
---|
|
emailValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItemElement=object;
var contactTypeId=wfItemElement.getGaDictionaryMap().get("contactType").getId();
var contactTypeDictionary=gaService.getGaDictionary(contactTypeId);
if (contactTypeDictionary.getDescription().equals("mail")){
var pattern = Packages.java.util.regex.Pattern
.compile("^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[\-A-Za-z0-9]+(\.[\-A-Za-z0-9]+)*(\.[A-Za-z]{2,})$");
var matcher = pattern.matcher(wfItemElement.getStringMap().get("description"));
if (!matcher.matches()) {
errors.rejectValue("stringMap[description]", "error.workgroup.contact.mail.invalidValue");
}
}
|
Anchor |
---|
| wfActionLogicSaveContributorDefault-anchor |
---|
| wfActionLogicSaveContributorDefault-anchor |
---|
|
wfActionLogicSaveContributorDefault Questa action logic serve per generare i task necessari per rendere visibile l'oggetto nella visione personale dei partecipanti.
I task vengono generati in automatico in fase di transizione da uno stato ad un altro.
Ci sono casi però dove vengono modificate delle informazioni senza effettuare nessuna transizione di stato come ad esempio il caso in cui venga aggiunto un nuovo partecipante ad un progetto che è già nello stato corretto.
Questa action logic, se agganciata in save, consente di generare i task per rendere visibile l'oggetto anche in visione personale del nuovo partecipante.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveContributorDefault |
Anchor |
---|
| wfActionLogicSaveTutorDefault-anchor |
---|
| wfActionLogicSaveTutorDefault-anchor |
---|
|
wfActionLogicSaveTutorDefault Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveTutorDefault |
Anchor |
---|
| wfActionLogicEnterSetForwardInConfirmedDate-anchor |
---|
| wfActionLogicEnterSetForwardInConfirmedDate-anchor |
---|
|
wfActionLogicEnterSetForwardInConfirmedDate Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (wfItem.getDateMap().get('forwardInConfirmedDate')==null) wfItem.getDateMap().put('forwardInConfirmedDate',java.util.Calendar.getInstance()); |
Anchor |
---|
| wfActionLogicEnterSetForwardInCompliantDate-anchor |
---|
| wfActionLogicEnterSetForwardInCompliantDate-anchor |
---|
|
wfActionLogicEnterSetForwardInCompliantDate Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (wfItem.getDateMap().get('forwardInCompliantDate')==null) wfItem.getDateMap().put('forwardInCompliantDate',java.util.Calendar.getInstance()); |
Anchor |
---|
| wfActionLogicSaveMultipleOrganizationUnit-anchor |
---|
| wfActionLogicSaveMultipleOrganizationUnit-anchor |
---|
|
wfActionLogicSaveMultipleOrganizationUnit Questa action logic serve per generare i task necessari per rendere visibile l'oggetto in visione dipartimentale.
I task vengono generati in automatico in fase di transizione da uno stato ad un altro.
Nei casi in cui le informazioni vengono modificate senza effettuare nessuna transizione è necessario procedere ad una rigenerazione dei task.
Ad esempio se viene aggiunto un nuovo dipartimento ad un progetto e viene effettuato un salvataggio (senza transizione di stato), questa logica, agganciata in salvataggio, genera i task per rendere visibile l'oggetto anche in visione dipartimentale del nuovo dipartimento.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveMultipleOrganizationUnit |
Anchor |
---|
| wfActionLogicSaveMultipleOwner-anchor |
---|
| wfActionLogicSaveMultipleOwner-anchor |
---|
|
wfActionLogicSaveMultipleOwner Questa action logic serve per generare i task necessari per rendere visibile l'oggetto nella visione personale dei responsabili scientifici.
I task vengono generati in automatico in fase di transizione da uno stato ad un altro.
Nei casi in cui le informazioni vengono modificate senza effettuare nessuna transizione è necessario procedere ad una rigenerazione dei task.
Ad esempio se viene aggiunto un nuovo responsabile scientifico ad un progetto e viene effettuato un salvataggio (senza transizione di stato), questa logica, agganciata in salvataggio, genera i task per rendere visibile l'oggetto anche in visione personale del nuovo responsabile scientifico.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveMultipleOwner |
Anchor |
---|
| wfActionLogicSaveMultipleAdministrativeOwner-anchor |
---|
| wfActionLogicSaveMultipleAdministrativeOwner-anchor |
---|
|
wfActionLogicSaveMultipleAdministrativeOwner Questa action logic serve per generare i task necessari per rendere visibile l'oggetto nella visione personale dei referenti amministrativi.
I task vengono generati in automatico in fase di transizione da uno stato ad un altro.
Nei casi in cui le informazioni vengono modificate senza effettuare nessuna transizione è necessario procedere ad una rigenerazione dei task.
Ad esempio se viene aggiunto un nuovo referente amministrativo ad un progetto e viene effettuato un salvataggio (senza transizione di stato), questa logica, agganciata in salvataggio, genera i task per rendere visibile l'oggetto anche in visione personale del nuovo referente amministrativo.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveMultipleAdministrativeOwner |
Anchor |
---|
| wfActionLogicSaveMultipleInternalRepresentatives-anchor |
---|
| wfActionLogicSaveMultipleInternalRepresentatives-anchor |
---|
|
wfActionLogicSaveMultipleInternalRepresentatives Questa action logic serve per generare i task necessari per rendere visibile l'oggetto nella visione personale dei delegati.
I task vengono generati in automatico in fase di transizione da uno stato ad un altro.
Nei casi in cui le informazioni vengono modificate senza effettuare nessuna transizione è necessario procedere ad una rigenerazione dei task.
Ad esempio se viene aggiunto un nuovo delegato ad un progetto e viene effettuato un salvataggio (senza transizione di stato), questa logica, agganciata in salvataggio, genera i task per rendere visibile l'oggetto anche in visione personale del nuovo delegato.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveMultipleInternalRepresentatives |
Anchor |
---|
| wfActionLogicSaveMultipleGenericPersonalVisionByDiscriminator-anchor |
---|
| wfActionLogicSaveMultipleGenericPersonalVisionByDiscriminator-anchor |
---|
|
wfActionLogicSaveMultipleGenericPersonalVisionByDiscriminator Questa action logic serve per generare i task necessari per rendere visibile l'oggetto nella visione personale.
I task vengono generati in automatico in fase di transizione da uno stato ad un altro.
Nei casi in cui le informazioni vengono modificate senza effettuare nessuna transizione è necessario procedere ad una rigenerazione dei task.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveMultipleGenericPersonalVisionByDiscriminator |
Anchor |
---|
| wfActionLogicVersionize-anchor |
---|
| wfActionLogicVersionize-anchor |
---|
|
wfActionLogicVersionize Questa action logica crea una snapshot per l'oggetto in questione e lo conserva tra versioni precedentis
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.logic.WfActionLogicVersionize |
Anchor |
---|
| wfActionLogicEnterMailSender-anchor |
---|
| wfActionLogicEnterMailSender-anchor |
---|
|
wfActionLogicEnterMailSender Questa action logic effettua l'invio di segnalazioni via mail ai vari attori del flusso.
L'invio delle segnalazioni viene pilotato dalle configurazioni abilitate.
Cfr.
Configurare le notifiche di RM Anchor |
---|
| wfStartLogicIdentifier-anchor |
---|
| wfStartLogicIdentifier-anchor |
---|
|
wfStartLogicIdentifier Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Viene effetuata la costruzione dell'identificativo utilizzando la logica definita nella variabile di configurazione
ap.<wfItemType>.identifier.logic configuration.
Se questa non è definita viene supposto l'utilizzo di
wfStartLogicStandardIdentifier Le logiche utilizzabili al momento sono:
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var sourceItemType = wfService.getWfItemType(wfItem.getWfItemTypeId());
var identifyLogic = Packages.it.cilea.wf.util.WfUtil.getParametricConfiguration("ap.<wfItemType>.identifier.logic", sourceItemType);
if(identifyLogic != null){
var startLogic = Packages.it.cilea.wf.WfConstant.START_LOGIC_MAP.get(identifyLogic);
startLogic.start(wfItem, request);
} else {
throw "To use wfStartLogicIdentifier you MUST specify ap.<wfItemType>.identifier.logic configuration";
}
|
Anchor |
---|
| wfStartLogicStandardIdentifier-anchor |
---|
| wfStartLogicStandardIdentifier-anchor |
---|
|
wfStartLogicStandardIdentifier Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Viene effetuata la costruzione dell'identificativo dell'oggetto seguendo le seguenti regole:
<CODE_TIPOLOGIA>-<PROGRESSIVO> - CODE_TIPOLOGIA: come da campo CODE da tassonomia scaricata dalla sezione "Alberatura tipologie RM/AP"; se si applica questa logica di costruzione identificativo evitare che il CODE abbia il carattere -, non può essere creata su DB la sequenza corrispondente per il progressivo
- PROGRESSIVO: numero progressivo
Esempio di costruzione dell'identificativo
PEN-0003.
Per maggiori dettagli cfr. modello dati dell'entità Progetto e l'alberatura delle tipologie.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
function buildIdentifier(counter, identifierCode) {
var counterString;
if (counter < 10)
counterString = "000" + counter;
else if (counter < 100)
counterString = "00" + counter;
else if (counter < 1000)
counterString = "0" + counter;
else
counterString = "" + counter;
identifierCode += "-" + counterString;
return identifierCode;
}
var identifierCode = wfService.getWfItemType(wfItem.getWfItemTypeId()).getCode();
var identifier;
if (wfItem.getIdentifier() == null ||
(wfItem.getIdentifier().lastIndexOf("-") >= 0 &&
!(wfItem.getIdentifier().substring(0, wfItem.getIdentifier().lastIndexOf("-"))).equals(identifierCode))
) {
var sequenceName = "item_" + identifierCode + "_seq";
var counter = wfService.updateSequence(sequenceName);
identifier = buildIdentifier(counter, identifierCode);
var isPresent = wfService.identifierIsPresent(identifier);
if (Packages.java.lang.Boolean.TRUE.equals(isPresent)) {
var maxValSequence = wfService.getMaxSequencesValueFromIdentifier(identifierCode + "-");
maxValSequence++;
counter = wfService.updateSequenceFromNumber(sequenceName, maxValSequence);
identifier = buildIdentifier(counter, identifierCode);
}
wfItem.setIdentifier(identifier);
}
|
Anchor |
---|
| wfStartLogicYearFromProposalStartDateIdentifier-anchor |
---|
| wfStartLogicYearFromProposalStartDateIdentifier-anchor |
---|
|
wfStartLogicYearFromProposalStartDateIdentifier Questa logica viene eseguita in fase di creazione di un nuovo progetto.
Viene effetuata la costruzione dell'identificativo dell'oggetto seguendo le seguenti regole:
<ANNO>-<CODICE>-<PROGRESSIVO> - ANNO: estratto dalla Data di avvio pratica (proposalStartDate)
- CODICE: come da tassonomia ap-item-type.xls; se si applica questa logica di costruzione identificativo evitare che il CODE abbia il carattere trattino -, non può essere creata su DB la sequenza corrispondente per il progressivo
- PROGRESSIVO: numero progressivo contestuale all'anno e codice
Esempio di costruzione dell'identificativo
2021-AL-0002.
Per maggiori dettagli cfr. modello dati dell'entità Progetto e l'alberatura delle tipologie.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
function buildIdentifier(counter, identifierCode) {
var counterString;
if (counter < 10)
counterString = "000" + counter;
else if (counter < 100)
counterString = "00" + counter;
else if (counter < 1000)
counterString = "0" + counter;
else
counterString = "" + counter;
identifierCode += "-" + counterString;
return identifierCode;
}
var startDate = wfItem.getDateMap().get("proposalStartDate");
var year = startDate.get(Packages.java.util.Calendar.YEAR);
var yearString = new Packages.java.lang.Integer(year).toString();
var sourceItemTypeCode = wfService.getWfItemType(wfItem.getWfItemTypeId()).getCode();
var stringBuilder = new Packages.java.lang.StringBuilder(yearString);
stringBuilder.append('-');
stringBuilder.append(sourceItemTypeCode);
var identifierCode = stringBuilder.toString();
var identifier;
if(wfItem.getIdentifier() == null || !(wfItem.getIdentifier().substring(0, wfItem.getIdentifier().lastIndexOf("-"))).equals(identifierCode)){
var sequenceName = "item_" + sourceItemTypeCode + "_" + year + "_seq";
var counter = wfService.updateSequence(sequenceName);
identifier = buildIdentifier(counter, identifierCode);
var isPresent = wfService.identifierIsPresent(identifier);
if (Packages.java.lang.Boolean.TRUE.equals(isPresent)) {
var maxNumber = wfService.getMaxSequencesValueFromIdentifier(identifierCode + "-");
maxNumber++;
counter = wfService.updateSequenceFromNumber(sequenceName, maxNumber);
identifier = buildIdentifier(counter, identifierCode);
}
wfItem.setIdentifier(identifier);
}
|
Anchor |
---|
| wfStartLogicYearFromStartDate-anchor |
---|
| wfStartLogicYearFromStartDate-anchor |
---|
|
wfStartLogicYearFromStartDate Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Viene recuperato l'anno dalla configurazione fatta nel seguente modo:
ap.+
"rootWfItemType"+
owner.position.date e viene salvato nel metadato
year Esempio:
ap.prj.owner.position.date Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var myDate=WfUtil.getCheckDate(wfItem, wfService);
if(myDate == null)
throw "The provided date MUST NOT be null";
var calendar = Calendar.getInstance();
calendar.setTime(myDate);
wfItem.setYear(new Packages.java.lang.Integer(calendar.get(Calendar.YEAR)));
|
Anchor |
---|
| wfStartLogicOwnerDependentItemTypeFirstIdentifier-anchor |
---|
| wfStartLogicOwnerDependentItemTypeFirstIdentifier-anchor |
---|
|
wfStartLogicOwnerDependentItemTypeFirstIdentifier Questa logica effettua la costruzione dell'identificativo dell'oggetto seguendo le seguenti regole:
<CODE_TIPOLOGIA>-<ANNO>-<PRIMA_LETTERA_NOME>-<PRIME_QUATTRO_LETTERE_COGNOME>-<PROGRESSIVO> - CODE_TIPOLOGIA: come da campo CODE da tassonomia scaricata dalla sezione "Alberatura tipologie RM/AP"
- ANNO: anno in due cifre estratto dalla data di inizio
- PRIMA_LETTERA_NOME: prima lettera del nome del responsabile
- PRIME_QUATTRO_LETTERE_COGNOME: prime quattro lettere del cognome del responsabile
- PROGRESSIVO: numero progressivo
Esempio di costruzione dell'identificativo
H202019IABBA_01.
Per maggiori dettagli cfr. modello dati dell'entità Progetto e l'alberatura delle tipologie.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","owner", wfService);
var person = Packages.it.cilea.wf.util.WfUtil.getOwnerForIdentifier(ownerWfElementSet, wfService);
var startDate = wfItem.getDateMap().get("proposalStartDate");
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 lastName = person.getLastName().replaceAll("\s", "");
lastName = lastName.replaceAll("'", "");
lastName = (lastName.length() >= 4) ? lastName.substring(0,4) : lastName.substring(0,lastName.length());
lastName = lastName.toUpperCase();
var firstName = person.getFirstName().substring(0,1);
firstName = firstName.toUpperCase();
var stringBuilder = new Packages.java.lang.StringBuilder(sourceItemTypeCode);
stringBuilder.append(yearString);
stringBuilder.append(firstName);
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);
}
|
Anchor |
---|
| wfStartLogicOwnerDependentLastNameFirstIdentifierAndAcronym-anchor |
---|
| wfStartLogicOwnerDependentLastNameFirstIdentifierAndAcronym-anchor |
---|
|
wfStartLogicOwnerDependentLastNameFirstIdentifierAndAcronym Questa logica effettua la costruzione dell'identificativo dell'oggetto seguendo le seguenti regole:
<PRIME_QUATTRO_LETTERE_COGNOME>_<PRIMA_LETTERA_NOME>_<ANNO>_<CODE_TIPOLOGIA>_<ACRONIMO>_<PROGRESSIVO> - PRIME_QUATTRO_LETTERE_COGNOME: prime quattro lettere del cognome del responsabile
- PRIMA_LETTERA_NOME: prima lettera del nome del responsabile
- ANNO: anno in due cifre estratto dalla data di inizio
- CODE_TIPOLOGIA: come da campo CODE da tassonomia scaricata dalla sezione "Alberatura tipologie RM/AP"
- ACRONIMO: acronimo dell'oggetto (può non essere presente)
- PROGRESSIVO: numero progressivo
Esempio di costruzione dell'identificativo
ROSS_P_21_PRJ_01.
Per maggiori dettagli cfr. modello dati dell'entità Progetto e l'alberatura delle tipologie.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","owner", wfService);
var person = Packages.it.cilea.wf.util.WfUtil.getOwnerForIdentifier(ownerWfElementSet, wfService);
var lastName = person.getLastName().replaceAll("\s", "");
lastName = lastName.replaceAll("'", "");
lastName = (lastName.length() >= 3) ? lastName.substring(0,4) : lastName.substring(0,lastName.length());
lastName = lastName.toUpperCase();
var firstName = person.getFirstName().substring(0,1);
firstName = firstName.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 acronym = wfItem.getStringMap().get("acronym");
var stringBuilder = new Packages.java.lang.StringBuilder(lastName);
stringBuilder.append("_");
stringBuilder.append(firstName);
stringBuilder.append("_");
stringBuilder.append(yearString);
stringBuilder.append("_");
stringBuilder.append(sourceItemTypeCode);
if(acronym != null){
acronym = acronym.replaceAll("\s", "");
acronym = acronym.toUpperCase();
stringBuilder.append("_");
stringBuilder.append(acronym);
}
var identifier = stringBuilder.toString();
identifier = (identifier.length() > 46) ? identifier.substring(0,46) : identifier.substring(0,identifier.length());
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);
}
|
Anchor |
---|
| wfStartLogicDepartmentAndOwnerDependentIdentifier-anchor |
---|
| wfStartLogicDepartmentAndOwnerDependentIdentifier-anchor |
---|
|
wfStartLogicDepartmentAndOwnerDependentIdentifier Questa logica effettua la costruzione dell'identificativo dell'oggetto seguendo le seguenti regole:
<CODICE_CSA_DEL_DIPARTIMENTO>-<CODICE_TIPO_PROGETTO>-<ULTIME_DUE_CIFRE_ANNO>-<PRIME_5_LETTERE_COGNOME>_<PROGRESSIVO> - CODICE_CSA_DEL_DIPARTIMENTO: codice del dipartimento da recuperare nel metadato orgUnit.stringMap[idCsa]
- CODICE_TIPO_PROGETTO: come da campo CODE da tassonomia scaricata dalla sezione "Alberatura tipologie RM/AP"
- ULTIME_DUE_CIFRE_ANNO: anno in due cifre estratto dalla data di inizio
- PRIME_5_LETTERE_COGNOME: prime cinque lettere del cognome del responsabile
- PROGRESSIVO: numero progressivo
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "owner", wfService);
var person = Packages.it.cilea.wf.util.WfUtil.getOwnerForIdentifier(ownerWfElementSet, wfService);
var idCsa = null;
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 {
idCsa = department.getStringMap().get("idCsa");
}
} else {
throw "To use wfStartLogicDepartmentAndOwnerDependentIdentifier you MUST specify department";
}
if (idCsa == 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(idCsa);
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);
}
|
Anchor |
---|
| wfStartLogicOwnerDependentLastNameFirstIdentifier-anchor |
---|
| wfStartLogicOwnerDependentLastNameFirstIdentifier-anchor |
---|
|
wfStartLogicOwnerDependentLastNameFirstIdentifier Questa logica effettua la costruzione dell'identificativo dell'oggetto seguendo le seguenti regole:
<CODE_TIPOLOGIA>-<ANNO>-<PRIMA_LETTERA_NOME>-<PRIME_TRE_LETTERE_COGNOME>-<PROGRESSIVO> - PRIME_TRE_LETTERE_COGNOME: prime quattro lettere del cognome del responsabile
- PRIMA_LETTERA_NOME: prima lettera del nome del responsabile
- CODE_TIPOLOGIA: come da campo CODE da tassonomia scaricata dalla sezione "Alberatura tipologie RM/AP"
- ANNO: anno in due cifre estratto dalla data di inizio
- PROGRESSIVO: numero progressivo
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","owner", wfService);
var person = Packages.it.cilea.wf.util.WfUtil.getOwnerForIdentifier(ownerWfElementSet, wfService);
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 lastName = person.getLastName().replaceAll("\s", "");
lastName = lastName.replaceAll("'", "");
lastName = (lastName.length() >= 3) ? lastName.substring(0,3) : lastName.substring(0,lastName.length());
lastName = lastName.toUpperCase();
var firstName = person.getFirstName().substring(0,1);
firstName = firstName.toUpperCase();
var stringBuilder = new Packages.java.lang.StringBuilder(lastName);
stringBuilder.append(firstName);
stringBuilder.append('_');
stringBuilder.append(sourceItemTypeCode);
stringBuilder.append('_');
stringBuilder.append(yearString);
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);
}
|
Anchor |
---|
| wfStartLogicAcademicField2000-anchor |
---|
| wfStartLogicAcademicField2000-anchor |
---|
|
wfStartLogicAcademicField2000 Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Recupera il responsabile scientifico (
owner), estrae il SSD relativo all'ultimo rapporto di lavoro valido prioritario relativo al contesto ricerca ed aggancia questa informazione all'oggetto radice.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var person=null;
person=wfItem.getPersonMap().get("owner");
var person2 = gaService.getPerson(person.getId());
var positionLastSet = person2.getPositionLastSet();
var maxPriority2 = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(positionLastSet, "research", "academicField2000");
positionLastSetIterator=positionLastSet.iterator();
while (positionLastSetIterator.hasNext()){
var position=positionLastSetIterator.next();
if (maxPriority2 == null || maxPriority2.equals(position.getPriority())) {
if ("research".equals(position.getDiscriminator()) && "academicField2000"
.equals(position.getOrganizationUnit().getOrganizationUnitType().getDescription())) {
var ssdElement=new Packages.it.cilea.wf.model.WfItemElement();
ssdElement.setDiscriminator("academicField2000");
ssdElement.setWfItemId(wfItem.getId());
ssdElement.getOrganizationUnitMap().put("organizationUnit", position.getOrganizationUnit());
wfService.saveOrUpdate(ssdElement);
wfItem.getWfItemElementSet().add(ssdElement);
break;
}
}
}
true;
|
Anchor |
---|
| wfStartLogicMultipleOwners-anchor |
---|
| wfStartLogicMultipleOwners-anchor |
---|
|
wfStartLogicMultipleOwners Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Effettua il setup del responsabile scientifico (
owner) ed estrae la sua afferenza dipartimentale che aggancia all'oggetto radice (
internalOrganization)
La data alla quale estrarre l'afferenza dipartimentale del responsabile è quella contenuta nel metadato con il nome recuperabile dalla configurazione
ap.<tipologia>.owner.position.date.
Se questa configurazione
- NON è presente, viene usato la data inserita nel metadato startDate
- è presente ed ha valore uguale a CURRENT viene usata la data corrente
- è presente ed ha valore uguale a CURRENT_OR_LAST viene usata l'ultima afferenza dipartimentale disponibile (attiva o cessata)
- è presente ed NON ha un valore tra quelli elencati allora viene usata la data presente nel metadato con il nome specificato
E' possibile decidere se settare in automatico il metadato startDate per il responsabile.
Se la configurazione
ap.<tipologia>.owner.startDate.enabled:
- NON è presente, allora NON viene abilitato l'automatismo di recupero della startDate
- è uguale a false allora NON viene abilitato l'automatismo di recupero della startDate
- è uguale a true allora viene inserita come startDate lo stesso valore recuperato con le logiche descritte al punto prima
- altrimenti NON viene abilitato l'automatismo di recupero della startDate
E' inoltre possibile stabilire quali siano i contesti all'interno dei quali cercare l'afferenza dipartimentale per il responsabile scientifico.
Questo viene pilotato dalla configurazione
ap.<tipologia>.owner.position.context.
Se questa configurazione
- NON è presente, viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a research allora viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a support allora viene usato il solo contesto di supporto (TA)
- è uguale a ALL allora vengono usati entrambi i contesti
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var person = wfItem.getPersonMap().get("owner");
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");
var ownerElement = new WfItemElement();
ownerElement.setDiscriminator("owner");
ownerElement.setWfItemId(wfItem.getId());
ownerElement.getPersonMap().put("ownerId", person);
if (WfUtil.isOwnerStartDateAutomaticPopulationEnabled(wfItem, wfService) && checkDate != null){
var calendar=Calendar.getInstance();
calendar.setTime(checkDate);
ownerElement.getDateMap().put("startDate", calendar);
}
WfUtil.addRoleInElementIfDefined(wfItem, ownerElement, wfService);
wfService.saveOrUpdate(ownerElement);
wfItem.getWfItemElementSet().add(ownerElement);
wfItem.getPersonMap().put("owner", null);
if (department!=null){
var internalOrganizationUnitElement=new WfItemElement();
internalOrganizationUnitElement.setDiscriminator("internalOrganizationUnit");
internalOrganizationUnitElement.setWfItemId(wfItem.getId());
internalOrganizationUnitElement.getOrganizationUnitMap().put("ouId", department);
WfUtil.addRoleInElementIfDefined(wfItem, internalOrganizationUnitElement, wfService);
wfService.saveOrUpdate(internalOrganizationUnitElement);
wfItem.getWfItemElementSet().add(internalOrganizationUnitElement);
}
}
true;
|
Anchor |
---|
| wfStartLogicPartner-anchor |
---|
| wfStartLogicPartner-anchor |
---|
|
wfStartLogicPartner Questa logica viene eseguita in fase di creazione di un nuovo progetto.
Viene eseguito l'nserimento dell'Ateneo tra i partner con il ruolo di default "Partner Unico"
Per maggiori dettagli cfr. excel modello dati dell'entità di riferimento
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var uniquePartnerRoleId = WfUtil.getDictionaryByCode(wfService, "partnerRole.uniquePartner");
var myOrganization = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("rm.orgunit.external.myOrganization");
if (uniquePartnerRoleId == null || myOrganization == null){
throw "Configuration variables partnerRole.uniquePartner and rm.orgunit.external.myOrganization MUST BE DEFINED";
} else {
uniquePartnerRoleId = wfService.getWfDictionary(new Packages.java.lang.Integer(uniquePartnerRoleId));
myOrganization = gaService.getOrganizationUnit(new Packages.java.lang.Integer(myOrganization));
var partnerElement = new Packages.it.cilea.wf.model.WfItemElement();
partnerElement.setDiscriminator("partner");
partnerElement.setWfItemId(wfItem.getId());
partnerElement.getOrganizationUnitMap().put("partnerId", myOrganization);
partnerElement.getWfDictionaryMap().put("partnerRole", uniquePartnerRoleId);
wfService.saveOrUpdate(partnerElement);
}
|
Anchor |
---|
| wfStartLogicMultipleInternalOrganizationUnits-anchor |
---|
| wfStartLogicMultipleInternalOrganizationUnits-anchor |
---|
|
wfStartLogicMultipleInternalOrganizationUnits Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Aggiunge l'unità organizzativa (internalOrganizationUnit) all'oggetto che si sta creando utilizzando l'unità organizzativa specificata in fase di creazione (organizationUnitMap[ouId]).
Aggiunge anche, se previsto il ruolo di default dell'unità organizzativa se viene trovata la configurazione ap.<tipologia>.internalOrganizationUnit.role.main, dove <tipologia> indica il codice della tipologia. che è navigabile fino alla radice.
Ad esempio se la configurazione ap.pen.formazione-comunicazione.internalOrganizationUnit.role.main è settata a 15, vuol dire che il ruolo con id 15 è quello che verrà associato all'unità organizzativa selezionata nel caso di iniziative di public engagement di formazione e comunicazione.
Se la configurazione fosse ap.pen.internalOrganizationUnit.role.main (e non esistesse quella più specifica presentata sopra) e fosse settata a 15, vuol dire che il ruolo con id 15 è quello che verrà associato all'unità organizzativa selezionata nel caso di tutte le iniziative di public engagement
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//caricamento internalOrganizationUnit
var internalOrganizationUnit = wfItem.getOrganizationUnitMap().get("ouId");
if (internalOrganizationUnit != null){
internalOrganizationUnit = gaService.getOrganizationUnit(internalOrganizationUnit.getId());
var internalOrganizationUnitElement = new Packages.it.cilea.wf.model.WfItemElement();
internalOrganizationUnitElement.setDiscriminator("internalOrganizationUnit");
internalOrganizationUnitElement.setWfItemId(wfItem.getId());
internalOrganizationUnitElement.getOrganizationUnitMap().put("ouId",internalOrganizationUnit);
Packages.it.cilea.wf.util.WfUtil.addRoleInElementIfDefined(wfItem, internalOrganizationUnitElement, wfService);
wfService.saveOrUpdate(internalOrganizationUnitElement);
wfItem.getWfItemElementSet().add(internalOrganizationUnitElement);
wfItem.getOrganizationUnitMap().put("ouId", null);
}
true;
|
Anchor |
---|
| wfStartLogicAdministrativeOwnerFromUser-anchor |
---|
| wfStartLogicAdministrativeOwnerFromUser-anchor |
---|
|
wfStartLogicAdministrativeOwnerFromUser Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Aggiunge il referente amministrativo all'oggetto che si sta creando.
Precisamente:
- Viene recuperata la macrotipologia dell'oggetto che si sta creando (macrotype)
- Viene recuperata la variabile di configurazione ap.<macrotype>.administrativeOwner.inheritFromLoggedUserIfResourcePresent
- Questa configurazione, se presente, contiene le risorse relative ai profili per i quali inserire come referente amministrativo dell'oggetto, l'utente corrente.
Ad esempio supponiamo la variabile di conf ap.prj.administrativeOwner.inheritFromLoggedUserIfResourcePresent=/DEPARTMENT.profile,/RESEARCH_DIVISION.profile.
Questo vuol dire che se un utente che appartiene a un team con profili dipartimentali o divisione ricerca effettua la creazione di un oggetto, verrà inserito lui stesso come referente amministrativo. Per maggiori dettagli cfr. modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var typeForConfig;
var itemType = wfService.getWfItemType(wfItem.getWfItemTypeId());
if (!itemType.getParentWfItemTypeSet().isEmpty()) {
var parentSetIterator = itemType.getParentWfItemTypeSet().iterator();
while (parentSetIterator.hasNext()){
var parent = parentSetIterator.next();
if (!parent.getParentWfItemTypeSet().isEmpty()) {
var parentParentSetIterator = parent.getParentWfItemTypeSet().iterator();
while (parentParentSetIterator.hasNext()){
var parentParent = parentParentSetIterator.next();
typeForConfig = parentParent;
break;
}
}
break;
}
}
var profiles = '';
if(typeForConfig.getIdentifier() == 'CON' || typeForConfig.getIdentifier() == 'PRJ'){
profiles = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap."+ typeForConfig.getIdentifier().toLowerCase() +".administrativeOwner.inheritFromLoggedUserIfResourcePresent");
var profileArray = profiles.split(",");
var gaUserDetail = Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();
for(i in profileArray){
if(gaUserDetail.hasAuthorities(profileArray[i])){
var administrativeOwnerElement = new Packages.it.cilea.wf.model.WfItemElement();
administrativeOwnerElement.setDiscriminator("administrativeOwner");
administrativeOwnerElement.setWfItemId(wfItem.getId());
var person = gaService.getPerson(gaUserDetail.getPersonId())
administrativeOwnerElement.getPersonMap().put("administrativeOwner", person);
wfService.saveOrUpdate(administrativeOwnerElement);
wfItem.getWfItemElementSet().add(administrativeOwnerElement);
break;
}
}
}
true;
|
Anchor |
---|
| wfStartLogicVisibileOnPortal-anchor |
---|
| wfStartLogicVisibileOnPortal-anchor |
---|
|
wfStartLogicVisibileOnPortal Questa logica viene eseguita in fase di creazione di un nuovo oggetto.
Viene effetuata la valorizzazione dell'attributo "Visibile su portale pubblico"(booleanMap[visibleOnPortal]) utilizzando il valore definita nella variabile di configurazione
ap.<wfItemType>.visibleOnPortal.default.
Per esempio per utilizzarla nei Gruppi di Ricerca (workgroup) la configurazione dovrà essere "ap.wkg.visibleOnPortal.default".
Questa configurazione è trasversale su tutti i flussi di quella entità.
I possibili casi sono:
- Se la config è popolata è ha valore true (indipendentemente dal case) allora viene presettato il valore booleano a true
- Se la config è popolata è ha valore false (indipendentemente dal case) allora viene presettato il valore booleano a false
- Se la config non è presente o non è popolata o il valore è diverso da true/false allora non viene fatto nessun preset
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var sourceItemType = wfService.getWfItemType(wfItem.getWfItemTypeId()).getRootWfItemType();
var visibleOnPortalConfiguration = Packages.it.cilea.wf.util.WfUtil.getParametricConfiguration("ap.<wfItemType>.visibleOnPortal.default", sourceItemType);
if(visibleOnPortalConfiguration != null){
visibleOnPortalConfiguration = visibleOnPortalConfiguration.trim();
if(!visibleOnPortalConfiguration.isEmpty()){
if (Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase(visibleOnPortalConfiguration, "true")){
wfItem.getBooleanMap().put("visibleOnPortal", true);
}
if (Packages.org.apache.commons.lang.StringUtils.equalsIgnoreCase(visibleOnPortalConfiguration, "false")){
wfItem.getBooleanMap().put("visibleOnPortal", false);
}
//if else, do nothing
}else{
// do nothing
}
} else {
// do nothing
// throw "To use wfStartLogicIdentifier you MUST specify ap.<wfItemType>.visibleOnPortal.default configuration";
}
|
Anchor |
---|
| multipleOwnerValidator-anchor |
---|
| multipleOwnerValidator-anchor |
---|
|
multipleOwnerValidator Questa validazione verifica che esista almeno un responsabile (owner)
Per maggiori dettagli cfr. il modello modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (object.getId()==null){
if (object.getPersonMap().get("owner")==null){
errors.rejectValue("personMap[owner]","error.owner.required");
}
} else {
if (object.getPersonMap().get("owner")==null){
var ownerWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","owner", wfService);
if(ownerWfElementSet.isEmpty()){
errors.reject("error.owner.required");
}
}
}
|
Anchor |
---|
| multipleContributorValidator-anchor |
---|
| multipleContributorValidator-anchor |
---|
|
multipleContributorValidator Questa validazione verifica che esista almeno un Docente interno (contributor)
Per maggiori dettagli cfr. il modello modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (object.getId()==null){
if (object.getPersonMap().get("contributor")==null){
errors.rejectValue("personMap[contributor]","error.contributor.required");
}
} else {
if (object.getPersonMap().get("contributor")==null){
var contributorWfElementSet = FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","contributor", wfService);
if(contributorWfElementSet.isEmpty()){
errors.reject("error.contributor.required");
}
}
}
|
Anchor |
---|
| startDateAndEndDateValidator-anchor |
---|
| startDateAndEndDateValidator-anchor |
---|
|
startDateAndEndDateValidator Questa validazione controlla che la date di inizio preceda la data di fine
Dal punto di vista del modello dati si tratta degli attributi
startDate e
endDate Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(object.getDateMap().get("endDate") != null){
if(object.getDateMap().get("startDate") != null){
if(object.getDateMap().get("startDate").getTime().after(object.getDateMap().get("endDate").getTime())){
errors.reject("error.date.startDateEndDateNotCompatible");
}
} else {
errors.reject("error.date.startDateEndDateNotCompatible");
}
}
|
Anchor |
---|
| wfIdentityLogicOwnerSimplePermissionsJs-anchor |
---|
| wfIdentityLogicOwnerSimplePermissionsJs-anchor |
---|
|
wfIdentityLogicOwnerSimplePermissionsJs Questa è una permissions logic che costruisce dinamicamente i permessi per gli item per gli owner.
Se la variabile di configurazione
ap.xxxx-flow.owner.create è settata a
true o
non è valorizzata allora vengono assegnati all'owner i seguenti permessi:
Se la variabile di configurazione
ap.xxxx-flow.owner.create è settata a
false allora vengono assegnati all'owner i seguenti permessi:
Se la variabile di configurazione
ap.xxxx-flow.owner.create dove xxxx è il nome del flusso è settata a
true o
non è valorizzata allora viene consentita la creazione di nuovi item agli owner.
Se la variabile di configurazione
ap.xxxx-flow.owner.create dove xxxx è il nome del flusso è settata a
false allora
NON viene consentita la creazione di nuovi item agli owner.
In caso di modifica di queste variabili di configurazione procedere con un reload delle Configurazioni ed effettuare un nuovo upload della tassonomia per forzare anche il reload delle risorse che pilotano la visibilità dei bottoni di creazione dell'oggetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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()).valueOf() == new String(additionalTeamCheck).valueOf()) {
foundTeam = true;
}
}
if (foundTeam == false) {
errors.reject("error." + ancestorType.toLowerCase() + ".headOfDepartment.additionalTeamCheck");
}
}
}
|
Anchor |
---|
| contributorAndInternalOrganizationUnitDateValidator-anchor |
---|
| contributorAndInternalOrganizationUnitDateValidator-anchor |
---|
|
contributorAndInternalOrganizationUnitDateValidator Validator per controllare che non ci sia sovrapposizione tra le date di inizio e fine dei vari elementi.
Dal punto di vista del modello dati si tratta degli attributi
contributor e
internalOrganizationUnit Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfElementContributorSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "contributor", wfService);
var wfElementContributorSetIterator = wfElementContributorSet.iterator();
loopContributor:
while (wfElementContributorSetIterator.hasNext()) {
var wfElement = wfElementContributorSetIterator.next();
var wfElementContributorSetTemp = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "contributor", wfService);
var wfElementContributorSetIteratorTemp = wfElementContributorSetTemp.iterator();
while (wfElementContributorSetIteratorTemp.hasNext()) {
var wfElementTemp = wfElementContributorSetIteratorTemp.next();
if(wfElementTemp.getId() != wfElement.getId()){
if(wfElement.getDateMap().get("endDate") == null && wfElementTemp.getDateMap().get("endDate") == null){
errors.reject("error.researchCentre.contributor.onlyOneEndDateNull");
break loopContributor;
} else{
if(wfElement.getDateMap().get("endDate") == null){
if(wfElementTemp.getDateMap().get("endDate").after(wfElement.getDateMap().get("startDate"))){
errors.reject("error.researchCentre.contributor.intervalDate");
break loopContributor;
}
} else{
if(wfElementTemp.getDateMap().get("endDate") == null){
if(wfElement.getDateMap().get("endDate").after(wfElementTemp.getDateMap().get("startDate"))){
errors.reject("error.researchCentre.contributor.intervalDate");
break loopContributor;
}
} else{
if (((wfElementTemp.getDateMap().get("startDate").after(wfElement.getDateMap().get("startDate")) && wfElementTemp.getDateMap().get("startDate").before(wfElement.getDateMap().get("endDate"))) || (wfElementTemp.getDateMap().get("endDate").after(wfElement.getDateMap().get("startDate")) && wfElementTemp.getDateMap().get("endDate").before(wfElement.getDateMap().get("endDate"))))) {
errors.reject("error.researchCentre.contributor.intervalDate");
break loopContributor;
}
}
}
}
}
}
}
var wfElementInternalOrganizationUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
var wfElementInternalOrganizationUnitSetIterator = wfElementInternalOrganizationUnitSet.iterator();
loopInternalOrganizationUnit:
while (wfElementInternalOrganizationUnitSetIterator.hasNext()) {
var wfElement = wfElementInternalOrganizationUnitSetIterator.next();
var wfElementInternalOrganizationUnitSetTemp = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
var wfElementInternalOrganizationUnitSetIteratorTemp = wfElementInternalOrganizationUnitSetTemp.iterator();
while (wfElementInternalOrganizationUnitSetIteratorTemp.hasNext()) {
var wfElementTemp = wfElementInternalOrganizationUnitSetIteratorTemp.next();
if(wfElementTemp.getId() != wfElement.getId()){
if(wfElement.getDateMap().get("endDate") == null && wfElementTemp.getDateMap().get("endDate") == null){
errors.reject("error.researchCentre.internalOrganizationUnit.onlyOneEndDateNull");
break loopInternalOrganizationUnit;
} else{
if(wfElement.getDateMap().get("endDate") == null){
if(wfElementTemp.getDateMap().get("endDate").after(wfElement.getDateMap().get("startDate"))){
errors.reject("error.researchCentre.internalOrganizationUnit.intervalDate");
break loopInternalOrganizationUnit;
}
} else{
if(wfElementTemp.getDateMap().get("endDate") == null){
if(wfElement.getDateMap().get("endDate").after(wfElementTemp.getDateMap().get("startDate"))){
errors.reject("error.researchCentre.internalOrganizationUnit.intervalDate");
break loopInternalOrganizationUnit;
}
} else{
if (((wfElementTemp.getDateMap().get("startDate").after(wfElement.getDateMap().get("startDate")) && wfElementTemp.getDateMap().get("startDate").before(wfElement.getDateMap().get("endDate"))) || (wfElementTemp.getDateMap().get("endDate").after(wfElement.getDateMap().get("startDate")) && wfElementTemp.getDateMap().get("endDate").before(wfElement.getDateMap().get("endDate"))))) {
errors.reject("error.researchCentre.internalOrganizationUnit.intervalDate");
break loopInternalOrganizationUnit;
}
}
}
}
}
}
}
|
Anchor |
---|
| contributorAndInternalOrganizationUnitStartDateValidator-anchor |
---|
| contributorAndInternalOrganizationUnitStartDateValidator-anchor |
---|
|
contributorAndInternalOrganizationUnitStartDateValidator Questa validazione controlla che tutte le strutture interne (internalOrganizationUnit) abbiano la data di Inizio valorizzata(dateMap[startDate]) Questa validazione controlla che tutte le persone del Comitato Membri interni (contributoor) abbiano la data di Inizio valorizzata(dateMap[startDate])
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var internalOrganizationUnitWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService);
if(internalOrganizationUnitWfElementSet.size() != 0){
var internalOrganizationUnitWfElementSetIterator = internalOrganizationUnitWfElementSet.iterator();
while(internalOrganizationUnitWfElementSetIterator.hasNext()){
var internalOrganizationUnitWfElement = internalOrganizationUnitWfElementSetIterator.next();
if(internalOrganizationUnitWfElement.getDateMap().get("startDate") == null){
errors.reject("error.researchCentre.internalOrganizationUnit.startDate.required");
}
}
}
var contributorWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement", "contributor", wfService);
if(contributorWfElementSet.size() != 0){
var contributorWfElementSetIterator = contributorWfElementSet.iterator();
while(contributorWfElementSetIterator.hasNext()){
var contriutorWfElement = contributorWfElementSetIterator.next();
if(contriutorWfElement.getDateMap().get("startDate") == null){
errors.reject("error.researchCentre.contributor.startDate.required");
}
}
}
|
Anchor |
---|
| checkElementDateBetweenItemDateValidator-anchor |
---|
| checkElementDateBetweenItemDateValidator-anchor |
---|
|
checkElementDateBetweenItemDateValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItemElementStartDate = object.getDateMap().get("startDate");
var wfItemElementEndDate = object.getDateMap().get("endDate");
var sourceItemType = wfService.getWfItemType(object.getWfItem().getWfItemTypeId());
var startDateDiscriminator = WfUtil.getParametricConfiguration("ap.<wfItemType>.contributorAndOwner.validator.date.start.discriminator", sourceItemType);
var endDateDiscriminator = WfUtil.getParametricConfiguration("ap.<wfItemType>.contributorAndOwner.validator.date.end.discriminator", sourceItemType);
var wfItemStartDate = object.getWfItem().getDateMap().get(startDateDiscriminator);
var wfItemEndDate = object.getWfItem().getDateMap().get(endDateDiscriminator);
var formatter = Packages.org.apache.commons.lang.time.FastDateFormat.getInstance("dd/MM/yyyy");
if( wfItemElementStartDate!= null && wfItemStartDate && (wfItemElementStartDate.before(wfItemStartDate) || (wfItemEndDate!=null && wfItemElementStartDate.after(wfItemEndDate))) ){
var suffixMessage=" - ";
if (wfItemEndDate!=null){
suffixMessage+=formatter.format(wfItemEndDate.getTime());
} else
suffixMessage+="<QUALSIASI DATA MAGGIORE DELLA DATA DI INIZIO>";
errors.rejectValue("dateMap[startDate]", "error.date.startDateOfElementAfterStartDateOfItemValidator", [formatter.format(wfItemStartDate.getTime()) + suffixMessage], null);
}
if( wfItemElementEndDate != null && wfItemStartDate && (wfItemElementEndDate.before(wfItemStartDate) || (wfItemEndDate != null && wfItemElementEndDate.after(wfItemEndDate))) ){
var suffixMessage=" - ";
if (wfItemEndDate != null){
suffixMessage += formatter.format(wfItemEndDate.getTime());
} else
suffixMessage += "<QUALSIASI DATA MAGGIORE DELLA DATA DI INIZIO>";
errors.rejectValue("dateMap[endDate]", "error.date.checkElementDateBetweenItemDateValidator.endDate", [formatter.format(wfItemStartDate.getTime()) + suffixMessage], null);
}
|
Anchor |
---|
| internalOrganizationUnitValidator-anchor |
---|
| internalOrganizationUnitValidator-anchor |
---|
|
internalOrganizationUnitValidator Questa validazione controlla che esista almeno una unità organizzativa responsabile (
internalOrganizationUnit)
Per maggiori dettagli cfr. modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var internalOrganizationUnitWfElementSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
if(internalOrganizationUnitWfElementSet.isEmpty()){
errors.reject("error.internalOrganizationUnit.required");
}
|
Anchor |
---|
| contributorValidator-anchor |
---|
| contributorValidator-anchor |
---|
|
contributorValidator Validator per controllare presenza di almeno un partecipante (contributor)
Dal punto di vista del modello dati si tratta degli attributi
contributor Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var contributorWfElementSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","contributor", wfService);
if(contributorWfElementSet.isEmpty()){
errors.reject("error.contributor.required");
}
|
Anchor |
---|
| keywordErcValidator-anchor |
---|
| keywordErcValidator-anchor |
---|
|
keywordErcValidator validator per controllare presenza di almeno una classificazione ERC
Dal punto di vista del modello dati si tratta degli attributi
keywordErc Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var keywordErcWfElementSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","keywordErc", wfService);
if(keywordErcWfElementSet.isEmpty()){
errors.reject("error.keywordErc.required");
}
|
Anchor |
---|
| esfriClassificationValidator-anchor |
---|
| esfriClassificationValidator-anchor |
---|
|
esfriClassificationValidator validator per controllare presenza di almeno una classificazione ERC
Dal punto di vista del modello dati si tratta degli attributi
esfriClassification Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var esfriClassificationWfElementSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","esfriClassification", wfService);
if(esfriClassificationWfElementSet.isEmpty()){
errors.reject("error.esfriClassification.required");
}
|
Anchor |
---|
| keywordAtecoValidator-anchor |
---|
| keywordAtecoValidator-anchor |
---|
|
keywordAtecoValidator validator per controllare presenza di almeno una classificazione ATECO
Dal punto di vista del modello dati si tratta degli attributi
keywordAteco Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var keywordAtecoWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","keywordAteco", wfService);
if(keywordAtecoWfElementSet.isEmpty()){
errors.reject("error.keywordAteco.required");
}
|
Anchor |
---|
| keywordUserDefinedValidator-anchor |
---|
| keywordUserDefinedValidator-anchor |
---|
|
keywordUserDefinedValidator Questa validazione controlla la presenza di almeno una parola chiave libera.
Dal punto di vista del modello dati si tratta degli attributi
keywordUserDefined Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var keywordUserDefinedWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","keywordUserDefined", wfService);
if(keywordUserDefinedWfElementSet.isEmpty()){
errors.reject("error.keywordUserDefined.required");
}
|
Anchor |
---|
| researchLineValidator-anchor |
---|
| researchLineValidator-anchor |
---|
|
researchLineValidator Questa validazione presenza di almeno una linea di ricerca
Dal punto di vista del modello dati si tratta degli attributi
researchLine Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var researchLineWfElementSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","researchLine", wfService);
if(researchLineWfElementSet.isEmpty()){
errors.reject("error.researchLine.required");
}
|
Anchor |
---|
| checkDateExtensionValidator-anchor |
---|
| checkDateExtensionValidator-anchor |
---|
|
checkDateExtensionValidator Questa validazione controlla la coerenza delle date inserite.
Precisamente, viene controllato che:
- startDate minore o uguale a endDate relativi all'oggetto radice
- durationInMonth maggiore o uguale a 0 relativo all'oggetto radice
- gli elementi di tipo approval abbiano una data maggiore della startDate dell'oggetto radice
- gli elementi di tipo extension abbiano una data maggiore della startDate dell'oggetto radice
Per maggiori dettagli cfr. modello dati dell'entità in questione.
Questa validazione viene attivata SOLO se
ap.checkDateExtensionValidator.enabled=true Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var enable=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.checkDateExtensionValidator.enabled");
if(enable.equalsIgnoreCase("true")){
var startDate=object.getDateMap().get("startDate");
var endDate=object.getDateMap().get("endDate");
if(startDate ==null){
errors.reject("error.notNull.fieldLabelKey", [messageUtil.findMessage("label.project.startDate")], null);
}
if(endDate ==null){
errors.reject("error.notNull.fieldLabelKey", [messageUtil.findMessage("label.project.endDate")], null);
}
if(endDate != null && startDate != null){
if(startDate.getTime().after(endDate.getTime())){
errors.reject("error.date.startDateEndDateNotCompatible");
}
}
var durationInMonth=object.getIntegerMap().get("durationInMonth");
if(durationInMonth==null||durationInMonth<0){
errors.reject("error.project.durationInMonth");
}
var wfItemElementSet = object.getWfItemElementSet();
if(endDate!=null&&startDate!=null){
var extensionSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "extension", wfService);
var extensionSetIterator=extensionSet.iterator();
while(extensionSetIterator.hasNext()){
var extensionElement=extensionSetIterator.next();
if (endDate.compareTo(extensionElement.getDateMap().get("currentEndDate"))<0 ||
durationInMonth<extensionElement.getIntegerMap().get("currentDurationInMonth")){
errors.reject("error.project.extension.date");
}
if(extensionElement.getDateMap().get("previousEndDate").getTime().after(extensionElement.getDateMap().get("currentEndDate").getTime())){
errors.reject("error.date.startDateEndDateNotCompatible");
}
}
approvalSet= Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "approval", wfService);
var approvalSetIterator=approvalSet.iterator();
while(approvalSetIterator.hasNext()){
var approvalElement=approvalSetIterator.next();
var approvalDate=approvalElement.getDateMap().get("approvalDate");
if (approvalDate!=null){
if(approvalDate.getTime().after(startDate.getTime())){
errors.reject("error.project.approval.date");
}
}
}
};
}
|
Anchor |
---|
| ownerPositionStartValidator-anchor |
---|
| ownerPositionStartValidator-anchor |
---|
|
ownerPositionStartValidator Questa validazione viene triggerata SOLO se la configurazione
ap.<tipologia>.owner.internalOrganizationUnit.mandatory è settata a true.
Se questa configurazione non viene trovata la validazione NON viene eseguita.
Verifica che l'owner (responsabile scientifico) inserito in fase di creazione abbia una afferenza dipartimentale.
La data alla quale estrarre l'afferenza dipartimentale del responsabile è quella contenuta nel metadato con il nome recuperabile dalla configurazione
ap.<tipologia>.owner.position.date.
Se questa configurazione
- NON è presente, viene usato la data inserita nel metadato startDate
- è presente ed ha valore uguale a CURRENT viene usata la data corrente
- è presente ed ha valore uguale a CURRENT_OR_LAST viene usata l'ultima afferenza dipartimentale disponibile (attiva o cessata)
- è presente ed NON ha un valore tra quelli elencati allora viene usata la data presente nel metadato con il nome specificato
E' inoltre possibile stabilire quali siano i contesti all'interno dei quali cercare l'afferenza dipartimentale per il responsabile scientifico.
Questo viene pilotatao dalla configurazione
ap.<tipologia>.owner.position.context.
Se questa configurazione
- NON è presente, viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a research allora viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a support allora viene usato il solo contesto di supporto (TA)
- è uguale a ALL allora vengono usati entrambi i contesti
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!errors.hasErrors() && object.getId()==null){
var isInternalOrganizationMandatory=WfUtil.getMandatory(object,"owner");
if (isInternalOrganizationMandatory){
var checkDate = WfUtil.getCheckDate(object, wfService);
var positionContext = WfUtil.getPositionContext(object, wfService);
var owner = object.getPersonMap().get("owner");
var ownerPositionSet = WfUtil.getPositionSet(owner, checkDate, positionContext, "department", gaService);
if(ownerPositionSet.isEmpty()){
var positionContextDescription="";
var checkDateDescription="";
if ("research"==positionContext){
positionContextDescription="di ricerca";
}
if (checkDate==null){
checkDateDescription="corrente o ultima disponibile"
} else {
checkDateDescription="alla data " + FastDateFormat.getInstance("dd/MM/yyyy").format(checkDate);
}
errors.reject("error.owner.position", [positionContextDescription,checkDateDescription], null);
}
}
}
|
Anchor |
---|
| getYearFromStartDateValidator-anchor |
---|
| getYearFromStartDateValidator-anchor |
---|
|
getYearFromStartDateValidator Logica lanciata in fase di salvataggio che ricava l'anno dalla data di inizio e lo salva nel metadato year.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var startDate=object.getDateMap().get("startDate");
//log.error("startDate: "+startDate.getTime());
if(startDate!=null){
object.year=startDate.get(startDate.YEAR);
}else{
errors.reject("error.startDate.required");
}
|
Anchor |
---|
| addOrgUnitFromNewOwnerValidator-anchor |
---|
| addOrgUnitFromNewOwnerValidator-anchor |
---|
|
addOrgUnitFromNewOwnerValidator Questa logica, ogni volta che viene aggiunto un nuovo owner (responsabile scientifico) o contributor(partecipante), ne ricava il dipartimento e lo aggiunge ai Dipartimenti di afferenza, se non già presente.
La data alla quale estrarre l'afferenza dipartimentale del responsabile è quella contenuta nel metadato con il nome recuperabile dalla configurazione
ap.<tipologia>.owner.position.date.
Se questa configurazione
- NON è presente, viene usata la data inserita nel metadato startDate
- è presente ed ha valore uguale a CURRENT viene usata la data corrente
- è presente ed ha valore uguale a CURRENT_OR_LAST viene usata l'ultima afferenza dipartimentale disponibile (attiva o cessata)
- è presente ed NON ha un valore tra quelli elencati allora viene usata la data presente nel metadato con il nome specificato
E' inoltre possibile stabilire quali siano i contesti all'interno dei quali cercare l'afferenza dipartimentale per il responsabile scientifico.
Questo viene pilotatao dalla configurazione
ap.<tipologia>.owner.position.context.
Se questa configurazione
- NON è presente, viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a research allora viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a support allora viene usato il solo contesto di supporto (TA)
- è uguale a ALL allora vengono usati entrambi i contesti
E' possibile infine definire le mappature tra ruolo dell'owner|contributor e il ruolo del dipartimento che deve essere aggiunto.
Questo viene pilotato dalla variabile di configurazione ap.pen.[owner|contributor].role.<id_numerico_dizionario>.inheritedInternalOrganizationUnit.role
Il valore di questa configuazione indica il valore numerico del dizionario associato al ruolo del dipartimento per quello specifico ruolo dell'[owner|contributor]
Tipicamente queste mappature vengono gestite a livello di sistema.
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(!errors.hasErrors()){
var wfItemElement = object;
var wfItem = wfService.getWfItem(wfItemElement.getWfItemId());
var fragmentInfo = FragmentUtil.getFragmentableInfo(wfItemElement);
var newOwnerToAdd = wfItemElement.getPersonMap().get(fragmentInfo.getDiscriminator()+"Id");
if(newOwnerToAdd != null){
var person= gaService.getPerson(newOwnerToAdd.getPersonId());
var checkDate=WfUtil.getCheckDate(wfItem, wfService);
var positionContext=WfUtil.getPositionContext(wfItem, wfService);
var ownerPositionSet=WfUtil.getPositionSet(person, checkDate, positionContext, "department", gaService);
var newOwnerOrgUnit=GaUtil.getPriorityOrganizationUnit(ownerPositionSet, positionContext, "department");
if (newOwnerOrgUnit!=null){
//cerco se c'è già il dipartimento, se no lo aggiungo
var orgUnitWfElementSet=FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","internalOrganizationUnit", wfService);
var orgUnitWfElementSetIterator=orgUnitWfElementSet.iterator();
var alreadyAdded=false;
while(orgUnitWfElementSetIterator.hasNext()){
var orgUnitElement=orgUnitWfElementSetIterator.next();
var orgUnit= orgUnitElement.getOrganizationUnitMap().get("ouId");
if(orgUnit.getOrganizationUnitId()==newOwnerOrgUnit.getId()){
alreadyAdded=true;
break;
}
}
if(!alreadyAdded){
var ouIe=new WfItemElement();
ouIe.setDiscriminator("internalOrganizationUnit");
ouIe.setWfItemId(wfItem.getId());
ouIe.getOrganizationUnitMap().put("ouId", newOwnerOrgUnit);
var roleId=wfItemElement.getWfDictionaryMap().get("roleId");
if (roleId!=null && fragmentInfo!=null){
WfUtil.addRoleInElementIfPresent(wfItem,roleId,fragmentInfo, ouIe, wfService);
}
FragmentUtil.addNewFragment(ouIe, wfService);
}
}
}
}
|
Anchor |
---|
| notEmptyResearchPositionValidatorTutor-anchor |
---|
| notEmptyResearchPositionValidatorTutor-anchor |
---|
|
notEmptyResearchPositionValidatorTutor Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//validator che controlla se il tutor inserito abbia una posizione di ricerca presso un dipartimento
function showOrHiddenError(error, mandatory){
if(mandatory){
errors.reject(error);
}else {
//log.error(error);
}
}
//prima controllo che non ci siano stati errori
//se non ci sono stati allora vado avanti
if(!errors.hasErrors()){
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement=object;
var fragmentInfo=Packages.it.cilea.core.fragment.util.FragmentUtil.getFragmentableInfo(wfItemElement);
//var newTutorToAdd= wfItemElement.getPersonMap().get(fragmentInfo.getDiscriminator()+"Id"); //no così visto che ha discriminator particolare
var newTutorToAdd= wfItemElement.getPersonMap().get("contributorId");
var person= gaService.getPerson(newTutorToAdd.getPersonId());
var wfItem= wfService.getWfItem(wfItemElement.getWfItemId());
var mandatory=Packages.it.cilea.wf.util.WfUtil.getMandatory(wfItem,fragmentInfo.getDiscriminator());
if(wfItemElement.getDateMap().get("startDate")==null)
errors.reject("error.startDate.required");
else{
//ricerca del dipartimento associato alla persona
var tutorDepartmentPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
tutorDepartmentPositionSearch.setPersonId(person.getId());
tutorDepartmentPositionSearch.setDate(wfItemElement.getDateMap().get("startDate").getTime());
tutorDepartmentPositionSearch.setOrganizationUnitTypeDescription("department");
tutorDepartmentPositionSearch.setDiscriminator("research");
var tutorDepartmentPositionSet = gaService.getPositionSearchList(tutorDepartmentPositionSearch, 0);
if(tutorDepartmentPositionSet.isEmpty()){
showOrHiddenError("error.tutor.emptyResearchPosition",mandatory);
}
}
}
|
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.
Verifica che l'utente che sta creando un nuovo oggetto a livello dipartimentale, specifichi come responsabile scientifico una persona che afferisce al proprio dipartimento.
Se non viene specificato nessun responsabile scientifico, questa validazione verrà ignorata.
La data alla quale estrarre l'afferenza dipartimentale del responsabile è quella contenuta nel metadato con il nome recuperabile dalla configurazione
ap.<tipologia>.owner.position.date.
Se questa configurazione
- NON è presente, viene usato la data inserita nel metadato startDate
- è presente ed ha valore uguale a CURRENT viene usata la data corrente
- è presente ed ha valore uguale a CURRENT_OR_LAST viene usata l'ultima afferenza dipartimentale disponibile (attiva o cessata)
- è presente ed NON ha un valore tra quelli elencati allora viene usata la data presente nel metadato con il nome specificato
E' inoltre possibile stabilire quali siano i contesti all'interno dei quali cercare l'afferenza dipartimentale per il responsabile scientifico.
Questo viene pilotatao dalla configurazione
ap.<tipologia>.owner.position.context.
Se questa configurazione
- NON è presente, viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a research allora viene usato il solo contesto di ricerca (docenti, ricercatori, dottorandi, ...)
- è uguale a support allora viene usato il solo contesto di supporto (TA)
- è uguale a ALL allora vengono usati entrambi i contesti
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(!errors.hasErrors()){
if (object.getId()==null){
if(GaUtil.isCurrentUserInDepartmentView(gaAuthorizationService)){
var owner = object.getPersonMap().get("owner");
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 isCurrentUserAuthorizedOnDepartment=GaUtil.isCurrentUserAuthorizedOnDepartment(department, gaAuthorizationService);
if(!isCurrentUserAuthorizedOnDepartment){
var positionContextDescription="";
var checkDateDescription="";
if ("research"==positionContext){
positionContextDescription="di ricerca";
}else if ("support"==positionContext){
positionContextDescription="di supporto";
}
if (checkDate==null){
checkDateDescription="corrente o ultima disponibile"
} else {
checkDateDescription="alla data " + FastDateFormat.getInstance("dd/MM/yyyy").format(checkDate);
}
errors.reject("error.owner.position.department.mustBeSameAsHead", [positionContextDescription,checkDateDescription], null);
}
}
}
}
}
|
Anchor |
---|
| departmentChangeRoleValidator-anchor |
---|
| departmentChangeRoleValidator-anchor |
---|
|
departmentChangeRoleValidator Questa validazione opera sull'elemento
internalOrganizationUnit figlio dell'oggetto radice.
Se l'utente è in visione dipartimentale per il dipartimento X e tenta di modificare il ruolo del dipartimento X nell'oggetto radice, viene sollevato un errore se il nuovo ruolo prevede diritti inferiori.
Questa operazione viene impedita in quanto la modifica del ruolo porterebbe l'utente a non potere più operare su quell'oggetto.
Ad esempio se un utente accede in visione dipartimentale ad un progetto e cambia il ruolo del
suo dipartimento da "Principale" ad "Aggregato", l'operazione viene impedita perché il ruolo "Aggregato" prevede diritti inferiori.
Questa operazione è consentita in visione completa per i team abilitati.
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ouIdToCheck = object.getIntegerMap().get("ouIdPreviousValue");
var ouRoleToCheck = object.getIntegerMap().get("roleIdPreviousValue");
if(ouRoleToCheck != null){
if (ouIdToCheck == null){
ouIdToCheck = object.getOrganizationUnitMap().get("ouId").getId();
}
if (ouRoleToCheck == null){
if (object.getWfDictionaryMap().get("roleId") != null){
ouRoleToCheck = object.getWfDictionaryMap().get("roleId").getId();
}
}
if (GaUtil.isCurrentUserInDepartmentView(gaAuthorizationService)){
if (WfUtil.isOrganizationUnitBindedWithTask(gaService.getOrganizationUnit(ouIdToCheck), request.getParameter("wfTaskId"), wfTaskService)){
object.getOrganizationUnitMap().put("ouId",gaService.getOrganizationUnit(ouIdToCheck));
object.getWfDictionaryMap().put("roleId",wfService.getWfDictionary(ouRoleToCheck));
wfService.saveOrUpdate(object);
errors.reject("error.operation.headOfDepartment.changeRole");
}
}
}
|
Anchor |
---|
| departmentDeleteValidator-anchor |
---|
| departmentDeleteValidator-anchor |
---|
|
departmentDeleteValidator Questa validazione opera sull'elemento
internalOrganizationUnit figlio dell'oggetto radice.
Se l'utente è in visione dipartimentale per il dipartimento X e tenta di eliminare il dipartimento X dall'oggetto radice, viene sollevato un errore in quanto cancellando questa associazione, l'utente non potrebbe più operare su quell'oggetto.
Questa operazione è consentita in visione completa per i team abilitati.
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (GaUtil.isCurrentUserInDepartmentView(gaAuthorizationService)){
if (WfUtil.isOrganizationUnitBindedWithTask(object.getOrganizationUnitMap().get("ouId"), request.getParameter("wfTaskId"), wfTaskService))
errors.reject("error.operation.headOfDepartment.cannotDeleteHisDepartment");
}
|
Anchor |
---|
| notEditableFragmentValidator-anchor |
---|
| notEditableFragmentValidator-anchor |
---|
|
notEditableFragmentValidator Questa validazione impedisce la modifica dei dati in un fragment.
Può agire sia in caso di salvataggio che in caso di eliminazione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
errors.reject("error.operation.notallowed");
|
Anchor |
---|
| contributorAndOwnerValidatorWithStartEndDate-anchor |
---|
| contributorAndOwnerValidatorWithStartEndDate-anchor |
---|
|
contributorAndOwnerValidatorWithStartEndDate Questa validazione opera sugli elementi
owner (responsabile scientifico) e
contributor (partecipante) figli dell'oggetto radice.
Viene verificato che l'intervallo di validità degli oggetti figli siano compresi all'interno della validità dell'oggetto padre.
Gli attributi per le date di inizio e fine sono
startDate e
endDate per gli elementi
owner e
contributor.
Sono di default gli stessi anche per l'oggetto padre, a meno che non venga inserita la configurazione gerarchica opportuna, ad es. "ap.prj.contributorAndOwner.validator.date.end.discriminator", che definisce il discriminator del metadato di tipo data dell'oggetto padre.
Per maggiori dettagli cfr. modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var elementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "contributor", wfService);
elementSet.addAll(Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService));
if (elementSet.size()>0){
var elementSetIterator = elementSet.iterator();
var sourceItemType = wfService.getWfItemType(object.getWfItemTypeId());
var startDateDiscriminator = WfUtil.getParametricConfiguration("ap.<wfItemType>.contributorAndOwner.validator.date.start.discriminator", sourceItemType);
var endDateDiscriminator = WfUtil.getParametricConfiguration("ap.<wfItemType>.contributorAndOwner.validator.date.end.discriminator", sourceItemType);
var wfItemStartDate = object.getDateMap().get(startDateDiscriminator);
var wfItemEndDate = object.getDateMap().get(endDateDiscriminator);
var formatter = Packages.org.apache.commons.lang.time.FastDateFormat.getInstance("dd/MM/yyyy");
var elementWithWrongInterval=[];
while (elementSetIterator.hasNext()){
var element = elementSetIterator.next();
var wfItemElementStartDate = element.getDateMap().get("startDate");
if( wfItemElementStartDate != null && wfItemStartDate && (wfItemElementStartDate.before(wfItemStartDate) || (wfItemEndDate!=null && wfItemElementStartDate.after(wfItemEndDate))) ){
var discriminator = element.getDiscriminator();
if(element.getDiscriminator().contains(".")){
discriminator = element.getDiscriminator().substring(0, element.getDiscriminator().indexOf("."))
}
elementWithWrongInterval.push(element.getPersonMap().get(discriminator + "Id").getDisplayValue());
}
}
if (elementWithWrongInterval.length>0){
errors.reject("error.contributorAndOwner.wrongInterval", [elementWithWrongInterval.toString()], "error.contributorAndOwner.wrongInterval");
}
}
|
Anchor |
---|
| contributorAndOwnerStartDateValidator-anchor |
---|
| contributorAndOwnerStartDateValidator-anchor |
---|
|
contributorAndOwnerStartDateValidator Questa validazione opera sugli elementi
owner (responsabile scientifico) e
contributor (partecipante) figli dell'oggetto radice.
Viene verificato che per ogni owner e contributor, sia specificata la data di inizio validità (attributo
startDate)
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var elementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "contributor", wfService);
elementSet.addAll(Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService));
if (elementSet.size()>0){
var elementSetIterator = elementSet.iterator();
var elementToEdit = [];
while (elementSetIterator.hasNext()){
var element = elementSetIterator.next();
var wfItemElementStartDate = element.getDateMap().get("startDate");
if(wfItemElementStartDate == null && !wfItemElementStartDate){
var discriminator = element.getDiscriminator();
if(element.getDiscriminator().contains(".")){
discriminator = element.getDiscriminator().substring(0, element.getDiscriminator().indexOf("."))
}
elementToEdit.push(element.getPersonMap().get(discriminator + "Id").getDisplayValue());
}
}
if (elementToEdit.length > 0){
errors.reject("error.contributorAndOwner.startDate.required", [elementToEdit.toString()], "error.contributorAndOwner.startDate.required");
}
}
|
Anchor |
---|
| ownerRoleValidator-anchor |
---|
| ownerRoleValidator-anchor |
---|
|
ownerRoleValidator Questa validazione opera sugli elementi
owner (responsabile scientifico) figli dell'oggetto radice.
Viene verificato che per ogni owner, sia specificato il ruolo (attributo
roleId) se attivato dalla configuration "ap.prj.owner.role.enabled"
Per maggiori dettagli cfr. modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (WfUtil.getParametricConfiguration("ap.<itemType>.owner.role.enabled", wfService.getWfItemType(wfItem.getWfItemTypeId())).equalsIgnoreCase("true")){
var elementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
if (elementSet.size() > 0){
var elementSetIterator = elementSet.iterator();
var elementToEdit = [];
while (elementSetIterator.hasNext()){
var element = elementSetIterator.next();
var wfItemElementRoleId = element.getWfDictionaryMap().get("roleId");
if(wfItemElementRoleId == null && !wfItemElementRoleId){
elementToEdit.push(element.getPersonMap().get("ownerId").getDisplayValue());
}
}
if (elementToEdit.length > 0){
errors.reject("error.owner.role.required", [elementToEdit.toString()], "error.owner.role.required");
}
}
}
|
Anchor |
---|
| notEditableByDepartmentValidator-anchor |
---|
| notEditableByDepartmentValidator-anchor |
---|
|
notEditableByDepartmentValidator Questa validazione controlla che l'utente corrente NON appartenga al team "Direttori di dipartimento cui negare accesso in modifica ai Progetti/Contratti".
Questo è un team con agganciata la funzione "Risorsa per Direttori di dipartimento cui negare accesso in modifica ai Progetti/Contratti" (/ap/department/onlyRead.function)
La visione dipartimentale consente a chiunque appartenga ai team "Profilo di dipartimento per XXX" di accedere con i diritti dipartimentali al flusso.
In questo team sono presenti sia i direttori di dipartimento che i referenti amministrativi.
Questa validazione consente l'accesso in scrittura ai soli referenti amministrativi.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var gaUserDetail = Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();
var userId = gaUserDetail.getUserId();
var searchCommand = new Packages.it.cilea.ga.command.TeamUserLinkSearchCommand();
searchCommand.setUserId(userId);
var linkList = gaService.getTeamUserLinkSearchList(searchCommand, 0);
var listIterator = linkList.iterator();
while(listIterator.hasNext()){
var teamUserLink = listIterator.next();
if(teamUserLink.getTeamId() == Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.department.onlyRead.team")){
errors.reject("error.operation.notallowed");
break;
}
}
|
Anchor |
---|
| notCreatableByDepartmentValidator-anchor |
---|
| notCreatableByDepartmentValidator-anchor |
---|
|
notCreatableByDepartmentValidator Questa validazione controlla che l'utente corrente NON appartenga al team "Direttori di dipartimento cui negare accesso in creazione ai Progetti/Contratti".
Questo è un team con agganciata la funzione "Risorsa per Direttori di dipartimento cui negare accesso in modifica ai Progetti/Contratti" (/ap/department/onlyRead.function)
La visione dipartimentale consente a chiunque appartenga ai team "Profilo di dipartimento per XXX" di accedere con i diritti dipartimentali al flusso.
In questo team sono presenti sia i direttori di dipartimento che i referenti amministrativi.
Questa validazione consente l'accesso in scrittura ai soli referenti amministrativi.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var gaUserDetail = Packages.it.cilea.ga.authorization.context.GaAuthorizationUserHolder.getUser();
var authority = gaUserDetail.getCurrentAuthorityIdentifier();
if(authority == "ROLE_DEPARTMENT"){
var validateLogic = Packages.it.cilea.wf.WfConstant.VALIDATE_LOGIC_MAP.get("notEditableByDepartmentValidator");
validateLogic.validate(request, object, errors);
}
|
Anchor |
---|
| personInFragmentValidator-anchor |
---|
| personInFragmentValidator-anchor |
---|
|
personInFragmentValidator Questa validazione controlla che all'interno delle tabelle dei Soggetti Interni NON ci siano nominativi duplicati.
Sono ammessi nominativi duplicati nel caso in cui siano specificati su intervalli temporali disgiunti.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var personMap = new Packages.java.util.HashMap();
var dateMap = new Packages.java.util.HashMap();
var discriminator = ["owner", "contributor"];
var dataDiscriminator = ["ownerId", "contributorId"];
var discriminatorLen = discriminator.length;
var duplucateList = new Packages.java.util.ArrayList();
for (i = 0; i < discriminatorLen; i++) {
var elementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement",discriminator[i], wfService);
var elementSetIterator = elementSet.iterator();
while(elementSetIterator.hasNext()){
var element = elementSetIterator.next();
var personId = element.getPersonMap().get(dataDiscriminator[i]).getId();
var intervalList = new Packages.java.util.ArrayList();
var dateList = new Packages.java.util.ArrayList();
dateList.add(element.getDateMap().get("startDate"));
dateList.add(element.getDateMap().get("endDate"));
if(personMap.get(personId) != null){
personMap.get(personId).add(dateList);
} else {
intervalList.add(dateList);
personMap.put(personId,intervalList);
}
}
}
var it = personMap.entrySet().iterator();
while (it.hasNext()) {
var entry = it.next();
var personItervals = entry.getValue();
var intervalError = 0;
if(personItervals.size() > 1){
for(i = 0; i < personItervals.size(); i++){
var startDate = personItervals.get(i).get(0);
var endDate = personItervals.get(i).get(1);
if(startDate != null){
for(l = 0; l < personItervals.size(); l++){
if(i != l){
if (personItervals.get(l).get(0) != null){
if (personItervals.get(l).get(0).before(startDate) || personItervals.get(l).get(0).equals(startDate)) {
if (personItervals.get(l).get(1) == null) {
intervalError = 1;
break;
} else if (personItervals.get(l).get(1).after(startDate) || personItervals.get(l).get(1).equals(startDate)) {
intervalError = 1;
break;
}
} else if (personItervals.get(l).get(0).after(startDate) || personItervals.get(l).get(0).equals(startDate)) {
if (endDate != null) {
if (personItervals.get(l).get(0).before(endDate) || personItervals.get(l).get(0).equals(endDate)) {
intervalError = 1;
break;
}
} else {
intervalError = 1;
break;
}
}
} else {
intervalError = 1;
}
}
}
} else {
intervalError = 1;
}
}
if(intervalError > 0){
duplucateList.add(gaService.getPerson(entry.getKey()).getDescription());
}
}
}
if(duplucateList.size() > 0){
errors.reject("error.contributorAndOwner.duplicate", [duplucateList.toString()], "error.contributorAndOwner.duplicate");
}
|
Anchor |
---|
| wfActionLogicSaveDisplayAsDefault-anchor |
---|
| wfActionLogicSaveDisplayAsDefault-anchor |
---|
|
wfActionLogicSaveDisplayAsDefault Questa logica calcola il campo displayAs della scheda ad ogni salvataggio; il formato del campo è:
identifier: description .
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.logic.action.save.WfActionLogicSaveDisplayAsDefault |
Anchor |
---|
| wfActionLogicSaveYearFromStartDate-anchor |
---|
| wfActionLogicSaveYearFromStartDate-anchor |
---|
|
wfActionLogicSaveYearFromStartDate Questa logica calcola il campo anno della scheda ad ogni salvataggio.
Viene estrapolato l'anno dal campo startDate.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.logic.action.save.WfActionLogicSaveYearFromStartDate |
Anchor |
---|
| notAllowedValidator-anchor |
---|
| notAllowedValidator-anchor |
---|
|
notAllowedValidator Questa logica scatena un errore e blocca l'azione sulla quale è collegata.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
errors.reject("error.operation.notallowed");
|
Anchor |
---|
| ownerCannotEditHimself-anchor |
---|
| ownerCannotEditHimself-anchor |
---|
|
ownerCannotEditHimself Questa validazione viene scatenata in visione personale.
Impedisce che l'utente sostituisca come responsabile se stesso con qualcun altro.
Se l'operazione fosse consentita, dopo il salvataggio, l'utente non avrebbe più i diritti per accedere all'oggetto
Per poter utilizzare questa validazione è necessario che nel modello dati sia presente l'attributo
ownerIdPreviousValue, che contiene l'id della persona precedente.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("--ownerCannotEditHimself--");
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement = object;
//controllo se è un nuovo element o meno
//se è un nuovo element allora non avrà la persona settata
if(wfItemElement.getId() != null){
//prima ricavo la persona precedente a quella che sto aggiungendo
var previousOwnerId = wfItemElement.getIntegerMap().get("ownerIdPreviousValue");
//ulteriore controllo per controllare che la persona precedente ci sia non è utile (?)
//successivamente vado a ricavare la persona che sta editando in questo momento
var personalUserName = request.getUserPrincipal().getName();
var personId = gaService.getUser(personalUserName).getPersonId();
//se le due persone coincidono, vuol dire che sto provando ad editarmi
if(previousOwnerId == personId){
//adesso ricavo la persona che sto mettendo in questo momento
//se non sono io vuol dire che sto cercando di sostituirmi
var ownerId = wfItemElement.getPersonMap().get("ownerId").getPersonId();
if(ownerId != previousOwnerId){
//allora vado a re-sostituire con me stesso e salvo
var person = gaService.getPerson(previousOwnerId);
wfItemElement.getPersonMap().put("ownerId", person);
wfService.saveOrUpdate(wfItemElement);
errors.reject("error.operation.ownerCannotEditHimself");
}
}
}
|
Anchor |
---|
| ownerCannotDeleteHimself-anchor |
---|
| ownerCannotDeleteHimself-anchor |
---|
|
ownerCannotDeleteHimself Questa validazione viene scatenata in visione personale.
Impedisce che l'utente elimini se stesso dai responsabili scientifici.
Se l'operazione fosse consentita, dopo il salvataggio, l'utente non avrebbe più i diritti per accedere all'oggetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("--ownerCannotDeleteHimself--");
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement = object;
//prima ricavo la persona che sto eliminando
var ownerId = wfItemElement.getPersonMap().get("ownerId").getPersonId();
//successivamente vado a ricavare la persona che sta editando in questo momento
var personalUserName = request.getUserPrincipal().getName();
var personId = gaService.getUser(personalUserName).getPersonId();
//se le due persone coincidono, vuol dire che sto provando ad eliminarmi
if(ownerId == personId)
errors.reject("error.operation.ownerCannotDeleteHimself");
|
Anchor |
---|
| checkCreationPermissionsValidator-anchor |
---|
| checkCreationPermissionsValidator-anchor |
---|
|
checkCreationPermissionsValidator Questa validazione viene scatenata in fase di creazione dell'oggetto.
Controlla che l'utente corrente abbia i permessi per creare la tipologia di oggetto in questione.
Anche se agli utenti viene presentata sempre la lista dei tipi di oggetto che possono creare, questo ulteriore check serve per prevenire eventuali "hacking" di utenti che modificano volutamente il markup del form inserendo un tipo di oggetto per il quale non hanno le autorizzazioni.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//da controllare solo in fase di prima creazione
if (wfItem.getId()==null){
var isCreateAllowed=Packages.it.cilea.wf.util.WfUtil.isWfItemTypeAllowedForCurrentUser(wfItem.getWfItemTypeId(), applicationContext);
if (!isCreateAllowed){
errors.reject("error.ap.wfItemType.creationNotAllowed");
}
}
|
Anchor |
---|
| sameDefinitionForGenericItemValidator-anchor |
---|
| sameDefinitionForGenericItemValidator-anchor |
---|
|
sameDefinitionForGenericItemValidator Questa validazione viene scatenata in fase di cambio della tipologia dell'oggetto.
Controlla che la nuova tipologia selezionata abbia agganciato lo stesso flusso della tipologia precedente.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//estraggo il wfItemId
//log.error("entro nel validator sameDefinitionForGenericItemValidator");
var myNEWWfItemType = object.getWfItemTypeId();
var myOLDWfItemType = object.getIntegerMap().get("wfItemTypeIdPreviousValue");
if (myOLDWfItemType==null)
throw "To use sameDefinitionForGenericItemValidator you MUST specify wfItemTypeIdPreviousValue hidden value";
//log.error("dovrebbe essere il mio definition new:" + myNEWWfItemType + " old: " + myOLDWfItemType);
//con il wfItemID tiro fuori tramite il wfservice la definition
var newItemType=wfService.getWfItemType(myNEWWfItemType);
var oldItemType=wfService.getWfItemType(myOLDWfItemType);
//log.error("newItemType:"+newItemType+" oldItemType:"+oldItemType);
//confronto le due definition se sono diverse vuol dire che il cambio di flusso non è compatibile
if(!newItemType.getWfDefaultDefinitionId().equals(oldItemType.getWfDefaultDefinitionId())){
object.setWfItemTypeId(myOLDWfItemType);
//errors.reject("error.ap.definitionError");
errors.rejectValue("wfItemTypeId", "error.ap.definitionError", null, null);
}
|
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.
Il cambio di tipologia è concesso se la configuration ap.<wfItemType>.itemTypeChange.enabled è uguale a true.
Introdotta la possibilità di cambio tipologia per Assitenza Tecnica (anche con scheda già sincronizzata con UGOV PJ e senza valutare la configurazione di cui sopra) in caso di scheda con flag legacy attivo.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//estraggo il wfItemId
var myNEWWfItemType = object.getWfItemTypeId();
var myOLDWfItemType = object.getIntegerMap().get("wfItemTypeIdPreviousValue");
var sourceItemType = wfService.getWfItemType(myNEWWfItemType);
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){
var gaUserDetail = GaAuthorizationUserHolder.getUser();
var authority = gaUserDetail.getCurrentAuthorityIdentifier();
if(!authority == "ROLE_ADMIN" || !(gaUserDetail.hasGlobalAuthorities("/ADMIN.profile", "ROLE_ADMIN") && Boolean.TRUE.equals(object.getBooleanMap().get("legacy")))){
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.getIntegerMap().get("ugovId") != 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 la sincronizzazione già avvenuta.
Introdotta la possibilità di cambio tipologia per Assitenza Tecnica in caso di scheda con flag legacy attivo.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//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){
var gaUserDetail = GaAuthorizationUserHolder.getUser();
var authority = gaUserDetail.getCurrentAuthorityIdentifier();
if(!authority == "ROLE_ADMIN" || !(gaUserDetail.hasGlobalAuthorities("/ADMIN.profile", "ROLE_ADMIN") && Boolean.TRUE.equals(object.getBooleanMap().get("legacy")))){
object.setWfItemTypeId(myOLDWfItemType);
errors.reject("error.ap.itemTypeError.step2");
}
}
|
Anchor |
---|
| itemTypeNotWithdrawnValidator-anchor |
---|
| itemTypeNotWithdrawnValidator-anchor |
---|
|
itemTypeNotWithdrawnValidator Questa validazione controlla che in fase di salvataggio non venga selezionata come tipologia di un item, una tipologia che è stata ritirata (ovvero per le quali non è possibile più creare nuovi item)
E' possibile mantenere un item che è già presente in quella tipologia
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var newWfItemTypeId = object.getWfItemTypeId();
var newWfItemType = wfService.getWfItemType(newWfItemTypeId);
//log.error("wfItemType: " + newWfItemType.getDisplayValue());
//log.error("getWithdrawn: " + newWfItemType.getWithdrawn());
if(newWfItemType.getWithdrawn() == true){
//ho trovato una tipologia eliminata
//adesso controllo se prima fosse la stessa, perchè devo mantenere comunque il pregresso
var oldWfItemTypeId = object.getIntegerMap().get("wfItemTypeIdPreviousValue");
//var oldWfItemType = wfService.getWfItemType(oldWfItemTypeId);
//controllo inoltre che la previousValue sia presente
if (oldWfItemTypeId == null)
throw "To use itemTypeNotWithdrawnValidator you MUST specify wfItemTypeIdPreviousValue hidden value";
if(newWfItemTypeId != oldWfItemTypeId){
errors.reject("error.ap.wfItemType.withdrawn");
}
}
|
Anchor |
---|
| wfActionLogicSaveNewIdentifier-anchor |
---|
| wfActionLogicSaveNewIdentifier-anchor |
---|
|
wfActionLogicSaveNewIdentifier Questa logica serve per il ricalcolo dell'identificativo della scheda in caso di cambio ti tipologia.
E' necessario inserirla come save logic per tutti gli stati nei flussi progetti che precedono la sincronizzazione con Ugov PJ.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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){
//var wfStateId = object.getWfStateId();
var startLogic = Packages.it.cilea.wf.WfConstant.START_LOGIC_MAP.get("wfStartLogicIdentifier");
startLogic.start(object, request);
//object.setWfStateId(wfStateId);
object.getIntegerMap().put("wfItemTypeIdPreviousValue", object.getWfItemTypeId());
}
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var justExternallyCreated=request.getParameter("justExternallyCreated");
if (Packages.java.lang.Boolean.TRUE.equals(wfItem.isMaster()) && (!justExternallyCreated || (justExternallyCreated=="true" && Packages.java.lang.Boolean.TRUE.equals(wfItem.isMostValidated())))){
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
wfItem.getBooleanMap().put("warningAcknowlegement", null);
|
Anchor |
---|
| isNotLegacy-anchor |
---|
| isNotLegacy-anchor |
---|
|
isNotLegacy 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 l'attributo
legacy, tipicamente con etichetta "Disattivazione validazioni" (cfr il modello dati)
Per tutti gli oggetti che hanno questo attributo valorizzato a true vengono disattivate le validazioni e le eventuali sincronizzazioni.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
object.getBooleanMap().get('legacy')==null
||
Packages.java.lang.Boolean.FALSE.equals(object.getBooleanMap().get('legacy'))
)
|
Anchor |
---|
| isOwnerCreationAllowed-anchor |
---|
| isOwnerCreationAllowed-anchor |
---|
|
isOwnerCreationAllowed 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 variabile di configurazione
ap.xxxx-flow.owner.create dove xxxx è il nome del flusso.
Per tutti gli oggetti che hanno questa variabile di configurazione settata a true o non valorizzata vengono abilitate le validazione.
Per tutti gli oggetti che hanno questa variabile di configurazione settata a false vengono disabilitate le validazione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
"true"==Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap."+ object.getWfItemType().getWfDefaultDefinition().getDescription() +".owner.create")
||
Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap."+ object.getWfItemType().getWfDefaultDefinition().getDescription() +".owner.create")==null
)
|
Anchor |
---|
| isOwnerCreationForbidden-anchor |
---|
| isOwnerCreationForbidden-anchor |
---|
|
isOwnerCreationForbidden 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 variabile di configurazione
ap.xxxx-flow.owner.create dove xxxx è il nome del flusso.
Per tutti gli oggetti che hanno questa variabile di configurazione settata a true o non valorizzata vengono disabilitate le validazione.
Per tutti gli oggetti che hanno questa variabile di configurazione settata a false vengono abilitate le validazione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
"false"==Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap."+ object.getWfItemType().getWfDefaultDefinition().getDescription() +".owner.create")
)
|
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 |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItemFull = wfService.getWfItem(wfItem.getWfItemId());
var listOfLinksDetected = '<ul>';
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();
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();
listOfLinksDetected += '<li>' + parentWfItem.getIdentifier() + ' - ' + parentWfItem.getDescription() + '</li>';
}
}
listOfLinksDetected += '</ul>';
if(listOfLinksDetected != '<ul></ul>'){
var messageContainer = [listOfLinksDetected];
errors.reject("error.delete.link.childAndParentDetected", messageContainer, "error.delete.link.childAndParentDetected.default");
}
|