...
Anchor | ||||
---|---|---|---|---|
|
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
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 | ||||
---|---|---|---|---|
|
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
if (object.getId()==null){ if (object.getPersonMap().get("owner")==null) errors.rejectValue("personMap[owner]","error.contract.owner.required"); } else { var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService); if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy")) && ownerSet.size()<1 && object.getPersonMap().get("owner")==null) errors.rejectAndLocate("error.contract.owner.atLeast1", "owner"); } |
...
Anchor | ||||
---|---|---|---|---|
|
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService); if (orgUnitSet.size()<1){ errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.atLeast1", "internalOrganizationUnit"); } else { var internalOrganizationUnitCoordinatorRole=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.con.internalOrganizationUnit.role.main"); if (!internalOrganizationUnitCoordinatorRole){ throw "Configuration variable ap.con.internalOrganizationUnit.role.main MUST BE DEFINED"; } else { internalOrganizationUnitCoordinatorRole=new Packages.java.lang.Integer(internalOrganizationUnitCoordinatorRole); } var orgUnitSetIterator=orgUnitSet.iterator(); var count=0; while (orgUnitSetIterator.hasNext()){ var element=orgUnitSetIterator.next(); var ouRole=element.getWfDictionaryMap().get("roleId"); if (ouRole!=null && internalOrganizationUnitCoordinatorRole.equals(ouRole.getId())){ count++; } } if (count==0){ errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.missingMain", "internalOrganizationUnit"); } else if (count>1) { errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.tooManyMain", "internalOrganizationUnit"); } } |
Anchor | ||||
---|---|---|---|---|
|
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
var orgUnitSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "internalOrganizationUnit", wfService); var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService); var ownerDepartmentSet=new Packages.java.util.HashSet(); var internalOrganizationUnitSet=new Packages.java.util.HashSet(); var startDateFromWfItem=wfItem.getDateMap().get("startDate"); if (startDateFromWfItem!=null){ startDateFromWfItem=startDateFromWfItem.getTime(); if (ownerSet.size()>0){ var ownerSetIterator=ownerSet.iterator(); while (ownerSetIterator.hasNext()){ var ownerElement=ownerSetIterator.next(); var person=ownerElement.getPersonMap().get("ownerId"); var ownerDepartmentPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand(); ownerDepartmentPositionSearch.setPersonId(person.getId()); ownerDepartmentPositionSearch.setDate(startDateFromWfItem); ownerDepartmentPositionSearch.setOrganizationUnitTypeDescription("department"); ownerDepartmentPositionSearch.setDiscriminator("research"); var ownerDepartmentPositionSet = gaService.getPositionSearchList(ownerDepartmentPositionSearch, 0); var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(ownerDepartmentPositionSet, "research", "department"); var ownerDepartmentPositionSetIterator=ownerDepartmentPositionSet.iterator(); while (ownerDepartmentPositionSetIterator.hasNext()){ var position=ownerDepartmentPositionSetIterator.next(); if (maxPriority == null || maxPriority.equals(position.getPriority())) { ownerDepartmentSet.add(position.getOrganizationUnit()); break; } } } } if (ownerDepartmentSet.size()>0){ if (orgUnitSet.size()>0){ var orgUnitSetIterator=orgUnitSet.iterator(); while (orgUnitSetIterator.hasNext()){ var wfItemElement=orgUnitSetIterator.next(); var orgUnit=wfItemElement.getOrganizationUnitMap().get("ouId"); internalOrganizationUnitSet.add(orgUnit); } } } if(!internalOrganizationUnitSet.containsAll(ownerDepartmentSet)){ var nonMatchedDepartmentCollection=Packages.org.apache.commons.collections.CollectionUtils.subtract(ownerDepartmentSet, internalOrganizationUnitSet); var nonMatchedDepartmentCollectionIterator=nonMatchedDepartmentCollection.iterator(); var nonMatchedDepartmentString=""; var counter=0; while(nonMatchedDepartmentCollectionIterator.hasNext()){ var nonMatchedDepartment=nonMatchedDepartmentCollectionIterator.next(); if (counter++>0) nonMatchedDepartmentString+=", "; nonMatchedDepartmentString+=nonMatchedDepartment.getDescription(); } var df = Packages.org.apache.commons.lang.time.FastDateFormat.getInstance("dd/MM/yyyy"); var dateAsString=df.format(startDateFromWfItem); errors.rejectrejectAndLocate("error.contract.multipleInternalOrganization.matchWithDepartmentOwnerNotFound", "internalOrganizationUnit", [dateAsString, nonMatchedDepartmentString], null); } } |
...
Anchor | ||||
---|---|---|---|---|
|
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
var paramMap = new Packages.java.util.HashMap(); paramMap.put("identifier", object.getIdentifier()); var count=searchBuilderTemplate.getSingleObject("getWfItemCount", paramMap); if (count>1) errors.rejectrejectValue("identifier", "error.contract.identifier.notUnique"); |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
var reject = 0; var discriminator = ["fiscalCheckPerson", "fiscalCheckTariff", "fiscalCheckVatCode", "fiscalCheckNotes"]; var column = ["person","string","string","string"]; columnLen = column.length; var value = []; for (i = 0; i < columnLen; i++) { if(Packages.java.lang.Boolean.TRUE.equals(Packages.it.cilea.wf.util.WfUtil.isAttributeChanged(wfService, wfItem, column[i]+ "." +discriminator[i]))){ reject = 1; break; } } if(reject > 0){ errors.reject(rejectValue("personMap[fiscalCheckPerson]","error.contract.fiscalCheck.edit.notAllowed"); errors.rejectValue("stringMap[fiscalCheckTariff]","error.contract.fiscalCheck.edit.notAllowed"); errors.rejectValue("stringMap[fiscalCheckVatCode]","error.contract.fiscalCheck.edit.notAllowed"); errors.rejectValue("stringMap[fiscalCheckNotes]","error.contract.fiscalCheck.edit.notAllowed"); } |
...