Anchor |
---|
| wfStartLogicCall-anchor |
---|
| wfStartLogicCall-anchor |
---|
|
wfStartLogicCall Empty start logic
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
true;
|
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 |
---|
| isNotLegacyAndYearIsGreaterOrEqualThan2019Contract-anchor |
---|
| isNotLegacyAndYearIsGreaterOrEqualThan2019Contract-anchor |
---|
|
isNotLegacyAndYearIsGreaterOrEqualThan2019Contract Questa è la descrizione della logica di validazione Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le altre validazioni altrimenti no.
Oltre al check previsto da
isNotLegacy , verifica anche che il contratto in questione sia relativo ad un anno maggiore o uguale a 2019, altrimenti vengono disattivate le validazioni e le sincronizzazioni.
Questo approccio è stao scelto per evitare lo scatenarsi delle validazioni su vecchi contratti che non rispettano le nuove e più stringenti validazioni, ed evitare quindi di dovere fare una bonifica a tappeto.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
(
object.getYear()!=null
&&
object.getYear().compareTo(2019)>=0
)
&&
(
object.getBooleanMap().get('legacy')==null
||
Packages.java.lang.Boolean.FALSE.equals(object.getBooleanMap().get('legacy'))
)
|
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 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
permissions="r";
break;
case "inquiry":
if(hasPowerPermissions && !isOnlyRead)
permissions="rwfd"
else
permissions="r";
break;
case "fiscalCheck":
if(hasPowerPermissions && !isOnlyRead)
permissions="r"
else
permissions="r";
break;
case "revisionAfterFiscalCheck":
if(hasPowerPermissions && !isOnlyRead)
permissions="rwf"
else
permissions="r";
break;
case "approval":
if(hasPowerPermissions && !isOnlyRead)
permissions="rwf"
else
permissions="r";
break;
case "approvedAwaitingCountersignedContract":
if(hasPowerPermissions && !isOnlyRead)
permissions="rwf"
else
permissions="r";
break;
case "signed":
if(hasPowerPermissions && !isOnlyRead)
permissions="rwf"
else
permissions="r";
break;
case "closed":
if(hasPowerPermissions && !isOnlyRead)
permissions="rwf"
else
permissions="r";
break;
case "suspended":
if(hasPowerPermissions && !isOnlyRead)
permissions="rwf"
else
permissions="r";
break;
}
wfTask.setPermissions(permissions);
|
Anchor |
---|
| wfStartLogicContract-anchor |
---|
| wfStartLogicContract-anchor |
---|
|
wfStartLogicContract Questa logica viene eseguita in fase di creazione di un nuovo contratto.
Vengono effettuate le seguenti operazioni:
- Recupero del responsabile scientifico (owner), estrae il dipartimento relativo all'ultimo rapporto di lavoro valido prioritario relativo al contesto ricerca ed aggancia questa informazione all'oggetto radice.
- Se è impostata a true la configurazione ap.contract.ownerStartDate.default va inoltre ad assegnare come data di inizio di default del Responsabile scientifico la stessa indicata nel campo Data di avvio pratica.
- Associazione al dipartimento inserito il ruolo "Principale"
- Caricamento come anno del contratto la data di avvio pratica (proposalStartDate)
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var person=wfItem.getPersonMap().get("owner");
person=gaService.getPerson(person.getId());
var startDate=wfItem.getDateMap().get("proposalStartDate");
var ownerElement=new Packages.it.cilea.wf.model.WfItemElement();
ownerElement.setDiscriminator("owner");
ownerElement.setWfItemId(wfItem.getId());
ownerElement.getPersonMap().put("ownerId", person);
var ownerStartDateDefault = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.contract.ownerStartDate.default");
if(ownerStartDateDefault != null && "true".equals(ownerStartDateDefault)){
ownerElement.getDateMap().put("startDate", startDate);
}
wfService.saveOrUpdate(ownerElement);
wfItem.getWfItemElementSet().add(ownerElement);
wfItem.getPersonMap().put("owner", null);
var positionLastSet = person.getPositionLastSet();
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(positionLastSet, "research", "department");
positionLastSetIterator=positionLastSet.iterator();
while (positionLastSetIterator.hasNext()){
var position=positionLastSetIterator.next();
if (maxPriority == null || maxPriority.equals(position.getPriority())) {
if ("research".equals(position.getDiscriminator()) && "department"
.equals(position.getOrganizationUnit().getOrganizationUnitType().getDescription())) {
var internalOrganizationUnitElement=new Packages.it.cilea.wf.model.WfItemElement();
internalOrganizationUnitElement.setDiscriminator("internalOrganizationUnit");
internalOrganizationUnitElement.setWfItemId(wfItem.getId());
var internalOrganizationUnitRoleId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.contract.internalOrganizationUnit.role.main");
var internalOrganizationUnitRole = wfService.getWfDictionary(new Packages.java.lang.Integer(internalOrganizationUnitRoleId));
internalOrganizationUnitElement.getOrganizationUnitMap().put("ouId", position.getOrganizationUnit());
internalOrganizationUnitElement.getWfDictionaryMap().put("ouRole", internalOrganizationUnitRole);
wfService.saveOrUpdate(internalOrganizationUnitElement);
wfItem.getWfItemElementSet().add(internalOrganizationUnitElement);
break;
}
}
}
var year=startDate.get(Packages.java.util.Calendar.YEAR);
wfItem.setYear(new Packages.java.lang.Integer(year));
true;
|
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 |
---|
| ownerValidatorWithStartEndDateContract-anchor |
---|
| ownerValidatorWithStartEndDateContract-anchor |
---|
|
ownerValidatorWithStartEndDateContract 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"))){
if (ownerSet.size()<1 && object.getPersonMap().get("owner")==null)
errors.reject("error.contract.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.contract.owner.wrongInterval", [ownerWithWrongInterval.toString()], "error.contract.owner.wrongInterval");
}
}
}
|
Anchor |
---|
| contributorValidatorWithStartEndDateContract-anchor |
---|
| contributorValidatorWithStartEndDateContract-anchor |
---|
|
contributorValidatorWithStartEndDateContract Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
var contributorSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "contributor", wfService);
if (contributorSet.size()>0){
var contributorSetIterator=contributorSet.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 contributorWithWrongInterval=[];
while (contributorSetIterator.hasNext()){
var contributor=contributorSetIterator.next();
var wfItemElementStartDate=contributor.getDateMap().get("startDate");
if( wfItemElementStartDate!= null && wfItemStartDate && (wfItemElementStartDate.before(wfItemStartDate) || (wfItemEndDate!=null && wfItemElementStartDate.after(wfItemEndDate))) ){
contributorWithWrongInterval.push(contributor.getPersonMap().get("contributorId").getDisplayValue());
}
}
if (contributorWithWrongInterval.length>0){
errors.reject("error.contract.contributor.wrongInterval", [contributorWithWrongInterval.toString()], "error.contract.contributor.wrongInterval");
}
}
}
|
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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.contract.internalOrganizationUnit.role.main");
if (!internalOrganizationUnitCoordinatorRole){
throw "Configuration variable ap.contract.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("ouRole");
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 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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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
- Responsabili scientifici: owner
Inviate anche date di inizio e fine se valorizzata a true la variabile di configurazione ap.contract.owner.starDate.required. - Partecipanti: contributor
Inviate anche date di inizio e fine se valorizzata a true la variabile di configurazione ap.contract.contributor.starDate.required. - Unità organizzative interne: internalOrganizationUnit
- Finanziatori: grantor
Inviato se valorizzata a true 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("ouRole");
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(organizationUnit, this.getFinancing(), contractorSet.size(), errors);
dtoPj.getDTOEfPjs().add(enteFinanziatore);
}
}
};
this.setPartners = function() {};
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.getIdentifier = function() {
return wfItem.getIdentifier();
};
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() {
return wfItem.getStringMap().get("acronym");
};
this.getExternalDmsIdentifier = function() {
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
| wfActionLogicEnterEquipmentOwnerMailSender-anchor |
---|
| wfActionLogicEnterEquipmentOwnerMailSender-anchor |
---|
|
wfActionLogicEnterEquipmentOwnerMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.equipment.mail.subject',
textLabel:'label.ap.equipment.mail.text',
sendEnable:'ap.itemType.eqp.mail.enable',
htmlEnable:'ap.itemType.eqp.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleOwners',
to:'',
from:''
}; X;
|
Anchor |
---|
| wfActionLogicEnterEquipmentHeadOfDepartmentMailSender-anchor |
---|
| wfActionLogicEnterEquipmentHeadOfDepartmentMailSender-anchor |
---|
|
wfActionLogicEnterEquipmentHeadOfDepartmentMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.equipment.mail.subject',
textLabel:'label.ap.equipment.mail.text',
sendEnable:'ap.itemType.eqp.mail.enable',
htmlEnable:'ap.itemType.eqp.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleHeadOfDepartment',
to:'',
from:''
}; X;
|
Anchor |
---|
| wfActionLogicCreateRmItem-anchor |
---|
| wfActionLogicCreateRmItem-anchor |
---|
|
wfActionLogicCreateRmItem Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
function createNewOrgUnitElementEquipment(department, rmItem){
var orgUnitElement= Packages.it.cilea.ga.model.OrganizationUnitElement();
orgUnitElement.setDiscriminator("equipment");
orgUnitElement.setOrganizationUnit(department);
orgUnitElement.setOrganizationUnitId(department.getOrganizationUnitId());
orgUnitElement.getRmItemMap().put("equipment", rmItem);
return orgUnitElement;
}
//log.error("Sono nella action //logic di enter wfAction//logicCreateRmItem -updated");
var wfItem= wfService.getWfItem(object.getId());
var rmItemMap=wfItem.getRmItemMap();
var rmItem=rmItemMap.get("equipment");
if(rmItem==null){
rmItem= Packages.it.cilea.ga.model.RmItem();
var today = new 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();
//log.error("rmItemId prima del salvataggio: "+rmItemId);
//salvo
gaService.saveOrUpdate(rmItem);
wfService.saveOrUpdate(wfItem);
//log.error("Salvato rmItem e 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){
//log.error("rmItem non nuovo");
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());
//log.error("Eliminato orgUnitElement con id: "+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());
//log.error("Dipartimento: "+department.getDescription());
//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)
);
//log.error("Aggiunto nuovo orgUnitElement");
gaService.saveOrUpdate(department);
//log.error("Salvato il dipartimento");
}
//log.error("fine action di enter");
|
Anchor |
---|
| wfActionLogicEnterLaboratoryOwnerMailSender-anchor |
---|
| wfActionLogicEnterLaboratoryOwnerMailSender-anchor |
---|
|
wfActionLogicEnterLaboratoryOwnerMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.laboratory.mail.subject',
textLabel:'label.ap.laboratory.mail.text',
sendEnable:'ap.itemType.lab.mail.enable',
htmlEnable:'ap.itemType.lab.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleOwners',
to:'',
from:''
}; X;
|
Anchor |
---|
| wfActionLogicEnterLaboratoryHeadOfDepartmentMailSender-anchor |
---|
| wfActionLogicEnterLaboratoryHeadOfDepartmentMailSender-anchor |
---|
|
wfActionLogicEnterLaboratoryHeadOfDepartmentMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.laboratory.mail.subject',
textLabel:'label.ap.laboratory.mail.text',
sendEnable:'ap.itemType.lab.mail.enable',
htmlEnable:'ap.itemType.lab.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleHeadOfDepartment',
to:'',
from:''
}; X;
|
Anchor |
---|
| equipmentValidatorLaboratory-anchor |
---|
| equipmentValidatorLaboratory-anchor |
---|
|
equipmentValidatorLaboratory Validazione che controlla che se esiste almeno una Grande Attrezzatura collegata al Laboratorio, questa Attrezzatura deve essere 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. excel modello dati dell'entità Gruppi di Lavoro
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 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 = Packages.it.cilea.ga.model.GaDictionary();
newIncomingTypeDictionary.setDescription(incomingTypeDescription);
newIncomingTypeDictionary.setDiscriminator("incomingType");
//newIncomingTypeDictionary.setId(gaService.saveOrUpdate(newIncomingTypeDictionary));
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);
}
}
//log.error("wfActionLogicCreatePersonElementIncoming");
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);
//log.error("delete old personelement");
}
}
//ora che mi sono accertato che per certo non ho quel personElement, me ne vado a creare uno completamente nuovo ed aggiornato
//log.error("new person element");
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.setPerson(tutorPerson);
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);
//log.error("Saved person");
}//tutorWfItemElementSetIterator
}//fine tutorWfItemElementSet.isEmpty
|
Anchor |
---|
| deleteAllPersonElementsLinkedToMobility-anchor |
---|
| deleteAllPersonElementsLinkedToMobility-anchor |
---|
|
deleteAllPersonElementsLinkedToMobility Logica che si occupa di andare ad eliminare tutti i collegamento delle persone alla Mobilità in ingresso di cui erano supervisore
E' una logica che viene triggerata in fase di DELETE di una Mobility Incoming (Mobilità in ingresso).
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("deleteAllPersonElementsLinkedToMobility");
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);
//log.error("delete old personelement");
}
}
}//tutorWfItemElementSetIterator
}//fine tutorWfItemElementSet.isEmpty
|
Anchor |
---|
| deletePersonElementFromOldTutor-anchor |
---|
| deletePersonElementFromOldTutor-anchor |
---|
|
deletePersonElementFromOldTutor Logica che si occupa di andare ad eliminare il collegamento delle persone alla Mobilità in ingresso di cui erano supervisori (tutor)
E' una logica che viene triggerata in fase di SAVE della Mobility Incoming (Mobilità in ingresso).
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 |
---|
| wfStartLogicPatent-anchor |
---|
| wfStartLogicPatent-anchor |
---|
|
wfStartLogicPatent Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var applicationNumber=wfItem.getStringMap().get("applicationNumber");
wfItem.setIdentifier(applicationNumber);
var applicationDate=wfItem.getDateMap().get("applicationDate");
var year=applicationDate.get(Packages.java.util.Calendar.YEAR);
wfItem.setYear(year);
if(Packages.java.lang.Boolean.FALSE.equals(wfItem.getBooleanMap().get("recoveryMetadataFromEPO"))){
var linkedInventionId = wfItem.getIntegerMap().get("linkedInventionId");
var linkedInvention = wfService.getWfItem(linkedInventionId);
var inventionIprLink = new Packages.it.cilea.wf.model.WfItemLink();
inventionIprLink.setParentId(linkedInventionId);
inventionIprLink.setChildId(wfItem.getId());
inventionIprLink.setDiscriminator("inventionIprLink");
var parentWfItemLinkSet = wfItem.getParentWfItemLinkSet();
parentWfItemLinkSet.add(inventionIprLink);
wfItem.setParentWfItemLinkSet(parentWfItemLinkSet);
wfItem.getIntegerMap().put("linkedInventionId", null);
wfService.saveOrUpdate(inventionIprLink);
}
wfService.saveOrUpdate(wfItem);
|
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 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 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/2019
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 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);
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 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.departmentFund", [Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("DEPARTMENT_FUND_POSITION_LAST_DATE")], null);
}
}
|
Anchor |
---|
| projectDepartmentFundCheckDateEnterValidator-anchor |
---|
| projectDepartmentFundCheckDateEnterValidator-anchor |
---|
|
projectDepartmentFundCheckDateEnterValidator 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 |
---|
| isNotLegacyAndYearIsGreaterOrEqualThan2019Project-anchor |
---|
| isNotLegacyAndYearIsGreaterOrEqualThan2019Project-anchor |
---|
|
isNotLegacyAndYearIsGreaterOrEqualThan2019Project Questa è un'applicability rule che viene valutata prima di eseguire altre validazioni.
Se ritorna true allora vengono eseguite le altre validazioni altrimenti no.
Oltre al check previsto da
isNotLegacy , verifica anche che il progetto in questione sia relativo ad un anno maggiore o uguale del 2019, altrimenti vengono disattivate le validazioni e le sincronizzazioni.
Questo approccio è stao scelto per evitare lo scatenarsi delle validazioni su vecchi progetti che non rispettano le nuove e più stringenti validazioni, ed evitare quindi di dovere fare una bonifica a tappeto.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
log.error("Sono in isNotLegacyAndYearIsGreaterOrEqualThan2019Project");
(
object.getYear()!=null
&&
object.getYear().compareTo(2019)>=0
)
&&
(
object.getBooleanMap().get('legacy')==null
||
Packages.java.lang.Boolean.FALSE.equals(object.getBooleanMap().get('legacy'))
)
|
Anchor |
---|
| wfStartLogicProject-anchor |
---|
| wfStartLogicProject-anchor |
---|
|
wfStartLogicProject Questa logica viene eseguita in fase di creazione di un nuovo progetto.
Vengono effettuate le seguenti operazioni:
- Recupero del responsabile scientifico (owner), estrae il dipartimento relativo all'ultimo rapporto di lavoro valido prioritario relativo al contesto ricerca ed aggancia questa informazione all'oggetto radice.
- Se è impostata a true la configurazione ap.project.ownerStartDate.default va inoltre ad assegnare come data di inizio di default del Responsabile scientifico la stessa indicata nel campo Data di avvio pratica.
- Associazione al dipartimento inserito il ruolo "Principale"
- Inserimento dell'Ateneo tra i partner con il ruolo di default "Partner Unico"
- Caricamento come anno del progetto la data di avvio pratica (proposalStartDate)
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var person = null;
var startDate = wfItem.getDateMap().get("proposalStartDate");
person = wfItem.getPersonMap().get("owner");
var person2 = gaService.getPerson(person.getId());
var ownerElement = new Packages.it.cilea.wf.model.WfItemElement();
ownerElement.setDiscriminator("owner");
ownerElement.setWfItemId(wfItem.getId());
ownerElement.getPersonMap().put("ownerId", person);
if (Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.owner.role.enabled").equalsIgnoreCase("true")){
var myRole = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.owner.role.main");
if (myRole == null){
throw "Configuration variables ap.prj.owner.role.main MUST BE DEFINED";
} else {
var ownerRole = wfService.getWfDictionary(new Packages.java.lang.Integer(myRole));
ownerElement.getWfDictionaryMap().put("roleId", ownerRole);
}
}
var ownerStartDateDefault = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.ownerStartDate.default");
if(ownerStartDateDefault != null && "true".equals(ownerStartDateDefault)){
ownerElement.getDateMap().put("startDate", startDate);
}
wfService.saveOrUpdate(ownerElement);
wfItem.getWfItemElementSet().add(ownerElement);
var positionLastSet = person2.getPositionLastSet();
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(positionLastSet, "research", "department");
//var maxPriority2 = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(positionSet, "research", "academicField2000");
positionLastSetIterator = positionLastSet.iterator();
while (positionLastSetIterator.hasNext()){
var position = positionLastSetIterator.next();
if (maxPriority == null || maxPriority.equals(position.getPriority())) {
if ("research".equals(position.getDiscriminator()) && "department"
.equals(position.getOrganizationUnit().getOrganizationUnitType().getDescription())) {
var internalOrganizationUnitElement = new Packages.it.cilea.wf.model.WfItemElement();
internalOrganizationUnitElement.setDiscriminator("internalOrganizationUnit");
internalOrganizationUnitElement.setWfItemId(wfItem.getId());
var internalOrganizationUnitRoleId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.internalOrganizationUnit.role.main");
var internalOrganizationUnitRole = wfService.getWfDictionary(new Packages.java.lang.Integer(internalOrganizationUnitRoleId));
internalOrganizationUnitElement.getOrganizationUnitMap().put("ouId", position.getOrganizationUnit());
internalOrganizationUnitElement.getWfDictionaryMap().put("ouRole", internalOrganizationUnitRole);
wfService.saveOrUpdate(internalOrganizationUnitElement);
wfItem.getWfItemElementSet().add(internalOrganizationUnitElement);
break;
}
}
}
//partner
var uniquePartnerRoleId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.role.uniquePartner");
var myOrganization = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.myOrganization");
if (uniquePartnerRoleId == null || myOrganization == null){
throw "Configuration variables ap.project.partner.role.uniquePartner and ap.project.partner.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);
}
wfItem.getPersonMap().put("owner", null);
var year = startDate.get(Packages.java.util.Calendar.YEAR);
wfItem.setYear(new Packages.java.lang.Integer(year));
true;
|
Anchor |
---|
| wfActionLogicEnterProjectOwnerMailSender-anchor |
---|
| wfActionLogicEnterProjectOwnerMailSender-anchor |
---|
|
wfActionLogicEnterProjectOwnerMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.project.mail.subject',
textLabel:'label.ap.project.mail.text',
sendEnable:'ap.project.mail.enable',
htmlEnable:'ap.project.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleOwners',
to:'',
from:''
}; X;
|
Anchor |
---|
| wfActionLogicEnterProjectContributorMailSender-anchor |
---|
| wfActionLogicEnterProjectContributorMailSender-anchor |
---|
|
wfActionLogicEnterProjectContributorMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.project.mail.subject',
textLabel:'label.ap.project.mail.text',
sendEnable:'ap.project.mail.enable',
htmlEnable:'ap.project.mail.html.enable',
identityLogic:'wfIdentityLogicContributor',
to:'',
from:''
};X;
|
Anchor |
---|
| wfActionLogicEnterProjectHeadOfDepartmentMailSender-anchor |
---|
| wfActionLogicEnterProjectHeadOfDepartmentMailSender-anchor |
---|
|
wfActionLogicEnterProjectHeadOfDepartmentMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.project.mail.subject',
textLabel:'label.ap.project.mail.text',
sendEnable:'ap.project.mail.enable',
htmlEnable:'ap.project.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleHeadOfDepartment',
to:'',
from:''
};X;
|
Anchor |
---|
| wfActionLogicEnterProjectMailSender-anchor |
---|
| wfActionLogicEnterProjectMailSender-anchor |
---|
|
wfActionLogicEnterProjectMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var mailEnableParam = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.mail.enable");
var mailHtmlEnableParam = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.mail.html.enable");
var isHtml;
if(mailHtmlEnableParam.equalsIgnoreCase("true")){
isHtml = true;
}
else{
isHtml = false;
}
if (mailEnableParam!=null && mailEnableParam.equalsIgnoreCase("true")){
var wfItemIdentifier = wfItem.getIdentifier();
var wfItemDescription = wfItem.getDescription();
var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
var ownerSetIterator=ownerSet.iterator();
while(ownerSetIterator.hasNext()){
var ownerElement=ownerSetIterator.next();
var person = ownerElement.getPersonMap().get("ownerId");
person = gaService.getPerson(person.getId());
var contact=person.getPrincipalContactMap().get("mail");
var surnameName = person.getLastName()+" "+person.getFirstName();
var subjectLabel=messageUtil.findMessage("label.ap.project.mail.subject", [wfItemIdentifier]);
var textLabel=messageUtil.findMessage("label.ap.project.mail.text",[wfItemIdentifier, surnameName, wfItemDescription, wfItem.getWfState().getDisplayValue()]);
mailService.send("no-reply@cineca.it", [contact], null, null, subjectLabel, textLabel, null, isHtml);
}
}
|
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)
- 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 valutata la variabile di configurazione ap.project.date.expenditure.send2ugov.enabled.
Se valorizzata a true allora viene usato l'attributo expenditureStartDate altrimenti startDate - Data fine validità:
Viene valutata la variabile di configurazione ap.project.date.expenditure.send2ugov.enabled.
Se valorizzata a true allora viene usato l'attributo expenditureEndDate altrimenti endDate - CUP: cup
Inviato se valorizzata a true la variabile di configurazione ap.project.cup.send2ugov.enable. - Riferimento Data Management System (Sistema Documentale): 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) (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). - 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. - 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("ouRole");
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(organizationUnit, 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.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("ap.project.partner.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 ap.project.partner.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 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() {
var expenditureDateEnabled=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.date.expenditure.send2ugov.enabled");
if (expenditureDateEnabled && expenditureDateEnabled.trim().equalsIgnoreCase("true")){
if (wfItem.getDateMap().get("expenditureStartDate")!=null)
return wfItem.getDateMap().get("expenditureStartDate");
else
return wfItem.getDateMap().get("startDate");
} else {
return wfItem.getDateMap().get("startDate");
}
};
this.getEndDate = function() {
var expenditureDateEnabled=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.date.expenditure.send2ugov.enabled");
if (expenditureDateEnabled && expenditureDateEnabled.trim().equalsIgnoreCase("true")){
if (wfItem.getDateMap().get("expenditureEndDate")!=null)
return wfItem.getDateMap().get("expenditureEndDate");
else
return wfItem.getDateMap().get("endDate");
} else {
return wfItem.getDateMap().get("endDate");
}
};
this.getIdentifier = function() {
return wfItem.getIdentifier();
};
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() {
return wfItem.getStringMap().get("acronym");
};
this.getExternalDmsIdentifier = function() {
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.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 |
---|
|
if(!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
| 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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
| ethicCommiteeApplicabilityValidatorProject-anchor |
---|
| ethicCommiteeApplicabilityValidatorProject-anchor |
---|
|
ethicCommiteeApplicabilityValidatorProject Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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");
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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");
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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");
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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");
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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");
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
| 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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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.project.internalOrganizationUnit.role.main");
if (!internalOrganizationUnitCoordinatorRole){
throw "Configuration variable ap.project.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("ouRole");
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 |
---|
| 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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
| grantorApprovalDateValidatorProject-anchor |
---|
| grantorApprovalDateValidatorProject-anchor |
---|
|
grantorApprovalDateValidatorProject Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
var grantorApprovalDateFound=false;
var 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 approval=approvalSetIterator.next();
var approvalType=approval.getWfDictionaryMap().get("approvalType");
if (approvalType!=null && "approvalType.grantor".equals(approvalType.getInternalSourceIdentifier()) && approval.getDateMap().get("approvalDate")!=null){
grantorApprovalDateFound=true;
break;
}
}
if (!grantorApprovalDateFound){
errors.reject("error.project.grantorApprovalDate.required");
}
}
|
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
| partnerAndGlobalCostValidatorProject-anchor |
---|
| partnerAndGlobalCostValidatorProject-anchor |
---|
|
partnerAndGlobalCostValidatorProject 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
Inoltre 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:
- ap.project.partner.role.main: identificativo del dizionario relativo al ruolo partner "Coordinatore"
- ap.project.partner.role.uniquePartner: identificativo del dizionario relativo al ruolo partner "Partner unico"
- ap.project.partner.myOrganization: identificativo dell'unità organizzativa relativa all'Ateneo con mappatura verso UGOV AC
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
var coordinatorRoleId=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.role.main");
var uniquePartnerRoleId=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.role.uniquePartner");
var myOrganization=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.myOrganization");
if (coordinatorRoleId==null || myOrganization==null || uniquePartnerRoleId==null){
throw "Configuration variables ap.project.partner.role.main, ap.project.partner.role.uniquePartner and ap.project.partner.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(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");
}
}
}
}
}
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 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(partnerSet.size() == 0){
errors.reject("error.project.partner.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;
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 iouSetIterator=iouSet.iterator();
var cost = 0;
var contribution = 0;
var cofinancing = 0;
var cost2 = 0;
var contribution2 = 0;
var cofinancing2 = 0;
while (iouSetIterator.hasNext()){
var element = iouSetIterator.next();
if(checkRequested){
cost = +cost + +element.getNumberMap().get("ouRequestedCost");
contribution = +contribution + +element.getNumberMap().get("ouRequestedContribution");
cofinancing = +cofinancing + +element.getNumberMap().get("ouRequestedCofinancing");
}
cost2 = +cost2 + +element.getNumberMap().get("ouCost");
contribution2 = +contribution2 + +element.getNumberMap().get("ouContribution");
cofinancing2 = +cofinancing2 + +element.getNumberMap().get("ouCofinancing");
}
if(cost != 0){
if(wfItem.getNumberMap().get("requestedInternalCost") != cost){
errors.rejectValue("numberMap[requestedInternalCost]","error.project.internalOrganizationUnit.requested.cost.inconsistent");
}
}
if(contribution != 0){
if(wfItem.getNumberMap().get("requestedInternalContribution") != contribution){
errors.rejectValue("numberMap[requestedInternalContribution]","error.project.internalOrganizationUnit.requested.contribution.inconsistent");
}
}
if(cofinancing != 0){
if(wfItem.getNumberMap().get("requestedInternalCofinancing") != cofinancing){
errors.rejectValue("numberMap[requestedInternalCofinancing]","error.project.internalOrganizationUnit.requested.cofinancing.inconsistent");
}
}
if(cost2 != 0){
if(wfItem.getNumberMap().get("internalCost") != cost2){
errors.rejectValue("numberMap[internalCost]","error.project.internalOrganizationUnit.cost.inconsistent");
}
}
if(contribution2 != 0){
if(wfItem.getNumberMap().get("internalContribution") != contribution2){
errors.rejectValue("numberMap[internalContribution]","error.project.internalOrganizationUnit.contribution.inconsistent");
}
}
if(cofinancing2 != 0){
if(wfItem.getNumberMap().get("internalCofinancing") != cofinancing2){
errors.rejectValue("numberMap[internalCofinancing]","error.project.internalOrganizationUnit.cofinancing.inconsistent");
}
}
var partnerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement", "partnerCost", wfService);
var partnerSetIterator=partnerSet.iterator();
cost = 0;
contribution = 0;
var cost2 = 0;
var contribution2 = 0;
while (partnerSetIterator.hasNext()){
var element = partnerSetIterator.next();
if(checkRequested){
cost = +cost + +element.getNumberMap().get("partnerRequestedCost");
contribution = +contribution + +element.getNumberMap().get("partnerRequestedContribution");
}
cost2 = +cost2 + +element.getNumberMap().get("partnerCost");
contribution2 = +contribution2 + +element.getNumberMap().get("partnerContribution");
}
if(cost != 0){
if(wfItem.getNumberMap().get("requestedGlobalCost") != cost){
errors.rejectValue("numberMap[requestedGlobalCost]","error.project.partner.requested.cost.inconsistent");
}
}
if(contribution != 0){
if(wfItem.getNumberMap().get("requestedGlobalContribution") != contribution){
errors.rejectValue("numberMap[requestedGlobalContribution]","error.project.partner.requested.contribution.inconsistent");
}
}
if(cost2 != 0){
if(wfItem.getNumberMap().get("globalCost") != cost2){
errors.rejectValue("numberMap[globalCost]","error.project.partner.cost.inconsistent");
}
}
if(contribution2 != 0){
if(wfItem.getNumberMap().get("globalContribution") != contribution2){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
| 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 Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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;
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(!Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.onlyRead.erasmusItemType").contains(object.getWfItemType().getIdentifier())){
errors.reject("error.project.erasmus.operation.itemType.notAllowed");
}
break;
}
}
if(foundTeam == 0){
if(Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.onlyRead.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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 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 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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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.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();
var callState = call.getWfState().getDescription();
if (
!Packages.org.apache.commons.lang.StringUtils.equals("approved", callState)
){
errors.reject("error.project.call.notApproved");
}
}
}
}
|
Anchor |
---|
| wfStartLogicProposal-anchor |
---|
| wfStartLogicProposal-anchor |
---|
|
wfStartLogicProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var person=wfItem.getPersonMap().get("owner");
person=gaService.getPerson(person.getId());
var ownerElement=new Packages.it.cilea.wf.model.WfItemElement();
ownerElement.setDiscriminator("owner");
ownerElement.setWfItemId(wfItem.getId());
ownerElement.getPersonMap().put("ownerId", person);
wfService.saveOrUpdate(ownerElement);
wfItem.getPersonMap().put("owner", null);
var positionLastSet = person.getPositionLastSet();
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(positionLastSet, "research", "department");
positionLastSetIterator=positionLastSet.iterator();
while (positionLastSetIterator.hasNext()){
var position=positionLastSetIterator.next();
if (maxPriority == null || maxPriority.equals(position.getPriority())) {
if ("research".equals(position.getDiscriminator()) && "department"
.equals(position.getOrganizationUnit().getOrganizationUnitType().getDescription())) {
var internalOrganizationUnitElement=new Packages.it.cilea.wf.model.WfItemElement();
internalOrganizationUnitElement.setDiscriminator("internalOrganizationUnit");
internalOrganizationUnitElement.setWfItemId(wfItem.getId());
var internalOrganizationUnitRoleId = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.internalOrganizationUnit.role.main");
if (internalOrganizationUnitRoleId==null)
throw "ERROR on wfStartLogicProposal: internalOrganizationUnitRoleId is NULL ";
var internalOrganizationUnitRole = wfService.getWfDictionary(new Packages.java.lang.Integer(internalOrganizationUnitRoleId));
if (internalOrganizationUnitRole==null)
throw "ERROR on wfStartLogicProposal: internalOrganizationUnitRole is NULL ";
internalOrganizationUnitElement.getOrganizationUnitMap().put("ouId", position.getOrganizationUnit());
internalOrganizationUnitElement.getWfDictionaryMap().put("ouRole", internalOrganizationUnitRole);
wfService.saveOrUpdate(internalOrganizationUnitElement);
break;
}
}
}
//partner
var uniquePartnerRoleId=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.role.uniquePartner");
var myOrganization=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.myOrganization");
if (uniquePartnerRoleId==null || myOrganization==null){
throw "Configuration variables ap.project.partner.role.uniquePartner and ap.project.partner.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);
}
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 startDate=wfItem.getDateMap().get("startDate");
var year=startDate.get(Packages.java.util.Calendar.YEAR);
var yearString=new Packages.java.lang.Integer(year).toString();
yearString=yearString.substring(2);
var sourceItemTypeCode=wfItem.getWfItemType().getCode();
var identifier="PRO_"+sourceItemTypeCode+yearString+firstName+lastName+"_";
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);
wfItem.setYear(new Packages.java.lang.Integer(year));
true;
|
Anchor |
---|
| wfActionLogicEnterProposalMailSender-anchor |
---|
| wfActionLogicEnterProposalMailSender-anchor |
---|
|
wfActionLogicEnterProposalMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var mailEnableParam = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.proposal.mail.enable");
var mailHtmlEnableParam = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.proposal.mail.html.enable");
var isHtml;
if(mailHtmlEnableParam.equalsIgnoreCase("true")){
isHtml = true;
}
else{
isHtml = false;
}
if (mailEnableParam!=null && mailEnableParam.equalsIgnoreCase("true")){
var wfItemIdentifier = wfItem.getIdentifier();
var wfItemDescription = wfItem.getDescription();
var ownerSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "getWfItemElementSet", "it.cilea.wf.model.WfItemElement", "owner", wfService);
var ownerSetIterator=ownerSet.iterator();
while(ownerSetIterator.hasNext()){
var ownerElement=ownerSetIterator.next();
var person = ownerElement.getPersonMap().get("ownerId");
person = gaService.getPerson(person.getId());
var contact=person.getPrincipalContactMap().get("mail");
var surnameName = person.getLastName()+" "+person.getFirstName();
var subjectLabel=messageUtil.findMessage("label.ap.proposal.mail.subject", [wfItemIdentifier]);
var textLabel=messageUtil.findMessage("label.ap.proposal.mail.text",[wfItemIdentifier, surnameName, wfItemDescription, wfItem.getWfState().getDisplayValue()]);
mailService.send("no-reply@cineca.it", [contact], null, null, subjectLabel, textLabel, null, isHtml);
}
}
|
Anchor |
---|
| ethicCommiteeDeleteInconsistentDataProposal-anchor |
---|
| ethicCommiteeDeleteInconsistentDataProposal-anchor |
---|
|
ethicCommiteeDeleteInconsistentDataProposal 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 |
---|
| ownerStartValidatorProposal-anchor |
---|
| ownerStartValidatorProposal-anchor |
---|
|
ownerStartValidatorProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (object.getId()==null && object.getPersonMap().get("owner")==null){
errors.rejectValue("personMap[owner]","error.proposal.owner.required");
}
|
Anchor |
---|
| ownerValidatorProposal-anchor |
---|
| ownerValidatorProposal-anchor |
---|
|
ownerValidatorProposal 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.proposal.owner.atLeast1");
|
Anchor |
---|
| organizationUnitValidatorProposal-anchor |
---|
| organizationUnitValidatorProposal-anchor |
---|
|
organizationUnitValidatorProposal 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.proposal.multipleInternalOrganization.atLeast1");
|
Anchor |
---|
| ethicCommiteeTopicValidatorProposal-anchor |
---|
| ethicCommiteeTopicValidatorProposal-anchor |
---|
|
ethicCommiteeTopicValidatorProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeTopicValidatorProposal");
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.proposal.ethicCommiteeTopic.atLeast1");
}
}
|
Anchor |
---|
| ethicCommiteeSubmittedValidatorProposal-anchor |
---|
| ethicCommiteeSubmittedValidatorProposal-anchor |
---|
|
ethicCommiteeSubmittedValidatorProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeSubmittedValidatorProposal");
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.proposal.ethicCommiteeSubmitted.required");
}
}
|
Anchor |
---|
| ethicCommiteeAuthorizationNumberValidatorProposal-anchor |
---|
| ethicCommiteeAuthorizationNumberValidatorProposal-anchor |
---|
|
ethicCommiteeAuthorizationNumberValidatorProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeAuthorizationNumberValidatorProposal");
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.proposal.ethicCommiteeAuthorizationNumber.requiredIfGranted");
}
}
}
}
}
|
Anchor |
---|
| ethicCommiteeAuthorizationDateValidatorProposal-anchor |
---|
| ethicCommiteeAuthorizationDateValidatorProposal-anchor |
---|
|
ethicCommiteeAuthorizationDateValidatorProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeAuthorizationDateValidatorProposal");
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.proposal.ethicCommiteeAuthorizationDate.requiredIfGranted");
}
}
}
}
}
|
Anchor |
---|
| ethicCommiteeAuthorizationOrganizationValidatorProposal-anchor |
---|
| ethicCommiteeAuthorizationOrganizationValidatorProposal-anchor |
---|
|
ethicCommiteeAuthorizationOrganizationValidatorProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//log.error("Sono nel ethicCommiteeAuthorizationOrganizationValidatorProposal");
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.proposal.ethicCommiteeAuthorizationOrganization.requiredIfGranted");
}
}
}
}
}
|
Anchor |
---|
| uniqueParentProject-anchor |
---|
| uniqueParentProject-anchor |
---|
|
uniqueParentProject Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var linkSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "getChildWfItemLinkSet", "it.cilea.wf.model.WfItemLink", "link", wfService);
//log.error("linkSet: " + linkSet);
if (linkSet.size()>1){
errors.reject("error.proposal.parentProject.moreThanOneParentProposal");
} else if (linkSet.size()==1){
var linkSetIterator = linkSet.iterator();
if( linkSetIterator.hasNext() ){
var linkElement = linkSetIterator.next();
var project = linkElement.getParent();
var projectState = project.getWfState().getDescription();
if (
!Packages.org.apache.commons.lang.StringUtils.equals("approved", projectState)
&&
!Packages.org.apache.commons.lang.StringUtils.equals("concluded", projectState)
){
errors.reject("error.proposal.parentProject.notApprovedOrConcluded");
} else {
var paramMap = new Packages.java.util.HashMap();
paramMap.put("parentId", project.getId());
var count=searchBuilderTemplate.getSingleObject("getProposalChildProject", paramMap);
if (count>0)
errors.reject("error.proposal.parentProject.notUnique");
}
}
} else if (linkSet.size()==0) {
//ok don't do anythig, just chill out bro
}
|
Anchor |
---|
| organizationUnitRoleValidatorProposal-anchor |
---|
| organizationUnitRoleValidatorProposal-anchor |
---|
|
organizationUnitRoleValidatorProposal 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.proposal.multipleInternalOrganization.atLeast1");
} else {
var internalOrganizationUnitCoordinatorRole=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.internalOrganizationUnit.role.main");
if (!internalOrganizationUnitCoordinatorRole){
throw "Configuration variable ap.proposal.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("ouRole");
if (ouRole!=null && internalOrganizationUnitCoordinatorRole.equals(ouRole.getId())){
count++;
}
}
if (count==0){
errors.reject("error.proposal.multipleInternalOrganization.missingMain");
}
else if (count>1) {
errors.reject("error.proposal.multipleInternalOrganization.tooManyMain");
}
}
|
Anchor |
---|
| ownerAndOrganizationUnitMatchValidatorProposal-anchor |
---|
| ownerAndOrganizationUnitMatchValidatorProposal-anchor |
---|
|
ownerAndOrganizationUnitMatchValidatorProposal 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.proposal.multipleInternalOrganization.matchWithDepartmentOwnerNotFound", [nonMatchedDepartmentString], null);
}
}
|
Anchor |
---|
| grantorValidatorProposal-anchor |
---|
| grantorValidatorProposal-anchor |
---|
|
grantorValidatorProposal 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.proposal.grantor.atLeast1");
|
Anchor |
---|
| currencyAndInternalContributionValidatorProposal-anchor |
---|
| currencyAndInternalContributionValidatorProposal-anchor |
---|
|
currencyAndInternalContributionValidatorProposal Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var currency=object.getWfDictionaryMap().get("currency");
var euroCurrency=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.dictionary.currency.euro");
if (!euroCurrency){
throw "Configuration variable ap.dictionary.currency.euro MUST BE DEFINED";
}
if (currency && currency.getId()!=euroCurrency){
if (!object.getNumberMap().get("internalContributionOriginalCurrency")){
errors.rejectValue("numberMap[internalContributionOriginalCurrency]","error.proposal.funding.internalContributionOriginalCurrency.required");
}
if (!object.getNumberMap().get("exchangeRate")){
errors.rejectValue("numberMap[exchangeRate]","error.proposal.funding.exchangeRate.required");
}
if (!object.getDateMap().get("exchangeRateDate")){
errors.rejectValue("dateMap[exchangeRateDate]","error.proposal.funding.exchangeRateDate.required");
}
}
|
Anchor |
---|
| partnerAndGlobalCostValidatorProposal-anchor |
---|
| partnerAndGlobalCostValidatorProposal-anchor |
---|
|
partnerAndGlobalCostValidatorProposal 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=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.role.uniquePartner");
var myOrganization=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.project.partner.myOrganization");
if (coordinatorRoleId==null || myOrganization==null || uniquePartnerRoleId==null){
throw "Configuration variables ap.project.partner.role.main, ap.project.partner.role.uniquePartner and ap.project.partner.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;
while (partnerSetIterator.hasNext()){
var element=partnerSetIterator.next();
var orgUnitRole = element.getWfDictionaryMap().get("partnerRole");
var orgUnit = element.getOrganizationUnitMap().get("partnerId");
if (coordinatorRoleId.equals(orgUnitRole.getId())){
counterCoordinator++;
} else if (uniquePartnerRoleId.equals(orgUnitRole.getId())){
counterUniquePartner++;
} else {
counterOtherPartner++;
}
if(myOrganization.equals(orgUnit.getId()) && coordinatorRoleId.equals(orgUnitRole.getId())){
if (!object.getNumberMap().get("globalContribution")){
errors.rejectValue("numberMap[globalContribution]","error.proposal.funding.globalContribution.required");
}
if (!object.getNumberMap().get("globalCost")){
errors.rejectValue("numberMap[globalCost]","error.proposal.funding.globalCost.required");
}
var currency=object.getWfDictionaryMap().get("currency");
var euroCurrency=Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.dictionary.currency.euro");
if (!euroCurrency){
throw "Configuration variable ap.dictionary.currency.euro MUST BE DEFINED";
}
if (currency && currency.getId()!=euroCurrency){
if (!object.getNumberMap().get("globalCostOriginalCurrency")){
errors.rejectValue("numberMap[globalCostOriginalCurrency]","error.proposal.funding.globalCostOriginalCurrency.required");
}
if (!object.getNumberMap().get("globalContributionOriginalCurrency")){
errors.rejectValue("numberMap[globalContributionOriginalCurrency]","error.proposal.funding.globalContributionOriginalCurrency.required");
}
}
}
}
if (counterCoordinator>1){
errors.reject("error.proposal.partner.tooManyMain");
} else if (counterUniquePartner>1){
errors.reject("error.proposal.partner.tooManyUniquePartner");
} else if (partnerSet.size()>0){
if (counterCoordinator>0 && counterUniquePartner>0){
errors.reject("error.proposal.partner.coordinatorAndUniquePartner");
} else if (counterOtherPartner>0 && counterCoordinator==0){
errors.reject("error.proposal.partner.missingMain");
} else if (counterOtherPartner>0 && counterUniquePartner>0){
errors.reject("error.proposal.partner.otherPartnerAndUniquePartner");
} else if (counterOtherPartner==0 && counterCoordinator>0){
errors.reject("error.proposal.partner.coordinatorAndNoOtherPartner");
}
}
|
Anchor |
---|
| wfStartLogicPublicEngagement-anchor |
---|
| wfStartLogicPublicEngagement-anchor |
---|
|
wfStartLogicPublicEngagement 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 |
---|
| wfStartLogicPublicEngagementAcademicAreaFromOwner-anchor |
---|
| wfStartLogicPublicEngagementAcademicAreaFromOwner-anchor |
---|
|
wfStartLogicPublicEngagementAcademicAreaFromOwner 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 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!");
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);
break;
}
}
}
}
true;
|
Anchor |
---|
| validatorDepartmentPublicEngagement-anchor |
---|
| validatorDepartmentPublicEngagement-anchor |
---|
|
validatorDepartmentPublicEngagement Viene controllato che la persona aggiunta sia all'interno del dipertimento questo è il messaggio di errore: "Il responsabile dell'iniziativa deve afferire ad un dipartimento. Scegliere un responsabile con un'afferenza valida." . Questa condizione viene applicata se nella tabella di configurazione di MA è presente la variabile "ap.pen.owner.internalOrganizationUnit.mandatory" viene messa a true. Se non è presente la variabile: questa validazione non è applicata.
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 |
---|
|
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 nel tab "Dati generali".
Dal punto di vista del modello dati si tratta degli elementi di tipo
object Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
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 Viene controllato che siano presenti nella Public Engagement gli strumenti di valutazione obbligatori, questo è l'errore che viene visualizzato: "Strumenti di valutazione obbligatori" nel tab "Dati generali".
Dal punto di vista del modello dati si tratta degli elementi di tipo
evaluationTool Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
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 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 di tipo
internalOrganizationUnit Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
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 di tipo
internalOrganizationUnit Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
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 validator di delete che 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 di tipo
wfItem Per maggiori dettagli cfr. excel modello dati dell'entità Contratto
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 Validator di delete che 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 di tipo
wfItem Per maggiori dettagli cfr. excel 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 Validator di forward che impedisce l'avanzamento se l'evento è periodico ma non è indicata la periodicità
Dal punto di vista del modello dati si tratta degli elementi di tipo
wfItemData Nel dettagio controlla i campi
command.booleanMap[periodicEvent] e
command.wfDictionaryMap[periodicity] Per maggiori dettagli cfr. excel 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 di tipo
WfItemElement-scientificAreasInvolved Per maggiori dettagli cfr. excel 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.
Essendo posta come validazione di enter in Bozza, è necessario eseguire un controllo più fine per attivarla.
Dal punto di vista del modello dati si tratta degli elementi di tipo
WfItemData Per maggiori dettagli cfr. excel 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 inutilmente.
Dal punto di vista del modello dati si tratta degli elementi di tipo
WfItemElement Per maggiori dettagli cfr. excel 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 inutilmente.
Dal punto di vista del modello dati si tratta degli elementi di tipo
WfItemElement Per maggiori dettagli cfr. excel 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 più informazioni nel caso venga selezionata la tipologia Altro.
Dal punto di vista del modello dati si tratta degli elementi di tipo
WfItemElementData Per maggiori dettagli cfr. excel 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'Area scientifica coinvolta nella sezione "Aree scientifiche coinvolte" nel tab "Classificazioni".
Dal punto di vista del modello dati si tratta degli elementi di tipo
WfItemElement-scientificAreasInvolved Per maggiori dettagli cfr. excel 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");
}
}
|
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 di tipo
WfItemElement-scientificAreasInvolved Per maggiori dettagli cfr. excel 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 |
---|
| wfIdentityLogicMultipleHeadOfDepartmentPublicEngagementPermissionsJs-anchor |
---|
| wfIdentityLogicMultipleHeadOfDepartmentPublicEngagementPermissionsJs-anchor |
---|
|
wfIdentityLogicMultipleHeadOfDepartmentPublicEngagementPermissionsJs Questa è una permissions logic che costruisce dinamicamente i permessi per i publicEngagement per i Team Dipartimentali (headOfDepartment).
Viene eseguita ad ogni salvataggio e costruisce le permissions dei singoli dipartimenti in base al loro ruolo.
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="rwf";
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="rwf";
else
permissions="r";
break;
case "rejected":
if(Packages.java.lang.Boolean.TRUE.equals(hasOrgUnitPowerPermissions))
permissions="rwf";
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 |
---|
| wfActionLogicEnterWorkgroupOwnerMailSender-anchor |
---|
| wfActionLogicEnterWorkgroupOwnerMailSender-anchor |
---|
|
wfActionLogicEnterWorkgroupOwnerMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.workgroup.mail.subject',
textLabel:'label.ap.workgroup.mail.text',
sendEnable:'ap.itemType.wkg.mail.enable',
htmlEnable:'ap.itemType.wkg.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleOwners',
to:'',
from:''
}; X;
|
Anchor |
---|
| wfActionLogicEnterWorkgroupHeadOfDepartmentMailSender-anchor |
---|
| wfActionLogicEnterWorkgroupHeadOfDepartmentMailSender-anchor |
---|
|
wfActionLogicEnterWorkgroupHeadOfDepartmentMailSender Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
X={
subjectLabel:'label.ap.workgroup.mail.subject',
textLabel:'label.ap.workgroup.mail.text',
sendEnable:'ap.itemType.wkg.mail.enable',
htmlEnable:'ap.itemType.wkg.mail.html.enable',
identityLogic:'wfIdentityLogicMultipleHeadOfDepartment',
to:'',
from:''
}; X;
|
Anchor |
---|
| laboratoryValidatorWorkgroup-anchor |
---|
| laboratoryValidatorWorkgroup-anchor |
---|
|
laboratoryValidatorWorkgroup Validazione che controlla che se esiste almeno un laboratorio collegato al gruppo di lavoro, questo laboratorio 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
workgroupLaboratoryLink Per maggiori dettagli cfr. excel 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. excel 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 Validazione che controlla che, mentre viene collegato ad altri gruppi di lavoro, 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. excel 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 |
---|
| approvedWorkgroupValidator-anchor |
---|
| approvedWorkgroupValidator-anchor |
---|
|
approvedWorkgroupValidator Validazione che controlla che, mentre viene collegato ad altri gruppi di lavoro, 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. excel 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 |
---|
| projectValidatorWorkgroup-anchor |
---|
| projectValidatorWorkgroup-anchor |
---|
|
projectValidatorWorkgroup Validazione che controlla che se esiste almeno una Progetto collegato al gruppo di lavoro, questo Progetto deve essere in uno stato che è contenuto nella variabile "ap.wkg.workgroupProjectLink.csvAllowedProjectState" altrimenti lancia un errore.
Dal punto di vista del modello dati si tratta degli elementi di tipo
workgroupProjectLink Per maggiori dettagli cfr. excel 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 |
---|
| ownerCannotAddOtherOnesValidator-anchor |
---|
| ownerCannotAddOtherOnesValidator-anchor |
---|
|
ownerCannotAddOtherOnesValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dalla request l'utente loggato in quel momento
//NOTA: in caso di loginAs restituisce l'user impersonato
var personalUserName=request.getUserPrincipal().getName();
var personId=gaService.getUser(personalUserName).getPersonId();
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement=object;
//ricavo wfItem completo, non mi serve il fragment dato che non posso comunque
var wfItem= wfService.getWfItem(wfItemElement.getWfItemId());
//cerco tra gli owner se c'è la persona al momento loggata
var ownerWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","owner", wfService);
var ownerWfElementSetIterator=ownerWfElementSet.iterator();
while(ownerWfElementSetIterator.hasNext()){
var ownerElement=ownerWfElementSetIterator.next();
var owner=ownerElement.getPersonMap().get("ownerId");
if(owner.getId()==personId){
errors.reject("error.workgroup.owner.cannotAddOtherOnes");
}
}
|
Anchor |
---|
| ownerCannotDeleteOtherOnesValidator-anchor |
---|
| ownerCannotDeleteOtherOnesValidator-anchor |
---|
|
ownerCannotDeleteOtherOnesValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dalla request l'utente loggato in quel momento
//NOTA: in caso di loginAs restituisce l'user impersonato
var personalUserName=request.getUserPrincipal().getName();
var personId=gaService.getUser(personalUserName).getPersonId();
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement=object;
//ricavo wfItem completo, non mi serve il fragment dato che non posso comunque
var wfItem= wfService.getWfItem(wfItemElement.getWfItemId());
//cerco tra gli owner se c'è la persona al momento loggata
var ownerWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","owner", wfService);
var ownerWfElementSetIterator=ownerWfElementSet.iterator();
while(ownerWfElementSetIterator.hasNext()){
var ownerElement=ownerWfElementSetIterator.next();
var owner=ownerElement.getPersonMap().get("ownerId");
if(owner.getId()==personId){
errors.reject("error.workgroup.owner.cannotDeleteOtherOnes");
}
}
|
Anchor |
---|
| internalRepresentativeCannotEditOwnersValidator-anchor |
---|
| internalRepresentativeCannotEditOwnersValidator-anchor |
---|
|
internalRepresentativeCannotEditOwnersValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//ricavo dalla request l'utente loggato in quel momento
//NOTA: in caso di loginAs restituisce l'user impersonato
var personalUserName=request.getUserPrincipal().getName();
var personId=gaService.getUser(personalUserName).getPersonId();
//inutile, ma mi serve per ricordarmi il contesto
var wfItemElement=object;
//ricavo wfItem completo, non mi serve il fragment dato che non posso comunque
var wfItem= wfService.getWfItem(wfItemElement.getWfItemId());
//cerco tra gli internalRepresentative se c'è la persona al momento loggata
var internalRepresentativeWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","internalRepresentative", wfService);
var internalRepresentativeWfElementSetIterator=internalRepresentativeWfElementSet.iterator();
while(internalRepresentativeWfElementSetIterator.hasNext()){
var internalRepresentativeElement=internalRepresentativeWfElementSetIterator.next();
var internalRepresentative=internalRepresentativeElement.getPersonMap().get("internalRepresentative");
if(internalRepresentative.getId()==personId){
errors.reject("error.workgroup.internalRepresentative.cannotEditOwners");
}
}
|
Anchor |
---|
| wfActionLogicSaveExCoordinatorToContributor-anchor |
---|
| wfActionLogicSaveExCoordinatorToContributor-anchor |
---|
|
wfActionLogicSaveExCoordinatorToContributor Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveExCoordinatorToContributor |
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 |
---|
| wfActionLogicSaveOtherCoordinatorDefault-anchor |
---|
| wfActionLogicSaveOtherCoordinatorDefault-anchor |
---|
|
wfActionLogicSaveOtherCoordinatorDefault Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveOtherCoordinatorDefault |
Anchor |
---|
| wfActionLogicSaveDateHistory-anchor |
---|
| wfActionLogicSaveDateHistory-anchor |
---|
|
wfActionLogicSaveDateHistory Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveDateHistory |
Anchor |
---|
| wfActionLogicSaveInvolvedDepartment-anchor |
---|
| wfActionLogicSaveInvolvedDepartment-anchor |
---|
|
wfActionLogicSaveInvolvedDepartment Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveInvolvedDepartment |
Anchor |
---|
| wfActionLogicSaveProjectNazInternazDepartmentValidation-anchor |
---|
| wfActionLogicSaveProjectNazInternazDepartmentValidation-anchor |
---|
|
wfActionLogicSaveProjectNazInternazDepartmentValidation Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveProjectNazInternazDepartmentValidation |
Anchor |
---|
| wfActionLogicLoadNazInternaz-anchor |
---|
| wfActionLogicLoadNazInternaz-anchor |
---|
|
wfActionLogicLoadNazInternaz Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.load.WfActionLogicLoadNazInternaz |
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 |
---|
| wfActionLogicSaveContributorInvitation-anchor |
---|
| wfActionLogicSaveContributorInvitation-anchor |
---|
|
wfActionLogicSaveContributorInvitation Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveContributorInvitation |
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.
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 dipartimento 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 dipartimentale.
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.
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 responsabile scientifico 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 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.
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 referente amministrativo 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 referente amministrativo.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.surplus.logic.action.save.WfActionLogicSaveMultipleAdministrativeOwner |
Anchor |
---|
| wfActionLogicVersionize-anchor |
---|
| wfActionLogicVersionize-anchor |
---|
|
wfActionLogicVersionize Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.logic.WfActionLogicVersionize |
Anchor |
---|
| wfActionLogicEnterMailSender-anchor |
---|
| wfActionLogicEnterMailSender-anchor |
---|
|
wfActionLogicEnterMailSender Questa action logic serve per inviare segnalazioni via mail ai vari attori del flusso.
TODO
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:
<CODICE>-<PROGRESSIVO> - CODICE: come da tassonomia ap-item-type.xls
- PROGRESSIVO: numero progressivo contestuale all'anno e codice
Per maggiori dettagli cfr. excel modello dati dell'entità in questione e la tassonomia ap-item-type.xls
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var sourceItemTypeCode=wfService.getWfItemType(wfItem.getWfItemTypeId()).getCode();
var identifier=sourceItemTypeCode+"-";
var sequenceName = "item_" + sourceItemTypeCode + "_seq";
var counter = wfService.updateSequence(sequenceName);
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;
identifier+=counterString;
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
- PROGRESSIVO: numero progressivo contestuale all'anno e codice
Per maggiori dettagli cfr. excel modello dati dell'entità Progetto e la tassonomia ap-item-type.xls
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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=wfItem.getWfItemType().getCode();
var identifier=yearString+"-"+sourceItemTypeCode+"-";
var sequenceName = "item_" + sourceItemTypeCode + "_" + year + "_seq";
var counter = wfService.updateSequence(sequenceName);
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;
identifier+=counterString;
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 data di inizio
startDate Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var startDate=wfItem.getDateMap().get("startDate");
var year=startDate.get(Packages.java.util.Calendar.YEAR);
wfItem.setYear(new Packages.java.lang.Integer(year));
|
Anchor |
---|
| wfStartLogicOwnerDependentIdentifier-anchor |
---|
| wfStartLogicOwnerDependentIdentifier-anchor |
---|
|
wfStartLogicOwnerDependentIdentifier Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var person = null;
var ownerElementSetIterator=wfItem.getWfItemElementMap().get("owner").iterator();
var min = 0;
while(ownerElementSetIterator.hasNext()){
var element = ownerElementSetIterator.next()
if(min == 0){
min = element.getId;
person = element.getPersonMap().get("ownerId");
} else {
if(min > element.getId){
min = element.getId;
person = element.getPersonMap().get("ownerId");
}
}
}
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 identifier=sourceItemTypeCode+yearString+firstName+lastName+"_";
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 Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//caricamento owner
var person=wfItem.getPersonMap().get("owner");
if (person!=null){
var startDate=wfItem.getDateMap().get("startDate");
person=gaService.getPerson(person.getId());
var ownerElement=new Packages.it.cilea.wf.model.WfItemElement();
ownerElement.setDiscriminator("owner");
ownerElement.setWfItemId(wfItem.getId());
ownerElement.getPersonMap().put("ownerId", person);
ownerElement.getDateMap().put("startDate", startDate);
Packages.it.cilea.wf.util.WfUtil.addRoleInElementIfDefined(wfItem, ownerElement, wfService);
wfService.saveOrUpdate(ownerElement);
wfItem.getWfItemElementSet().add(ownerElement);
wfItem.getPersonMap().put("owner", null);
//caricamento dipartimento con data
var ownerDepartmentPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
ownerDepartmentPositionSearch.setPersonId(person.getId());
ownerDepartmentPositionSearch.setDate(startDate.getTime());
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())) {
var internalOrganizationUnitElement=new Packages.it.cilea.wf.model.WfItemElement();
internalOrganizationUnitElement.setDiscriminator("internalOrganizationUnit");
internalOrganizationUnitElement.setWfItemId(wfItem.getId());
internalOrganizationUnitElement.getOrganizationUnitMap().put("ouId", position.getOrganizationUnit());
Packages.it.cilea.wf.util.WfUtil.addRoleInElementIfDefined(wfItem, internalOrganizationUnitElement, wfService);
wfService.saveOrUpdate(internalOrganizationUnitElement);
wfItem.getWfItemElementSet().add(internalOrganizationUnitElement);
break;
}
}
}
true;
|
Anchor |
---|
| wfStartLogicMultipleInternalOrganizationUnits-anchor |
---|
| wfStartLogicMultipleInternalOrganizationUnits-anchor |
---|
|
wfStartLogicMultipleInternalOrganizationUnits 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. excel 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 |
---|
| multipleOwnerValidator-anchor |
---|
| multipleOwnerValidator-anchor |
---|
|
multipleOwnerValidator validator per controllare presenza di almeno un owner NEL FRAGMENT Per maggiori dettagli cfr. excel modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ownerWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","owner", wfService);
if(ownerWfElementSet.isEmpty()){
errors.reject("error.owner.required");
}
|
Anchor |
---|
| intellectualPropertyOwnerValidator-anchor |
---|
| intellectualPropertyOwnerValidator-anchor |
---|
|
intellectualPropertyOwnerValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//non mi importa in che stato sono, vado sempre a controllare dove potrei trovare l'owner
var ownerInMap = object.getPersonMap().get("owner");
var ownerWfElementSet = Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","owner", wfService);
if(ownerInMap==null){
if(ownerWfElementSet.isEmpty())
errors.reject("error.intellectualProperty.owner.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. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if(object.getDateMap().get("endDate") != null && object.getDateMap().get("startDate") != null){
if(object.getDateMap().get("startDate").getTime().after(object.getDateMap().get("endDate").getTime())){
errors.reject("error.date.startDateEndDateNotCompatible");
}
}
|
Anchor |
---|
| startDateOfElementAfterStartDateOfItemValidator-anchor |
---|
| startDateOfElementAfterStartDateOfItemValidator-anchor |
---|
|
startDateOfElementAfterStartDateOfItemValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var wfItemElementStartDate=object.getDateMap().get("startDate");
var wfItemStartDate=object.getWfItem().getDateMap().get("startDate");
var wfItemEndDate=object.getWfItem().getDateMap().get("endDate");
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);
}
|
Anchor |
---|
| internalOrganizationUnitValidator-anchor |
---|
| internalOrganizationUnitValidator-anchor |
---|
|
internalOrganizationUnitValidator validator per controllare presenza di almeno una unità organizzativa NEL FRAGMENT Per maggiori dettagli cfr. excel 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.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. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var contributorWfElementSet=Packages.it.cilea.core.fragment.util.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 keywordErc
Dal punto di vista del modello dati si tratta degli attributi
keywordErc Per maggiori dettagli cfr. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var keywordErcWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","keywordErc", wfService);
if(keywordErcWfElementSet.isEmpty()){
errors.reject("error.keywordErc.required");
}
|
Anchor |
---|
| keywordAtecoValidator-anchor |
---|
| keywordAtecoValidator-anchor |
---|
|
keywordAtecoValidator validator per controllare presenza di almeno una keywordAteco
Dal punto di vista del modello dati si tratta degli attributi
keywordAteco Per maggiori dettagli cfr. excel 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 validator per controllare presenza di almeno una keywordUserDefined
Dal punto di vista del modello dati si tratta degli attributi
keywordUserDefined Per maggiori dettagli cfr. excel 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 validator per controllare presenza di almeno una researchLine
Dal punto di vista del modello dati si tratta degli attributi
researchLine Per maggiori dettagli cfr. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var researchLineWfElementSet=Packages.it.cilea.core.fragment.util.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. excel 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 Validator per controllare che l'owner inserito in start abbia una posizione di ricerca su un dipartimento a partire dalla data di inizio (startDate).
Per maggiori dettagli cfr. excel modello dati dell'entità in questione.
Questa validazione viene attivata SOLO se
ap.checkDateExtensionValidator.enabled=true Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
function showOrHiddenError(error, mandatory){
if(mandatory){
errors.reject(error);
}else {
log.error(error);
}
}
function showOrHiddenValueError(value,error, mandatory){
if(mandatory){
errors.rejectValue(value,error);
}else {
log.error(error);
}
}
if (object.getId()==null){
var mandatory=Packages.it.cilea.wf.util.WfUtil.getMandatory(object,"owner");
if (object.getPersonMap().get("owner")==null)
showOrHiddenValueError("personMap[owner]","error.owner.required", mandatory);
else{
var typeForConfig = wfService.getWfItemType(wfItem.getWfItemTypeId());
if (!typeForConfig.getParentWfItemTypeSet().isEmpty()) {
var parentSetIterator = typeForConfig.getParentWfItemTypeSet().iterator();
while (parentSetIterator.hasNext()){
typeForConfig = parentSetIterator.next();
if (!typeForConfig.getParentWfItemTypeSet().isEmpty()) {
var parentParentSetIterator = typeForConfig.getParentWfItemTypeSet().iterator();
while (parentParentSetIterator.hasNext()){
typeForConfig = parentParentSetIterator.next();
break;
}
}
break;
}
}
var dateDiscriminator = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap." + typeForConfig.getIdentifier().toLowerCase() + ".ownerPositionStartValidator.dateMap.discriminator");
if(dateDiscriminator == null){
dateDiscriminator = 'startDate';
}
if(object.getDateMap().get(dateDiscriminator)==null)
showOrHiddenValueError("dateMap["+ dateDiscriminator +"]","error."+dateDiscriminator+".required", mandatory);
else{
var owner= object.getPersonMap().get("owner");
var ownerPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
ownerPositionSearch.setPersonId(owner.getId());
ownerPositionSearch.setDate(object.getDateMap().get(dateDiscriminator).getTime());
ownerPositionSearch.setOrganizationUnitTypeDescription("department");
ownerPositionSearch.setDiscriminator("research");
var ownerPositionSet = gaService.getPositionSearchList(ownerPositionSearch, 0);
if(ownerPositionSet.isEmpty()){
showOrHiddenError("error.owner.emptyResearchPosition",mandatory);
}
}
}
}
|
Anchor |
---|
| multipleOwnerPositionConsistencyStartDateValidator-anchor |
---|
| multipleOwnerPositionConsistencyStartDateValidator-anchor |
---|
|
multipleOwnerPositionConsistencyStartDateValidator Validator per controllare che ogni owner inserito abbia un'afferenza valida nella data designata è possibile attivare/disattivare questo controllo con la variabile di configurazione usata anche in ownerPositionStartValidator
SE l'oggetto è già stato creato
SE la variabile è attivata
SE esiste almeno un owner
SE esiste una data di inizio
SE qualcuno non ha una posizione nella data di inizio specificata viene scatenato l'errore: "E' stato trovato uno o più Responsabili scientifici senza una posizione di ricerca su un dipartimento nella data di inizio specificata."
Per maggiori dettagli cfr. excel modello dati dell'entità in questione.
Questa validazione viene attivata SOLO se
ap.checkDateExtensionValidator.enabled=true Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//innanzitutto controllo che non sia un oggetto appena creato
if (object.getId()!=null){
//poi controllo che non ci siano stati errori, se non ce ne sono stati allora vado avanti
//controllo io se le info che mi servono ci sono o meno
//if(!errors.hasErrors()){
//poi ricavo se la variabile di configurazione per il controllo è attiva o meno
//se lo è, allora scateno la validazione
var mandatory=Packages.it.cilea.wf.util.WfUtil.getMandatory(object,"owner");
if(mandatory){
//poi controllo che il fragment degli owner non sia vuoto
var ownerWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(object, "it.cilea.wf.model.WfItemElement","owner", wfService);
if(!ownerWfElementSet.isEmpty()){
//poi controllo che vi sia la data di inizio
var startDate=object.getDateMap().get("startDate");
//log.error("startDate: "+startDate.getTime());
if(startDate!=null){
//a questo punto ho tutte le informazioni che mi servono per la validazione
//vado a ciclare il set degli owner alla ricerca di qualcuno che non abbia una posizione nella data di inizio specificata
//se ne trovo anche solo uno scateno il messaggio di errore
var ownerSetIterator = ownerWfElementSet.iterator();
while (ownerSetIterator.hasNext()){
var ownerElement = ownerSetIterator.next(); //ricavo il singolo element
var ownerPerson= ownerElement.getPersonMap().get("ownerId"); //ricavo l'owner
//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();
//log.error("owner id: "+ownerPerson.getId());
ownerPositionSearch.setPersonId(ownerPerson.getId());
ownerPositionSearch.setDate(startDate.getTime());
ownerPositionSearch.setOrganizationUnitTypeDescription("department");
ownerPositionSearch.setDiscriminator("research");
var ownerPositionSet = gaService.getPositionSearchList(ownerPositionSearch, 0);
if(ownerPositionSet.isEmpty()){
errors.reject("error.multipleOwner.emptyResearchPosition");
}
}//fine ciclo tra gli owner
}else{
errors.reject("error.startDate.required");
}
}else{
errors.reject("error.owner.required");
}
}
//}//controllo errori
}
|
Anchor |
---|
| getYearFromStartDateValidator-anchor |
---|
| getYearFromStartDateValidator-anchor |
---|
|
getYearFromStartDateValidator validator di save che ricava l'anno dalla data di inizio creato perchè gli elementi di input disabilitati della form non vengono salvati
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 Logica che ogni volta che viene aggiunto un nuovo owner, ne ricava il dipartimento e lo aggiunge ai Dipartimenti di afferenza del publicEngagement, se non già presente, altrimenti lancia un errore.
è una logica che viene triggerata in fase di SAVE per l'onwer di Pubblic Engagement (Terza Missione).
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
function showOrHiddenError(error, mandatory){
if(mandatory){
errors.reject(error);
}else {
log.error(error);
}
}
//script per aggiunta nuovo dipartimento nuovo owner
//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 wfItem= wfService.getWfItem(wfItemElement.getWfItemId());
var fragmentInfo=Packages.it.cilea.core.fragment.util.FragmentUtil.getFragmentableInfo(wfItemElement);
var newOwnerToAdd= wfItemElement.getPersonMap().get(fragmentInfo.getDiscriminator()+"Id");
if(newOwnerToAdd != null){
var person= gaService.getPerson(newOwnerToAdd.getPersonId());
var mandatory=Packages.it.cilea.wf.util.WfUtil.getMandatory(wfItem,fragmentInfo.getDiscriminator());
if(wfItem.getDateMap().get("startDate")==null)
showOrHiddenError("error.startDate.required",mandatory);
else{
//ricerca del dipartimento associato alla persona
var ownerDepartmentPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
ownerDepartmentPositionSearch.setPersonId(person.getId());
ownerDepartmentPositionSearch.setDate(wfItem.getDateMap().get("startDate").getTime());
ownerDepartmentPositionSearch.setOrganizationUnitTypeDescription("department");
ownerDepartmentPositionSearch.setDiscriminator("research");
var ownerDepartmentPositionSet = gaService.getPositionSearchList(ownerDepartmentPositionSearch, 0);
if(ownerDepartmentPositionSet.isEmpty()){
showOrHiddenError("error.owner.emptyResearchPosition",mandatory);
}else{
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(ownerDepartmentPositionSet, "research", "department");
//ciclo posittion in cerca del dipartimento del nuovo owner
var newOwnerOrgUnit= null;
var ownerDepartmentPositionSetIterator=ownerDepartmentPositionSet.iterator();
while (ownerDepartmentPositionSetIterator.hasNext()){
var position=ownerDepartmentPositionSetIterator.next();
if (maxPriority == null || maxPriority.equals(position.getPriority())) {
newOwnerOrgUnit=position.getOrganizationUnit();
}
}
//cerco se c'è già il dipartimento, se no lo aggiungo
var orgUnitWfElementSet=Packages.it.cilea.core.fragment.util.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.getOrganizationUnitId()){
alreadyAdded=true;
}
}
if(!alreadyAdded){
var ouIe=new Packages.it.cilea.wf.model.WfItemElement();
ouIe.setDiscriminator("internalOrganizationUnit");
ouIe.setWfItemId(wfItem.getId());
ouIe.getOrganizationUnitMap().put("ouId", newOwnerOrgUnit);
var roleId=wfItemElement.getWfDictionaryMap().get("roleId");
if (roleId!=null&&fragmentInfo!=null){
Packages.it.cilea.wf.util.WfUtil.addRoleInElementIfPresent(wfItem,roleId,fragmentInfo, ouIe, wfService);
}
Packages.it.cilea.core.fragment.util.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 |
---|
| deleteOrgUnitFromOldOwnerValidator-anchor |
---|
| deleteOrgUnitFromOldOwnerValidator-anchor |
---|
|
deleteOrgUnitFromOldOwnerValidator Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//script per eliminazione dipartimento vecchio owner
function getDepartmentFromPerson(wfItem, person){
//ricerca del dipartimento associato alla persona
var personDepartmentPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
personDepartmentPositionSearch.setPersonId(person.getId());
personDepartmentPositionSearch.setDate(wfItem.getDateMap().get("startDate").getTime());
personDepartmentPositionSearch.setOrganizationUnitTypeDescription("department");
personDepartmentPositionSearch.setDiscriminator("research");
var personDepartmentPositionSet = gaService.getPositionSearchList(personDepartmentPositionSearch, 0);
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(personDepartmentPositionSet, "research", "department");
//ciclo posittion in cerca del dipartimento della person
var personDepartmentPositionSetIterator=personDepartmentPositionSet.iterator();
while (personDepartmentPositionSetIterator.hasNext()){
var position=personDepartmentPositionSetIterator.next();
if (maxPriority == null || maxPriority.equals(position.getPriority())) {
return position.getOrganizationUnit();
}
}
}
//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 wfItem= wfService.getWfItem(wfItemElement.getWfItemId());
var oldOwnerToDelete= wfItemElement.getPersonMap().get("ownerId");
var person= gaService.getPerson(oldOwnerToDelete.getPersonId());
//ricavo il dipartimento della persona
var oldOwnerOrgUnit= getDepartmentFromPerson(wfItem, person);
//cerco tra gli owner se c'è già qualcuno associato allo stesso dipartimento
var ownerWfElementSet=Packages.it.cilea.core.fragment.util.FragmentUtil.getCurrentFragmentSetByParentAndDiscriminator(wfItem, "it.cilea.wf.model.WfItemElement","owner", wfService);
var ownerWfElementSetIterator=ownerWfElementSet.iterator();
//mi serve per verificare se altri owner hanno il dipartimento in comune
//se ne trovo un altro con lo stesso dipartimento, incremento
var ownersWithCommonDepartment=0;
while(ownerWfElementSetIterator.hasNext()){
var ownerElement=ownerWfElementSetIterator.next();
var owner=ownerElement.getPersonMap().get("ownerId");
//per non contare anche l'owner che sto togliendo
if(owner.getId()!=person.getId()){
var ownerOrgUnit=getDepartmentFromPerson(wfItem, owner);
if(ownerOrgUnit.getOrganizationUnitId()==oldOwnerOrgUnit.getOrganizationUnitId()){
ownersWithCommonDepartment++;
}
}
}
if(ownersWithCommonDepartment==0){
var ouIe=null;
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 orgUnitElement=internalOrganizationUnitSetIterator.next();
var orgUnit= orgUnitElement.getOrganizationUnitMap().get("ouId");
if(orgUnit.getOrganizationUnitId()==oldOwnerOrgUnit.getOrganizationUnitId()){
ouIe=orgUnitElement;
}
}
Packages.it.cilea.core.fragment.util.FragmentUtil.deleteFragment(ouIe, wfService);
}
}
|
Anchor |
---|
| ownerWithSameDepartmentAsHeadValidator-anchor |
---|
| ownerWithSameDepartmentAsHeadValidator-anchor |
---|
|
ownerWithSameDepartmentAsHeadValidator Questa validazione viene triggerata in fase di creazione di un nuovo oggetto 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 (alla data di inizio specificata per l'oggetto creato).
La variabile di configurazione ap.<tipologia>.ownerWithSameDepartmentAsHeadValidator.dateMap.discriminator contiene il nome dell'attributo da usare per recuperare la data di inizio relativa all'oggetto creato.
Questa validazione prende in considerazione anche la variabile di configurazione ap.<tipologia>.owner.internalOrganizationUnit.mandatory che specifica se il responsabile scientifico debba obbligatoriamente avere un'afferenza su un dipartimento.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//validator per headofdepartment
//prima controllo che non ci siano stati errori
if(!errors.hasErrors()){
var list=gaAuthorizationService.getAuthoritiesInfoSelectableDisplayList("/DEPARTMENT/ap.profile");
//controllo per verificare se sono in visione dipartimentale o no
if(list.get(0).getIdentifyingValue()!=-1){
if (object.getId()==null){
//gli altri controlli non li faccio, ci pensano gli altri validator
var owner= object.getPersonMap().get("owner");
var ownerPositionSearch = new Packages.it.cilea.ga.command.PositionSearchCommand();
ownerPositionSearch.setPersonId(owner.getId());
var typeForConfig = wfService.getWfItemType(object.getWfItemTypeId());
if (!typeForConfig.getParentWfItemTypeSet().isEmpty()) {
var parentSetIterator = typeForConfig.getParentWfItemTypeSet().iterator();
while (parentSetIterator.hasNext()){
typeForConfig = parentSetIterator.next();
if (!typeForConfig.getParentWfItemTypeSet().isEmpty()) {
var parentParentSetIterator = typeForConfig.getParentWfItemTypeSet().iterator();
while (parentParentSetIterator.hasNext()){
typeForConfig = parentParentSetIterator.next();
break;
}
}
break;
}
}
var dateDiscriminator = Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap." + typeForConfig.getIdentifier().toLowerCase() + ".ownerWithSameDepartmentAsHeadValidator.dateMap.discriminator");
if(dateDiscriminator == null){
dateDiscriminator = 'startDate';
}
ownerPositionSearch.setDate(object.getDateMap().get(dateDiscriminator).getTime());
ownerPositionSearch.setOrganizationUnitTypeDescription("department");
ownerPositionSearch.setDiscriminator("research");
var ownerPositionSet = gaService.getPositionSearchList(ownerPositionSearch, 0);
var maxPriority = Packages.it.cilea.ga.util.GaUtil.getMaxPriority(ownerPositionSet, "research", "department");
var mandatory=Packages.it.cilea.wf.util.WfUtil.getMandatory(object,"owner");
if(mandatory){
//ciclo posittion in cerca del dipartimento della person
var department=null;
var ownerPositionSetIterator=ownerPositionSet.iterator();
while (ownerPositionSetIterator.hasNext()){
var position=ownerPositionSetIterator.next();
if (maxPriority == null || maxPriority.equals(position.getPriority())) {
department=position.getOrganizationUnit();
//log.error("department id: "+department.getOrganizationUnitId());
}
}
//uso un flag dato che devo ciclare su tutti i possibili dipartimenti
var flag=false;
var listIterator=list.iterator();
if (department!=null){
while(listIterator.hasNext()){
var selectable=listIterator.next();
//log.error("selectable getIdentifyingValue: "+selectable.getIdentifyingValue());
if(department.getOrganizationUnitId()==selectable.getIdentifyingValue()){
flag=true;
}
}
}
if(!flag){
errors.reject("error.owner.mustBeSameAsHead");
}
}
}
}
}
|
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. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
var ouIdToCheck = object.getIntegerMap().get("ouIdPreviousValue");
if (ouIdToCheck==null){
ouIdToCheck=object.getOrganizationUnitMap().get("ouId").getId();
}
var ouRoleToCheck = object.getIntegerMap().get("ouRolePreviousValue");
var ouRoleDiscriminator="";
if (ouRoleToCheck==null){
if (object.getWfDictionaryMap().get("ouRole")!=null){
ouRoleToCheck=object.getWfDictionaryMap().get("ouRole").getId();
ouRoleDiscriminator="ouRole";
} else if (object.getWfDictionaryMap().get("roleId")!=null){
ouRoleToCheck=object.getWfDictionaryMap().get("roleId").getId();
ouRoleDiscriminator="roleId";
}
}
var list=gaAuthorizationService.getAuthoritiesInfoSelectableDisplayList("/DEPARTMENT/ap.profile");
//controllo per verificare se sono in visione dipartimentale o no
var listIterator=list.iterator();
while(listIterator.hasNext()){
var selectable=listIterator.next();
if(ouIdToCheck==selectable.getIdentifyingValue()){
object.getOrganizationUnitMap().put("ouId",gaService.getOrganizationUnit(ouIdToCheck));
object.getWfDictionaryMap().put("ouRole",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. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
// Elenco dei miei dipartimenti
var list=gaAuthorizationService.getAuthoritiesInfoSelectableDisplayList("/DEPARTMENT/ap.profile");
//controllo per verificare se sono in visione dipartimentale o no
var listIterator=list.iterator();
while(listIterator.hasNext()){
var selectable=listIterator.next();
if(object.getOrganizationUnitMap().get("ouId").getId()==selectable.getIdentifyingValue()){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(object.getWfItem().getBooleanMap().get("legacy"))){
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 sia per gli elementi
owner e
contributor che per l'oggetto padre.
Per maggiori dettagli cfr. excel modello dati dell'entità in questione.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 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 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. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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) 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. excel modello dati dell'entità in questione
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
if (Packages.it.cilea.core.configuration.util.ConfigurationUtil.getConfigValue("ap.prj.owner.role.enabled").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){
var discriminator = element.getDiscriminator();
if(element.getDiscriminator().contains(".")){
discriminator = element.getDiscriminator().substring(0, element.getDiscriminator().indexOf("."))
}
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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 |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
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.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
if (!Packages.java.lang.Boolean.TRUE.equals(wfItem.getBooleanMap().get("legacy"))){
var personMap = 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();
if(personMap.get(personId) != null){
duplucateList.add(gaService.getPerson(personId).getDescription());
} else {
personMap.put(personId,"1");
}
}
}
if(duplucateList.size() > 0){
errors.reject("error.contributorAndOwner.duplicate", [duplucateList.toString()], "error.contributorAndOwner.duplicate");
}
}
|
Anchor |
---|
| wfActionLogicSaveDisplayAsDefault-anchor |
---|
| wfActionLogicSaveDisplayAsDefault-anchor |
---|
|
wfActionLogicSaveDisplayAsDefault Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
it.cilea.wf.logic.action.save.WfActionLogicSaveDisplayAsDefault |
Anchor |
---|
| wfActionLogicSaveYearFromStartDate-anchor |
---|
| wfActionLogicSaveYearFromStartDate-anchor |
---|
|
wfActionLogicSaveYearFromStartDate 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. Per esempio se collegata in delete ad un element in un task dell'onwer, impedisce all'owner di concellare l'element.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
errors.reject("error.operation.notallowed");
|
Anchor |
---|
| ownerCannotEditHimself-anchor |
---|
| ownerCannotEditHimself-anchor |
---|
|
ownerCannotEditHimself Questa validazione viene scatenata in fase di modifica di un elemento.
Controlla che l'utente corrente non sia un Responsabile scientifico che stia cercando di togliersi la responsabilità, andando a sostituire qualcun'altro al suo posto.
Questa validazione è data dal fatto che l'owner deve comunque poter modificare e/o aggiungere altri Responsabili scientifici, motivo per cui il semplice
notAllowedValidator non può essere applicato.
Per poter utilizzare questa validazione è necessario aggiungere alla form 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 fase di eliminazione di un elemento.
Controlla che l'utente corrente non sia un Responsabile scientifico che stia cercando di togliersi la responsabilità, andando ad eliminare se stesso dalla lista.
Questa validazione è data dal fatto che l'owner deve comunque poter eliminare altri Responsabili scientifici, motivo per cui il semplice
notAllowedValidator non può essere applicato.
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.
Agli utenti viene presentata sempre la lista dei tipi di oggetto che possono creare.
Questa validazione, comunque, 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 di Tipo dell'oggetto.
Validatore che controlla che se si cambia tipo di flusso, questo nuovo tipo sia compatibile (same definition number) in modo che un tipo di progetto rimanga un tipo di progetto.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
//estraggo il wfItemId
//log.error("entro nel validator sameDefinitionForGenericProjectValidator");
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");
}
|
Anchor |
---|
| changeItemTypeForNotSynchronizedItemValidator-anchor |
---|
| changeItemTypeForNotSynchronizedItemValidator-anchor |
---|
|
changeItemTypeForNotSynchronizedItemValidator Questa validazione viene scatenata in fase di cambio di Tipo dell'oggetto.
Non è possibile cambiare la tipologia, la scheda è già stata sincronizzata con U-GOV o l'utente non possiede i permessi sulla nuova tipologia selezionata.
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";
//confronto le due tipologie, se sono diverse e ho già sincronizzato vuol dire che il cambio di tipologia non è compatibile
if(myNEWWfItemType != myOLDWfItemType){
if(object.getStringMap().get("ugovIdentifier") != null){
object.setWfItemTypeId(myOLDWfItemType);
errors.reject("error.ap.itemTypeError");
} else {
var isCreateAllowed=Packages.it.cilea.wf.util.WfUtil.isWfItemTypeAllowedForCurrentUser(myOLDWfItemType, applicationContext);
if(!Packages.java.lang.Boolean.TRUE.equals(isCreateAllowed)){
errors.reject("error.ap.itemTypeError");
}
}
}
|
Anchor |
---|
| changeItemTypeForSynchronizedItemValidator-anchor |
---|
| changeItemTypeForSynchronizedItemValidator-anchor |
---|
|
changeItemTypeForSynchronizedItemValidator Questa validazione viene scatenata in fase di cambio di Tipo dell'oggetto in un determinato stato del flusso.
Non è possibile cambiare la tipologia in questo stato del flusso in quanto non compatibile con altri stati di altri flussi.
Code Block |
---|
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){
object.setWfItemTypeId(myOLDWfItemType);
errors.reject("error.ap.itemTypeError.step2");
}
|
Anchor |
---|
| itemTypeNotWithdrawnValidator-anchor |
---|
| itemTypeNotWithdrawnValidator-anchor |
---|
|
itemTypeNotWithdrawnValidator Questa validazione controlla che in salvataggio non venga inserita una tipologia che è stata eliminata.
Non è possibile cambiare la tipologia in una che non è più valida.
Posso però mantenere un item che è già presente in quella tipologia, se poi però vado a modificarla non posso tornare indietro alla tipologia non valida.
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 |
---|
| wfActionLogicSaveOwnerDependentNewIdentifier-anchor |
---|
| wfActionLogicSaveOwnerDependentNewIdentifier-anchor |
---|
|
wfActionLogicSaveOwnerDependentNewIdentifier 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 startLogic = Packages.it.cilea.wf.WfConstant.START_LOGIC_MAP.get("wfStartLogicOwnerDependentIdentifier");
startLogic.start(object, request);
object.getIntegerMap().put("wfItemTypeIdPreviousValue",object.getWfItemTypeId());
}
|
Anchor |
---|
| wfActionLogicSaveStandardNewIdentifier-anchor |
---|
| wfActionLogicSaveStandardNewIdentifier-anchor |
---|
|
wfActionLogicSaveStandardNewIdentifier 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 startLogic = Packages.it.cilea.wf.WfConstant.START_LOGIC_MAP.get("wfStartLogicStandardIdentifier");
startLogic.start(object, request);
object.getIntegerMap().put("wfItemTypeIdPreviousValue",object.getWfItemTypeId());
}
|
Anchor |
---|
| wfActionLogicTransitionLogger-anchor |
---|
| wfActionLogicTransitionLogger-anchor |
---|
|
wfActionLogicTransitionLogger Questa logica serve per la gestione del logging delle transizioni di stato.
E' necessario inserirla come enter action logic per tutti gli stati nei flussi che prevedono il logging delle transizioni di stato.
Nel caso in cui sia ritenuto necessario, è possibile richiedere all'utente che sta effettuando la transizione di stato di inserire un messaggio.
Questo messaggio verrà conservato nel log delle transizioni.
La gestione del messaggio opzionale è gestito dall'attributo
transitionComment che deve essere configurato come validazione di enter con il validator @Required.
Code Block |
---|
language | js |
---|
linenumbers | true |
---|
collapse | true |
---|
|
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();
if (user!=null){
var message="";
if(Packages.org.apache.commons.lang.StringUtils.isNotBlank(wfItem.getClobMap().get("transitionsLog"))){
message+="_______________________________________________________________"+ "
";
} else {
wfItem.getClobMap().put("transitionsLog", "");
}
message+=currentDate+" <strong>"+user.getLastName()+" "+user.getFirstName()+"</strong> ("+user.getUsername()+")"+"
";
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. excel modello dati dell'entità Progetto
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'))
)
|