it.cnr.contab.pdg01.comp.CRUDPdgModuloSpeseGestComponent 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 .
*/
package it.cnr.contab.pdg01.comp;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.PreparedStatement;
import javax.ejb.EJBException;
import it.cnr.contab.config00.bulk.Configurazione_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrHome;
import it.cnr.contab.config00.ejb.Classificazione_vociComponentSession;
import it.cnr.contab.config00.latt.bulk.WorkpackageBulk;
import it.cnr.contab.config00.latt.bulk.WorkpackageHome;
import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceBulk;
import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceHome;
import it.cnr.contab.doccont00.core.bulk.Linea_attivitaBulk;
import it.cnr.contab.pdg01.bulk.Pdg_modulo_spese_gestBulk;
import it.cnr.contab.prevent01.bulk.Pdg_modulo_speseBulk;
import it.cnr.contab.prevent01.bulk.Pdg_modulo_speseHome;
import it.cnr.contab.progettiric00.core.bulk.Ass_progetto_piaeco_voceBulk;
import it.cnr.contab.utenze00.bp.CNRUserContext;
import it.cnr.contab.util.EuroFormat;
import it.cnr.contab.util.EuroPositivoFormat;
import it.cnr.contab.util.Utility;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.BusyResourceException;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.persistency.sql.FindClause;
import it.cnr.jada.persistency.sql.LoggableStatement;
import it.cnr.jada.persistency.sql.SQLBuilder;
public class CRUDPdgModuloSpeseGestComponent extends it.cnr.jada.comp.CRUDComponent {
/**
* CRUDPdgModuloEntrateGestComponent constructor comment.
*/
public CRUDPdgModuloSpeseGestComponent() {
super();
}
/**
* Carica un modulo del Pdg con tutti i dettagli gestionali correlati.
*
* Nome: Inizializzazione;
* Pre: Preparare l'oggetto alle modifiche;
* Post: Si procede, oltre che alla normale procedura di inizializzazione di un oggetto bulk,
* anche al caricamento dei dettagli gestionali e al calcolo delle somme già ripartite.
*
* @param bulk dovrà essere sempre Pdg_modulo_speseBulk.
*
* @return un OggettoBulk che sarà sempre un Pdg_modulo_speseBulk.
*/
public OggettoBulk inizializzaBulkPerModifica(UserContext userContext, OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException {
try {
Pdg_modulo_speseBulk testata = (Pdg_modulo_speseBulk)super.inizializzaBulkPerModifica(userContext,bulk);
Pdg_modulo_speseHome testataHome = (Pdg_modulo_speseHome)getHome(userContext, Pdg_modulo_speseBulk.class);
testata.setDettagli_gestionali(new it.cnr.jada.bulk.BulkList(testataHome.findDettagliGestionaliOriginali(testata)));
valorizzaImportoTotali(userContext,testata);
getHomeCache(userContext).fetchAll(userContext);
return testata;
} catch (PersistencyException e) {
throw new ComponentException(e);
} catch(Exception e) {
throw handleException(e);
}
}
/**
* Esegue una operazione di modifica di un Pdg_Modulo_SpeseBulk.
*
* Pre-post-conditions:
*
* Nome: Modifica di un Modulo
* Pre: La richiesta di modifica di un Modulo è stata generata
* Post: Viene loccato il record PDG_MODULO_SPESE con l'istruzione findAndLock per evitare che salvataggi
* simultanei da parte di più utenti possano alterare i controlli.
* Vengono verificati i dettagli gestionali associati al modulo per controllare che il totale
* degli importi ripartiti non sia superiore agli importi previsti in Bilancio.
* In caso affermativo viene generata una ApplicationException per segnalare all'utente
* l'impossibilità di modificare i dettagli gestionali associati al Modulo.
*
* @param usercontext lo UserContext che ha generato la richiesta
* @param oggettobulk il Pdg_Modulo_SpeseBulk che deve essere modificato
* @return il Pdg_Modulo_SpeseBulk risultante dopo l'operazione di modifica.
*/
public OggettoBulk modificaConBulk(UserContext userContext, OggettoBulk oggettobulk) throws ComponentException {
try {
oggettobulk.setCrudStatus(OggettoBulk.NORMAL);
Pdg_modulo_speseHome testataHome = (Pdg_modulo_speseHome)getHome(userContext,oggettobulk);
Pdg_modulo_speseBulk clone = (Pdg_modulo_speseBulk)testataHome.findAndLock(oggettobulk);
Pdg_modulo_speseBulk testata = (Pdg_modulo_speseBulk)super.modificaConBulk(userContext, oggettobulk);
valorizzaImportoTotali(userContext,testata);
if (testata.getTotale_spese_accentrate_interne_gest().compareTo(testata.getIm_spese_gest_accentrata_int())>0)
throw new ApplicationException("Impossibile salvare: il totale della spese accentrate interne ripartite (" + new it.cnr.contab.util.EuroFormat().format(testata.getTotale_spese_accentrate_interne_gest()) + ") è superiore all'importo previsto in Bilancio (" + new it.cnr.contab.util.EuroFormat().format(testata.getIm_spese_gest_accentrata_int()) + ").");
if (testata.getTotale_spese_accentrate_esterne_gest().compareTo(testata.getIm_spese_gest_accentrata_est())>0)
throw new ApplicationException("Impossibile salvare: il totale della spese accentrate esterne ripartite (" + new it.cnr.contab.util.EuroFormat().format(testata.getTotale_spese_accentrate_esterne_gest()) + ") è superiore all'importo previsto in Bilancio (" + new it.cnr.contab.util.EuroFormat().format(testata.getIm_spese_gest_accentrata_est()) + ").");
if (testata.getTotale_spese_decentrate_interne_gest().compareTo(testata.getIm_spese_gest_decentrata_int())>0)
throw new ApplicationException("Impossibile salvare: il totale della spese decentrate interne ripartite (" + new it.cnr.contab.util.EuroFormat().format(testata.getTotale_spese_decentrate_interne_gest()) + ") è superiore all'importo previsto in Bilancio (" + new it.cnr.contab.util.EuroFormat().format(testata.getIm_spese_gest_decentrata_int()) + ").");
if (testata.getTotale_spese_decentrate_esterne_gest().compareTo(testata.getIm_spese_gest_decentrata_est())>0)
throw new ApplicationException("Impossibile salvare: il totale della spese decentrate esterne ripartite (" + new it.cnr.contab.util.EuroFormat().format(testata.getTotale_spese_decentrate_esterne_gest()) + ") è superiore all'importo previsto in Bilancio (" + new it.cnr.contab.util.EuroFormat().format(testata.getIm_spese_gest_decentrata_est()) + ").");
return testata;
} catch (PersistencyException e) {
throw new ComponentException(e);
} catch (BusyResourceException e) {
try{
String ds_classificazione = Utility.createClassificazioneVociComponentSession().
getDsLivelloClassificazione(userContext,
CNRUserContext.getEsercizio(userContext),
Elemento_voceHome.GESTIONE_SPESE,
((Pdg_modulo_speseBulk)oggettobulk).getClassificazione().getNr_livello());
throw new ApplicationException("Operazione effettuata al momento da un'altro utente sullo stesso Modulo e " + ds_classificazione + ". Riprovare a salvare successivamente.");
} catch (ComponentException e1) {
throw handleException(e1);
} catch (RemoteException e1) {
throw handleException(e1);
}
} catch(Exception e) {
throw handleException(e);
}
}
/**
* Aggiunge delle clausole a tutte le operazioni di ricerca eseguite su CdrBulk
*
* Pre-post-conditions:
*
* Nome: Default
* Pre: E' stata generata la richiesta di ricerca di un CDR
* Post: Vengono restituiti tutti i CDR appartenenti al CDS del dettaglio gestionale Pdg_modulo_speseBulk;
*
* @param userContext lo userContext che ha generato la richiesta
* @param clauses clausole di ricerca gia' specificate dall'utente
* @return il SQLBuilder con la clausola aggiuntiva sul gestore
*/
public SQLBuilder selectCdr_assegnatarioByClause (UserContext userContext,
Pdg_modulo_spese_gestBulk dett,
it.cnr.contab.config00.sto.bulk.CdrBulk cdr,
CompoundFindClause clause) throws ComponentException, PersistencyException {
SQLBuilder sql = getHome(userContext, cdr, "V_CDR_VALIDO").createSQLBuilder();
sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA");
sql.addSQLClause("AND","V_CDR_VALIDO.ESERCIZIO",sql.EQUALS,CNRUserContext.getEsercizio(userContext));
sql.addSQLJoin("V_CDR_VALIDO.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO");
sql.addSQLJoin("V_CDR_VALIDO.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT");
sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CDS",sql.EQUALS,CNRUserContext.getCd_cds(userContext));
if (!dett.getPdg_modulo_spese().getPdg_modulo_costi().getPdg_modulo().getCdr().getUnita_padre().getCd_unita_organizzativa().equals(CNRUserContext.getCd_unita_organizzativa(userContext)))
sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA",sql.EQUALS,CNRUserContext.getCd_unita_organizzativa(userContext));
if (clause != null) sql.addClause(clause);
return sql;
}
/**
* Aggiunge delle clausole a tutte le operazioni di ricerca eseguite su WorkpackageBulk
*
* Pre-post-conditions:
*
* Nome: Default
* Pre: E' stata generata la richiesta di ricerca di una Linea di Attività
* Post: Vengono restituite tutte le Linee di Attività che:
* - sono associate al CDR Assegnatario del dettaglio gestionale Pdg_modulo_spese_gestBulk;
* - sono associate al Modulo di Attività del dettaglio gestionale Pdg_modulo_speseBulk;
* - siano Linee utilizzabile nella Gestione spese (TI_GESTIONE='S')
*
* @param userContext lo userContext che ha generato la richiesta
* @param clauses clausole di ricerca gia' specificate dall'utente
* @return il SQLBuilder con la clausola aggiuntiva sul gestore
*/
public SQLBuilder selectLinea_attivitaByClause (UserContext userContext,
Pdg_modulo_spese_gestBulk dett,
WorkpackageBulk latt,
CompoundFindClause clause) throws ComponentException, PersistencyException {
SQLBuilder sql = getHome(userContext, latt, "V_LINEA_ATTIVITA_VALIDA").createSQLBuilder();
sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
sql.addClause(FindClause.AND,"cd_centro_responsabilita",SQLBuilder.EQUALS,dett.getCd_cdr_assegnatario());
sql.addClause(FindClause.AND,"pg_progetto",SQLBuilder.EQUALS,dett.getPg_progetto());
sql.openParenthesis(FindClause.AND);
sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_SPESE);
sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_ENTRAMBE);
sql.closeParenthesis();
if (dett.getPdg_modulo_spese()!=null && dett.getPdg_modulo_spese().getCd_cofog()!=null )
sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_COFOG",SQLBuilder.EQUALS,dett.getPdg_modulo_spese().getCd_cofog());
Parametri_cnrHome parCnrhome = (Parametri_cnrHome)getHome(userContext, Parametri_cnrBulk.class);
Parametri_cnrBulk parCnrBulk = (Parametri_cnrBulk)parCnrhome.findByPrimaryKey(new Parametri_cnrBulk(it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext )));
if (parCnrBulk!=null && parCnrBulk.getFl_nuovo_pdg()) {
sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_PROGRAMMA",SQLBuilder.ISNOTNULL,null);
sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_MISSIONE",SQLBuilder.ISNOTNULL,null);
if (dett.getPdg_modulo_spese().getCd_missione()!=null)
sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_MISSIONE",SQLBuilder.EQUALS,dett.getPdg_modulo_spese().getCd_missione());
}
String cdNaturaReimpiego = null;
try {
cdNaturaReimpiego = Utility.createConfigurazioneCnrComponentSession().getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_NATURA_REIMPIEGO);
} catch (RemoteException e) {
throw new ComponentException(e);
} catch (EJBException e) {
throw new ComponentException(e);
}
if (cdNaturaReimpiego != null)
sql.addSQLClause( FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.CD_NATURA", SQLBuilder.NOT_EQUALS, cdNaturaReimpiego);
sql.addTableToHeader("NATURA");
sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA","NATURA.CD_NATURA");
sql.addSQLClause(FindClause.AND, "NATURA.FL_SPESA",SQLBuilder.EQUALS,"Y");
sql.addTableToHeader("FUNZIONE");
sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_FUNZIONE","FUNZIONE.CD_FUNZIONE");
sql.addSQLClause(FindClause.AND, "FUNZIONE.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");
/**
* Escludo la linea di attività dell'IVA C20
*/
it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = null;
try {
config = Utility.createConfigurazioneCnrComponentSession().getConfigurazione( userContext, null, null, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_LINEA_ATTIVITA_SPECIALE, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_LINEA_COMUNE_VERSAMENTO_IVA);
} catch (RemoteException e) {
throw new ComponentException(e);
} catch (EJBException e) {
throw new ComponentException(e);
}
if (config != null){
sql.addSQLClause( FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA", SQLBuilder.NOT_EQUALS, config.getVal01());
}
if (clause != null) sql.addClause(clause);
return sql;
}
/**
* Aggiunge delle clausole a tutte le operazioni di ricerca eseguite su Elemento_voceBulk
*
* Pre-post-conditions:
*
* Nome: Default
* Pre: E' stata generata la richiesta di ricerca di Elemento Voce
* Post: Vengono restituiti tutti gli Elementi Voce che:
* - sono associate a classificazioni di un livello pari a quello definito in Parametri_Ente;
* - le classificazioni associate sono figlie della classificazione del dettaglio gestionale Pdg_modulo_spese_gestBulk
* - non sia una partita di giro
* - abbia la FUNZIONE uguale a quella della Linea di Attività del dettaglio gestionale Pdg_modulo_spese_gestBulk
* - il CD_TIPO_UNITA è uguale a quello della UO associata al CDR
*
* @param userContext lo userContext che ha generato la richiesta
* @param clauses clausole di ricerca gia' specificate dall'utente
* @return il SQLBuilder con la clausola aggiuntiva sul gestore
*/
public SQLBuilder selectElemento_voceByClause (UserContext userContext,
Pdg_modulo_spese_gestBulk dett,
Elemento_voceBulk elementoVoce,
CompoundFindClause clause) throws ComponentException, PersistencyException {
try {
Parametri_cnrHome parCnrhome = (Parametri_cnrHome)getHome(userContext, Parametri_cnrBulk.class);
Parametri_cnrBulk parCnrBulk = (Parametri_cnrBulk)parCnrhome.findByPrimaryKey(new Parametri_cnrBulk(it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext )));
if (clause == null) clause = ((OggettoBulk)elementoVoce).buildFindClauses(null);
SQLBuilder sql = getHome(userContext, elementoVoce,"V_ELEMENTO_VOCE_PDG_SPE").createSQLBuilder();
if(clause != null) sql.addClause(clause);
sql.addSQLClause("AND", "V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO", sql.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ) );
sql.addTableToHeader("PARAMETRI_LIVELLI");
sql.addSQLJoin("V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO", "PARAMETRI_LIVELLI.ESERCIZIO");
sql.addTableToHeader("V_CLASSIFICAZIONE_VOCI_ALL");
sql.addSQLJoin("V_ELEMENTO_VOCE_PDG_SPE.ID_CLASSIFICAZIONE", "V_CLASSIFICAZIONE_VOCI_ALL.ID_CLASSIFICAZIONE");
sql.addSQLJoin("V_CLASSIFICAZIONE_VOCI_ALL.NR_LIVELLO", "PARAMETRI_LIVELLI.LIVELLI_SPESA");
sql.addSQLClause("AND", "V_CLASSIFICAZIONE_VOCI_ALL.ID_LIV"+parCnrBulk.getLivello_pdg_decis_spe(), sql.EQUALS, dett.getId_classificazione());
if (Utility.createParametriEnteComponentSession().getParametriEnte(userContext).isEnteCNR()) {
sql.openParenthesis("AND");
sql.addSQLClause("OR", "V_ELEMENTO_VOCE_PDG_SPE.FL_PARTITA_GIRO", sql.ISNULL, null);
sql.addSQLClause("OR", "V_ELEMENTO_VOCE_PDG_SPE.FL_PARTITA_GIRO", sql.EQUALS, "N");
sql.closeParenthesis();
}
sql.addSQLClause( "AND", "V_ELEMENTO_VOCE_PDG_SPE.FL_SOLO_RESIDUO", sql.EQUALS, "N");
if (dett.getLinea_attivita() != null)
sql.addSQLClause("AND","V_ELEMENTO_VOCE_PDG_SPE.CD_FUNZIONE",sql.EQUALS,dett.getLinea_attivita().getCd_funzione());
if(!parCnrBulk.getFl_nuovo_pdg())
if (dett.getPdg_modulo_spese().getPdg_modulo_costi().getPdg_modulo().getCdr() != null)
sql.addSQLClause("AND","V_ELEMENTO_VOCE_PDG_SPE.CD_TIPO_UNITA",sql.EQUALS,dett.getPdg_modulo_spese().getPdg_modulo_costi().getPdg_modulo().getCdr().getUnita_padre().getCd_tipo_unita());
if (dett.getPdg_modulo_spese().getVoce_piano_economico()!=null && dett.getPdg_modulo_spese().getVoce_piano_economico().getCd_voce_piano()!=null ) {
sql.addTableToHeader("ASS_PROGETTO_PIAECO_VOCE");
sql.addSQLJoin("ASS_PROGETTO_PIAECO_VOCE.ESERCIZIO_VOCE","V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO");
sql.addSQLJoin("ASS_PROGETTO_PIAECO_VOCE.TI_APPARTENENZA","V_ELEMENTO_VOCE_PDG_SPE.TI_APPARTENENZA");
sql.addSQLJoin("ASS_PROGETTO_PIAECO_VOCE.TI_GESTIONE","V_ELEMENTO_VOCE_PDG_SPE.TI_GESTIONE");
sql.addSQLJoin("ASS_PROGETTO_PIAECO_VOCE.CD_ELEMENTO_VOCE","V_ELEMENTO_VOCE_PDG_SPE.CD_ELEMENTO_VOCE");
sql.addSQLClause(FindClause.AND,"ASS_PROGETTO_PIAECO_VOCE.PG_PROGETTO",SQLBuilder.EQUALS,dett.getPdg_modulo_spese().getPg_progetto());
sql.addSQLClause(FindClause.AND,"ASS_PROGETTO_PIAECO_VOCE.CD_UNITA_ORGANIZZATIVA",SQLBuilder.EQUALS,dett.getPdg_modulo_spese().getVoce_piano_economico().getCd_unita_organizzativa());
sql.addSQLClause(FindClause.AND,"ASS_PROGETTO_PIAECO_VOCE.CD_VOCE_PIANO",SQLBuilder.EQUALS,dett.getPdg_modulo_spese().getVoce_piano_economico().getCd_voce_piano());
sql.addSQLClause(FindClause.AND,"ASS_PROGETTO_PIAECO_VOCE.ESERCIZIO_PIANO",SQLBuilder.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ));
}
if (clause != null) sql.addClause(clause);
return sql;
} catch(RemoteException e) {
throw new it.cnr.jada.comp.ComponentException(e);
}
}
private BigDecimal calcolaImporto(UserContext userContext, SQLBuilder sql) throws ComponentException{
BigDecimal totale = Utility.ZERO;
try {
java.sql.ResultSet rs = null;
LoggableStatement ps = null;
try {
ps = sql.prepareStatement(getConnection(userContext));
try {
rs = ps.executeQuery();
if (rs.next() && rs.getBigDecimal(1)!= null)
totale = totale.add(rs.getBigDecimal(1));
} catch (java.sql.SQLException e) {
throw handleSQLException(e);
} finally {
if (rs != null) try{rs.close();}catch( java.sql.SQLException e ){};
}
} finally {
if (ps != null) try{ps.close();}catch( java.sql.SQLException e ){};
}
} catch (java.sql.SQLException ex) {
throw handleException(ex);
}
return totale;
}
private void valorizzaImportoTotali(UserContext userContext, Pdg_modulo_speseBulk pdg) throws ComponentException{
try {
Pdg_modulo_speseHome testataHome = (Pdg_modulo_speseHome)getHome(userContext, Pdg_modulo_speseBulk.class);
pdg.setTotale_spese_accentrate_esterne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliAccEst(userContext,pdg)));
pdg.setTotale_spese_accentrate_interne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliAccInt(userContext,pdg)));
pdg.setTotale_spese_decentrate_esterne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliDecEst(userContext,pdg)));
pdg.setTotale_spese_decentrate_interne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliDecInt(userContext,pdg)));
} catch (PersistencyException e) {
throw new ComponentException(e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy