All Downloads are FREE. Search and download functionalities are using the official Maven repository.

it.cnr.contab.config00.comp.Classificazione_vociComponent Maven / Gradle / Ivy

/*
 * Copyright (C) 2019  Consiglio Nazionale delle Ricerche
 *
 *     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 .
 */

/*
 * Created on Aug 29, 2005
 * @author rpagano
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package it.cnr.contab.config00.comp;

import java.io.Serializable;

import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceHome;
import it.cnr.contab.config00.pdcfin.cla.bulk.*;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.BulkCollection;
import it.cnr.jada.bulk.BulkList;
import it.cnr.jada.bulk.BusyResourceException;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.OutdatedResourceException;
import it.cnr.jada.bulk.PrimaryKeyChangedException;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.CRUDComponent;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.persistency.IntrospectionException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.util.RemoteIterator;

public class Classificazione_vociComponent extends CRUDComponent implements Cloneable,Serializable {

	public Classificazione_vociComponent()
	{
		super();
	}

	/**
	 * Verifica, per le Classificazioni associate a quella in questione, che:
	 *  
  	 * Nome: Struttura della classificazione non uguale a quella definita nei parametri
	 * Pre:  Viene invocato il metodo verificaLivelli e quest'ultimo genera una eccezione di validazione
	 * Post: Viene lasciata uscire l'eccezione senza salvare la classificazione
	 *
	 * Nome: Classificazione inserita di ultimo livello
	 * Pre:  Viene invocato il metodo validaMastrino
	 * Post: Viene restituita la Classificazione aggiornata 
	 **/
	protected void validateBulkListForPersistency(UserContext usercontext, BulkCollection bulkcollection) throws ComponentException, PersistencyException, OutdatedResourceException, BusyResourceException, PrimaryKeyChangedException {
		for (java.util.Iterator dett = bulkcollection.iterator();dett.hasNext();){
			Classificazione_vociBulk claAss = (Classificazione_vociBulk)dett.next();
			if (claAss.isToBeCreated()||claAss.isToBeUpdated()) {
				/*	
				 * 	Verifica che la struttura della classificazione rispetti quella definita nei parametri livelli
				 */ 
				verificaLivelli(usercontext, claAss);
				validaMastrino(usercontext, claAss);
				validaFlPianoRiparto(usercontext, claAss);
			}
		}			
		super.validateBulkListForPersistency(usercontext, bulkcollection);
	}

	public OggettoBulk inizializzaBulkPerModifica(UserContext usercontext, OggettoBulk oggettobulk)	throws ComponentException {
		OggettoBulk cla = super.inizializzaBulkPerModifica(usercontext,oggettobulk);
		return caricaClassVociAssociate(usercontext, (Classificazione_vociBulk)cla, new CompoundFindClause());
	}

	/**
	  *  Struttura della classificazione non uguale a quella definita nei parametri
	  *	   PreCondition:
	  *		 Viene invocato il metodo verificaLivelli e quest'ultimo genera una eccezione di validazione
	  *    PostCondition:
	  *		 Viene lasciata uscire l'eccezione senza salvare la classificazione
	  *
	  *  Classificazione inserita di ultimo livello
	  *	   PreCondition:
	  *		 Viene invocato il metodo validaMastrino
	  *    PostCondition:
	  *		 Viene restituita la Classificazione aggiornata 
	  **/
	public OggettoBulk modificaConBulk(UserContext usercontext,	OggettoBulk oggettobulk) throws ComponentException {
		/*	
		 * 	Verifica che la struttura della classificazione rispetti quella definita nei parametri livelli
		 * 	e, in caso di cambio del codice sulla classificazione padre, aggiorna i codici anche sui figli 
		 */ 
		verificaLivelli(usercontext, (Classificazione_vociBulk)oggettobulk);
		validaMastrino(usercontext, (Classificazione_vociBulk)oggettobulk);
		validaFlPianoRiparto(usercontext, (Classificazione_vociBulk)oggettobulk);

		return super.modificaConBulk(usercontext, oggettobulk);
	}

	/**
	 *  Esegue una operazione di creazione di un Classificazione_vociBulk. 
	 *
	 *  Pre-post-conditions:
	 *
	 *  Nome: Struttura della classificazione non uguale a quella definita nei parametri
  	 *	Pre:  Viene invocato il metodo verificaLivelli e quest'ultimo genera una eccezione di validazione
	 *  Post: Viene lasciata uscire l'eccezione senza salvare la classificazione
	 *  
	 *  Nome: Classificazione inserita di ultimo livello
	 *	Pre:  Viene invocato il metodo validaMastrino
	 *  Post: Viene restituita la Classificazione aggiornata 
	 **/
	public OggettoBulk creaConBulk(UserContext usercontext, OggettoBulk oggettobulk) throws ComponentException {
		/*	
		 * 	Verifica che la struttura della classificazione rispetti quella definita nei parametri livelli
		 * 	e, in caso di cambio del codice sulla classificazione padre, aggiorna i codici anche sui figli 
		 */ 
		verificaLivelli(usercontext, (Classificazione_vociBulk)oggettobulk);
		validaMastrino(usercontext, (Classificazione_vociBulk)oggettobulk);
		validaFlPianoRiparto(usercontext, (Classificazione_vociBulk)oggettobulk);
		return super.creaConBulk(usercontext, oggettobulk);
	}

	/**
	 * 	Ritorna l'oggetto  di tipo  riempito con le 
	 *  delle Classificazioni associate a quella  in questione
	 */
	public Classificazione_vociBulk caricaClassVociAssociate(UserContext usercontext, Classificazione_vociBulk bulk, CompoundFindClause compoundfindclause)	throws ComponentException {
		try {
			Classificazione_vociHome home = (Classificazione_vociHome)getHome(usercontext, bulk.getClass());
			bulk.setClassVociAssociate(new it.cnr.jada.bulk.BulkList(home.findClassVociAssociate(bulk, compoundfindclause)));			
			getHomeCache(usercontext).fetchAll(usercontext);
			return bulk;
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		} catch (IntrospectionException e) {
			throw new ComponentException(e);
		} catch(Exception e) {
			throw handleException(e);
		}	
	}
	
	/**
	 * 	Ritorna l'oggetto  di tipo  riempito con i 
	 *  del Piano di riparto spese accentrate associati alla classificazione  in questione
	 */
	public Classificazione_vociBulk caricaPdgPianoRipartoSpese(UserContext usercontext, Classificazione_vociBulk bulk, CompoundFindClause compoundfindclause) throws ComponentException {
		try {
			Classificazione_vociHome home = (Classificazione_vociHome)getHome(usercontext, bulk.getClass());
			bulk.setPdgPianoRipartoSpese(new it.cnr.jada.bulk.BulkList(home.findPdgPianoRipartoSpese(bulk, compoundfindclause)));
			getHomeCache(usercontext).fetchAll(usercontext);
			return bulk;
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		} catch (IntrospectionException e) {
			throw new ComponentException(e);
		} catch(Exception e) {
			throw handleException(e);
		}	
	}

	/**
	 * 	Ritorna il bulk dei parametri livelli  dell'Esercizio indicato .
	 */
	public Parametri_livelliBulk findParametriLivelli(UserContext userContext, Integer esercizio) throws it.cnr.jada.comp.ComponentException {
		try
		{
			Parametri_livelliHome parametri_livelliHome = (Parametri_livelliHome) getHome(userContext, Parametri_livelliBulk.class );
			Parametri_livelliBulk parametri_livelliBulk = (Parametri_livelliBulk)parametri_livelliHome.findByPrimaryKey(new Parametri_livelliBulk(esercizio));
			if (parametri_livelliBulk==null)
				throw new ApplicationException("Parametri Livelli non definiti per l'esercizio " + esercizio + ".");
			return parametri_livelliBulk;
		}
		catch (Exception e )
		{
			throw handleException( e );
		}	
	}

	/**
	 * 	Ritorna la Descrizione del Livello a cui appartiene la classificazione  indicata.
	 */
	public String getDsLivelloClassificazione(UserContext userContext, Classificazione_vociBulk cla) throws it.cnr.jada.comp.ComponentException {
		Parametri_livelliBulk parametri = findParametriLivelli(userContext, cla.getEsercizio());
		if (cla.getTi_gestione().equals(Elemento_voceHome.GESTIONE_ENTRATE))
			return parametri.getDs_livello_etr(cla.getLivelloMax().intValue());
		else
			return parametri.getDs_livello_spe(cla.getLivelloMax().intValue());
	}

	/**
	 * 	Ritorna la Descrizione del Livello a cui appartiene la classificazione  indicata.
	 * 
	 * @param userContext lo UserContext che ha generato la richiesta
	 * @param esercizio Integer l'esercizio della classificazione da considerare
	 * @param tipo String il tipo Entrata/Spesa di classificazione da considerare
	 * @param livello Integer il livello della Classificazione da considerare
	 * 
	 * @return String String la descrizione della classificazione indicata.
	 *	 
	 **/
	public String getDsLivelloClassificazione(UserContext userContext, Integer esercizio, String tipo, Integer livello) throws it.cnr.jada.comp.ComponentException {
		Parametri_livelliBulk parametri = findParametriLivelli(userContext, esercizio);
		if (tipo.equals(Elemento_voceHome.GESTIONE_ENTRATE))
			return parametri.getDs_livello_etr(livello.intValue());
		else
			return parametri.getDs_livello_spe(livello.intValue());
	}

	/**
	  *  Controlla che la struttura della classificazione rispetti quella indicata in Parametri_livelli 
	  *  per l'esercizio della classificazione.
	  *
	  *  Numero Livelli della Classificazione superiore a quelli indicati in Parametri Livelli
	  *	   PreCondition:
	  *		 L'ultimo livello caricato è superiore al numero dei livelli indicati in parametri_livelli
	  *    PostCondition:
	  *		 Viene generata una ApplicationException con il messaggio "Non è possibile inserire classificazioni di  con più di < livelli."
	  *  Lunghezza del livello non corrispondente con quella indicata nei parametri_livelli
	  *	   PreCondition:
	  *		 Il numero dei caratteri di un livello non corrispondente con quello indicato nei parametri
	  *    PostCondition:
	  *		 Viene generata una ApplicationException con il messaggio "Il codice del  livello di  deve avere una lunghezza di  caratteri."
	  *  Codice della classificazione cambiato
	  *	   PreCondition:
	  *		 Il codice della classificazione è cambiato
	  *    PostCondition:
	  *		 Viene aggiornato il codice su tutti i livelli sottostanti
	  *  Default
	  *    PreCondition:
	  *      Nessun'altra precondizione è verificata
	  *    PostCondition:
	  *		 Esce senza alcuna eccezione
	 */	
	private void verificaLivelli(UserContext usercontext, Classificazione_vociBulk claNew) throws it.cnr.jada.comp.ComponentException {
		Parametri_livelliBulk parametri = findParametriLivelli(usercontext, claNew.getEsercizio());
		if (claNew.getTi_gestione().equals(Elemento_voceHome.GESTIONE_ENTRATE)) {
			for (int i=1; i<=Classificazione_vociHome.LIVELLO_MAX; i++){ 
				if (claNew.getCd_livello(i) != null) {
					if (parametri.getLivelli_entrata().compareTo(new Integer(i))==-1)
						throw new ApplicationException("Non è possibile inserire classificazioni di entrata con più di " + i + " livelli.");
					if (parametri.getLung_livello_etr(i).compareTo(new Integer(claNew.getCd_livello(i).length()))!=0)
						throw new ApplicationException("Il codice " + parametri.getDs_livello_etr(i) + " deve avere una lunghezza di " + parametri.getLung_livello_etr(i).toString() + " caratteri.");
				}
			}
		}
		else if (claNew.getTi_gestione().equals(Elemento_voceHome.GESTIONE_SPESE)) {
			for (int i=1; i <= Classificazione_vociHome.LIVELLO_MAX; i++){ 
				if (claNew.getCd_livello(i) != null) {
					if (parametri.getLivelli_spesa().compareTo(new Integer(i))==-1)
						throw new ApplicationException("Non è possibile inserire classificazioni di spesa con più di " + i + " livelli.");
					if (parametri.getLung_livello_spe(i).compareTo(new Integer(claNew.getCd_livello(i).length()))!=0)
						throw new ApplicationException("Il codice " + parametri.getDs_livello_spe(i) + " deve avere una lunghezza di " + parametri.getLung_livello_spe(i).toString() + " caratteri.");
				}
			}
		}		

		/*
		 * 	Se è cambiato il codice di uno dei livelli della classificazione, procedo ad aggiornare
		 * 	il valore anche sugli eventuali figli collegati alla classificazione in oggetto 
		 */
		if (claNew.isToBeUpdated()) {
			try {
				Classificazione_vociHome claHome = (Classificazione_vociHome)getHome(usercontext, Classificazione_vociBulk.class);
				Classificazione_vociBulk claOld = (Classificazione_vociBulk)claHome.findByPrimaryKey(claNew);
				//getHomeCache(usercontext).fetchAll(claHome);

				if (claOld.getLivelloMax().compareTo(claNew.getLivelloMax())==0 &&
					!claOld.getCd_livello(claOld.getLivelloMax().intValue()).equals(claNew.getCd_livello(claNew.getLivelloMax().intValue()))) {
					for (java.util.Iterator dett = claHome.findAllClassVociAssociate(claOld).iterator();dett.hasNext();){
						Classificazione_vociBulk claAss = (Classificazione_vociBulk)dett.next();
						claAss.setToBeUpdated();
						claAss.setCd_livello(claNew.getCd_livello(claNew.getLivelloMax().intValue()), claNew.getLivelloMax().intValue());
						updateBulk(usercontext, claAss); 
					}
				}
			} catch (PersistencyException e) {
				throw handleException(e);
			} catch (IntrospectionException e) {
				throw handleException(e);
			}
		}
	}

	/** 
	  *    PreCondition:
	  *      E' stato richiesto di verificare se la Classificazione è un mastrino e, in caso affermativo,
	  *      effettuare i controlli appositi 
	  *    PostCondition:
	  *		 Viene aggiornato il campo  e restituito il bulk aggiornato
	  *      
	  *
	  * @param userContext lo UserContext che ha generato la richiesta
	  * @param bulk Classificazione_vociBulk la classificazione da aggiornare
	  *
	  * @return Classificazione_vociBulk Classificazione_vociBulk il bulk aggiornato.
	**/ 
	private Classificazione_vociBulk validaMastrino(UserContext userContext, Classificazione_vociBulk bulk) throws ComponentException {
		Parametri_livelliBulk parametri = findParametriLivelli(userContext, bulk.getEsercizio());
		if ((bulk instanceof Classificazione_voci_etrBulk && bulk.getLivelloMax().compareTo(parametri.getLivelli_entrata())==0) ||
			(bulk instanceof Classificazione_voci_speBulk && bulk.getLivelloMax().compareTo(parametri.getLivelli_spesa())==0))
			bulk.setFl_mastrino(Boolean.TRUE);
		else
			bulk.setFl_mastrino(Boolean.FALSE);
		return bulk;
	}

	/** 
	  *    PreCondition:
	  *      E' stato richiesto di cambiare il valore del campo FL_PIANO_RIPARTO. 
	  *      Viene verificato se sono stati caricati dati nel Piano di riparto delle spese accentrate
	  *      per la Classificazione in oggetto. 
	  *    PostCondition:
	  *		 Viene restituito una ComponentException
	  *      
	  *
	  * @param userContext lo UserContext che ha generato la richiesta
	  * @param bulk Classificazione_vociBulk la classificazione da aggiornare
	  *
	  * @return Classificazione_vociBulk Classificazione_vociBulk il bulk aggiornato.
	**/ 
	private Classificazione_vociBulk validaFlPianoRiparto(UserContext userContext, Classificazione_vociBulk bulk) throws ComponentException {
		try {
			if (bulk instanceof Classificazione_voci_speBulk && bulk.isToBeUpdated() && 
			    bulk.getFl_piano_riparto().equals(Boolean.FALSE)) {
				Classificazione_vociHome home = (Classificazione_vociHome)getHome(userContext, bulk.getClass());
				BulkList pianoList = new BulkList(home.findPdgPianoRipartoSpese(bulk, null));
				if (!pianoList.isEmpty())
					throw new ApplicationException("Attenzione! Risultano caricati dati nel 'Piano di riparto delle Spese Accentrate' " + 
					"per la classificazione '"+ bulk.getCd_classificazione() + "'. Attivare il flag '" +
					bulk.getBulkInfo().getFieldProperty("fl_piano_riparto").getLabel() +"'.");
			}
			return bulk;
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		} catch (IntrospectionException e) {
			throw new ComponentException(e);
		}	
	}

	/** 
	  *  Tutti i controlli superati.
	  *    PreCondition:
	  *      E' stata generata la richiesta di creazione di un Iteratore su tutti i nodi figli 
	  *		di un Progetto.
	  *    PostCondition:
	  *		 Viene restituito il RemoteIterator con l'elenco degli eventuali nodi figli del progetto di riferimento.
	  *      
	  *
	  * @param userContext lo UserContext che ha generato la richiesta
	  * @param bulk OggettoBulk il progetto di riferimento.
	  *
	  * @return remoteIterator RemoteIterator l'Iterator creato.
	**/ 
	public RemoteIterator getChildren(UserContext userContext, OggettoBulk bulk) throws ComponentException {

		Classificazione_vociBulk ubi = (Classificazione_vociBulk)bulk;
		Classificazione_vociHome ubiHome = (Classificazione_vociHome)getHome(userContext,Classificazione_vociBulk.class);
		return iterator(userContext, ubiHome.selectChildrenFor(userContext,ubi), Classificazione_vociBulk.class, null);
	}

	/** 
	  *  Tutti i controlli superati.
	  *    PreCondition:
	  *      E' stata generata la richiesta di ricerca del Progetto padre del Progetto specificato negli argomenti.
	  *    PostCondition:
	  *		 Viene restituito l'oggetto ProgettoBulk che è il Progetto padre cercato.
	  *      
	  *
	  * @param userContext lo UserContext che ha generato la richiesta
	  * @param bulk OggettoBulk il Progetto di riferimento.
	  *
	  * @return bulk OggettoBulk il Progetto cercato.
	**/ 
	public OggettoBulk getParent(UserContext userContext, OggettoBulk bulk) throws ComponentException{

		try{
			Classificazione_vociBulk ubi = (Classificazione_vociBulk)bulk;
			Classificazione_vociHome ubiHome = (Classificazione_vociHome)getHome(userContext,Classificazione_vociBulk.class);
			return ubiHome.getParent(ubi);
		
		}catch(it.cnr.jada.persistency.PersistencyException ex){
			throw handleException(bulk,ex);
		}catch(it.cnr.jada.persistency.IntrospectionException ex){
			throw handleException(bulk, ex);
		}
	}        

	/**
	 * Controllo che il bulk specificato rappresenta una classificazione di ultimo livello.
	 *  PreCondition: Il livello della classificazione = LIVELLO_MAX o non ha figli
	 *  PpostCondition: Ritorna true
	 *
	 * @param context it.cnr.jada.UserContext
	 * @param bulk classificazione di cui stabilire se ultimo livello
	 * @return boolean true se ultimo livello
	 */
	public boolean isLeaf(UserContext context, OggettoBulk bulk) throws ComponentException{
		return ((((Classificazione_vociBulk)bulk).getLivelloMax().intValue() == Classificazione_vociHome.LIVELLO_MAX) ||
					!hasChildren(context, bulk) );
	}

	/**
	 * Recupera i figli della classificazione corrente
	 *
	 * Pre-post-conditions:
	 *
	 * Nome: Tutti i controlli superati
	 * Pre: Nessun errore
	 * Post: viene ritornato un RemoteIteretor sulla collezione dei figli del bulk specificato
	 * 
	 * @param	uc	lo UserContext che ha generato la richiesta
	 * @param	bulk	l'OggettoBulk di cui determinare il parent
	 * @return	il RemoteIterator sui figli
	 */
	private boolean hasChildren(UserContext context, OggettoBulk bulk) throws ComponentException{
		try {
			Classificazione_vociBulk claBulk = (Classificazione_vociBulk)bulk;
			Classificazione_vociHome claHome = (Classificazione_vociHome)getHome(context,Classificazione_vociBulk.class);
			if (claBulk.isToBeCreated() || claHome.findClassVociAssociate(claBulk).isEmpty()) 
				return false;
			else
				return true;
		} catch (IntrospectionException e) {
			throw handleException( e );
		} catch (PersistencyException e) {
			throw handleException( e );
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy