/* * Copyright (C) 2012 AXIA Studio (http://www.axiastudio.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.axiastudio.suite.protocollo; import com.axiastudio.pypapi.Register; import com.axiastudio.pypapi.annotations.Callback; import com.axiastudio.pypapi.annotations.CallbackType; import com.axiastudio.pypapi.db.Controller; import com.axiastudio.pypapi.db.Database; import com.axiastudio.pypapi.db.IDatabase; import com.axiastudio.pypapi.db.Validation; import com.axiastudio.suite.SuiteUtil; import com.axiastudio.suite.anagrafiche.entities.Soggetto; import com.axiastudio.suite.base.entities.IUtente; import com.axiastudio.suite.base.entities.Ufficio; import com.axiastudio.suite.base.entities.UfficioUtente; import com.axiastudio.suite.base.entities.Utente; import com.axiastudio.suite.generale.entities.Costante; import com.axiastudio.suite.pratiche.entities.Pratica; import com.axiastudio.suite.protocollo.entities.*; import java.util.ArrayList; import java.util.List; /** * * @author Tiziano Lattisi <tiziano at axiastudio.it> */ public class ProtocolloCallbacks { /* * Valida il protocollo e richiede il nuovo iddocumento */ @Callback(type=CallbackType.BEFORECOMMIT) public static Validation beforeCommit(Protocollo protocollo){ Boolean res = true; Utente autenticato = (Utente) Register.queryUtility(IUtente.class); Boolean eNuovo = protocollo.getId() == null; List<Ufficio> uffici = new ArrayList(); List<Ufficio> ufficiRicerca = new ArrayList(); List<Ufficio> ufficiPrivato = new ArrayList(); for(UfficioUtente uu: autenticato.getUfficioUtenteCollection()){ uffici.add(uu.getUfficio()); if( uu.getRicerca() ){ ufficiRicerca.add(uu.getUfficio()); } if( uu.getRiservato() ){ ufficiPrivato.add(uu.getUfficio()); } } Ufficio attribuzionePrincipale = null; int nrAttribuzioniPrincipali = 0; for( Attribuzione attribuzione: protocollo.getAttribuzioneCollection() ){ if( attribuzione.getPrincipale() ){ nrAttribuzioniPrincipali += 1; attribuzionePrincipale = attribuzione.getUfficio(); } } int nrPraticheOriginali = 0; for( PraticaProtocollo praticaProtocollo: protocollo.getPraticaProtocolloCollection()){ if( praticaProtocollo.getOriginale()){ nrPraticheOriginali += 1; } } Ufficio sportello = protocollo.getSportello(); String msg = ""; if( !eNuovo ){ /* * Modifica permessa solo allo sportello e all'attribuzione principale * con flag ricerca */ if( !(uffici.contains(sportello) || ufficiRicerca.contains(attribuzionePrincipale)) ){ msg += "Devi appartenere allo sportello o all'attribuzione principale\n"; msg += "con diritti di ricerca, per poter modificare il protocollo.\n"; res = false; } } else { /* * Nuovo inserimento */ /* sportello obbligatorio */ if( protocollo.getSportello() == null ){ msg += "Deve essere dichiarato uno sportello ricevente.\n"; res = false; } /* sportello tra quelli dell'utente */ if( !uffici.contains(protocollo.getSportello()) ){ msg += "Lo sportello deve essere scelto tra gli uffici dell'utente.\n"; res = false; } /* almeno un soggetto */ if( protocollo.getSoggettoProtocolloCollection() == null || protocollo.getSoggettoProtocolloCollection().isEmpty() ){ if( TipoProtocollo.INTERNO.equals(protocollo.getTipo()) ){ Costante costante = SuiteUtil.trovaCostante("SOGGETTO_INTERNI"); Long id = Long.parseLong(costante.getValore()); Database db = (Database) Register.queryUtility(IDatabase.class); Controller controller = db.createController(Soggetto.class); Soggetto soggetto = (Soggetto) controller.get(id); SoggettoProtocollo sp = new SoggettoProtocollo(); sp.setSoggetto(soggetto); List<SoggettoProtocollo> spList = new ArrayList<SoggettoProtocollo>(); spList.add(sp); protocollo.setSoggettoProtocolloCollection(spList); } else { msg += "Deve essere dichiarato almeno un soggetto esterno (mittente o destinatario)."; res = false; } } if( res == false ){ return new Validation(false, msg); } /* almeno un ufficio */ if( protocollo.getUfficioProtocolloCollection() == null || protocollo.getUfficioProtocolloCollection().isEmpty() ){ msg += "Deve essere dichiarato almeno un ufficio (mittente o destinatario)."; res = false; } /* Oggetto non nullo */ if( protocollo.getOggetto() == null || protocollo.getOggetto().isEmpty() ){ msg += "Devi compilare l'oggetto."; res = false; } } /* * Verifica inserimento pratiche: permesso solo se ufficio gestore, eventualmente * con flag riservato. */ for( PraticaProtocollo praticaProtocollo: protocollo.getPraticaProtocolloCollection() ){ if( praticaProtocollo.getProtocollo() == null ){ /* Nuovo inserimento */ Pratica pratica = praticaProtocollo.getPratica(); Ufficio ufficioGestore = pratica.getGestione(); if( false ){ /* TODO: riservato */ if( !ufficiPrivato.contains(ufficioGestore) && !autenticato.getSupervisorepratiche() ){ msg += "Per poter inserire pratiche riservate è necessario appartenere al loro ufficio gestore\n"; msg += "con flag riservato, o essere un amministratore delle pratiche.\n"; res = false; } } else { if( !uffici.contains(ufficioGestore) && !autenticato.getSupervisorepratiche() ){ msg += "Per poter inserire pratiche è necessario appartenere al loro ufficio gestore,\n"; msg += "o essere un amministratore delle pratiche.\n"; res = false; } } } } /* * Una sola attribuzione in via principale */ if( nrAttribuzioniPrincipali != 1 ){ msg += "E' possibile e necessario impostare una sola attribuzione principale.\n"; res = false; } /* * Una sola pratica in originale */ if( protocollo.getPraticaProtocolloCollection().size() > 0 ){ if( nrPraticheOriginali != 1 ){ msg += "Il protocollo può essere inserito come originale in una sola pratica.\n"; res = false; } } /* * I riferimenti precedenti devono essere realmente precedenti */ if( protocollo.getRiferimentoProtocolloCollection() != null ){ for( RiferimentoProtocollo rp: protocollo.getRiferimentoProtocolloCollection() ){ if( rp.getPrecedente().getDataprotocollo().after(protocollo.getDataprotocollo()) ){ msg += "I protocolli precedenti riferiti non possono avere data successiva al protocollo.\n"; res = false; break; } } } /* * Restituzione della validazione */ if( res == false ){ return new Validation(false, msg); } else { return new Validation(true); } } }