it.cnr.contab.missioni00.comp.MissioneComponent 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.missioni00.comp;
import it.cnr.contab.anagraf00.core.bulk.*;
import it.cnr.contab.anagraf00.tabrif.bulk.Rif_inquadramentoBulk;
import it.cnr.contab.anagraf00.tabrif.bulk.Rif_inquadramentoHome;
import it.cnr.contab.anagraf00.tabrif.bulk.Tipo_rapportoBulk;
import it.cnr.contab.anagraf00.tabrif.bulk.Tipo_rapportoHome;
import it.cnr.contab.anagraf00.tabter.bulk.NazioneBulk;
import it.cnr.contab.anagraf00.tabter.bulk.NazioneHome;
import it.cnr.contab.compensi00.docs.bulk.CompensoBulk;
import it.cnr.contab.compensi00.docs.bulk.CompensoHome;
import it.cnr.contab.compensi00.docs.bulk.V_terzo_per_compensoBulk;
import it.cnr.contab.compensi00.docs.bulk.V_terzo_per_compensoHome;
import it.cnr.contab.compensi00.tabrif.bulk.Filtro_trattamentoBulk;
import it.cnr.contab.compensi00.tabrif.bulk.Tipo_trattamentoBulk;
import it.cnr.contab.compensi00.tabrif.bulk.Tipo_trattamentoHome;
import it.cnr.contab.config00.bulk.Parametri_cnrBulk;
import it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession;
import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceBulk;
import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceHome;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaHome;
import it.cnr.contab.docamm00.docs.bulk.Filtro_ricerca_obbligazioniVBulk;
import it.cnr.contab.docamm00.docs.bulk.Numerazione_doc_ammBulk;
import it.cnr.contab.docamm00.docs.bulk.ObbligazioniTable;
import it.cnr.contab.docamm00.ejb.ProgressiviAmmComponentSession;
import it.cnr.contab.docamm00.ejb.RiportoDocAmmComponentSession;
import it.cnr.contab.docamm00.tabrif.bulk.CambioBulk;
import it.cnr.contab.docamm00.tabrif.bulk.CambioHome;
import it.cnr.contab.docamm00.tabrif.bulk.DivisaBulk;
import it.cnr.contab.docamm00.tabrif.bulk.DivisaHome;
import it.cnr.contab.doccont00.comp.DocumentoContabileComponentSession;
import it.cnr.contab.doccont00.core.DatiFinanziariScadenzeDTO;
import it.cnr.contab.doccont00.core.bulk.*;
import it.cnr.contab.doccont00.ejb.AccertamentoAbstractComponentSession;
import it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession;
import it.cnr.contab.missioni00.docs.bulk.*;
import it.cnr.contab.missioni00.tabrif.bulk.*;
import it.cnr.contab.utenze00.bp.CNRUserContext;
import it.cnr.contab.util.RemoveAccent;
import it.cnr.contab.util.Utility;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.PrimaryKeyHashMap;
import it.cnr.jada.bulk.PrimaryKeyHashtable;
import it.cnr.jada.bulk.ValidationException;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.CRUDComponent;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.comp.IPrintMgr;
import it.cnr.jada.persistency.IntrospectionException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.*;
import it.cnr.jada.util.RemoteIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.*;
public class MissioneComponent extends CRUDComponent implements IMissioneMgr, Cloneable, Serializable, IPrintMgr {
private transient final static Logger logger = LoggerFactory.getLogger(MissioneComponent.class);
/**
* MissioneComponent constructor comment.
*/
public MissioneComponent() {
super();
}
private void addStaticClause(SQLBuilder sql, MissioneBulk missione) {
sql.addSQLClause("AND", "v_terzo_per_compenso.TI_DIPENDENTE_ALTRO", sql.EQUALS, missione.getTi_anagrafico());
sql.addSQLClause("AND", "v_terzo_per_compenso.DT_INI_VALIDITA", sql.LESS_EQUALS, missione.getDt_inizio_missione());
sql.addSQLClause("AND", "v_terzo_per_compenso.DT_FIN_VALIDITA", sql.GREATER_EQUALS, missione.getDt_inizio_missione());
}
/**
* Aggiorna anticipo
*
* Pre-post-conditions:
*
* Nome: Aggiorna anticipo
* Pre: L'utente ha richiesto l'inserimento/modifica di una missione
* L'utente ha specificato un anticipo per la missione
* Post: Il sistema aggiona il flag 'associato a missione' dell'anticipo
*
* @param userContext lo UserContext che ha generato la richiesta
* @param anticipo l'AnticipoBulk da aggiornare
* @param flg valore con cui impostare il flag associato a missione
*/
private void aggiornaAnticipo(it.cnr.jada.UserContext userContext, AnticipoBulk anticipo, Boolean flg) throws ComponentException {
try {
anticipo.setFl_associato_missione(flg);
anticipo.setToBeUpdated();
updateBulk(userContext, anticipo);
} catch (it.cnr.jada.persistency.PersistencyException e) {
throw handleException(anticipo, e);
}
}
private void aggiornaCogeCoan(
UserContext userContext,
MissioneBulk missione,
IDocumentoContabileBulk docCont)
throws ComponentException {
try {
if (docCont != null && missione != null && missione.getDefferredSaldi() != null) {
IDocumentoContabileBulk key = missione.getDefferredSaldoFor(docCont);
if (key != null) {
java.util.Map values = (java.util.Map) missione.getDefferredSaldi().get(key);
//caso di creazione o di nessuna modifica sui doc cont
if (values == null) return;
//QUI chiamare component del documento contabile interessato
String jndiName = null;
Class clazz = null;
DocumentoContabileComponentSession session = null;
if (docCont instanceof ObbligazioneBulk) {
jndiName = "CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession";
clazz = ObbligazioneAbstractComponentSession.class;
session =
(ObbligazioneAbstractComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB(
jndiName, clazz);
} else if (docCont instanceof AccertamentoBulk) {
jndiName = "CNRDOCCONT00_EJB_AccertamentoAbstractComponentSession";
clazz = AccertamentoAbstractComponentSession.class;
session =
(AccertamentoAbstractComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB(
jndiName, clazz);
}
if (session != null) {
session.aggiornaCogeCoanInDifferita(userContext, key, values);
missione.getDefferredSaldi().remove(key);
}
}
}
} catch (javax.ejb.EJBException e) {
throw handleException(missione, e);
} catch (java.rmi.RemoteException e) {
throw handleException(missione, e);
}
}
private void aggiornaCogeCoanDocAmm(
UserContext userContext,
MissioneBulk missione)
throws ComponentException {
if (missione == null || missione.isSalvataggioTemporaneo()) return;
aggiornaCogeCoanObbligazioniDaCancellare(userContext, missione);
aggiornaCogeCoanObbligazioni(userContext, missione);
}
private void aggiornaCogeCoanObbligazioni(
UserContext userContext,
MissioneBulk missione)
throws ComponentException {
if (missione != null) {
ObbligazioniTable obbligazioniHash = missione.getObbligazioniHash();
if (obbligazioniHash != null && !obbligazioniHash.isEmpty()) {
//Aggiorna coge coan per le obbligazioni NON temporanee
for (java.util.Enumeration e = getDocumentiContabiliNonTemporanei(userContext, ((ObbligazioniTable) obbligazioniHash.clone()).keys()).keys(); e.hasMoreElements(); )
aggiornaCogeCoan(
userContext,
missione,
(IDocumentoContabileBulk) e.nextElement());
}
}
}
private void aggiornaCogeCoanObbligazioniDaCancellare(
UserContext userContext,
MissioneBulk missione)
throws ComponentException {
if (missione != null) {
if (missione.getDocumentiContabiliCancellati() != null &&
!missione.getDocumentiContabiliCancellati().isEmpty() &&
missione.getObbligazioniHash() != null) {
for (java.util.Enumeration e = missione.getDocumentiContabiliCancellati().elements(); e.hasMoreElements(); ) {
OggettoBulk oggettoBulk = (OggettoBulk) e.nextElement();
if (oggettoBulk instanceof Obbligazione_scadenzarioBulk) {
Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk) oggettoBulk;
if (!scadenza.getObbligazione().isTemporaneo()) {
PrimaryKeyHashtable obbligs = getDocumentiContabiliNonTemporanei(userContext, missione.getObbligazioniHash().keys());
if (!obbligs.containsKey(scadenza.getObbligazione()))
aggiornaCogeCoan(
userContext,
missione,
scadenza.getObbligazione());
}
}
}
}
}
}
/**
* Aggiorna obbligazione
*
* Pre-post-conditions:
*
* Nome: Aggiorna obbligazione temporanea
* Pre: L'utente ha richiesto l'inserimento/modifica di una missione
* L'utente ha creato una nuova obbligazione nel contesto transazionale della missione
* Post: Il sistema assegna un progressivo definitivo all'obbligazione (metodo 'aggiornaObbligazionetemporanea'),
* aggiona l'importo associato a doc. amministrativi della scadenza di obbligazione, aggiorna il saldo dell'obbligazione
* (metodo 'aggiornaSaldi')
*
* Nome: Aggiorna obbligazione non temporanea
* Pre: L'utente ha richiesto l'inserimento/modifica di una missione
* L'utente ha selezionato una scadenza di obbligazione già esistente
* Post: Il sistema aggiorna l'importo associato a doc. amministrativi della scadenza di obbligazione e aggiorna il saldo dell'obbligazione
* (metodo 'aggiornaSaldi')
*
* Nome: Elimina associazione con obbligazione
* Pre: L'utente ha richiesto la modifica di una missione
* L'utente ha eliminato un'associazione con una scadenza di obbligazione
* Post: Il sistema azzera l'importo associato a doc. amministrativi della scadenza di obbligazione e aggiorna il saldo dell'obbligazione
* (metodo 'aggiornaSaldi')
*
* Nome: Aggiorna saldi per obbligazione del compenso
* Pre: Il sistema salva una missione legata ad un compenso con associato una obbligazione
* Post: Il sistema aggiorna il saldo dell'obbligazione legata al compenso (metodo 'aggiornaSaldi')
*
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk da creare/modificare
* @param status serve per gestire l'eccezione lanciata dall'obbligazione
* nel caso non ci sia disponibilita' di cassa
*/
private void aggiornaObbligazione(UserContext userContext, MissioneBulk missione, it.cnr.contab.doccont00.core.bulk.OptionRequestParameter status) throws ComponentException {
Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk) missione.getObbligazione_scadenzario();
// Ciclo sulle scadenze precedentementi associate alla missione.
// Se nuove le inserisco comunque in tabella con "im_associato_doc_amm" nullo e ne aggiorno i saldi
// Se non nuove le aggiorno azzerando il loro "im_associato_doc_amm"
Obbligazione_scadenzarioBulk aScadenzaNonAssociata;
if (missione.getDocumentiContabiliCancellati() != null) {
for (Iterator i = missione.getDocumentiContabiliCancellati().iterator(); i.hasNext(); ) {
aScadenzaNonAssociata = (Obbligazione_scadenzarioBulk) i.next();
if (scadenza == null || !aScadenzaNonAssociata.getObbligazione().equalsByPrimaryKey(scadenza.getObbligazione())) {
// se la scadenza appartiene alla stessa obbligazione della scadenza associata alla missione
// non aggiornare i saldi altrimenti lo faresti due volte (l'aggiornamento dei saldi va per
// obbligazione e non per scadenze)
aggiornaSaldi(userContext, missione, aScadenzaNonAssociata.getObbligazione(), status);
if (aScadenzaNonAssociata.getObbligazione().isTemporaneo())
aggiornaObbligazioneTemporanea(userContext, aScadenzaNonAssociata.getObbligazione());
}
aScadenzaNonAssociata.setIm_associato_doc_amm((new BigDecimal(0)));
updateImportoAssociatoDocAmm(userContext, aScadenzaNonAssociata);
}
}
if (missione.isMissioneConObbligazione()) {
// Se la scadenza era gia' stata creata e non e' stata modificata
// il metodo non aggiornera' alcun saldo
aggiornaSaldi(userContext, missione, scadenza.getObbligazione(), status);
if (scadenza.getObbligazione().isTemporaneo())
aggiornaObbligazioneTemporanea(userContext, scadenza.getObbligazione());
scadenza.setIm_associato_doc_amm(missione.getImporto_scadenza_obbligazione());
updateImportoAssociatoDocAmm(userContext, scadenza);
}
// Aggiorno i saldi dell'obbligazione del compenso
if (missione.isMissioneConCompenso())
aggiornaSaldiPerCompenso(userContext, missione, status);
}
/**
* Aggiorna obbligazione temporanea
*
* Pre-post-conditions:
*
* Nome: Aggiorna obbligazione temporanea
* Pre: L'utente ha richiesto l'inserimento/modifica di una missione
* L'utente ha creato una nuova obbligazione nel contesto transazionale della missione e pertanto
* questa obbligazione ha un progressivo temporaneo
* Post: Il sistema assegna la numerazione definitiva all'obbligazione creata nel contesto della missione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param obbligazioneTemporanea l'ObbligazioneBulk con numerazione temporanea da rendere definitiva
*/
private void aggiornaObbligazioneTemporanea(UserContext userContext, ObbligazioneBulk obbligazioneTemporanea) throws ComponentException {
try {
Numerazione_doc_contHome numHome = (Numerazione_doc_contHome) getHomeCache(userContext).getHome(Numerazione_doc_contBulk.class);
Long pg = null;
pg = numHome.getNextPg(userContext,
obbligazioneTemporanea.getEsercizio(),
obbligazioneTemporanea.getCd_cds(),
obbligazioneTemporanea.getCd_tipo_documento_cont(),
obbligazioneTemporanea.getUser());
ObbligazioneHome home = (ObbligazioneHome) getHome(userContext, obbligazioneTemporanea);
home.confirmObbligazioneTemporanea(userContext, obbligazioneTemporanea, pg);
} catch (it.cnr.jada.persistency.PersistencyException e) {
throw handleException(obbligazioneTemporanea, e);
} catch (it.cnr.jada.persistency.IntrospectionException e) {
throw handleException(obbligazioneTemporanea, e);
}
}
/**
* Aggiorna saldi obbligazione
*
* Pre-post-conditions:
*
* Nome: Aggiorna saldi obbligazione
* Pre: L'utente ha richiesto l'inserimento/modifica di una missione
* L'utente ha associato una obbligazione alla missione
* Post: Il sistema richiede alla Component che gestisce l'Obbligazione l'aggiornamento in differita dei saldi
*
* @param docCont il documento contabile di tipo ObbligazioneBulk per cui chiedere l'aggiornamento dei saldi
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk a cui e' stata associata una scadenza di obbligazione
* @param status serve per gestire l'eccezione lanciata dall'obbligazione
* nel caso non ci sia disponibilita' di cassa
*/
private void aggiornaSaldi(it.cnr.jada.UserContext userContext, MissioneBulk missione, IDocumentoContabileBulk docCont, OptionRequestParameter status) throws ComponentException {
try {
if (docCont != null && missione != null && missione.getDefferredSaldi() != null) {
IDocumentoContabileBulk key = missione.getDefferredSaldoFor(docCont);
if (key != null) {
java.util.Map values = (java.util.Map) missione.getDefferredSaldi().get(key);
if (values != null) {
//QUI chiamare component del documento contabile interessato
String jndiName = null;
Class clazz = null;
it.cnr.contab.doccont00.comp.DocumentoContabileComponentSession session = null;
if (docCont instanceof ObbligazioneBulk) {
jndiName = "CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession";
clazz = it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession.class;
session = (it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB(jndiName, clazz);
}
if (session != null) {
session.aggiornaSaldiInDifferita(userContext, key, values, status);
//NON Differibile: si rischia di riprocessare i saldi impropriamente
missione.getDefferredSaldi().remove(key);
}
}
}
}
} catch (javax.ejb.EJBException e) {
throw handleException(missione, e);
} catch (java.rmi.RemoteException e) {
throw handleException(missione, e);
}
}
/**
* Aggiorna saldi obbligazione compenso
*
* Pre-post-conditions:
*
* Nome: Aggiorna saldi obbligazione compenso
* Pre: Il sistema sta salvando una missione aasociata a compenso
* Post: Il sistema aggiorna i saldi per le scadenze di obbligazione elaborate dal compeso associato alla
* missione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk legata al compenso
* @param status serve per gestire l'eccezione lanciata dall'obbligazione
* nel caso non ci sia disponibilita' di cassa
*/
private void aggiornaSaldiPerCompenso(it.cnr.jada.UserContext userContext, MissioneBulk missione, it.cnr.contab.doccont00.core.bulk.OptionRequestParameter status) throws ComponentException {
Obbligazione_scadenzarioBulk aScadenzaNonAssociataCompenso;
Obbligazione_scadenzarioBulk aScadenzaAssociataCompenso = missione.getCompenso().getObbligazioneScadenzario();
if (missione.getCompenso().getDocumentiContabiliCancellati() != null &&
!missione.getCompenso().getDocumentiContabiliCancellati().isEmpty()) {
for (Iterator i = missione.getCompenso().getDocumentiContabiliCancellati().iterator(); i.hasNext(); ) {
aScadenzaNonAssociataCompenso = (Obbligazione_scadenzarioBulk) i.next();
if (aScadenzaAssociataCompenso == null || !aScadenzaNonAssociataCompenso.getObbligazione().equalsByPrimaryKey(aScadenzaAssociataCompenso.getObbligazione())) {
// Aggiorno i saldi per le scadenze di obbligazione elaborate dal compenso
// ma non piu' associate
aggiornaSaldi(userContext, missione, aScadenzaNonAssociataCompenso.getObbligazione(), status);
}
}
}
// Aggiorno i saldi per la scadenza di obbligazione attualmente associata al compenso
if (aScadenzaAssociataCompenso != null)
aggiornaSaldi(userContext, missione, aScadenzaAssociataCompenso.getObbligazione(), status);
}
/**
* Cancellazione fisica del compenso
*
* Pre-post-conditions:
*
* Cancella fisicamente/logicamente Compenso
* Pre: Cancellazione fisica o logica del compenso validata ed effettuata dalla procedura
* Post: Il sistema cancella fisicamente il compenso e inizializza alcuni
* campi della missione (stato_coge, stato_coan, fl_associato_compenso)
*
* Condizione di errore
* Pre: Cancellazione fisica o logica del compenso NON validata dalla procedura
* Post: Il sistema non procede con la cancellazione
*
* @return la MissioneBulk il cui compenso e' stato cancellato
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui cancellare il compenso
*/
public MissioneBulk cancellaCompensoPhisically(it.cnr.jada.UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
// Chiamo la procedura che cancella logicamente o fisicamente
// il compenso
getTipoCancellazione(userContext, missione, 0);
// Se esiste, scollego la scadenza dal compenso.
// Ricorda che tale scadenza puo' non esistere se la missione ha associato
// un anticipo di importo maggiore
Obbligazione_scadenzarioBulk scadenza = missione.getCompenso().getObbligazioneScadenzario();
if (scadenza != null) {
scadenza.setIm_associato_doc_amm(new BigDecimal(0));
updateImportoAssociatoDocAmm(userContext, scadenza);
}
// Inizializzo i campi della missione relativi al compenso
missione.setCompenso(new CompensoBulk());
missione.setFl_associato_compenso(new Boolean(false));
missione.setStato_coge(MissioneBulk.STATO_INIZIALE_COGE);
missione.setStato_coan(MissioneBulk.STATO_INIZIALE_COAN);
return missione;
} catch (Throwable e) {
throw handleException(e);
}
}
/**
* Cancellazione fisica Dettagli Diaria
*
* Pre-post-conditions:
*
* Nome: Cancella fisicamente Diaria
* Pre: L'utente ha fatto delle modifiche che comportano la cancellazione fisica
* dei dettagli did iaria
* Post: Il sistema richiede alla Component di cancellare i dettagli di diaria
*
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui cancellare i dettagli di diaria
*/
public MissioneBulk cancellaDiariaPhisically(it.cnr.jada.UserContext userContext, MissioneBulk missione) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
try {
LoggableStatement ps = new LoggableStatement(getConnection(userContext),
"DELETE FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +
"Missione_dettaglio " +
" where pg_missione = ?" +
" and esercizio = ?" +
" and cd_cds = ?" +
" and cd_unita_organizzativa = ?" +
" and ti_spesa_diaria = 'D'", true, this.getClass());
ps.setObject(1, missione.getPg_missione());
ps.setObject(2, missione.getEsercizio());
ps.setString(3, missione.getCd_cds());
ps.setString(4, missione.getCd_unita_organizzativa());
ps.executeQuery();
return missione;
} catch (java.sql.SQLException e) {
throw new it.cnr.jada.persistency.PersistencyException(e);
}
}
public MissioneBulk cancellaRimborsoPhisically(it.cnr.jada.UserContext userContext, MissioneBulk missione) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
try {
LoggableStatement ps = new LoggableStatement(getConnection(userContext),
"DELETE FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +
"Missione_dettaglio " +
" where pg_missione = ?" +
" and esercizio = ?" +
" and cd_cds = ?" +
" and cd_unita_organizzativa = ?" +
" and ti_spesa_diaria = 'R'", true, this.getClass());
ps.setObject(1, missione.getPg_missione());
ps.setObject(2, missione.getEsercizio());
ps.setString(3, missione.getCd_cds());
ps.setString(4, missione.getCd_unita_organizzativa());
ps.executeQuery();
return missione;
} catch (java.sql.SQLException e) {
throw new it.cnr.jada.persistency.PersistencyException(e);
}
}
/**
* Cancellazione fisica Tappe
*
* Pre-post-conditions:
*
* Nome: Cancella fisicamente Tappe
* Pre: L'utente ha modificato la configurazione delle tappe della missione
* Post: Il sistema richiede alla Component di cancellare le tappe della missione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui cancellare le tappe
*/
public MissioneBulk cancellaTappePhisically(it.cnr.jada.UserContext userContext, MissioneBulk missione) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
try {
LoggableStatement ps = new LoggableStatement(getConnection(userContext),
"DELETE FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +
"Missione_tappa " +
" where pg_missione = ?" +
" and esercizio = ?" +
" and cd_cds = ?" +
" and cd_unita_organizzativa = ?", true, this.getClass());
ps.setObject(1, missione.getPg_missione());
ps.setObject(2, missione.getEsercizio());
ps.setString(3, missione.getCd_cds());
ps.setString(4, missione.getCd_unita_organizzativa());
ps.executeQuery();
return missione;
} catch (java.sql.SQLException e) {
throw new it.cnr.jada.persistency.PersistencyException(e);
}
}
/**
* Lettura da Tabella Missione_dettaglioBulk dei dettagli della missione in modifica
* PreCondition:
* Dettagli trovati
* PostCondition:
* Inizializza ogni dettaglio letto da tabella con i relativi attributi esterni e non
**/
private void caricaDettagliMissione(UserContext aUC, MissioneBulk missione) throws ComponentException, it.cnr.jada.persistency.PersistencyException, it.cnr.jada.comp.ApplicationException {
Missione_dettaglioHome dettaglioHome = (Missione_dettaglioHome) getHome(aUC, Missione_dettaglioBulk.class);
SQLBuilder sql = dettaglioHome.createSQLBuilder();
sql.addSQLClause("AND", "cd_cds", sql.EQUALS, missione.getCd_cds());
sql.addSQLClause("AND", "cd_unita_organizzativa", sql.EQUALS, missione.getCd_unita_organizzativa());
sql.addSQLClause("AND", "esercizio", sql.EQUALS, missione.getEsercizio());
sql.addSQLClause("AND", "pg_missione", sql.EQUALS, missione.getPg_missione());
it.cnr.jada.bulk.BulkList dettagli = new it.cnr.jada.bulk.BulkList(dettaglioHome.fetchAll(sql));
Missione_dettaglioBulk aDettaglio = null;
for (Iterator i = dettagli.iterator(); i.hasNext(); ) {
aDettaglio = (Missione_dettaglioBulk) i.next();
aDettaglio.setMissione(missione);
if (aDettaglio.getTi_spesa_diaria().equals(Missione_dettaglioBulk.TIPO_DIARIA))
missione.getDiariaMissioneColl().add(aDettaglio);
if (aDettaglio.getTi_spesa_diaria().equals(Missione_dettaglioBulk.TIPO_RIMBORSO))
missione.getRimborsoMissioneColl().add(aDettaglio);
if (aDettaglio.getTi_spesa_diaria().equals(Missione_dettaglioBulk.TIPO_SPESA)) {
// Carico gli attributi esterni
aDettaglio.setTipo_spesa(findTipo_spesa(aUC, aDettaglio));
if (aDettaglio.isPasto())
aDettaglio.setTipo_pasto(findTipo_pasto(aUC, aDettaglio));
if (aDettaglio.isRimborsoKm())
aDettaglio.setTipo_auto(findTipo_auto(aUC, aDettaglio));
else
aDettaglio.setTipo_auto(null);
missione.getSpeseMissioneColl().add(aDettaglio);
aDettaglio.setStatus(Missione_dettaglioBulk.STATUS_CONFIRMED);
}
}
missione.setSpeseInserite(true);
return;
}
/**
* Inizializzazione rimborso
*
* Pre-post-conditions:
*
* Nome: inizializzazione
* Pre: Il sistema carica in modifica una missione con anticipo
* Post: Il sistema restituisce l'anticipo con l'eventuale rimborso inizializzato
*
* @return l'AnticipoBulk inizializzato con l'eventuale rimborso
* @param aUC lo UserContext che ha generato la richiesta
* @param bulk l' AnticipoBulk per cui ricercare un eventuale rimborso
*/
private AnticipoBulk caricaRimborsoAnticipo(UserContext userContext, AnticipoBulk anticipo) throws ComponentException {
try {
SQLBuilder sql = getHome(userContext, RimborsoBulk.class).createSQLBuilder();
sql.addClause("AND", "esercizio_anticipo", sql.EQUALS, anticipo.getEsercizio());
sql.addClause("AND", "cd_cds_anticipo", sql.EQUALS, anticipo.getCd_cds());
sql.addClause("AND", "cd_uo_anticipo", sql.EQUALS, anticipo.getCd_unita_organizzativa());
sql.addClause("AND", "pg_anticipo", sql.EQUALS, anticipo.getPg_anticipo());
List result = getHome(userContext, RimborsoBulk.class).fetchAll(sql);
if (result.size() > 1)
throw new it.cnr.jada.comp.ApplicationException("Attenzione esiste piu' di un rimborso associato all'anticipo");
if (result.size() == 1)
anticipo.setRimborso((RimborsoBulk) result.get(0));
return anticipo;
} catch (Throwable e) {
throw handleException(e);
}
}
/**
* Lettura da Tabella Missione_tappaBulk delle tappe della missione in modifica
* PreCondition:
* Tappe trovate
* PostCondition:
* Riordina le tappe lette da tabella per dataInizioTappa, inizializza gli opportuni attributi delle tappe lette
* e crea una HashTable contenente le tappe di ogni giorno.
*
* Condizioni di errore
* PreCondition:
* Nessuna tappa trovata
* PostCondition:
* Emette errore con messaggio:"Tappe della missione non disponibili !".
**/
private void caricaTappeMissione(UserContext aUC, MissioneBulk missione) throws ComponentException, it.cnr.jada.persistency.PersistencyException, it.cnr.jada.comp.ApplicationException {
Missione_tappaHome tappaHome = (Missione_tappaHome) getHome(aUC, Missione_tappaBulk.class);
SQLBuilder sql = tappaHome.createSQLBuilder();
sql.addSQLClause("AND", "cd_cds", sql.EQUALS, missione.getCd_cds());
sql.addSQLClause("AND", "cd_unita_organizzativa", sql.EQUALS, missione.getCd_unita_organizzativa());
sql.addSQLClause("AND", "esercizio", sql.EQUALS, missione.getEsercizio());
sql.addSQLClause("AND", "pg_missione", sql.EQUALS, missione.getPg_missione());
missione.setTappeMissioneColl(new it.cnr.jada.bulk.BulkList(tappaHome.fetchAll(sql)));
if (missione.getTappeMissioneColl().isEmpty())
throw new it.cnr.jada.comp.ApplicationException("Tappe della missione non disponibili !");
missione.ordinaTappePerDataInizioTappa();
missione.setTappeConfigurate(true);
for (Iterator i = missione.getTappeMissioneColl().iterator(); i.hasNext(); ) {
Missione_tappaBulk aTappa = (Missione_tappaBulk) i.next();
aTappa.setMissione(missione);
if (aTappa.getFl_comune_altro().booleanValue())
aTappa.setComune(aTappa.COMUNE_ALTRO);
if (aTappa.getFl_comune_proprio().booleanValue())
aTappa.setComune(aTappa.COMUNE_PROPRIO);
if (aTappa.getFl_comune_estero().booleanValue())
aTappa.setComune(aTappa.COMUNE_ESTERO);
aTappa.setStatus(Missione_tappaBulk.STATUS_CONFIRMED);
missione.putInHashtableTappe(aTappa);
}
return;
}
/**
* Lettura del terzo della missione e inizializzazione dei relativi attributi :
* la collection di modalita e termini di pagamento e la collection dei tipi rapporto
*/
public MissioneBulk caricaTerzoInModificaMissione(UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
java.sql.Timestamp tsDtValidita = new java.sql.Timestamp(sdf.parse(sdf.format(missione.getDt_inizio_missione())).getTime());
V_terzo_per_compensoHome home = (V_terzo_per_compensoHome) getHome(userContext, V_terzo_per_compensoBulk.class, "DISTINCT_TERZO");
V_terzo_per_compensoBulk terzo = home.loadVTerzo(userContext, missione.getTi_anagrafico(), missione.getCd_terzo(), tsDtValidita, tsDtValidita);
if (terzo == null || terzo.getCd_terzo() == null)
throw new it.cnr.jada.comp.ApplicationException("Attenzione, il terzo associato alla missione non esiste !");
missione.setV_terzo(terzo);
missione.setTermini(findTermini(userContext, missione));
missione.setModalita(findModalita(userContext, missione));
missione.setTipi_rapporto(findTipi_rapporto(userContext, missione));
return missione;
} catch (Throwable e) {
throw handleException(e);
}
}
/**
* Valorizzazione l'attributo esterno "tipo_trattamento" della missione in modifica
* PreCondition:
* La collezione degli oggetti Tipo Trattamento eleggibili alla missione e' vuota
* PostCondition:
* Esce dal metodo
*
* PreCondition:
* Trovata la corrispondenza tra il codice trattamento della missione e il codice trattamento
* di uno degli oggetti Tipo Trattamento eleggibili
* PostCondition:
* Inizializzo l'attributo esterno "tipo_trattamento" della missione
*
* PreCondition:
* Non trovata la corrispondenza tra il codice trattamento della missione e il codice trattamento
* di uno degli oggetti Tipo Trattamento eleggibili
* PostCondition:
* Esce dal metodo
**/
private void caricaTipoTrattamento(MissioneBulk missione) {
if ((missione.getCd_trattamento() == null) ||
(missione.getTipi_trattamento() == null) || (missione.getTipi_trattamento().isEmpty()))
return;
Tipo_trattamentoBulk aTrattamento = null;
for (Iterator i = missione.getTipi_trattamento().iterator(); i.hasNext(); ) {
aTrattamento = (Tipo_trattamentoBulk) i.next();
if ((aTrattamento.getCd_trattamento() != null) && (aTrattamento.getCd_trattamento().equals(missione.getCd_trattamento()))) {
missione.setTipo_trattamento(aTrattamento);
break;
}
}
return;
}
/**
* Tutti i controlli superati.
* PreCondition:
* Ricerca la lista delle scadenze di obbligazioni congruenti con la missione che si sta creando/modificando.
* PostCondition:
* Le scadenze vengono aggiunte alla lista delle scadenze congruenti.
* Validazione lista delle obbligazioni per le missioni
* PreCondition:
* Si è verificato un errore nel caricamento delle scadenze delle obbligazioni.
* PostCondition:
* Viene inviato il messaggio corrispondente all'errore segnalato.
* Obbligazione definitiva
* PreCondition:
* La scadenza non appartiene ad un'obbligazione definitiva
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Obbligazioni non cancellate
* PreCondition:
* La scadenza appartiene ad un'obbligazione cancellata
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Obbligazioni associate ad altri documenti amministrativi
* PreCondition:
* La scadenza appartiene ad un'obbligazione associata ad altri documenti amministrativi
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Obbligazioni della stessa UO
* PreCondition:
* La scadenza dell'obbligazione non appartiene alla stessa UO di generazione missione
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Abilitatazione filtro di selezione sul debitore dell'obbligazione
* PreCondition:
* La scadenza dell'obbligazione ha un debitore diverso da quello della missione
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Disabilitazione filtro di selezione sul debitore dell'obbligazione
* PreCondition:
* La scadenza dell'obbligazione ha un debitore diverso da quello della missione e non è di tipo "diversi"
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Abilitazione filtro di selezione sulla data di scadenza
* PreCondition:
* La scadenza dell'obbligazione ha una data scadenza precedente alla data di filtro
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Abilitazione filtro importo scadenza
* PreCondition:
* La scadenza dell'obbligazione ha un importo di scadenza inferiore a quella di filtro
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
* Abilitazione filtro sul progressivo dell'obbligazione
* PreCondition:
* La scadenza dell'obbligazione non ha progressivo specificato
* PostCondition:
* La scadenza non viene aggiunta alla lista delle scadenze congruenti.
*/
public RemoteIterator cercaObbligazioni(UserContext context, Filtro_ricerca_obbligazioniVBulk filtro) throws ComponentException {
SQLBuilder sql = prepareQueryObbligazioni(context, filtro);
return iterator(context, sql, Obbligazione_scadenzarioBulk.class, "default");
}
private SQLBuilder prepareQueryObbligazioni(UserContext context, Filtro_ricerca_obbligazioniVBulk filtro) throws ComponentException {
Obbligazione_scadenzarioHome home = (Obbligazione_scadenzarioHome) getHome(context, Obbligazione_scadenzarioBulk.class);
it.cnr.jada.persistency.sql.SQLBuilder sql = home.createSQLBuilder();
sql.setDistinctClause(true);
sql.addTableToHeader("OBBLIGAZIONE");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.CD_CDS", "OBBLIGAZIONE.CD_CDS");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO", "OBBLIGAZIONE.ESERCIZIO");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO_ORIGINALE", "OBBLIGAZIONE.ESERCIZIO_ORIGINALE");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.PG_OBBLIGAZIONE", "OBBLIGAZIONE.PG_OBBLIGAZIONE");
sql.addSQLClause("AND", "OBBLIGAZIONE.ESERCIZIO", sql.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context));
sql.addSQLClause("AND", "OBBLIGAZIONE.STATO_OBBLIGAZIONE", sql.EQUALS, "D");
sql.addSQLClause("AND", "OBBLIGAZIONE.DT_CANCELLAZIONE", sql.ISNULL, null);
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.IM_SCADENZA", sql.NOT_EQUALS, new java.math.BigDecimal(0));
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM IS NULL");
sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP), java.sql.Types.DECIMAL, 2);
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE IS NULL");
sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP), java.sql.Types.DECIMAL, 2);
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_UNITA_ORGANIZZATIVA", sql.EQUALS, filtro.getCd_unita_organizzativa());
sql.addSQLClause("AND", "OBBLIGAZIONE.RIPORTATO", sql.EQUALS, "N");
if (filtro.getElemento_voce() != null) {
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_ELEMENTO_VOCE", sql.STARTSWITH, filtro.getElemento_voce().getCd_elemento_voce());
sql.addSQLClause("AND", "OBBLIGAZIONE.TI_APPARTENENZA", sql.EQUALS, filtro.getElemento_voce().getTi_appartenenza());
sql.addSQLClause("AND", "OBBLIGAZIONE.TI_GESTIONE", sql.EQUALS, filtro.getElemento_voce().getTi_gestione());
sql.addSQLClause("AND", "OBBLIGAZIONE.ESERCIZIO", sql.EQUALS, filtro.getElemento_voce().getEsercizio());
}
if (!filtro.getFl_fornitore().booleanValue()) {
sql.addTableToHeader("TERZO");
sql.addTableToHeader("ANAGRAFICO");
sql.addSQLJoin("OBBLIGAZIONE.CD_TERZO", "TERZO.CD_TERZO");
sql.addSQLJoin("TERZO.CD_ANAG", "ANAGRAFICO.CD_ANAG");
sql.addSQLClause("AND", "(OBBLIGAZIONE.CD_TERZO = ? OR ANAGRAFICO.TI_ENTITA = ?)");
sql.addParameter(filtro.getFornitore().getCd_terzo(), java.sql.Types.INTEGER, 0);
sql.addParameter(AnagraficoBulk.DIVERSI, java.sql.Types.VARCHAR, 0);
} else {
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_TERZO", sql.EQUALS, filtro.getFornitore().getCd_terzo());
}
if (filtro.getFl_data_scadenziario().booleanValue() && filtro.getData_scadenziario() != null)
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.DT_SCADENZA", sql.EQUALS, filtro.getData_scadenziario());
if (filtro.getFl_importo().booleanValue() && filtro.getIm_importo() != null)
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.IM_SCADENZA", sql.GREATER_EQUALS, filtro.getIm_importo());
//filtro su Tipo obbligazione
if (filtro.getFl_nr_obbligazione().booleanValue() && filtro.getTipo_obbligazione() != null) {
if (ObbligazioneBulk.TIPO_COMPETENZA.equals(filtro.getTipo_obbligazione()))
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_TIPO_DOCUMENTO_CONT", sql.EQUALS, Numerazione_doc_contBulk.TIPO_OBB);
else if (ObbligazioneBulk.TIPO_RESIDUO_PROPRIO.equals(filtro.getTipo_obbligazione()))
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_TIPO_DOCUMENTO_CONT", sql.EQUALS, Numerazione_doc_contBulk.TIPO_OBB_RES);
else if (ObbligazioneBulk.TIPO_RESIDUO_IMPROPRIO.equals(filtro.getTipo_obbligazione()))
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_TIPO_DOCUMENTO_CONT", sql.EQUALS, Numerazione_doc_contBulk.TIPO_OBB_RES_IMPROPRIA);
}
//filtro su Anno Residuo obbligazione
if (filtro.getFl_nr_obbligazione().booleanValue() && filtro.getEsercizio_ori_obbligazione() != null)
sql.addSQLClause("AND", "OBBLIGAZIONE.ESERCIZIO_ORIGINALE", sql.EQUALS, filtro.getEsercizio_ori_obbligazione());
//filtro su Numero obbligazione
if (filtro.getFl_nr_obbligazione().booleanValue() && filtro.getNr_obbligazione() != null)
sql.addSQLClause("AND", "OBBLIGAZIONE.PG_OBBLIGAZIONE", sql.EQUALS, filtro.getNr_obbligazione());
return sql;
}
private boolean checkEleggibilitaAnticipo(UserContext aUC, MissioneBulk missione) throws ComponentException {
AnticipoHome anticipoHome = (AnticipoHome) getHome(aUC, AnticipoBulk.class);
AnticipoBulk aAnticipo = null;
try {
SQLBuilder sql = selectAnticipoByClause(aUC, missione, new AnticipoBulk(), null);
sql.addClause("and", "pg_anticipo", sql.EQUALS, missione.getAnticipo().getPg_anticipo());
sql.addClause("and", "cd_cds", sql.EQUALS, missione.getAnticipo().getCd_cds());
sql.addClause("and", "cd_unita_organizzativa", sql.EQUALS, missione.getAnticipo().getCd_unita_organizzativa());
sql.addClause("and", "esercizio", sql.EQUALS, missione.getAnticipo().getEsercizio());
SQLBroker broker = anticipoHome.createBroker(sql);
if (broker.next())
aAnticipo = (AnticipoBulk) anticipoHome.fetch(broker);
broker.close();
if (aAnticipo == null)
return false;
} catch (it.cnr.jada.persistency.PersistencyException e) {
throw handleException(missione, e);
}
return true;
}
/**
* Completa i dati relativi al terzo
*
* Pre-post-conditions:
*
* Nome: Completa terzo
* Pre: L'utente ha selezionato un nuovo terzo per la missione
* Post: Il sistema ha valorizzato tutti i dati relativi all'anagrafico associato al terzo selezionato, in particolare
* codice, nome, cognome, ragione sociale, codice fiscale, partita iva,
* modalita, termini di pagamento e tipi rapporto
*
* @return la MissioneBulk coi dati relativi al terzo inizializzati
* @param uc lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui e' stato selezionato un nuovo terzo
* @param aTerzo il terzo di tipo V_terzo_per_compensoBulk selezioanto dall'utente
*/
public MissioneBulk completaTerzo(UserContext uc, MissioneBulk missione, V_terzo_per_compensoBulk aTerzo) throws ComponentException {
if (missione != null) {
missione.setV_terzo(aTerzo);
missione.setCd_terzo(aTerzo.getCd_terzo());
missione.setNome(aTerzo.getNome());
missione.setCognome(aTerzo.getCognome());
missione.setRagione_sociale(aTerzo.getRagione_sociale());
missione.setCodice_fiscale(aTerzo.getCodice_fiscale());
missione.setPartita_iva(aTerzo.getPartita_iva());
missione.setTermini(findTermini(uc, missione));
missione.setModalita(findModalita(uc, missione));
missione.setTipi_rapporto(findTipi_rapporto(uc, missione));
}
return missione;
}
/**
* Creazione missione
*
* Pre-post-conditions:
*
* Nome: creazione temporanea di missione
* Pre: L'utente ha selezionato fine inserimento spese
* Post: Il sistema salva la missione temporaneamente
*
* Nome: creazione di missione
* Pre: L'utente ha selezionato il bottone di salvataggio della missione
* Post: Aggiornamento dell'anticipo associato alla missione,
* aggiornamento dell'obbligazione associata alla missione ( metodo 'aggiornaObbligazione')
* aggiornamento della missione con progressivo definitivo e stato cofi = contabilizzato
*
* @return la MissioneBulk creata
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da creare
*/
public OggettoBulk creaConBulk(UserContext userContext, OggettoBulk bulk) throws ComponentException {
return creaConBulk(userContext, bulk, null);
}
/**
* Creazione missione
*
* Pre-post-conditions:
*
* Nome: creazione temporanea di missione
* Pre: L'utente ha selezionato fine inserimento spese
* Post: Il sistema salva la missione temporaneamente
*
* Nome: creazione di missione
* Pre: Validazione della scadenza di obbligazione associata alla missione
* Post: Il sistema prosegue con il salvataggio della missione
*
* Nome: creazione di missione
* Pre: L'utente ha selezionato il bottone di salvataggio della missione
* Post: Aggiornamento dell'anticipo associato alla missione,
* aggiornamento dell'obbligazione associata alla missione ( metodo 'aggiornaObbligazione')
* aggiornamento della missione con progressivo definitivo e stato cofi = contabilizzato
*
* @return la MissioneBulk creata
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da creare
* @param status serve per gestire l'eccezione lanciata dall'obbligazione
* nel caso non ci sia disponibilita' di cassa
*/
public OggettoBulk creaConBulk(UserContext userContext, OggettoBulk bulk, it.cnr.contab.doccont00.core.bulk.OptionRequestParameter status) throws ComponentException {
MissioneBulk missioneTemp = (MissioneBulk) bulk;
if (missioneTemp == null)
return null;
try {
// Salvo temporaneamente l'hash map dei saldi
PrimaryKeyHashMap aTempDiffSaldi = new PrimaryKeyHashMap();
if (missioneTemp.getDefferredSaldi() != null)
aTempDiffSaldi = (PrimaryKeyHashMap) missioneTemp.getDefferredSaldi().clone();
impostaDatiRimborsoDaCompletare(missioneTemp);
controlloDateTappeConDateMissioni(missioneTemp);
if (missioneTemp.getPg_missione() == null) {
// Salvo missione, le spese, le tappe in modo temporaneo
missioneTemp = (MissioneBulk) super.creaConBulk(userContext, missioneTemp);
} else {
// Validazione dell'eventuale obbligazione collegata alla missione
if (!missioneTemp.isSalvataggioTemporaneo() && missioneTemp.isMissioneDefinitiva() &&
missioneTemp.isObbligazioneObbligatoria()) {
if (!missioneTemp.isMissioneConObbligazione())
throw new it.cnr.jada.comp.ApplicationException("Associare una Obbligazione !");
validaObbligazione(userContext, missioneTemp.getObbligazione_scadenzario(), missioneTemp);
}
// Verifico che l'anticipo associato alla missione sia ancora eleggibile
// (Qualche altro utente potrebbe avere ad esempio annullato il mandato)
if (missioneTemp.isMissioneConAnticipo()) {
if (!checkEleggibilitaAnticipo(userContext, missioneTemp))
throw new ApplicationException("Anticipo non eleggibile alla missione");
}
if (missioneTemp.isMissioneConAnticipo())
aggiornaAnticipo(userContext, missioneTemp.getAnticipo(), new Boolean(true));
aggiornaObbligazione(userContext, missioneTemp, status);
missioneTemp.setStato_cofi(missioneTemp.STATO_CONTABILIZZATO_COFI);
// Salvo missione/tappe/spese in modo definitivo
// Cerco un progressivo definitivo per la missione
Long pg = null;
if (missioneTemp.isMissioneFromGemis() && missioneTemp.getPgMissioneFromGeMis() != null) {
pg = missioneTemp.getPgMissioneFromGeMis();
} else {
ProgressiviAmmComponentSession progressiviSession = (ProgressiviAmmComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRDOCAMM00_EJB_ProgressiviAmmComponentSession", ProgressiviAmmComponentSession.class);
Numerazione_doc_ammBulk numerazione = new Numerazione_doc_ammBulk(missioneTemp);
pg = progressiviSession.getNextPG(userContext, numerazione);
}
// Inserisco la missione, le spese, le tappe in modo definitivo
MissioneHome home = (MissioneHome) getHome(userContext, missioneTemp);
// Aggiorno la missione temporanea perche' dal salvataggio temporaneo a
// quello definitivo potrei avere associato/cambiato scadenza, selezionato
// il fondo, modificato gli importi della diaria .....
missioneTemp.setToBeUpdated();
makeBulkPersistent(userContext, missioneTemp);
// Rendo definitiva la missione
home.confermaMissioneTemporanea(userContext, missioneTemp, pg);
}
// Restore dell'hash map dei saldi
if (missioneTemp.getDefferredSaldi() != null)
missioneTemp.getDefferredSaldi().putAll(aTempDiffSaldi);
aggiornaCogeCoanDocAmm(userContext, missioneTemp);
if (!verificaStatoEsercizio(userContext, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk(missioneTemp.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio())))
throw new it.cnr.jada.comp.ApplicationException("Impossibile salvare un documento per un esercizio non aperto!");
return missioneTemp;
} catch (Throwable e) {
throw handleException(e);
}
}
private void impostaDatiRimborsoDaCompletare(MissioneBulk missioneTemp) {
if (missioneTemp.isMissioneProvvisoria() && missioneTemp.isMissioneFromGemis()) {
missioneTemp.setDaRimborsoDaCompletare(true);
} else {
missioneTemp.setDaRimborsoDaCompletare(false);
}
}
private void controlloTrovato(UserContext aUC,
Obbligazione_scadenzarioBulk scadenza) throws ComponentException,
ApplicationException {
Elemento_voceHome evHome = (Elemento_voceHome) getHome(aUC, Elemento_voceBulk.class);
SQLBuilder sql = evHome.createSQLBuilder();
sql.addSQLClause("AND", "esercizio", SQLBuilder.EQUALS, scadenza.getObbligazione().getEsercizio());
sql.addSQLClause("AND", "ti_appartenenza", SQLBuilder.EQUALS, scadenza.getObbligazione().getTi_appartenenza());
sql.addSQLClause("AND", "ti_gestione", SQLBuilder.EQUALS, scadenza.getObbligazione().getTi_gestione());
sql.addSQLClause("AND", "cd_elemento_voce", SQLBuilder.EQUALS, scadenza.getObbligazione().getCd_elemento_voce());
try {
List voce = evHome.fetchAll(sql);
if (!voce.isEmpty()) {
Elemento_voceBulk elementoVoce = (Elemento_voceBulk) voce.get(0);
if (elementoVoce.isVocePerTrovati()) {
throw new it.cnr.jada.comp.ApplicationException(
"Non è possibile selezionare per missioni obbligazioni su capitoli collegati a Brevetti/Trovati.");
}
if (!elementoVoce.getFl_missioni()) {
throw new it.cnr.jada.comp.ApplicationException(
"Non è possibile selezionare per missioni obbligazioni su capitoli non utilizzabili per le missioni.");
}
}
} catch (PersistencyException ex) {
throw handleException(ex);
}
}
/**
* Cancellazione logica missione
*
* Pre-post-conditions:
*
* Nome: cancellazione logica missione
* Pre: L'utente ha selezionato elimina missione
* Post: Il sistema cancella logicamnete la missione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da cancellare
*/
private void deleteLogically(UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
missione.setCrudStatus(OggettoBulk.TO_BE_UPDATED);
// ************
// Se l'esercizio di scrivania e' diverso da quello solare
// inizializzo la data di cancellazione al 31/12/esercizio missione
java.sql.Timestamp tsOdierno = ((MissioneHome) getHome(userContext, missione)).getServerDate();
GregorianCalendar tsOdiernoGregorian = (GregorianCalendar) missione.getGregorianCalendar(tsOdierno);
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
if (tsOdiernoGregorian.get(GregorianCalendar.YEAR) != it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue())
missione.setDt_cancellazione(new java.sql.Timestamp(sdf.parse("31/12/" + missione.getEsercizio().intValue()).getTime()));
else {
String currentDate = Integer.toString(tsOdiernoGregorian.get(GregorianCalendar.DAY_OF_MONTH)) + "/" +
Integer.toString(tsOdiernoGregorian.get(GregorianCalendar.MONTH)) + "/" +
Integer.toString(tsOdiernoGregorian.get(GregorianCalendar.YEAR));
missione.setDt_cancellazione(new java.sql.Timestamp(sdf.parse(currentDate).getTime()));
}
// ************
missione.setStato_cofi(MissioneBulk.STATO_ANNULLATO);
// Nel caso di cancellazione logica della missione + compenso
// reinizializzo i campi della missione nella tabella del compenso
// e quindi metto sempre e comunque la flag associata a compenso = N.
missione.setFl_associato_compenso(new Boolean(false));
if (missione.getStato_coan().compareTo(MissioneBulk.STATO_CONTABILIZZATO_COAN) == 0)
missione.setStato_coan(MissioneBulk.STATO_RICONTABILIZZARE_COAN);
if (missione.getStato_coge().compareTo(MissioneBulk.STATO_CONTABILIZZATO_COGE) == 0)
missione.setStato_coge(MissioneBulk.STATO_RICONTABILIZZARE_COGE);
updateBulk(userContext, missione);
} catch (Throwable e) {
throw handleException(e);
}
}
/**
* Cancellazione missione
*
* Pre-post-conditions:
*
* Nome: cancellazione missione
* Pre: Validazione cancellazione superata
* Post: Il sistema procede con :
* - una cancellazione logica se la procedura ritorna il valore 1
* - una cancellazione fisica se la procedura ritorna il valore 2
* e scollega l'eventuale scadenza associata alla missione o al compenso
*
* Pre: Validazione cancellazione NON superata
* Post: Il sistema non procede con la cancellazione della missione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da cancellare
*/
public void eliminaConBulk(UserContext aUC, OggettoBulk bulk) throws ComponentException {
MissioneBulk missione = (MissioneBulk) bulk;
try {
// Controllo dello stato dell'es COEP prec. per compensi riportati Da ese. prec. (isRiportataInScrivania())
validateEsercizioCOEP(aUC, missione);
int rc = getTipoCancellazione(aUC, missione, 1);
if (rc == 0)
throw new it.cnr.jada.comp.ApplicationException("Impossibile eliminare la missione !");
// Salvo temporaneamente l'hash map dei saldi
PrimaryKeyHashMap aTempDiffSaldi = new PrimaryKeyHashMap();
if (missione.getDefferredSaldi() != null)
aTempDiffSaldi = (PrimaryKeyHashMap) missione.getDefferredSaldi().clone();
Obbligazione_scadenzarioBulk scadenza = null;
// Scollego l'eventuale scadenza dalla missione o del compenso
if (missione.isMissioneConObbligazione())
scadenza = missione.getObbligazione_scadenzario();
if (missione.isMissioneConCompenso())
scadenza = missione.getCompenso().getObbligazioneScadenzario();
if (scadenza != null) {
scadenza.setIm_associato_doc_amm(new BigDecimal(0));
updateImportoAssociatoDocAmm(aUC, scadenza);
}
if (rc == missione.CANCELLAZIONE_FISICA){
logger.info("Cancellazione Fisica Missione "+missione.getPg_missione());
super.eliminaConBulk(aUC, missione);
} else if (rc == missione.CANCELLAZIONE_LOGICA){
logger.info("Cancellazione Logica Missione "+missione.getPg_missione());
deleteLogically(aUC, missione);
}
// Restore dell'hash map dei saldi
if (missione.getDefferredSaldi() != null)
missione.getDefferredSaldi().putAll(aTempDiffSaldi);
aggiornaCogeCoanDocAmm(aUC, missione);
if (!verificaStatoEsercizio(aUC, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk(missione.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext) aUC).getEsercizio())))
throw new it.cnr.jada.comp.ApplicationException("Impossibile eliminare un documento per un esercizio non aperto!");
} catch (Throwable e) {
throw handleException(e);
}
}
/**
* Carica i dati relativi al cambio
*
* Pre-post-conditions:
*
* Nome: Carica cambio
* Pre: E' stata generata una richiesta di caricamento di un cambio associato ad una certa divisa e valido
* in una certa data
* Post: Il sistema restituisce il cambio valido per la divisa data
*
* @return il CambioBulk trovato oppure null se non esiste nessun cambio valido per quella divisa in quella data
* @param uc lo UserContext che ha generato la richiesta
* @param divisa la DivisaBulk per cui ricercare il cambio
* @param dataCambio la data per cui il cambio deve essere valido
*/
public CambioBulk findCambio(UserContext uc, DivisaBulk divisa, java.sql.Timestamp dataCambio) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
CambioHome cambioHome = (CambioHome) getHome(uc, CambioBulk.class);
CambioBulk aCambio = null;
if (divisa != null) {
return findCambio(uc, divisa.getCd_divisa(), dataCambio);
} else {
aCambio = cambioHome.getCambio(divisa, dataCambio);
}
if (aCambio == null)
return null;
return aCambio;
}
public CambioBulk findCambio(UserContext uc, String divisa, java.sql.Timestamp dataCambio) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
CambioHome cambioHome = (CambioHome) getHome(uc, CambioBulk.class);
CambioBulk aCambio = null;
aCambio = cambioHome.getCambio(divisa, dataCambio);
if (aCambio == null)
return null;
return aCambio;
}
/**
* Carica i dati relativi alla divisa
*
* Pre-post-conditions:
*
* Nome: Carica divisa
* Pre: E' stata generata una richiesta di caricamento di una divisa dato il suo codice
* Post: Il sistema restituisce la divisa
*
* @return la DivisaBulk oppure null se non esiste nessuna divisa per il codice specificato
* @param uc lo UserContext che ha generato la richiesta
*/
private DivisaBulk findDivisa(UserContext userContext, String cdDivisa) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
if (cdDivisa == null)
return new DivisaBulk();
DivisaHome divisaHome = (DivisaHome) getHome(userContext, DivisaBulk.class);
DivisaBulk aDivisa = new DivisaBulk();
SQLBuilder sql = divisaHome.createSQLBuilder();
sql.addSQLClause("AND", "CD_DIVISA", sql.EQUALS, cdDivisa);
sql.addSQLClause("AND", "DT_CANCELLAZIONE", sql.ISNULL, null);
SQLBroker broker = divisaHome.createBroker(sql);
if (broker.next())
aDivisa = (DivisaBulk) divisaHome.fetch(broker);
broker.close();
return aDivisa;
}
/**
* Carica i dati relativi agli Inquadramenti
*
* Pre-post-conditions:
*
* Nome: Carica inquadramenti
* Pre: E' stata generata una richiesta di caricamento degli inquadramenti disponibili per il terzo specificato per una
* missione
* Post: Il sistema restituisce l'elenco degli inquadramenti validi relativi al terzo della missione, con tipo
* rapporto uguale a quello della missione e data inizio missione inclusa nell'intervallo di validità
* dell'inquadramento
*
* @return la collezione di Rif_inquadramentoBulk valida per la missione
* @param uc lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui selezionare gli inquadramenti
*/
public Collection findInquadramenti(UserContext aUC, MissioneBulk missione) throws ComponentException {
try {
if (missione.getV_terzo() == null || missione.getV_terzo().getCd_terzo() == null ||
missione.getCd_tipo_rapporto() == null || missione.getDt_inizio_missione() == null)
return null;
Rif_inquadramentoHome rifHome = (Rif_inquadramentoHome) getHome(aUC, Rif_inquadramentoBulk.class);
java.sql.Timestamp aData = it.cnr.jada.util.DateUtils.truncate(missione.getDt_inizio_missione());
SQLBuilder sql = rifHome.selectInquadramenti(null, missione.getTipo_rapporto(), missione.getV_terzo(), aData);
return rifHome.fetchAll(sql);
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(missione, ex);
}
}
/**
* Carica i dati relativi agli Inquadramenti e ai Tipi di Trattamento
*
* Pre-post-conditions:
*
* Nome: Carica Inquadramenti e Tipi Trattamento
* Pre: E' stata generata una richiesta di caricamento degli inquadramenti disponibili per il terzo specificato per una
* missione e dei relativi tipi di trattamento
* Post: Il sistema restituisce la missione con gli inquadramenti (metodo findInquadramenti)
* e i Tipi Trattamento ( metodo 'findTipi_trattamento') validi relativi al terzo della missione
*
* @return la MissioneBulk con gli inquadramenti e i tipi di trattamento inizializzati
* @param uc lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui selezionare gli inquadramenti e i tipi di trattamento
*/
public MissioneBulk findInquadramentiETipiTrattamento(UserContext aUC, MissioneBulk missione) throws ComponentException {
missione.setInquadramenti(findInquadramenti(aUC, missione));
missione.setTipi_trattamento(findTipi_trattamento(aUC, missione));
return missione;
}
/**
* Carica i dati relativi alle coordinate bancarie
*
* Pre-post-conditions:
*
* Nome: Carica banche
* Pre: E' stata generata una richiesta di caricamento delle coordinate bancarie relative al terzo della missione
* Post: Il sistema restituisce la lista delle coordinate bancarie relative al terzo della missione
*
* @return la collezione di istanze di tipo BancaBulk
* @param uc lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk da cui ricavare il terzo per cui selezionare le coordinate bancarie
*/
public java.util.Collection findListabanche(UserContext aUC, MissioneBulk missione) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
if (missione.getCd_terzo() == null || missione.getModalita_pagamento() == null)
return null;
return getHome(aUC, BancaBulk.class).fetchAll(selectBancaByClause(aUC, missione, null, null));
}
/**
* Carica i dati relativi alle modalità di pagamento
*
* Pre-post-conditions:
*
* Nome: Carica modalita
* Pre: E' stata generata una richiesta di caricamento delle modalità di pagamento relative al terzo della missione
* Post: Il sistema restituisce la lista delle modalità di pagamento relative al terzo della missione
*
* @return la collezione di istanze di tipo Rif_modalita_pagamentoBulk
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da cui ricavare il terzo per cui selezionare le modalità di pagamento
*/
public java.util.Collection findModalita(UserContext userContext, OggettoBulk bulk) throws ComponentException {
try {
MissioneBulk missione = (MissioneBulk) bulk;
if ((missione.getTerzo() == null))
return null;
TerzoHome terzoHome = (TerzoHome) getHome(userContext, TerzoBulk.class);
return terzoHome.findRif_modalita_pagamento(missione.getTerzo());
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(bulk, ex);
} catch (it.cnr.jada.persistency.IntrospectionException ex) {
throw handleException(bulk, ex);
}
}
/**
* Carica i dati relativi alla Nazione Italia
*
* Pre-post-conditions:
*
* Nome: Carica nazione Italia
* Pre: E' stata generata una richiesta di caricamento dei dati relativi alla nazione di tipo Italia
* Post: Il sistema restituisce la nazione di tipo Italia
*
* @return la NazioneBulk di tipo Italia
* @param uc lo UserContext che ha generato la richiesta
*/
private NazioneBulk findNazioneItalia(UserContext userContext) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
NazioneHome nazHome = (NazioneHome) getHome(userContext, NazioneBulk.class);
NazioneBulk nazione = null;
SQLBuilder sql = nazHome.createSQLBuilder();
sql.addSQLClause("AND", "TI_NAZIONE", sql.EQUALS, NazioneBulk.ITALIA);
sql.addOrderBy("PG_NAZIONE");
SQLBroker broker = nazHome.createBroker(sql);
if (broker.next())
nazione = (NazioneBulk) nazHome.fetch(broker);
broker.close();
return nazione;
}
/**
* Carica i dati relativi ai termini di pagamento
*
* Pre-post-conditions:
*
* Nome: Carica termini
* Pre: E' stata generata una richiesta di caricamento dei termini di pagamento relativi al terzo della missione
* Post: Il sistema restituisce la lista dei termini di pagamento relativi al terzo della missione
*
* @return la collezione di istanze di tipo Rif_termini_pagamentoBulk
* @param uc lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da cui ricavare il terzo per cui selezionare i termini di pagamento
*/
public java.util.Collection findTermini(UserContext userContext, OggettoBulk bulk) throws ComponentException {
try {
MissioneBulk missione = (MissioneBulk) bulk;
if ((missione.getTerzo() == null))
return null;
TerzoHome terzoHome = (TerzoHome) getHome(userContext, TerzoBulk.class);
return terzoHome.findRif_termini_pagamento(missione.getTerzo());
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(bulk, ex);
} catch (it.cnr.jada.persistency.IntrospectionException ex) {
throw handleException(bulk, ex);
}
}
/**
* Carica i dati relativi ai tipi di missione
*
* Pre-post-conditions:
*
* Nome: Carica tipi missione
* Pre: E' stata generata una richiesta di caricamento dei tipi di missione
* Post: Il sistema restituisce la lista di tutti i tipi di missione
*
* @return la collezione di istanze di tipo Tipo_missioneBulk
* @param uc lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk
*/
public java.util.Collection findTipi_missione(UserContext userContext, OggettoBulk bulk) throws ComponentException {
try {
Tipo_missioneHome tipoMissioneHome = (Tipo_missioneHome) getHome(userContext, Tipo_missioneBulk.class);
SQLBuilder sql = tipoMissioneHome.createSQLBuilder();
return tipoMissioneHome.fetchAll(sql);
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(bulk, ex);
}
}
/**
* Viene richiesta la lista dei Tipi di rapporto associati ad un Terzo e validi
* in data inizio missione
*
* Pre-post-conditions:
*
* Nome: Terzo NON selezionato o data inizio missione non valorizzata
* Pre: Non è stato selezionato un Terzo per la missione oppure non e'
* stata inserita la data inizio missione
* Post: Non vengono caricati i Tipi di rapporto
*
* Nome: Terzo selezionato e data inizio missione valorizzata
* Pre: E' stato selezionato un Terzo valido per la missione ed e' stata
* inserita la data inizio missione
* Post: Viene restituita la lista dei Tipi di rapporto associati al Terzo e
* validi in data inizio missione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk l'OggettoBulk da completare
* @return La lista dei Tipi di rapporto associati al terzo e validi in data inizio
* missione
**/
public java.util.Collection findTipi_rapporto(UserContext userContext, OggettoBulk bulk) throws ComponentException {
try {
MissioneBulk missione = (MissioneBulk) bulk;
if (!missione.areCampiPerRicercaTipiRapportoValorizzati())
return null;
Tipo_rapportoHome rifHome = (Tipo_rapportoHome) getHome(userContext, Tipo_rapportoBulk.class);
java.sql.Timestamp aData = it.cnr.jada.util.DateUtils.truncate(missione.getDt_inizio_missione());
List listaTipiRapporto = rifHome.findTipiRapporto(missione.getV_terzo(), aData);
return listaTipiRapporto;
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(bulk, ex);
}
}
/**
* Viene richiesta la lista dei Tipi di Trattamento legati
* al Tipo di Rapporto selezionato
*
* Pre-post-conditions:
*
* Nome: Tipo di Rapporto o Data registrazione NON valorizzati
* Pre: Non sono stati valorizzati il tipo di rapporto o la data di registrazione
* Post: Non vengono caricati i Tipi Trattamento
*
* Nome: Tipo rapporto e Data registrazione valorizzati
* Pre: E' stato selezionato un tipo di rapporto valido ed e' stata
* valorizza la data di registrazione della missione
* Post: Viene restituita la lista dei Tipi di Trattamento
* legati al Tipo di rapporto selezionato, al tipo anagrafico della missione
* e validita alla data di registrazione della missione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk l'OggettoBulk da completare
* @return La lista dei Tipi di Trattamento associati al Tipo Rapporto e al tipo anagrafico
* della missione e validi alla data di registrazione della missione
**/
public java.util.Collection findTipi_trattamento(UserContext userContext, OggettoBulk bulk) throws ComponentException {
try {
MissioneBulk missione = (MissioneBulk) bulk;
if (missione == null || !missione.areCampiPerRicercaTipiTrattamentoValorizzati())
return null;
Tipo_trattamentoHome trattamentoHome = (Tipo_trattamentoHome) getHome(userContext, Tipo_trattamentoBulk.class);
Filtro_trattamentoBulk filtro = new Filtro_trattamentoBulk();
filtro.setCdTipoRapporto(missione.getCd_tipo_rapporto());
filtro.setTipoAnagrafico(missione.getTi_anagrafico());
filtro.setDataValidita(missione.getDt_registrazione());
filtro.setFlSenzaCalcoli(Boolean.FALSE);
filtro.setFlDiaria(Boolean.TRUE);
filtro.setFlDefaultCongualio(Boolean.FALSE);
filtro.setTiIstituzionaleCommerciale(missione.getTi_istituz_commerc());
if (filtro.getCdTipoRapporto() != null && filtro.getCdTipoRapporto().equals("DIP")) {
try {
TerzoHome tHome = (TerzoHome) getHomeCache(userContext).getHome(TerzoBulk.class);
TerzoBulk tKey = new TerzoBulk(missione.getCd_terzo());
TerzoBulk t = (TerzoBulk) tHome.findByPrimaryKey(tKey);
RapportoHome rHome = (RapportoHome) getHomeCache(userContext).getHome(RapportoBulk.class);
java.util.Collection collRapp = rHome.findByCdAnagCdTipoRapporto(t.getCd_anag(), filtro.getCdTipoRapporto());
boolean exit = false;
for (java.util.Iterator i = collRapp.iterator(); i.hasNext() && !exit; ) {
RapportoBulk r = (RapportoBulk) i.next();
exit = true;
if (r.getCd_ente_prev_sti() == null)
//throw new it.cnr.jada.comp.ApplicationException("Non è stato possibile recuperare l''Ente Previdenziale del dipendente selezionato.");
//non blocco perchè potrebbero esserci trattamenti che non prevedono contributi previdenziali
//quindi passo il codice fittizio 'XX'
filtro.setEntePrev("XX");
else
filtro.setEntePrev(r.getCd_ente_prev_sti());
if (r.getCd_rapp_impiego_sti() == null)
throw new it.cnr.jada.comp.ApplicationException("Per il dipendente in esame non è definito un Rapporto di Impiego!");
else {
Ass_rapp_impiegoHome assHome = (Ass_rapp_impiegoHome) getHome(userContext, Ass_rapp_impiegoBulk.class);
Ass_rapp_impiegoBulk assKey = new Ass_rapp_impiegoBulk(r.getCd_rapp_impiego_sti());
Ass_rapp_impiegoBulk ass = (Ass_rapp_impiegoBulk) assHome.findByPrimaryKey(assKey);
filtro.setTipoRappImpiego(ass.getTipo_rapp_impiego());
}
}
} catch (IntrospectionException e) {
throw handleException(e);
}
//solo per il rapporto DIP aggiungo il filtro "Anno prec" a seconda della data di inizio competenza
GregorianCalendar data_da = (GregorianCalendar) GregorianCalendar.getInstance();
data_da.setTime(missione.getDt_inizio_missione());
if (data_da.get(GregorianCalendar.YEAR) == (missione.getEsercizio() - 1))
filtro.setFlAnnoPrec(new Boolean(true));
else
filtro.setFlAnnoPrec(new Boolean(false));
}
if (missione.getDt_inizio_missione() != null && missione.getDt_fine_missione() != null) {
GregorianCalendar data_da = (GregorianCalendar) GregorianCalendar.getInstance();
GregorianCalendar data_a = (GregorianCalendar) GregorianCalendar.getInstance();
data_da.setTime(missione.getDt_inizio_missione());
data_a.setTime(missione.getDt_fine_missione());
if (data_da.get(GregorianCalendar.YEAR) == data_a.get(GregorianCalendar.YEAR)) {
TerzoHome tHome = (TerzoHome) getHomeCache(userContext).getHome(TerzoBulk.class);
TerzoBulk tKey = new TerzoBulk(missione.getCd_terzo());
TerzoBulk t = (TerzoBulk) tHome.findByPrimaryKey(tKey);
AnagraficoHome aHome = (AnagraficoHome) getHomeCache(userContext).getHome(AnagraficoBulk.class);
AnagraficoBulk aKey = new AnagraficoBulk(t.getCd_anag());
AnagraficoBulk a = (AnagraficoBulk) aHome.findByPrimaryKey(aKey);
if (a.getFl_cervellone() &&
!(new Integer(data_da.get(GregorianCalendar.YEAR)).compareTo(a.getAnno_inizio_res_fis().intValue()) < 0) &&
!(new Integer(data_da.get(GregorianCalendar.YEAR)).compareTo(a.getAnno_fine_agevolazioni().intValue()) > 0)) {
filtro.setFlAgevolazioniCervelli(new Boolean(a.getFl_cervellone()));
} else
filtro.setFlAgevolazioniCervelli(new Boolean(false));
} else
filtro.setFlAgevolazioniCervelli(new Boolean(false));
}
return trattamentoHome.findTipiTrattamento(filtro);
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(bulk, ex);
}
}
/**
* Pre-post-conditions:
*
* Nome: inizializza tipo auto
* Pre: L'utente ha richiesto l'inizializzzaione dei dettagli di spesa di una missione
* La spesa e' di tipo rimborso km
* Post: Il sistema carica il tipo auto del dettaglio della missione
*
* @return la Missione_rimborso_kmBulk trovata
* @param userContext lo UserContext che ha generato la richiesta
* @param aSpesa il Missione_dettaglioBulk per cui cercare il tipo auto
*/
private Missione_rimborso_kmBulk findTipo_auto(UserContext aUC, Missione_dettaglioBulk aSpesa) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
Missione_rimborso_kmHome tipoAutoHome = (Missione_rimborso_kmHome) getHome(aUC, Missione_rimborso_kmBulk.class);
Missione_rimborso_kmBulk tipoAuto = null;
SQLBuilder sql = selectTipo_autoByClause(aUC, aSpesa, new Missione_rimborso_kmBulk(), null);
SQLBroker broker = tipoAutoHome.createBroker(sql);
if (broker.next())
tipoAuto = (Missione_rimborso_kmBulk) tipoAutoHome.fetch(broker);
broker.close();
return tipoAuto;
}
/**
* Pre-post-conditions:
*
* Nome: inizializza tipo spesa
* Pre: L'utente ha richiesto l'inizializzzaione dei dettagli di spesa di una missione
* La spesa e' di tipo pasto
* Post: Il sistema carica il tipo pasto del dettaglio della missione
*
* @return la Missione_tipo_pastoBulk trovata
* @param userContext lo UserContext che ha generato la richiesta
* @param aSpesa il Missione_dettaglioBulk per cui cercare il tipo pasto
*/
private Missione_tipo_pastoBulk findTipo_pasto(UserContext aUC, Missione_dettaglioBulk aSpesa) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
Missione_tipo_pastoHome tipoPastoHome = (Missione_tipo_pastoHome) getHome(aUC, Missione_tipo_pastoBulk.class);
Missione_tipo_pastoBulk tipoPasto = null;
SQLBuilder sql = selectTipo_pastoByClause(aUC, aSpesa, new Missione_tipo_pastoBulk(), null);
SQLBroker broker = tipoPastoHome.createBroker(sql);
if (broker.next())
tipoPasto = (Missione_tipo_pastoBulk) tipoPastoHome.fetch(broker);
broker.close();
return tipoPasto;
}
/**
* Pre-post-conditions:
*
* Nome: inizializza tipo spesa
* Pre: L'utente ha richiesto l'inizializzzaione dei dettagli di spesa di una missione
* Post: Il sistema carica il tipo spesa del dettaglio della missione
*
* @return la Missione_tipo_spesaBulk trovata
* @param userContext lo UserContext che ha generato la richiesta
* @param aSpesa il Missione_dettaglioBulk per cui cercare il tipo spesa
*/
private Missione_tipo_spesaBulk findTipo_spesa(UserContext aUC, Missione_dettaglioBulk aSpesa) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
Missione_tipo_spesaHome tipoSpesaHome = (Missione_tipo_spesaHome) getHome(aUC, Missione_tipo_spesaBulk.class);
Missione_tipo_spesaBulk tipoSpesa = null;
SQLBuilder sql = selectTipo_spesaByClause(aUC, aSpesa, new Missione_tipo_spesaBulk(), null);
SQLBroker broker = tipoSpesaHome.createBroker(sql);
if (broker.next())
tipoSpesa = (Missione_tipo_spesaBulk) tipoSpesaHome.fetch(broker);
broker.close();
return tipoSpesa;
}
/**
* Genera diaria
*
* Pre-post-conditions:
*
* Nome: Genera diaria
* Pre: L'utente ha richiesto la generazione della diaria per una missione
* Post: Il sistema richiama la stored procedure che genera la diaria; il sistema carica i dettagli della diaria
* (metodo 'ritornaDiariaGenerata')
*
* @return la MissioneBulk con la diaria generata
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui generare la diaria
*/
public MissioneBulk generaDiaria(UserContext aUC, MissioneBulk missione) throws ComponentException {
LoggableStatement cs = null;
try {
missione.calcolaConsuntivi();
try {
cs = new LoggableStatement(getConnection(aUC), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
+ "CNRCTB505.elaboraMissioneDiaria(?,?,?,?)}", false, this.getClass());
cs.setObject(1, missione.getCd_cds());
cs.setObject(2, missione.getCd_unita_organizzativa());
cs.setObject(3, missione.getEsercizio());
cs.setObject(4, missione.getPg_missione());
cs.executeQuery();
} finally {
cs.close();
}
missione = ritornaDiariaGenerata(aUC, missione);
return missione;
} catch (java.sql.SQLException e) {
throw handleException(missione, e);
}
}
public MissioneBulk generaRimborso(UserContext aUC, MissioneBulk missione) throws ComponentException {
LoggableStatement cs = null;
try {
//missione.calcolaConsuntivi();
try {
if (missione.getCd_trattamento() != null) {
cs = new LoggableStatement(getConnection(aUC), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
+ "CNRCTB505.elaboraMissioneRimborso(?,?,?,?,?)}", false, this.getClass());
cs.setObject(1, missione.getCd_cds());
cs.setObject(2, missione.getCd_unita_organizzativa());
cs.setObject(3, missione.getEsercizio());
cs.setObject(4, missione.getPg_missione());
cs.setObject(5, missione.getCd_trattamento());
cs.executeQuery();
} else {
cs = new LoggableStatement(getConnection(aUC), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
+ "CNRCTB505.elaboraMissioneRimborso(?,?,?,?)}", false, this.getClass());
cs.setObject(1, missione.getCd_cds());
cs.setObject(2, missione.getCd_unita_organizzativa());
cs.setObject(3, missione.getEsercizio());
cs.setObject(4, missione.getPg_missione());
cs.executeQuery();
}
} finally {
cs.close();
}
missione = ritornaRimborsoGenerato(aUC, missione);
return missione;
} catch (java.sql.SQLException e) {
throw handleException(missione, e);
}
}
/**
* Carica i dati relativi alla divisa di default
*
* Pre-post-conditions:
*
* Nome: Carica divisa
* Pre: E' stata generata una richiesta di caricamento della divisa di default
* Post: Il sistema restituisce la divisa di default
*
* @return la DivisaBulk di default oppure null se non esiste nessuna divisa di default
* @param uc lo UserContext che ha generato la richiesta
*/
public DivisaBulk getDivisaDefault(UserContext aUC) throws it.cnr.jada.comp.ComponentException, javax.ejb.EJBException, it.cnr.jada.persistency.PersistencyException {
DivisaHome divisaHome = (DivisaHome) getHome(aUC, DivisaBulk.class);
DivisaBulk divisaDefault = divisaHome.getDivisaDefault(aUC);
return divisaDefault;
}
/**
* Carica i dati relativi alla divisa
*
* Pre-post-conditions:
*
* Nome: Carica divisa
* Pre: E' stata generata una richiesta di caricamento di una divisa dato il suo codice
* Post: Il sistema restituisce la divisa
*
* @return la DivisaBulk oppure null se non esiste nessuna divisa per il codice specificato
* @param uc lo UserContext che ha generato la richiesta
*/
private String getDivisaTappaDaDiaria(UserContext userContext, Long nazione, String gruppoInqudramento, Timestamp data) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
Missione_diariaHome diariaHome = (Missione_diariaHome) getHome(userContext, Missione_diariaBulk.class);
Missione_diariaBulk aDiaria = new Missione_diariaBulk();
SQLBuilder sql = diariaHome.createSQLBuilder();
sql.addSQLClause("AND", "PG_NAZIONE", sql.EQUALS, nazione);
sql.addSQLClause("AND", "CD_GRUPPO_INQUADRAMENTO", sql.EQUALS, gruppoInqudramento);
sql.addSQLClause("AND", "DT_INIZIO_VALIDITA", sql.LESS_EQUALS, data);
sql.addSQLClause("AND", "DT_FINE_VALIDITA", sql.GREATER_EQUALS, data);
SQLBroker broker = diariaHome.createBroker(sql);
if (broker.next())
aDiaria = (Missione_diariaBulk) diariaHome.fetch(broker);
broker.close();
return aDiaria.getCd_divisa();
}
private it.cnr.jada.bulk.PrimaryKeyHashtable getDocumentiContabiliNonTemporanei(
UserContext userContext,
java.util.Enumeration scadenze) throws ComponentException {
it.cnr.jada.bulk.PrimaryKeyHashtable documentiContabiliNonTemporanei = new it.cnr.jada.bulk.PrimaryKeyHashtable();
if (scadenze != null)
while (scadenze.hasMoreElements()) {
IScadenzaDocumentoContabileBulk scadenza = (IScadenzaDocumentoContabileBulk) scadenze.nextElement();
if (!scadenza.getFather().isTemporaneo()) {
if (!documentiContabiliNonTemporanei.containsKey(scadenza.getFather())) {
Vector allInstances = new java.util.Vector();
allInstances.addElement(scadenza.getFather());
documentiContabiliNonTemporanei.put(scadenza.getFather(), allInstances);
} else {
((Vector) documentiContabiliNonTemporanei.get(scadenza.getFather())).add(scadenza.getFather());
}
}
}
return documentiContabiliNonTemporanei;
}
private BigDecimal getMassimaleEuro(UserContext aUC, Missione_dettaglioBulk spesa, DivisaBulk divisaDefault, String cdDivisaMassimale, BigDecimal importoMassimale, boolean flgSpesa) throws ComponentException, javax.ejb.EJBException, it.cnr.jada.persistency.PersistencyException, it.cnr.jada.bulk.ValidationException {
CambioBulk cambioMassimale = new CambioBulk();
DivisaBulk divisaMassimale = null;
BigDecimal importoMassimaleEuro = new BigDecimal(0);
// Se il massimale non e' espresso in EURO lo converto
if (!cdDivisaMassimale.equals(divisaDefault.getCd_divisa())) {
// Recupero l'oggetto divisa del massimale
divisaMassimale = findDivisa(aUC, cdDivisaMassimale);
if (divisaMassimale == null) {
if (flgSpesa)
throw new it.cnr.jada.bulk.ValidationException("Impossibile trovare la divisa di riferimento del massimale della spesa !");
else
throw new it.cnr.jada.bulk.ValidationException("Impossibile trovare la divisa di riferimento del massimale del pasto !");
}
// Cerco il Cambio da usare
Missione_tappaBulk tappa = (Missione_tappaBulk) spesa.getMissione().getTappeMissioneHash().get(spesa.getDt_inizio_tappa());
if ((tappa != null) && (tappa.getCd_divisa_tappa() != null) && (tappa.getCd_divisa_tappa().equals(cdDivisaMassimale))) {
// Propongo il cambio della tappa dello stesso giorno
cambioMassimale.setCambio(tappa.getCambio_tappa());
} else {
// Cambio letto da db
cambioMassimale = findCambio(aUC, divisaMassimale, spesa.getDt_inizio_tappa());
if (cambioMassimale == null) {
if (flgSpesa)
throw new it.cnr.jada.bulk.ValidationException("Impossibile trovare il cambio per convertire il massimale della spesa !");
else
throw new it.cnr.jada.bulk.ValidationException("Impossibile trovare il cambio per convertire il massimale del pasto !");
}
}
// Converto massimale in Euro
importoMassimale = importoMassimale.setScale(2, BigDecimal.ROUND_HALF_UP);
if (divisaMassimale.getFl_calcola_con_diviso().booleanValue())
importoMassimaleEuro = importoMassimale.divide(cambioMassimale.getCambio(), BigDecimal.ROUND_HALF_UP);
else
importoMassimaleEuro = importoMassimale.multiply(cambioMassimale.getCambio());
} else
importoMassimaleEuro = importoMassimale;
return importoMassimaleEuro;
}
private String getStatoRiporto(UserContext context, MissioneBulk missione) throws ComponentException {
try {
RiportoDocAmmComponentSession session = (RiportoDocAmmComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRDOCAMM00_EJB_RiportoDocAmmComponentSession", RiportoDocAmmComponentSession.class);
return session.getStatoRiporto(context, missione);
} catch (Throwable t) {
throw handleException(missione, t);
}
}
/**
* Gennaro Borriello - (02/11/2004 15.04.39)
* Aggiunta gestione dell Stato Riportato all'esercizio di scrivania.
*/
private String getStatoRiportoInScrivania(UserContext context, MissioneBulk missione) throws ComponentException {
try {
RiportoDocAmmComponentSession session = (RiportoDocAmmComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRDOCAMM00_EJB_RiportoDocAmmComponentSession", RiportoDocAmmComponentSession.class);
return session.getStatoRiportoInScrivania(context, missione);
} catch (Throwable t) {
throw handleException(missione, t);
}
}
/**
* Tipo di Cancellazione
*
* Pre-post-conditions:
*
* Nome: Tipo di Cancellazione
* Pre: L'utente ha richiesto la cancellazione della missione
* Post: Il sistema richiama la stored procedure che stabilisce se la cancellazione
* della missione deve essere puo' avvenire e se deve essere logica o fisica.
* La procedura cancella anche l'eventuale compenso collegato
*
* @return il tipo di cancellazione (NULL = non cancellabile; F = cancellazione
* fisica; L = cancellazione logica)
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk da cancellare
* @param cancellaAnticipo 0 = non cancellare anticipo
* 1 = cancella anticipo
*/
private int getTipoCancellazione(UserContext aUC, OggettoBulk bulk, int cancellaAnticipo) throws ComponentException {
MissioneBulk missione = (MissioneBulk) bulk;
int rc = 0;
LoggableStatement cs = null;
try {
try {
cs = new LoggableStatement(getConnection(aUC), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
+ "CNRCTB505.eseguiDelMissione(?,?,?,?,?)}", false, this.getClass());
cs.setObject(1, missione.getCd_cds());
cs.setObject(2, missione.getCd_unita_organizzativa());
cs.setObject(3, missione.getEsercizio());
cs.setObject(4, missione.getPg_missione());
cs.setInt(5, cancellaAnticipo);
cs.registerOutParameter(5, java.sql.Types.INTEGER);
cs.executeQuery();
rc = ((Integer) (cs.getObject(5))).intValue();
// Se la missione e' eleggibile alla cancellazione fisica
// ma l'obbligazione ad essa associata risulta essere stata
// riportata --> forzo la cancellazione logica della missione
//Gennaro Borriello - (03/11/2004 19.04.48)
// Fix sul controllo dello "Stato Riportato"
if (rc == missione.CANCELLAZIONE_FISICA && missione.isRiportata() && missione.isRiportataInScrivania())
rc = missione.CANCELLAZIONE_LOGICA;
} finally {
cs.close();
}
return rc;
} catch (java.sql.SQLException e) {
throw handleException(missione, e);
}
}
/**
* Gestione della validazione del terzo selezionato
*
* Pre-post-conditions:
*
* Pre: Il sistema ha effettuato i controlli del terzo della missione
* Post: Il sistema a seconda dell'errore che si e' verificato durante la validazione del terzo
* manda una ComponentException
*
* @param error il codice dell'errore che si e' verificato in fase di validazione del terzo
*/
/**
* ComponentException :
*
* errorCode Significato
* ========= ===========
* 0 Tutto bene
* 1 Terzo assente
* 2 Terzo non valido alla data registrazione
* 3 Controllo se ho inserito le modalità di pagamento
* 4 Controllo se la modalità di pagamento è valida (ha una banca associata)
* 5 Tipo rapporto assente
* 6 Tipo di rapporto non valido in data inizio missione
* 7 Tipo trattamento assente
* 8 Tipo trattamento non valido alla data registrazione
**/
private void handleExceptionsTerzo(int error) throws ComponentException {
switch (error) {
case 1:
throw new it.cnr.jada.comp.ApplicationException("Inserire il terzo");
case 2:
throw new it.cnr.jada.comp.ApplicationException("Il Terzo selezionato non è valido in Data Registrazione");
case 3:
throw new it.cnr.jada.comp.ApplicationException("Selezionare la Modalità di pagamento");
case 4:
throw new it.cnr.jada.comp.ApplicationException("Selezionare una Modalità di Pagamento valida");
case 5:
throw new it.cnr.jada.comp.ApplicationException("Selezionare il Tipo Rapporto");
case 6:
throw new it.cnr.jada.comp.ApplicationException("Il Tipo Rapporto selezionato non è valido alla Data Inizio Missione");
case 7:
throw new it.cnr.jada.comp.ApplicationException("Selezionare il Tipo Trattamento");
case 8:
throw new it.cnr.jada.comp.ApplicationException("Il Tipo Trattamento selezionato non è valido alla Data Registrazione");
}
}
/**
* Esercizio non aperto
* PreCondition:
* L'esercizio di scrivania e' in uno stato diverso da APERTO
* PostCondition:
* Il metodo utilizza un Throw Exception per comunicare che non e' possibile creare missioni.
* Esercizio aperto
* PreCondition:
* L'esercizio di scrivania e' in stato APERTO
* PostCondition:
* e' possibile procedere con la creazione della missione
*
* Inizializzazione data di registrazione
* PreCondition:
* se l'esercizio di scrivania (quello della missione) e' uguale all'esercizio corrente
* PostCondition:
* inizializzo la data di registrazione con la data odierna
*
* Inizializzazione data di registrazione
* PreCondition:
* Se l'esercizio di scrivania (quello della missione) e' antecedente all'esercizio corrente
* PostCondition:
* inizializzo la data di registrazione con la data 31/12/esercizio di scrivania
*
* @param aUC lo user context
* @param bulk l'istanza di MissioneBulk che si sta creando
* @return l'istanza di MissioneBulk inizializzata
*/
public OggettoBulk inizializzaBulkPerInserimento(UserContext aUC, OggettoBulk bulk) throws ComponentException {
MissioneBulk missione = (MissioneBulk) bulk;
try {
// Verifico che l'esercizio della missione (scrivania) sia aperto
if (!verificaStatoEsercizio(aUC, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk(missione.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext) aUC).getEsercizio())))
throw new it.cnr.jada.comp.ApplicationException("Impossibile inserire una missione per un esercizio non aperto!");
missione.setDt_registrazione(getDataRegistrazione(aUC, missione));
return super.inizializzaBulkPerInserimento(aUC, missione);
} catch (it.cnr.jada.persistency.PersistencyException e) {
throw handleException(missione, e);
}
}
private Timestamp getDataRegistrazione(UserContext aUC, MissioneBulk missione)
throws PersistencyException, ComponentException, ApplicationException {
java.sql.Timestamp tsOdierno = ((MissioneHome) getHome(aUC, missione)).getServerDate();
GregorianCalendar tsOdiernoGregorian = (GregorianCalendar) missione.getGregorianCalendar(tsOdierno);
// Se l'esercizio della missione (scrivania) e' antecedente a quello corrente
// inizializzo la data di registrazione a 31/12/esercizio missione
Timestamp dataRegistrazione = null;
if (tsOdiernoGregorian.get(GregorianCalendar.YEAR) > missione.getEsercizio().intValue()) {
try {
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
dataRegistrazione = new java.sql.Timestamp(sdf.parse("31/12/" + missione.getEsercizio().intValue()).getTime());
} catch (java.text.ParseException e) {
throw new it.cnr.jada.comp.ApplicationException("Impossibile inizializzare la data di registrazione!");
}
} else
dataRegistrazione = tsOdierno;
return dataRegistrazione;
}
/**
* Pre-post-conditions:
*
* Nome: inizializza Missione
* Pre: L'utente ha richiesto l'inizializzzaione dei dati di una missione già inserita per una eventuale modifica
* Post: Il sistema carica la missione, il terzo della missione, gli inquadramenti e i tipi di rapporto,
* le tappe della missione (metodo 'caricaTappeMissione'), i dettagli di spesa della missione (metodo 'caricaDettagliMissione'),
* gli eventuali anticipi, obbligazioni o compensi (metodo 'loadCompenso')
* su cui la missione e' stata contabilizzata
*
* @return la MissioneBulk inizializzata
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da inizializzare
*/
public OggettoBulk inizializzaBulkPerModifica(UserContext userContext, OggettoBulk bulk) throws ComponentException {
MissioneBulk missione = (MissioneBulk) bulk;
if (missione.getEsercizio() == null)
throw new it.cnr.jada.comp.ApplicationException("L'esercizio del documento non è valorizzato! Impossibile proseguire.");
if (missione.getEsercizio().intValue() > it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue())
throw new it.cnr.jada.comp.ApplicationException("Il documento deve appartenere o all'esercizio di scrivania o ad esercizi precedenti per essere aperto in modifica!");
missione = (MissioneBulk) super.inizializzaBulkPerModifica(userContext, missione);
try {
lockBulk(userContext, missione);
if (missione == null)
return null;
caricaTerzoInModificaMissione(userContext, missione);
// Inizializzo gli attributi del terzo, la collection di modalita e termini
// di pagamento e la collection dei tipi rapporto
completaTerzo(userContext, missione, missione.getV_terzo());
// Inizializzo la collection degli inquadramenti e dei tipi rapporto eleggibili
findInquadramentiETipiTrattamento(userContext, missione);
// Carico il Tipo rapporto selezionato
caricaTipoTrattamento(missione);
// Lettura delle tappe della missione e inizializzazioni della relativa collection e dictionary
caricaTappeMissione(userContext, missione);
// Lettura dei dettagli della missione e inizializzazioni della collection delle spese e della diaria
caricaDettagliMissione(userContext, missione);
// Inizializzo la collection dei giorni
missione.riempiElencoGiorniCollPerModifica();
missione.ordinaCollectionGiorni();
// Riempi gli oggetti complessi persistenti
getHomeCache(userContext).fetchAll(userContext);
// Se la missione ha un anticipo associato carico l'eventuale rimborso
if (missione.isMissioneConAnticipo())
missione.setAnticipo(caricaRimborsoAnticipo(userContext, missione.getAnticipo()));
if (missione.getAnticipo() != null)
missione.setAnticipoClone((AnticipoBulk) missione.getAnticipo().clone());
// Serve nella lettura delle scadenze eleggibili (per poter riselezionare la scadenza
// associata alla missione che si sta modificando)
if (missione.getObbligazione_scadenzario() != null) {
missione.setObbligazione_scadenzarioClone(new Obbligazione_scadenzarioBulk());
missione.getObbligazione_scadenzarioClone().setEsercizio_originale(missione.getEsercizio_ori_obbligazione());
missione.getObbligazione_scadenzarioClone().setPg_obbligazione(missione.getPg_obbligazione());
missione.getObbligazione_scadenzarioClone().setPg_obbligazione_scadenzario(missione.getPg_obbligazione_scadenzario());
missione.getObbligazione_scadenzarioClone().setEsercizio(missione.getObbligazione_scadenzario().getEsercizio());
missione.getObbligazione_scadenzarioClone().setCd_cds(missione.getObbligazione_scadenzario().getCd_cds());
}
// In base allo stato di riporto dell'obbligazione della missione (o del relativo compenso)
// inizializzo la variabile 'riportata' della missione
missione.setRiportata(getStatoRiporto(userContext, missione));
/**
* Gennaro Borriello - (02/11/2004 15.04.39)
* Aggiunta gestione dell Stato Riportato all'esercizio di scrivania.
*/
missione.setRiportataInScrivania(getStatoRiportoInScrivania(userContext, missione));
// carico Compenso
if (missione.isMissioneConCompenso())
loadCompenso(userContext, missione);
missione.setMissioneIniziale((MissioneBulk) missione.clone());
} catch (Throwable e) {
throw handleException(e);
}
return missione;
}
/**
* inizializzaBulkPerStampa method comment.
*/
public OggettoBulk inizializzaBulkPerStampa(UserContext userContext, OggettoBulk bulk) throws ComponentException {
try {
Stampa_vpg_missioneBulk stampa = (Stampa_vpg_missioneBulk) bulk;
Unita_organizzativaHome uoHome = (Unita_organizzativaHome) getHome(userContext, Unita_organizzativaBulk.class);
Unita_organizzativaBulk uo = (Unita_organizzativaBulk) uoHome.findByPrimaryKey(new Unita_organizzativaBulk(CNRUserContext.getCd_unita_organizzativa(userContext)));
stampa.setUoForPrint(uo);
stampa.setCd_cds(CNRUserContext.getCd_cds(userContext));
stampa.setEsercizio(CNRUserContext.getEsercizio(userContext));
stampa.setPgInizio(new Long(0));
stampa.setPgFine(new Long(999999999));
stampa.setTerzoForPrint(new TerzoBulk());
return stampa;
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(ex);
}
}
/**
* Pre-post-conditions:
*
* Nome: inizializza Divisa e Cambio Per spesa di tipo RimborsoKm
* Pre: Ad una spesa di una missione e' stato associato il tipo RimborsoKm
* Post: Il sistema imposta la divisa della spesa con la divisa di default e
* il cambio della spesa con il cambio valido per la divisa e per la data
* della spesa (se piu' giorni ci si riferisce al primo della selezione)
*
* @return la MissioneBulk con la spesa inizializzata
* @param userContext lo UserContext che ha generato la richiesta
* @param aSpesa la Missione_dettaglioBulk per tipo rimborso km
*/
public MissioneBulk inizializzaDivisaCambioPerRimborsoKm(UserContext userContext, Missione_dettaglioBulk aSpesa) throws ComponentException, it.cnr.jada.persistency.PersistencyException, javax.ejb.EJBException, it.cnr.jada.bulk.ValidationException {
aSpesa.setDivisa_spesa(getDivisaDefault(userContext));
if ((aSpesa.getDivisa_spesa() == null) || (aSpesa.getDivisa_spesa().getCd_divisa() == null))
throw new it.cnr.jada.bulk.ValidationException("Divisa non disponibile !");
CambioBulk cambio = null;
if (aSpesa.getDt_inizio_tappa() != null) // Si e' in fase di conferma della spesa
cambio = findCambio(userContext, aSpesa.getDivisa_spesa(), aSpesa.getDt_inizio_tappa());
else // Al bring back di una spesa di tipo rimborso km
cambio = findCambio(userContext, aSpesa.getDivisa_spesa(), aSpesa.getMissione().getPrimoGiornoSpesaSelezionato());
if (cambio == null)
throw new it.cnr.jada.bulk.ValidationException("Cambio non disponibile !");
aSpesa.setCambio_spesa(cambio.getCambio());
return aSpesa.getMissione();
}
/**
* Pre-post-conditions:
*
* Nome: verifica validita' inquadramento
* Pre: Il sistema richiede la validita' dell'inquadramento del terzo associato alla missione
* Post: Il sistema valida l'inquadramento selezionato
*
* @param userContext lo UserContext che ha generato la richiesta
* @param missione La missione il cui inquadramento e' da controllare
* @return true se l'inquadramento e' ancora valido
**/
private boolean isInquadramentoValido(UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
Rif_inquadramentoHome home = (Rif_inquadramentoHome) getHome(userContext, Rif_inquadramentoBulk.class);
return home.isInquadramentoValido(missione.getPg_rif_inquadramento(), missione.getTipo_rapporto(), missione.getV_terzo(), missione.getDt_inizio_missione());
} catch (java.sql.SQLException ex) {
throw handleException(ex);
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(ex);
}
}
/**
* Viene richiesto lo stato cofi della missione
*
* Pre-post-conditions
*
* Nome: Missione ANNULLATA - Stato COFI uguale ad 'A'
* Pre: La missione è annullata
* Post: Ritorna . La missione è annullata
*
* Nome: Missione NON ANNULLATA - Stato COFI diverso da 'A'
* Pre: La missione non è annullata
* Post: Ritorna . La missione non è annullata
*
* @param userContext lo UserContext che ha generato la richiesta
* @param missione La missione da controllare
* @return vero se la missione è anullata
* falso altrimenti
**/
public boolean isMissioneAnnullata(UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
java.sql.ResultSet rs;
String stato = null;
String str = "SELECT STATO_COFI FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +
"MISSIONE " +
"WHERE " +
"CD_CDS = ? AND " +
"CD_UNITA_ORGANIZZATIVA = ? AND " +
"ESERCIZIO = ? AND " +
"PG_MISSIONE = ?";
LoggableStatement ps = new LoggableStatement(getConnection(userContext), str,
true, this.getClass());
try {
ps.setObject(1, missione.getCd_cds());
ps.setObject(2, missione.getCd_unita_organizzativa());
ps.setObject(3, missione.getEsercizio());
ps.setObject(4, missione.getPg_missione());
rs = ps.executeQuery();
try {
if (rs.next())
stato = rs.getString(1);
} finally {
try {
rs.close();
} catch (java.sql.SQLException e) {
}
;
}
} finally {
try {
ps.close();
} catch (java.sql.SQLException e) {
}
;
}
return (missione.STATO_ANNULLATO.equals(stato));
} catch (java.sql.SQLException ex) {
throw handleException(missione, ex);
}
}
/**
* Pre-post-conditions:
*
* Nome: verifica validita' tipo rapporto
* Pre: Il sistema richiede la validita' del Tipo Rapporto del terzo associato alla missione
* Post: Il sistema valida il tipo rapporto selezionato
*
* @param userContext lo UserContext che ha generato la richiesta
* @param missione La missione il cui Tipo Rapporto e' da controllare
* @return true se il Tipo Rapporto e' ancora valido
**/
private boolean isTipoRapportoValido(UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
Tipo_rapportoHome home = (Tipo_rapportoHome) getHome(userContext, Tipo_rapportoBulk.class);
return home.isTipoRapportoValido(missione.getV_terzo(), missione.getCd_tipo_rapporto(), missione.getDt_inizio_missione());
} catch (java.sql.SQLException ex) {
throw handleException(ex);
}
}
/**
* Pre-post-conditions:
*
* Nome: verifica validita' Tipo Trattamento
* Pre: Il sistema richiede la validita' del Tipo Trattamento del terzo associato alla missione
* Post: Il sistema valida il Tipo Trattamento selezionato
*
* @param userContext lo UserContext che ha generato la richiesta
* @param missione La missione il cui Tipo Trattamento e' da controllare
* @return true se il Tipo Trattamento e' ancora valido
**/
private boolean isTipoTrattamentoValido(UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
Tipo_trattamentoHome home = (Tipo_trattamentoHome) getHome(userContext, Tipo_trattamentoBulk.class);
Filtro_trattamentoBulk filtro = new Filtro_trattamentoBulk();
filtro.setCdTipoRapporto(missione.getCd_tipo_rapporto());
filtro.setCdTipoTrattamento(missione.getCd_trattamento());
filtro.setTipoAnagrafico(missione.getTi_anagrafico());
filtro.setDataValidita(missione.getDt_registrazione());
filtro.setFlSenzaCalcoli(Boolean.FALSE);
filtro.setFlDiaria(Boolean.TRUE);
filtro.setFlDefaultCongualio(Boolean.FALSE);
filtro.setTiIstituzionaleCommerciale(missione.getTi_istituz_commerc());
if (filtro.getCdTipoRapporto() != null && filtro.getCdTipoRapporto().equals("DIP")) {
try {
TerzoHome tHome = (TerzoHome) getHomeCache(userContext).getHome(TerzoBulk.class);
TerzoBulk tKey = new TerzoBulk(missione.getCd_terzo());
TerzoBulk t = (TerzoBulk) tHome.findByPrimaryKey(tKey);
RapportoHome rHome = (RapportoHome) getHomeCache(userContext).getHome(RapportoBulk.class);
java.util.Collection collRapp = rHome.findByCdAnagCdTipoRapporto(t.getCd_anag(), filtro.getCdTipoRapporto());
boolean exit = false;
for (java.util.Iterator i = collRapp.iterator(); i.hasNext() && !exit; ) {
RapportoBulk r = (RapportoBulk) i.next();
exit = true;
if (r.getCd_ente_prev_sti() == null)
//throw new it.cnr.jada.comp.ApplicationException("Non è stato possibile recuperare l''Ente Previdenziale del dipendente selezionato.");
//non blocco perchè potrebbero esserci trattamenti che non prevedono contributi previdenziali
//quindi passo il codice fittizio 'XX'
filtro.setEntePrev("XX");
else
filtro.setEntePrev(r.getCd_ente_prev_sti());
if (r.getCd_rapp_impiego_sti() == null)
throw new it.cnr.jada.comp.ApplicationException("Per il dipendente in esame non è definito un Rapporto di Impiego!");
else {
Ass_rapp_impiegoHome assHome = (Ass_rapp_impiegoHome) getHome(userContext, Ass_rapp_impiegoBulk.class);
Ass_rapp_impiegoBulk assKey = new Ass_rapp_impiegoBulk(r.getCd_rapp_impiego_sti());
Ass_rapp_impiegoBulk ass = (Ass_rapp_impiegoBulk) assHome.findByPrimaryKey(assKey);
filtro.setTipoRappImpiego(ass.getTipo_rapp_impiego());
}
}
} catch (IntrospectionException e) {
throw handleException(e);
}
//solo per il rapporto DIP aggiungo il filtro "Anno prec" a seconda della data di inizio competenza
GregorianCalendar data_da = (GregorianCalendar) GregorianCalendar.getInstance();
data_da.setTime(missione.getDt_inizio_missione());
if (data_da.get(GregorianCalendar.YEAR) == (missione.getEsercizio() - 1))
filtro.setFlAnnoPrec(new Boolean(true));
else
filtro.setFlAnnoPrec(new Boolean(false));
}
if (missione.getDt_inizio_missione() != null && missione.getDt_fine_missione() != null) {
GregorianCalendar data_da = (GregorianCalendar) GregorianCalendar.getInstance();
GregorianCalendar data_a = (GregorianCalendar) GregorianCalendar.getInstance();
data_da.setTime(missione.getDt_inizio_missione());
data_a.setTime(missione.getDt_fine_missione());
if (data_da.get(GregorianCalendar.YEAR) == data_a.get(GregorianCalendar.YEAR)) {
TerzoHome tHome = (TerzoHome) getHomeCache(userContext).getHome(TerzoBulk.class);
TerzoBulk tKey = new TerzoBulk(missione.getCd_terzo());
TerzoBulk t = (TerzoBulk) tHome.findByPrimaryKey(tKey);
AnagraficoHome aHome = (AnagraficoHome) getHomeCache(userContext).getHome(AnagraficoBulk.class);
AnagraficoBulk aKey = new AnagraficoBulk(t.getCd_anag());
AnagraficoBulk a = (AnagraficoBulk) aHome.findByPrimaryKey(aKey);
if (a.getFl_cervellone() &&
!(new Integer(data_da.get(GregorianCalendar.YEAR)).compareTo(a.getAnno_inizio_res_fis().intValue()) < 0) &&
!(new Integer(data_da.get(GregorianCalendar.YEAR)).compareTo(a.getAnno_fine_agevolazioni().intValue()) > 0)) {
filtro.setFlAgevolazioniCervelli(new Boolean(a.getFl_cervellone()));
} else
filtro.setFlAgevolazioniCervelli(new Boolean(false));
} else
filtro.setFlAgevolazioniCervelli(new Boolean(false));
}
return home.isTipoTrattamentoValido(filtro);
} catch (java.sql.SQLException ex) {
throw handleException(ex);
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(ex);
}
}
/**
* Carica compenso
*
* Pre-post-conditions:
*
* Nome: Carica compenso
* Pre: Una missione deve essere inizializzata per modifica
* La missione ha un compenso
* Post: Il sistema richiede alla Component che gestisce il compenso il suo caricamento
*
* @return la MissioneBulk con il compenso caricato
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui caricare il compenso
*/
public MissioneBulk loadCompenso(UserContext userContext, MissioneBulk missione) throws ComponentException {
try {
CompensoHome compensoHome = (CompensoHome) getHome(userContext, CompensoBulk.class);
CompensoBulk compenso = compensoHome.loadCompenso(userContext, missione);
// Se la missione e' annullata non troverei piu' il suo compenso
// perche' ho azzerato i campi della missione nella tabella
// dei compensi.
if (compenso == null && missione.isAnnullato())
return missione;
if (compenso == null)
throw new it.cnr.jada.comp.ApplicationException("Impossibile trovare il compenso associato alla missione !");
it.cnr.contab.compensi00.ejb.CompensoComponentSession component = (it.cnr.contab.compensi00.ejb.CompensoComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCOMPENSI00_EJB_CompensoComponentSession", it.cnr.contab.compensi00.ejb.CompensoComponentSession.class);
missione.setCompenso(component.reloadCompenso(userContext, compenso));
if (missione.getCompenso() == null)
throw new it.cnr.jada.comp.ApplicationException("Impossibile trovare il compenso associato alla missione !");
} catch (it.cnr.jada.persistency.PersistencyException e) {
throw handleException(missione, e);
} catch (javax.ejb.EJBException e) {
throw handleException(missione, e);
} catch (java.rmi.RemoteException e) {
throw handleException(missione, e);
}
return missione;
}
/**
* Modifica missione
*
* Pre-post-conditions:
*
* Nome: modifica
* Pre: Una missione e' stata modificata
* Post: Il sistema aggiorna lo stato coan/coge della missione e aggiorna l'obbligazione associata alla missione
* ( metodo 'aggiornaObbligazione')
*
* Nome: elimina compenso
* Pre: Una missione e' stata modificata
* L'utente ha scollegato il compenso dalla missione
* Post: Il sistema elimina il compenso ( metodo 'cancellaCompenso')
*
* Nome: elimina anticipo
* Pre: Una missione e' stata modificata
* L'utente ha scollegato l'anticipo dalla missione
* Post: Il sistema agggiorna lo stato dell'anticipo ( metodo 'aggiornaAnticipo')
*
* Nome: collega anticipo
* Pre: Una missione e' stata modificata
* L'utente ha collegato un anticipo alla missione
* Post: Il sistema agggiorna lo stato dell'anticipo ( metodo 'aggiornaAnticipo')
*
* @return la MissioneBulk con il compenso caricato
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui caricare il compenso
*/
public OggettoBulk modificaConBulk(it.cnr.jada.UserContext userContext, OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException {
return modificaConBulk(userContext, bulk, null);
}
/**
* Modifica missione
*
* Pre-post-conditions:
*
* Nome: modifica missione
* Pre: Validazione dell' eventuale obbligazione collegata alla missione andata a buon fine
* Post: Il sistema prosegue con l'aggiornamento della missione
*
* Nome: modifica
* Pre: Una missione e' stata modificata
* Post: Il sistema aggiorna lo stato coan/coge della missione e aggiorna l'obbligazione associata alla missione
* ( metodo 'aggiornaObbligazione')
*
* Nome: elimina anticipo
* Pre: Una missione e' stata modificata
* L'utente ha scollegato l'anticipo dalla missione
* Post: Il sistema aggiorna lo stato dell'anticipo ( metodo 'aggiornaAnticipo')
*
* Nome: collega anticipo
* Pre: Una missione e' stata modificata
* L'utente ha collegato un anticipo alla missione
* Post: Il sistema agggiorna lo stato dell'anticipo ( metodo 'aggiornaAnticipo')
*
* @return la MissioneBulk con il compenso caricato
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui caricare il compenso
* @param status serve per gestire l'eccezione lanciata dall'obbligazione
* nel caso non ci sia disponibilita' di cassa
*/
public OggettoBulk modificaConBulk(it.cnr.jada.UserContext userContext, OggettoBulk bulk, it.cnr.contab.doccont00.core.bulk.OptionRequestParameter status) throws it.cnr.jada.comp.ComponentException {
MissioneBulk missione = (MissioneBulk) bulk;
// Salvo temporaneamente l'hash map dei saldi
PrimaryKeyHashMap aTempDiffSaldi = new PrimaryKeyHashMap();
if (missione.getDefferredSaldi() != null)
aTempDiffSaldi = (PrimaryKeyHashMap) missione.getDefferredSaldi().clone();
controlloDateTappeConDateMissioni(missione);
if (!missione.isSalvataggioTemporaneo()) {
// Validazione dell'eventuale obbligazione collegata alla missione
if (!missione.isSalvataggioTemporaneo() && missione.isMissioneDefinitiva() &&
missione.isObbligazioneObbligatoria()) {
if (!missione.isMissioneConObbligazione())
throw new it.cnr.jada.comp.ApplicationException("Associare una Obbligazione !");
validaObbligazione(userContext, missione.getObbligazione_scadenzario(), missione);
}
// Verifico che l'anticipo associato alla missione sia ancora eleggibile
// (Qualche altro utente potrebbe avere ad esempio annullato il mandato)
if (missione.isMissioneConAnticipo()) {
if (!checkEleggibilitaAnticipo(userContext, missione))
throw new ApplicationException("Anticipo non eleggibile alla missione");
}
// Aggiornamento dell'anticipo che ho slegato dalla missione
if (missione.getAnticipoClone() != null && missione.getAnticipoClone().getPg_anticipo() != null &&
!missione.getAnticipoClone().equalsByPrimaryKey(missione.getAnticipo()))
aggiornaAnticipo(userContext, missione.getAnticipoClone(), new Boolean(false));
// Aggiornamento dell'anticipo che ho legato alla missione
if (missione.getPg_anticipo() != null /*&& !missione.getAnticipo().equalsByPrimaryKey(missione.getAnticipoClone())*/)
aggiornaAnticipo(userContext, missione.getAnticipo(), new Boolean(true));
// Se ho modificato una missione gia' contabilizzata in Coge o Coan
// devo predisporre la ricontabilizzazione
//Aggiornamenti degli stati COGE e COAN
boolean aggiornaStatoCoge = false;
try {
MissioneBulk missioneDB = (MissioneBulk) getTempHome(userContext, MissioneBulk.class).findByPrimaryKey(missione);
if (!Utility.equalsNull(missione.getFl_associato_compenso(), missioneDB.getFl_associato_compenso()) ||
!Utility.equalsNull(missione.getStato_pagamento_fondo_eco(), missioneDB.getStato_pagamento_fondo_eco()) ||
!Utility.equalsNull(missione.getCd_terzo(), missioneDB.getCd_terzo()) ||
!Utility.equalsNull(missione.getDt_inizio_missione(), missioneDB.getDt_inizio_missione()) ||
!Utility.equalsNull(missione.getDt_fine_missione(), missioneDB.getDt_fine_missione()) ||
!Utility.equalsNull(missione.getIm_totale_missione(), missioneDB.getIm_totale_missione().setScale(2))
)
aggiornaStatoCoge = true;
} catch (PersistencyException e) {
throw new ComponentException(e);
}
if (aggiornaStatoCoge) {
if (missione.getStato_coan() != null && missione.getStato_coan().compareTo(MissioneBulk.STATO_CONTABILIZZATO_COAN) == 0)
missione.setStato_coan(MissioneBulk.STATO_RICONTABILIZZARE_COAN);
if (missione.getStato_coge() != null && missione.getStato_coge().compareTo(MissioneBulk.STATO_CONTABILIZZATO_COGE) == 0)
missione.setStato_coge(MissioneBulk.STATO_RICONTABILIZZARE_COGE);
}
}
aggiornaObbligazione(userContext, missione, status);
impostaDatiRimborsoDaCompletare(missione);
missione = (MissioneBulk) super.modificaConBulk(userContext, missione);
// Restore dell'hash map dei saldi
if (missione.getDefferredSaldi() != null)
missione.getDefferredSaldi().putAll(aTempDiffSaldi);
aggiornaCogeCoanDocAmm(userContext, missione);
if (!verificaStatoEsercizio(userContext, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk(missione.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio())))
throw new it.cnr.jada.comp.ApplicationException("Impossibile salvare un documento per un esercizio non aperto!");
return missione;
}
private void controlloDateTappeConDateMissioni(MissioneBulk missione) throws ApplicationException {
if (!missione.getTappeMissioneColl().isEmpty()) {
for (Iterator i = missione.getTappeMissioneColl().iterator(); i.hasNext(); ) {
Missione_tappaBulk aTappa = (Missione_tappaBulk) i.next();
if (aTappa.getDt_inizio_tappa() != null && missione.getDt_inizio_missione() != null &&
aTappa.getDt_inizio_tappa().before(missione.getDt_inizio_missione())) {
throw new it.cnr.jada.comp.ApplicationException("Esiste una tappa con data inizio precedente alla data di inizio della missione.");
}
if (aTappa.getDt_fine_tappa() != null && missione.getDt_fine_missione() != null &&
aTappa.getDt_fine_tappa().after(missione.getDt_fine_missione())) {
throw new it.cnr.jada.comp.ApplicationException("Esiste una tappa con data fine successiva alla data di fine della missione.");
}
}
}
}
/**
* Carica diaria
*
* Pre-post-conditions:
*
* Nome: Carica diaria
* Pre: Il sistema ha generato, tramite stored procedure, una diaria per la missione
* Post: Il sistema carica i dettagli della diaria della missione
*
* @return la MissioneBulk con la diaria caricata
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui caricare la diaria
*/
private MissioneBulk ritornaDiariaGenerata(UserContext aUC, MissioneBulk missione) throws ComponentException {
try {
Missione_dettaglioHome dettaglioHome = (Missione_dettaglioHome) getHome(aUC, Missione_dettaglioBulk.class);
SQLBuilder sql = dettaglioHome.createSQLBuilder();
sql.addSQLClause("AND", "cd_cds", sql.EQUALS, missione.getCd_cds());
sql.addSQLClause("AND", "cd_unita_organizzativa", sql.EQUALS, missione.getCd_unita_organizzativa());
sql.addSQLClause("AND", "esercizio", sql.EQUALS, missione.getEsercizio());
sql.addSQLClause("AND", "pg_missione", sql.EQUALS, missione.getPg_missione());
sql.addSQLClause("AND", "ti_spesa_diaria", sql.EQUALS, Missione_dettaglioBulk.TIPO_DIARIA);
it.cnr.jada.bulk.BulkList dettagliDiaria = new it.cnr.jada.bulk.BulkList(dettaglioHome.fetchAll(sql));
if ((dettagliDiaria == null) || (dettagliDiaria.isEmpty()))
throw new it.cnr.jada.comp.ApplicationException("Problemi nella creazione della diaria !");
missione.setDiariaMissioneColl(dettagliDiaria);
for (Iterator i = missione.getDiariaMissioneColl().iterator(); i.hasNext(); ) {
Missione_dettaglioBulk aDiaria = (Missione_dettaglioBulk) i.next();
aDiaria.setMissione(missione);
}
return missione;
} catch (Throwable e) {
throw handleException(missione, e);
}
}
private MissioneBulk ritornaRimborsoGenerato(UserContext aUC, MissioneBulk missione) throws ComponentException {
try {
Missione_dettaglioHome dettaglioHome = (Missione_dettaglioHome) getHome(aUC, Missione_dettaglioBulk.class);
SQLBuilder sql = dettaglioHome.createSQLBuilder();
sql.addSQLClause("AND", "cd_cds", sql.EQUALS, missione.getCd_cds());
sql.addSQLClause("AND", "cd_unita_organizzativa", sql.EQUALS, missione.getCd_unita_organizzativa());
sql.addSQLClause("AND", "esercizio", sql.EQUALS, missione.getEsercizio());
sql.addSQLClause("AND", "pg_missione", sql.EQUALS, missione.getPg_missione());
sql.addSQLClause("AND", "ti_spesa_diaria", sql.EQUALS, Missione_dettaglioBulk.TIPO_RIMBORSO);
it.cnr.jada.bulk.BulkList dettagliRimborso = new it.cnr.jada.bulk.BulkList(dettaglioHome.fetchAll(sql));
if ((dettagliRimborso == null) || (dettagliRimborso.isEmpty()))
throw new it.cnr.jada.comp.ApplicationException("Problemi nella creazione del rimborso !");
missione.setRimborsoMissioneColl(dettagliRimborso);
for (Iterator i = missione.getRimborsoMissioneColl().iterator(); i.hasNext(); ) {
Missione_dettaglioBulk aRimborso = (Missione_dettaglioBulk) i.next();
aRimborso.setMissione(missione);
}
return missione;
} catch (Throwable e) {
throw handleException(missione, e);
}
}
public Obbligazione_scadenzarioBulk recuperoObbligazioneDaGemis(UserContext aUC, MissioneBulk missione) throws ComponentException {
Obbligazione_scadenzarioBulk obblScad = null;
try {
if (missione.getEsercizioObblGeMis() != null && missione.getEsercizioOriObblGeMis() != null && missione.getCdsObblGeMis() != null && missione.getPgObblGeMis() != null) {
if (missione.getGaeGeMis() != null) {
Obbligazione_scad_voceHome scadenzaHome = (Obbligazione_scad_voceHome) getHome(aUC, Obbligazione_scad_voceBulk.class);
SQLBuilder sql = scadenzaHome.createSQLBuilder();
sql.addSQLClause("AND", "OBBLIGAZIONE_SCAD_VOCE.CD_LINEA_ATTIVITA", sql.EQUALS, missione.getGaeGeMis());
sql.addSQLClause("AND", "OBBLIGAZIONE_SCAD_VOCE.IM_VOCE", sql.GREATER_EQUALS, missione.getImportoDaRimborsare());
SQLBuilder sqlExists = impostaFiltroQueryObbligazioniFromGemis(aUC, missione);
sqlExists.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.CD_CDS", "OBBLIGAZIONE_SCAD_VOCE.CD_CDS");
sqlExists.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO", "OBBLIGAZIONE_SCAD_VOCE.ESERCIZIO");
sqlExists.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO_ORIGINALE", "OBBLIGAZIONE_SCAD_VOCE.ESERCIZIO_ORIGINALE");
sqlExists.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.PG_OBBLIGAZIONE", "OBBLIGAZIONE_SCAD_VOCE.PG_OBBLIGAZIONE");
sqlExists.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.PG_OBBLIGAZIONE_SCADENZARIO", "OBBLIGAZIONE_SCAD_VOCE.PG_OBBLIGAZIONE_SCADENZARIO");
sql.addSQLExistsClause("AND", sqlExists);
sql.addOrderBy("OBBLIGAZIONE_SCAD_VOCE.PG_OBBLIGAZIONE_SCADENZARIO");
it.cnr.jada.bulk.BulkList scadVoces = new it.cnr.jada.bulk.BulkList(scadenzaHome.fetchAll(sql));
if ((scadVoces != null) && (!scadVoces.isEmpty())) {
Obbligazione_scad_voceBulk scadVoce = (Obbligazione_scad_voceBulk) scadVoces.get(0);
Obbligazione_scadenzarioBulk scad = scadVoce.getObbligazione_scadenzario();
Obbligazione_scadenzarioHome scadHome = (Obbligazione_scadenzarioHome) getHome(aUC, Obbligazione_scadenzarioBulk.class);
scad = ((Obbligazione_scadenzarioBulk) scadHome.findByPrimaryKey(scad));
ObbligazioneHome obblHome = (ObbligazioneHome) getHome(aUC, ObbligazioneBulk.class);
scad.setObbligazione((ObbligazioneBulk) obblHome.findByPrimaryKey(scad.getObbligazione()));
obblScad = scad;
}
} else {
Obbligazione_scadenzarioHome scadenzaHome = (Obbligazione_scadenzarioHome) getHome(aUC, Obbligazione_scadenzarioBulk.class);
SQLBuilder sql = impostaFiltroQueryObbligazioniFromGemis(aUC, missione);
sql.addOrderBy("OBBLIGAZIONE_SCADENZARIO.PG_OBBLIGAZIONE_SCADENZARIO");
it.cnr.jada.bulk.BulkList scadenzario = new it.cnr.jada.bulk.BulkList(scadenzaHome.fetchAll(sql));
if ((scadenzario != null) && (!scadenzario.isEmpty())) {
Obbligazione_scadenzarioBulk scad = (Obbligazione_scadenzarioBulk) scadenzario.get(0);
ObbligazioneHome obblHome = (ObbligazioneHome) getHome(aUC, ObbligazioneBulk.class);
scad.setObbligazione((ObbligazioneBulk) obblHome.findByPrimaryKey(scad.getObbligazione()));
obblScad = scad;
}
}
} else {
return null;
}
if (obblScad != null) {
return gestioneScadenzaObbligazioneDaGemis(aUC, missione, obblScad);
}
} catch (Throwable e) {
throw handleException(missione, e);
}
return obblScad;
}
private Obbligazione_scadenzarioBulk gestioneScadenzaObbligazioneDaGemis(UserContext aUC, MissioneBulk missione, Obbligazione_scadenzarioBulk obblScad)
throws ComponentException {
try {
Obbligazione_scadenzarioBulk scadenzaNuova = null;
BigDecimal importoResiduo = obblScad.getImportoDisponibile().subtract(missione.getImportoDaRimborsare());
if (obblScad != null && importoResiduo.compareTo(BigDecimal.ZERO) > 0) {
return sdoppiaObbligazioneScadenzario(aUC, missione, obblScad, importoResiduo);
} else if (obblScad != null && importoResiduo.compareTo(BigDecimal.ZERO) == 0) {
return obblScad;
} else {
return null;
}
} catch (Exception e) {
throw handleException(e);
}
}
private Obbligazione_scadenzarioBulk sdoppiaObbligazioneScadenzario(UserContext aUC, MissioneBulk missione,
Obbligazione_scadenzarioBulk obblScad, BigDecimal importoResiduo)
throws ComponentException, RemoteException, PersistencyException, ValidationException {
Obbligazione_scadenzarioBulk scadenzaNuova;
ObbligazioneAbstractComponentSession sess = (ObbligazioneAbstractComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession");
java.sql.Timestamp ts = getDataRegistrazione(aUC, missione);
Calendar cal = Calendar.getInstance();
cal.setTime(ts);
cal.add(Calendar.DAY_OF_WEEK, 1);
ts = new Timestamp(cal.getTime().getTime());
DatiFinanziariScadenzeDTO datiScadenze = new DatiFinanziariScadenzeDTO();
datiScadenze.setCdCentroResponsabilita(missione.getCdrGeMis());
datiScadenze.setCdLineaAttivita(missione.getGaeGeMis());
datiScadenze.setCdVoce(missione.getVoceGeMis());
datiScadenze.setNuovaDescrizione(missione.getDs_missione());
datiScadenze.setNuovaScadenza(ts);
datiScadenze.setNuovoImportoScadenzaVecchia(importoResiduo);
scadenzaNuova = (Obbligazione_scadenzarioBulk) sess
.sdoppiaScadenzaInAutomatico(
aUC,
obblScad,
datiScadenze);
// ricarico obbligazione e recupero i riferimenti alle scadenze
ObbligazioneBulk obbligazione = (ObbligazioneBulk) sess.inizializzaBulkPerModifica(aUC, scadenzaNuova.getObbligazione());
if (!obbligazione.getObbligazione_scadenzarioColl()
.containsByPrimaryKey(obblScad)
|| !obbligazione.getObbligazione_scadenzarioColl()
.containsByPrimaryKey(scadenzaNuova))
throw new ValidationException(
"Errore nello sdoppiamento della scadenza dell'impegno.");
obblScad = (Obbligazione_scadenzarioBulk) obbligazione
.getObbligazione_scadenzarioColl().get(
obbligazione.getObbligazione_scadenzarioColl()
.indexOfByPrimaryKey(obblScad));
scadenzaNuova = (Obbligazione_scadenzarioBulk) obbligazione
.getObbligazione_scadenzarioColl().get(
obbligazione.getObbligazione_scadenzarioColl()
.indexOfByPrimaryKey(scadenzaNuova));
return scadenzaNuova;
}
private SQLBuilder impostaFiltroQueryObbligazioniFromGemis(UserContext aUC, MissioneBulk missione) throws PersistencyException, ComponentException, ApplicationException {
Filtro_ricerca_obbligazioniVBulk filtro = new Filtro_ricerca_obbligazioniVBulk();
filtro.setCd_unita_organizzativa(missione.getCd_unita_organizzativa());
filtro.setFl_data_scadenziario(false);
filtro.setIm_importo(missione.getImportoDaRimborsare());
filtro.setFl_fornitore(false);
filtro.setFl_importo(true);
filtro.setFl_nr_obbligazione(true);
TerzoBulk terzo = new TerzoBulk();
terzo.setCd_terzo(missione.getCd_terzo());
filtro.setFornitore(terzo);
filtro.setEsercizio_ori_obbligazione(missione.getEsercizioOriObblGeMis());
filtro.setNr_obbligazione(missione.getPgObblGeMis());
SQLBuilder sql = prepareQueryObbligazioni(aUC, filtro);
return sql;
}
public AnticipoBulk recuperoAnticipoDaGemis(UserContext aUC, MissioneBulk missione) throws ComponentException {
try {
if (missione.getEsercizioAnticipoGeMis() != null && missione.getCdsAnticipoGeMis() != null && missione.getPgAnticipoGeMis() != null && missione.getCd_terzo() != null) {
Mandato_rigaHome mandatoHome = (Mandato_rigaHome) getHome(aUC, Mandato_rigaIBulk.class);
SQLBuilder sql = mandatoHome.createSQLBuilder();
sql.addSQLClause("AND", "cd_cds", sql.EQUALS, missione.getCdsAnticipoGeMis());
sql.addSQLClause("AND", "esercizio", sql.EQUALS, missione.getEsercizioAnticipoGeMis());
sql.addSQLClause("AND", "pg_mandato", sql.EQUALS, missione.getPgAnticipoGeMis());
sql.addSQLClause("AND", "cd_terzo", sql.EQUALS, missione.getCd_terzo());
it.cnr.jada.bulk.BulkList mandati = new it.cnr.jada.bulk.BulkList(mandatoHome.fetchAll(sql));
if ((mandati != null) && (!mandati.isEmpty())) {
for (Object object : mandati) {
Mandato_rigaIBulk mandato = (Mandato_rigaIBulk) object;
if (mandato.getCd_tipo_documento_amm() != null && mandato.getCd_tipo_documento_amm().equals("ANTICIPO")) {
AnticipoHome anticipoHome = (AnticipoHome) getHome(aUC, AnticipoBulk.class);
AnticipoKey key = new AnticipoKey(mandato.getCd_cds_doc_amm(), mandato.getCd_uo_doc_amm(), mandato.getEsercizio_doc_amm(), mandato.getPg_doc_amm());
AnticipoBulk anticipo = ((AnticipoBulk) anticipoHome.findByPrimaryKey(key));
if (anticipo != null && !anticipo.isAnticipoConMissione()) {
if (checkEleggibilitaAnticipo(aUC, missione))
return anticipo;
}
}
}
}
} else {
return null;
}
} catch (Throwable e) {
throw handleException(missione, e);
}
return null;
}
/**
* Annulla le modifiche apportate alla missione e ritorna al savepoint impostato in precedenza
*
* Pre-post-conditions:
*
* Nome: Rollback to savePoint
* Pre: Una richiesta di annullare tutte le modifiche apportate e di ritornare al savepoint e' stata generata
* Post: Tutte le modifiche effettuate sulla missione da quando si e' impostato il savepoint vengono annullate
*
* @param uc lo UserContext che ha generato la richiesta
*/
public void rollbackToSavePoint(UserContext userContext, String savePointName) throws ComponentException {
try {
rollbackToSavepoint(userContext, savePointName);
} catch (java.sql.SQLException e) {
if (e.getErrorCode() != 1086)
throw handleException(e);
}
}
/**
* Ricerca missione
*
* Pre-post-conditions:
*
* Nome: Ricerca
* Pre: L'utente ha richiesto una ricerca di missioni
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta con le clausole che
* la missione abbia cds, unità organizzativa uguali a quello di scrivania
*
* @param clauses le clausole speicificate dall'utene
* @return il SQLBuilder con tutte le clausole
* @param userContext lo UserContext che ha generato la richiesta
* @param bulk la MissioneBulk da ricercare
*/
public Query select(UserContext userContext, it.cnr.jada.persistency.sql.CompoundFindClause clauses, OggettoBulk bulk) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
SQLBuilder sql = (SQLBuilder) super.select(userContext, clauses, bulk);
MissioneBulk missione = (MissioneBulk) bulk;
sql.addClause("AND", "cd_cds", SQLBuilder.EQUALS,
Optional.ofNullable(missione)
.flatMap(missioneBulk -> Optional.ofNullable(missioneBulk.getCd_cds()))
.orElseGet(() -> CNRUserContext.getCd_cds(userContext))
);
sql.addClause("AND", "cd_unita_organizzativa", SQLBuilder.EQUALS,
Optional.ofNullable(missione)
.flatMap(missioneBulk -> Optional.ofNullable(missioneBulk.getCd_unita_organizzativa()))
.orElseGet(() -> CNRUserContext.getCd_unita_organizzativa(userContext))
);
sql.addTableToHeader("TERZO");
sql.addSQLJoin("MISSIONE.CD_TERZO", "TERZO.CD_TERZO");
sql.addSQLClause("AND", "TERZO.CD_PRECEDENTE", SQLBuilder.EQUALS,
Optional.ofNullable(missione)
.flatMap(missioneBulk -> Optional.ofNullable(missioneBulk.getV_terzo()))
.flatMap(v_terzo_per_compensoBulk -> Optional.ofNullable(v_terzo_per_compensoBulk.getCd_terzo_precedente()))
.orElse(null)
);
return sql;
}
/**
* Ricerca anticipo
*
* Pre-post-conditions:
*
* Nome: Ricerca
* Pre: L'utente ha richiesto una ricerca degli anticipi associabili alla missione
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta le seguenti clausole clausole:
* - anticipo non associato ad altra missione e non rimborsato
* - anticipo non cancellato
* - anticipo pagato e con relativo mandato riscontrato oppure
* anticipo registrato sul fondo
* - anticipo definito per lo stesso terzo della missione
*
* @return il SQLBuilder con tutte le clausole
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk da cui ricavare il terzo e il tipo di pagamento
* @param anticipo l'AnticipoBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectAnticipoByClause(UserContext aUC, MissioneBulk missione, AnticipoBulk anticipo, CompoundFindClause clauses) throws ComponentException {
AnticipoHome anticipoHome = (AnticipoHome) getHome(aUC, AnticipoBulk.class);
SQLBuilder sql = anticipoHome.createSQLBuilder();
sql.addSQLClause("AND", "Anticipo.cd_terzo = ?" +
" and Anticipo.ti_anagrafico = ?" +
" and Anticipo.esercizio <= ?" +
" and Anticipo.cd_cds = ?" +
" and Anticipo.cd_unita_organizzativa = ?" +
" and Anticipo.dt_cancellazione IS NULL " +
" and ((exists (SELECT 1 FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "mandato man, " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "mandato_riga manr " +
" where man.stato = ?" +
" and manr.pg_mandato = man.pg_mandato" +
" and manr.cd_cds = man.cd_cds" +
" and manr.esercizio = man.esercizio" +
" and manr.cd_tipo_documento_amm = ?" +
" and manr.esercizio_doc_amm = Anticipo.esercizio" +
" and manr.cd_uo_doc_amm = Anticipo.cd_unita_organizzativa" +
" and manr.cd_cds_doc_amm = Anticipo.cd_cds" +
" and manr.pg_doc_amm = Anticipo.pg_anticipo))" +
" or (Anticipo.stato_pagamento_fondo_eco = ? ))" +
" and not exists (SELECT 1 FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "rimborso B " +
" where B.cd_cds_anticipo = Anticipo.cd_cds" +
" and B.cd_uo_anticipo = Anticipo.cd_unita_organizzativa" +
" and B.esercizio_anticipo = Anticipo.esercizio" +
" and B.pg_anticipo = Anticipo.pg_anticipo)" +
" and (" +
"not exists (SELECT 1 FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "missione C " +
" where C.cd_cds_anticipo = Anticipo.cd_cds" +
" and C.cd_uo_anticipo = Anticipo.cd_unita_organizzativa" +
" and C.esercizio_anticipo = Anticipo.esercizio" +
" and C.pg_anticipo = Anticipo.pg_anticipo " +
" and C.dt_cancellazione IS NULL " +
" and C.stato_cofi <> 'A' )" +
" or " +
" exists (SELECT 1 FROM " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "missione C " +
" where C.cd_cds_anticipo = Anticipo.cd_cds" +
" and C.cd_uo_anticipo = Anticipo.cd_unita_organizzativa" +
" and C.esercizio_anticipo = Anticipo.esercizio" +
" and C.pg_anticipo = Anticipo.pg_anticipo" +
" and C.pg_missione = ?" +
" and C.esercizio = ?" +
" and C.cd_cds = ?" +
" and C.cd_unita_organizzativa = ?))");
sql.addParameter(missione.getCd_terzo(), java.sql.Types.NUMERIC, 0);
sql.addParameter(missione.getTi_anagrafico(), java.sql.Types.CHAR, 0);
sql.addParameter(missione.getEsercizio(), java.sql.Types.NUMERIC, 0);
sql.addParameter(missione.getCd_cds(), java.sql.Types.CHAR, 0);
sql.addParameter(missione.getCd_unita_organizzativa(), java.sql.Types.CHAR, 0);
sql.addParameter(MandatoBulk.STATO_MANDATO_PAGATO, java.sql.Types.CHAR, 0);
sql.addParameter(Numerazione_doc_ammBulk.TIPO_ANTICIPO, java.sql.Types.CHAR, 0);
sql.addParameter(AnticipoBulk.STATO_REGISTRATO_FONDO_ECO, java.sql.Types.CHAR, 0);
sql.addParameter(missione.getPg_missione(), java.sql.Types.NUMERIC, 0);
sql.addParameter(missione.getEsercizio(), java.sql.Types.NUMERIC, 0);
sql.addParameter(missione.getCd_cds(), java.sql.Types.CHAR, 0);
sql.addParameter(missione.getCd_unita_organizzativa(), java.sql.Types.CHAR, 0);
sql.addClause(clauses);
return sql;
}
/**
* Ricerca banca
*
* Pre-post-conditions:
*
* Nome: Ricerca
* Pre: L'utente ha richiesto una ricerca delle coordinate bancarie del terzo associato alla missione
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta con le clausole che
* le coordinate bancarie siano valide (non cancellate), siano associate al terzo della missione a abbiano un tipo uguale
* a quello selezionato dall'utente (bancario, postale, etc.)
*
* @return il SQLBuilder con tutte le clausole
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk da cui ricavare il terzo e il tipo di pagamento
* @param banca la BancaBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectBancaByClause(UserContext aUC, MissioneBulk missione, BancaBulk banca, CompoundFindClause clauses) throws ComponentException {
BancaHome bancaHome = (BancaHome) getHome(aUC, BancaBulk.class);
return bancaHome.selectBancaFor(
missione.getModalita_pagamento(),
missione.getCd_terzo());
}
/**
* Ricerca nazione
*
* Pre-post-conditions:
*
* Nome: Ricerca estero
* Pre: L'utente ha richiesto una ricerca delle nazioni per una tappa relativa ad un comune estero
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta la clausole
* che il tipo nazione sia diverso da Italia
*
* Nome: Ricerca italia
* Pre: L'utente ha richiesto una ricerca della nazione per una tappa relativa ad un comune non estero
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta la clausole
* che il tipo nazione sia uguale ad Italia
*
* @return il SQLBuilder con tutte le clausole
* @param userContext lo UserContext che ha generato la richiesta
* @param tappa la Missione_tappaBulk da cui ricercare la nazione
* @param nazione la NazioneBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectNazioneByClause(UserContext aUC, Missione_tappaBulk tappa, NazioneBulk nazione, CompoundFindClause clauses) throws ComponentException {
NazioneHome nazioneHome = (NazioneHome) getHome(aUC, NazioneBulk.class);
SQLBuilder sql = nazioneHome.createSQLBuilder();
if ((tappa.getFl_comune_estero() != null) && (tappa.getFl_comune_estero().booleanValue()))
sql.addClause("AND", "ti_nazione", sql.NOT_EQUALS, NazioneBulk.ITALIA);
else
sql.addClause("AND", "ti_nazione", sql.EQUALS, NazioneBulk.ITALIA);
if (clauses != null)
sql.addClause(clauses);
return sql;
}
/**
* Pre-post-conditions:
*
* Nome: Seleziona scadenza di obbligazione
* Pre: Una richiesta di listare le scadenze di obbligazione da cui selezionare quella da utilizzare
* per la contabilizzazione della missione e' stata generata
* Post: Viene restituito il SQLBuilder con le clausole specificate dall'utente e le seguenti clausole aggiuntive:
* - obbligazione definitiva non annullata
* - obbligazione con cds e esercizio uguali a quelli di scrivania
* - obbligazione con terzo uguale a quello specificato per la missione
* - scadenza con data maggiore o uguale a quella di registrazione della missione
* - scadenza con importo associato a doc. amministrativo uguale a 0
*
* @return il SQLBuilder con tutte le clausole
* @param aUC lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui selezionare la scadenza di obbligazione
* @param scadenza l'Obbligazione_scadenzarioBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectObbligazione_scadenzarioByClause(UserContext aUC, MissioneBulk missione, Obbligazione_scadenzarioBulk scadenza, CompoundFindClause clauses) throws ComponentException {
Obbligazione_scadenzarioHome scadenzaHome = (Obbligazione_scadenzarioHome) getHome(aUC, Obbligazione_scadenzarioBulk.class);
SQLBuilder sql = scadenzaHome.createSQLBuilder();
GregorianCalendar ggRegistrazione = (GregorianCalendar) missione.getGregorianCalendar(missione.getDt_registrazione()).clone();
ggRegistrazione.set(GregorianCalendar.HOUR_OF_DAY, 0);
ggRegistrazione.set(GregorianCalendar.MINUTE, 0);
ggRegistrazione.set(GregorianCalendar.SECOND, 0);
java.sql.Timestamp dataRegistrazione = new java.sql.Timestamp(ggRegistrazione.getTime().getTime());
sql.setDistinctClause(true);
sql.addTableToHeader("OBBLIGAZIONE");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.CD_CDS", "OBBLIGAZIONE.CD_CDS");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO", "OBBLIGAZIONE.ESERCIZIO");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO_ORIGINALE", "OBBLIGAZIONE.ESERCIZIO_ORIGINALE");
sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.PG_OBBLIGAZIONE", "OBBLIGAZIONE.PG_OBBLIGAZIONE");
sql.addSQLClause("AND", "OBBLIGAZIONE.ESERCIZIO", sql.EQUALS, missione.getEsercizio());
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_CDS", sql.EQUALS, missione.getCd_cds());
sql.addSQLClause("AND", "OBBLIGAZIONE.STATO_OBBLIGAZIONE", sql.EQUALS, "D");
sql.addSQLClause("AND", "OBBLIGAZIONE.DT_CANCELLAZIONE", sql.ISNULL, null);
sql.addSQLClause("AND", "OBBLIGAZIONE.CD_TERZO", sql.EQUALS, missione.getCd_terzo());
sql.addSQLClause("AND", "OBBLIGAZIONE.RIPORTATO", sql.EQUALS, "N");
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.DT_SCADENZA", sql.GREATER_EQUALS, dataRegistrazione);
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM IS NULL");
sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP), java.sql.Types.DECIMAL, 2);
sql.addSQLClause("AND", "OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE IS NULL");
sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP), java.sql.Types.DECIMAL, 2);
if (clauses != null)
sql.addClause(clauses);
return sql;
}
/**
* Ricerca tipo auto
*
* Pre-post-conditions:
*
* Nome: Ricerca
* Pre: L'utente ha richiesto una ricerca dei tipi di auto per una spesa di una missione
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta la clausole
* che il tipo auto abbia un intervallo di validità comprendente la data di inizio della missione e
* un'area geografica e una nazione comaptibili con quelli della tappa della spesa
*
* @return il SQLBuilder con tutte le clausole
* @param userContext lo UserContext che ha generato la richiesta
* @param dettaglioSpesa la dettaglioSpesa per cui ricercare il tipo auto
* @param tipoAuto la Missione_rimborso_kmBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectTipo_autoByClause(UserContext aUC, Missione_dettaglioBulk dettaglioSpesa, Missione_rimborso_kmBulk tipoAuto, CompoundFindClause clauses) throws ComponentException {
MissioneBulk missione = dettaglioSpesa.getMissione();
if (dettaglioSpesa.getTi_spesa_diaria().equals(Missione_dettaglioBulk.TIPO_DIARIA))
return null;
if (!dettaglioSpesa.isRimborsoKm())
return null;
// Se sto recuperando un tipo auto di un dettaglio appena caricato da db
// uso dt_inizio_tappa del dettaglio per recuperare la relativa tappa
// perche' non ho selezionato alcun giorno.
// Se sto cercando il tipo auto per un dettaglio che sto creando/modificando
// considero il giorno selezionato
java.sql.Timestamp primoGG = null;
if (dettaglioSpesa.getCrudStatus() == OggettoBulk.NORMAL)
primoGG = dettaglioSpesa.getDt_inizio_tappa();
else
primoGG = missione.getPrimoGiornoSpesaSelezionato();
Missione_tappaBulk tappa = (Missione_tappaBulk) missione.getTappeMissioneHash().get(primoGG);
return selectTipo_autoByClause(aUC, missione.getDt_inizio_missione(), tappa.getNazione(), dettaglioSpesa.getTi_auto(), clauses);
}
public SQLBuilder selectTipo_autoByClause(UserContext aUC, Timestamp dataTappa, NazioneBulk nazione, String tipoAuto, CompoundFindClause clauses) throws ComponentException {
Missione_rimborso_kmHome aTipoAutoHome = (Missione_rimborso_kmHome) getHome(aUC, Missione_rimborso_kmBulk.class);
SQLBuilder sql = aTipoAutoHome.createSQLBuilder();
sql.addClause("AND", "dt_inizio_validita", sql.LESS_EQUALS, dataTappa);
sql.addClause("AND", "dt_fine_validita", sql.GREATER_EQUALS, dataTappa);
sql.openParenthesis("AND");
if ((nazione != null) && ((NazioneBulk.ITALIA).equals(nazione.getTi_nazione())))
sql.addClause("AND", "ti_area_geografica", sql.EQUALS, "I");
else
sql.addClause("AND", "ti_area_geografica", sql.EQUALS, "E");
sql.addClause("OR", "ti_area_geografica", sql.EQUALS, "*");
sql.closeParenthesis();
sql.openParenthesis("AND");
sql.addClause("AND", "pg_nazione", sql.EQUALS, nazione.getPg_nazione());
sql.addClause("OR", "pg_nazione", sql.EQUALS, new Long(0));
sql.closeParenthesis();
sql.addClause("AND", "ti_auto", sql.EQUALS, tipoAuto);
sql.addSQLClause("AND", "(ti_auto || ti_area_geografica || pg_nazione || TO_CHAR(dt_inizio_validita, 'DDMMYYYY') || TO_CHAR(dt_fine_validita, 'DDMMYYYY')) = " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + " CNRCTB500.getFirstTabMissione('03', ti_auto, ?, ?, null, ?)");
if ((nazione != null) && ((NazioneBulk.ITALIA).equals(nazione.getTi_nazione())))
sql.addParameter("I", java.sql.Types.CHAR, 5);
else
sql.addParameter("E", java.sql.Types.CHAR, 5);
sql.addParameter(nazione.getPg_nazione(), java.sql.Types.NUMERIC, 6);
sql.addParameter(dataTappa, java.sql.Types.TIMESTAMP, 7);
sql.addPreOrderBy(" ti_auto, pg_nazione desc, ti_area_geografica");
return sql;
}
/**
* Ricerca tipo pasto
*
* Pre-post-conditions:
*
* Nome: Ricerca
* Pre: L'utente ha richiesto una ricerca dei tipi di pasto per una spesa di una missione
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta la clausole
* che il tipo pasto abbia un intervallo di validità comprendente la data di inizio della missione,
* un'area geografica e una nazione compatibili con quelli della tappa della spesa e un inqudramento uguale a
* quello selezionato per la missione
*
* @return il SQLBuilder con tutte le clausole
* @param userContext lo UserContext che ha generato la richiesta
* @param dettaglioSpesa la dettaglioSpesa per cui ricercare il tipo pasto
* @param tipoPasto la Missione_tipo_pastoBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectTipo_pastoByClause(UserContext aUC, Missione_dettaglioBulk dettaglioSpesa, Missione_tipo_pastoBulk tipoPasto, CompoundFindClause clauses) throws ComponentException, PersistencyException {
MissioneBulk missione = dettaglioSpesa.getMissione();
// Se sto recuperando un tipo pasto di un dettaglio appena caricato da db
// uso dt_inizio_tappa del dettaglio per recuperare la relativa tappa
// perche' non ho selezionato alcun giorno.
// Se sto cercando il tipo pasto per un dettaglio che sto creando/modificando
// considero il giorno selezionato
java.sql.Timestamp primoGG = null;
if (dettaglioSpesa.getCrudStatus() == OggettoBulk.NORMAL)
primoGG = dettaglioSpesa.getDt_inizio_tappa();
else
primoGG = missione.getPrimoGiornoSpesaSelezionato();
Missione_tappaBulk tappa = (Missione_tappaBulk) missione.getTappeMissioneHash().get(primoGG);
NazioneHome nazionehome = (NazioneHome) getHome(aUC, NazioneBulk.class);
tappa.setNazione((NazioneBulk) nazionehome.findByPrimaryKey(tappa.getNazione()));
return selectTipo_pastoByClause(aUC, tappa.getDt_inizio_tappa(), missione.getPg_rif_inquadramento(), tappa.getNazione(), dettaglioSpesa.getCd_ti_pasto(), clauses);
}
public List recuperoTipi_pasto(UserContext aUC, Timestamp dataTappa, Long inquadramento, NazioneBulk nazione, String tipoPasto, CompoundFindClause clauses) throws ComponentException, PersistencyException {
Missione_tipo_pastoHome tipoPastoHome = (Missione_tipo_pastoHome) getHome(aUC, Missione_tipo_pastoBulk.class);
return tipoPastoHome.fetchAll(selectTipo_pastoByClause(aUC, dataTappa, inquadramento, nazione, tipoPasto, clauses));
}
public SQLBuilder selectTipo_pastoByClause(UserContext aUC, Timestamp dataTappa, Long inquadramento, NazioneBulk nazione, String tipoPasto, CompoundFindClause clauses) throws ComponentException {
Missione_tipo_pastoHome tipoPastoHome = (Missione_tipo_pastoHome) getHome(aUC, Missione_tipo_pastoBulk.class);
SQLBuilder sql = tipoPastoHome.createSQLBuilder();
//sql.addClause("AND","dt_inizio_validita",sql.LESS_EQUALS,missione.getDt_inizio_missione());
//sql.addClause("AND","dt_fine_validita",sql.GREATER_EQUALS,missione.getDt_inizio_missione());
sql.addClause("AND", "dt_inizio_validita", sql.LESS_EQUALS, dataTappa);
sql.addClause("AND", "dt_fine_validita", sql.GREATER_EQUALS, dataTappa);
sql.openParenthesis("AND");
if ((nazione != null) && ((NazioneBulk.ITALIA).equals(nazione.getTi_nazione())))
sql.addClause("AND", "ti_area_geografica", sql.EQUALS, "I");
else
sql.addClause("AND", "ti_area_geografica", sql.EQUALS, "E");
sql.addClause("OR", "ti_area_geografica", sql.EQUALS, "*");
sql.closeParenthesis();
sql.openParenthesis("AND");
sql.addClause("AND", "pg_nazione", sql.EQUALS, nazione.getPg_nazione());
sql.addClause("OR", "pg_nazione", sql.EQUALS, new Long(0));
sql.closeParenthesis();
sql.openParenthesis("AND");
sql.addClause("AND", "pg_rif_inquadramento", sql.EQUALS, inquadramento);
sql.addClause("OR", "pg_rif_inquadramento", sql.EQUALS, new Long(0));
sql.closeParenthesis();
sql.addClause("AND", "cd_ti_pasto", sql.EQUALS, tipoPasto);
sql.addClause("AND", "cd_area_estera", sql.EQUALS, nazione.getCd_area_estera());
sql.addSQLClause("AND", "(cd_ti_pasto || ti_area_geografica || pg_nazione || pg_rif_inquadramento || TO_CHAR(dt_inizio_validita, 'DDMMYYYY') || TO_CHAR(dt_fine_validita, 'DDMMYYYY')) = " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + " CNRCTB500.getFirstTabMissione('02', cd_ti_pasto, ?, ?, ?, ?)");
if ((nazione != null) && ((NazioneBulk.ITALIA).equals(nazione.getTi_nazione())))
sql.addParameter("I", java.sql.Types.CHAR, 6);
else
sql.addParameter("E", java.sql.Types.CHAR, 6);
sql.addParameter(nazione.getPg_nazione(), java.sql.Types.NUMERIC, 7);
sql.addParameter(inquadramento, java.sql.Types.NUMERIC, 8);
sql.addParameter(dataTappa, java.sql.Types.TIMESTAMP, 9);
sql.addPreOrderBy(" cd_ti_pasto, pg_rif_inquadramento desc, pg_nazione desc, ti_area_geografica");
return sql;
}
/**
* Ricerca tipo spesa
*
* Pre-post-conditions:
*
* Nome: Ricerca
* Pre: L'utente ha richiesto una ricerca dei tipi di spesa per una spesa di una missione
* Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta la clausole
* che il tipo spesa abbia un intervallo di validità comprendente la data di inizio della missione,
* un'area geografica e una nazione compatibili con quelli della tappa della spesa e un inqudramento uguale a
* quello selezionato per la missione
*
* @return il SQLBuilder con tutte le clausole
* @throws PersistencyException
* @param userContext lo UserContext che ha generato la richiesta
* @param dettaglioSpesa la dettaglioSpesa per cui ricercare il tipo pasto
* @param tipoSpesa la Missione_tipo_spesaBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectTipo_spesaByClause(UserContext aUC, Missione_dettaglioBulk dettaglioSpesa, Missione_tipo_spesaBulk tipoSpesa, CompoundFindClause clauses) throws ComponentException, PersistencyException {
MissioneBulk missione = dettaglioSpesa.getMissione();
// Se sto recuperando un tipo spesa di un dettaglio appena caricato da db
// uso dt_inizio_tappa del dettaglio per recuperare la relativa tappa
// perche' non ho selezionato alcun giorno.
// Se sto cercando la spesa per un dettaglio che sto creando/modificando
// considero il giorno selezionato
java.sql.Timestamp primoGG = null;
if (dettaglioSpesa.getCrudStatus() == OggettoBulk.NORMAL)
primoGG = dettaglioSpesa.getDt_inizio_tappa();
else
primoGG = missione.getPrimoGiornoSpesaSelezionato();
Missione_tappaBulk tappa = (Missione_tappaBulk) missione.getTappeMissioneHash().get(primoGG);
NazioneHome nazionehome = (NazioneHome) getHome(aUC, NazioneBulk.class);
tappa.setNazione((NazioneBulk) nazionehome.findByPrimaryKey(tappa.getNazione()));
SQLBuilder sql = selectTipo_spesaByClause(aUC, tappa.getDt_inizio_tappa(), missione.getPg_rif_inquadramento(), tappa.getNazione(), tappa.getFl_rimborso(), dettaglioSpesa.getCd_ti_spesa(), clauses);
sql.addPreOrderBy(" cd_ti_spesa, pg_rif_inquadramento desc, pg_nazione desc, ti_area_geografica");
return sql;
}
public java.util.List recuperoTipiSpesa(UserContext aUC, Timestamp dataInizioTappa, Long nazione, Long inquadramento, Boolean rimborsoAmmissibile, String cdTipoSpesa) throws ComponentException, PersistencyException {
NazioneHome nazionehome = (NazioneHome) getHome(aUC, NazioneBulk.class);
NazioneBulk nazioneBulk = new NazioneBulk(nazione);
nazioneBulk = (NazioneBulk) nazionehome.findByPrimaryKey(nazioneBulk);
SQLBuilder sql = selectTipo_spesaByClause(aUC, dataInizioTappa, inquadramento, nazioneBulk, rimborsoAmmissibile, cdTipoSpesa, new CompoundFindClause());
Missione_tipo_spesaHome tipoSpesaHome = (Missione_tipo_spesaHome) getHome(aUC, Missione_tipo_spesaBulk.class);
return tipoSpesaHome.fetchAll(sql);
}
public SQLBuilder selectTipo_spesaByClause(UserContext aUC, Timestamp dataTappa, Long inquadramento, NazioneBulk nazione, Boolean ammissibileConRimborso, String tipoSpesa, CompoundFindClause clauses) throws ComponentException, PersistencyException {
Missione_tipo_spesaHome tipoSpesaHome = (Missione_tipo_spesaHome) getHome(aUC, Missione_tipo_spesaBulk.class);
SQLBuilder sql = tipoSpesaHome.createSQLBuilder();
sql.addClause(clauses);
sql.addClause("AND", "dt_inizio_validita", sql.LESS_EQUALS, dataTappa);
sql.addClause("AND", "dt_fine_validita", sql.GREATER_EQUALS, dataTappa);
sql.openParenthesis("AND");
if ((nazione != null) && ((NazioneBulk.ITALIA).equals(nazione.getTi_nazione())))
sql.addClause("AND", "ti_area_geografica", sql.EQUALS, "I");
else
sql.addClause("AND", "ti_area_geografica", sql.EQUALS, "E");
sql.addClause("OR", "ti_area_geografica", sql.EQUALS, "*");
sql.closeParenthesis();
sql.openParenthesis("AND");
sql.addClause("AND", "pg_nazione", sql.EQUALS, nazione.getPg_nazione());
sql.addClause("OR", "pg_nazione", sql.EQUALS, new Long(0));
sql.closeParenthesis();
sql.openParenthesis("AND");
sql.addClause("AND", "pg_rif_inquadramento", sql.EQUALS, inquadramento);
sql.addClause("OR", "pg_rif_inquadramento", sql.EQUALS, new Long(0));
sql.closeParenthesis();
if (ammissibileConRimborso)
sql.addClause("AND", "fl_ammissibile_con_rimborso", sql.EQUALS, ammissibileConRimborso);
sql.addClause("AND", "cd_ti_spesa", sql.EQUALS, tipoSpesa);
sql.addSQLClause("AND", "(cd_ti_spesa || ti_area_geografica || pg_nazione || pg_rif_inquadramento || TO_CHAR(dt_inizio_validita, 'DDMMYYYY') || TO_CHAR(dt_fine_validita, 'DDMMYYYY')) = " +
it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + " CNRCTB500.getFirstTabMissione('01', cd_ti_spesa, ?, ?, ?, ?)");
if ((nazione != null) && ((NazioneBulk.ITALIA).equals(nazione.getTi_nazione())))
sql.addParameter("I", java.sql.Types.CHAR, 7);
else
sql.addParameter("E", java.sql.Types.CHAR, 7);
sql.addParameter(nazione.getPg_nazione(), java.sql.Types.NUMERIC, 8);
sql.addParameter(inquadramento, java.sql.Types.NUMERIC, 9);
//sql.addParameter(missione.getDt_inizio_missione(), java.sql.Types.TIMESTAMP, 10);
sql.addParameter(dataTappa, java.sql.Types.TIMESTAMP, 10);
return sql;
}
/**
* Pre-post-conditions:
*
* Nome: Seleziona terzo
* Pre: Una richiesta di listare i terzi da cui selezionare quello da utilizzare
* per la creazione della missione e' stata generata
* Post: Viene restituito il SQLBuilder con le clausole specificate dall'utente e la clausola aggiuntiva che il
* tipo anagrafico (dipendente/altro) sia uguale a quello specificato per la missione
*
* @return il SQLBuilder con tutte le clausole
* @param aUC lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk per cui selezionare il terzo
* @param aTerzo il V_terzo_per_compensoBulk da ricercare
* @param clauses le clausole specificate dall'utente
*/
public SQLBuilder selectV_terzoByClause(UserContext aUC, MissioneBulk missione, V_terzo_per_compensoBulk aTerzo, CompoundFindClause clauses) throws ComponentException {
try {
V_terzo_per_compensoHome home = (V_terzo_per_compensoHome) getHome(aUC, V_terzo_per_compensoBulk.class, "DISTINCT_TERZO");
java.sql.Timestamp aData = it.cnr.jada.util.DateUtils.truncate(missione.getDt_fine_missione());
return home.selectVTerzo(missione.getTi_anagrafico(), missione.getCd_terzo(), missione.getDt_registrazione(), aData, clauses);
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(ex);
}
}
/**
* Inzializzazione divisa e cambio
*
* Pre-post-conditions:
*
* Nome: inizializzazione
* Pre: L'utente ha richiesto la modifica della nazione di una tappa
* Post: Il sistema inizializza la tappa impostando come divisa la divisa definita per la nuova nazione
* e come cambio il cambio della divisa valido per la data di inizio tappa
*
* @return MissioneBulk con la tappa inizializzata
* @param uc lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk a cui appartiene la tappa
* @param tappa la Missione_tappaBulk da inizializzare
*/
public MissioneBulk setDivisaCambio(UserContext userContext, MissioneBulk missione, Missione_tappaBulk tappa) throws ComponentException {
try {
tappa.setDivisa_tappa(recuperoDivisa(userContext, tappa.getPg_nazione(), missione.getRif_inquadramento().getCd_gruppo_inquadramento(), missione.getDt_inizio_missione()));
CambioBulk cambio = null;
if (tappa.getDivisa_tappa() != null) {
cambio = getCambioDivisa(userContext, tappa.getDivisa_tappa().getCd_divisa(), missione.getDt_inizio_missione());
}
if (cambio == null)
tappa.setCambio_tappa(null);
else
tappa.setCambio_tappa(cambio.getCambio());
return missione;
} catch (Throwable ex) {
throw handleException(ex);
}
}
public DivisaBulk recuperoDivisa(UserContext userContext, Long nazione, String gruppoInquadramento, Timestamp dataInizioMissione) throws ComponentException {
try {
String cdDivisaDiaria = getDivisaTappaDaDiaria(userContext, nazione, gruppoInquadramento, dataInizioMissione);
if (cdDivisaDiaria == null)
throw new ApplicationException("Non trovata la divisa per la tappa !");
DivisaBulk divisaDiaria = findDivisa(userContext, cdDivisaDiaria);
if (divisaDiaria == null)
throw new ApplicationException("Non trovata la divisa per la tappa !");
return divisaDiaria;
} catch (Throwable ex) {
throw handleException(ex);
}
}
public BigDecimal recuperoCambio(UserContext userContext, String divisa, Timestamp dataInizioMissione) throws ComponentException {
try {
CambioBulk cambio = getCambioDivisa(userContext, divisa, dataInizioMissione);
if (cambio == null)
return null;
else
return cambio.getCambio();
} catch (Throwable ex) {
throw handleException(ex);
}
}
private CambioBulk getCambioDivisa(UserContext userContext, String divisa,
Timestamp dataInizioMissione) throws ComponentException,
PersistencyException {
CambioBulk cambio = null;
if (divisa == null) {
return null;
}
try {
cambio = findCambio(userContext, divisa, dataInizioMissione);
} catch (ApplicationException e) {
}
return cambio;
}
/**
* Inzializzazione tappa
*
* Pre-post-conditions:
*
* Nome: inizializzazione
* Pre: L'utente ha richiesto la creazione di una nuova tappa
* Post: Il sistema inizializza la nuova tappa impostando la nazione a Italia, la divisa alla divisa definita per l'Italia
* e il cambio al cambio della divisa valido per la data di inizio tappa
*
* @return MissioneBulk con la nuova tappa inizializzata
* @param uc lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk a cui appartiene la nuova tappa
* @param tappa la Missione_tappaBulk da inizializzare
*/
public MissioneBulk setNazioneDivisaCambioItalia(UserContext userContext, MissioneBulk missione, Missione_tappaBulk tappa) throws ComponentException {
try {
tappa.setNazione(null);
tappa.setDivisa_tappa(null);
tappa.setCambio_tappa(null);
// Inizializzo nazione ITALIA
tappa.setNazione(findNazioneItalia(userContext));
// Inizializzo divisa ITALIA
if (tappa.getNazione() == null)
tappa.setDivisa_tappa(null);
else
tappa.setDivisa_tappa(getDivisaDefault(userContext));
// Inizializzo cambio ITALIA
CambioBulk cambio = findCambio(userContext, tappa.getDivisa_tappa(), missione.getDt_inizio_missione());
if (cambio == null)
tappa.setCambio_tappa(null);
else
tappa.setCambio_tappa(cambio.getCambio());
return missione;
} catch (Throwable ex) {
throw handleException(ex);
}
}
/**
* Imposta un savepoint che consente di salvare le modifiche apportate al doc. amministrativo
* fino a quel momento
* Pre-post-conditions:
*
* Nome: Imposta savePoint
* Pre: Una richiesta di impostare un savepoint e' stata generata
* Post: Un savepoint e' stato impostato in modo che le modifiche apportate al doc. amministrativo vengono consolidate
*
* @param uc lo UserContext che ha generato la richiesta
*/
public void setSavePoint(UserContext userContext, String savePointName) throws ComponentException {
try {
setSavepoint(userContext, savePointName);
} catch (java.sql.SQLException e) {
throw handleException(e);
}
}
/**
* stampaConBulk method comment.
*/
public it.cnr.jada.bulk.OggettoBulk stampaConBulk(it.cnr.jada.UserContext aUC, it.cnr.jada.bulk.OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException {
validateBulkForPrint(aUC, (Stampa_vpg_missioneBulk) bulk);
return bulk;
}
/**
* Aggiornamento anticipo
*
* Pre-post-conditions:
*
* Nome: salvataggio missione + anticio di importo maggiore + compenso
* Pre: Il sistema salva una missione collegata ad un anticipo di importo maggiore e
* ad un compenso
* Post: Il sistema aggiorna la linea di attivita' dell'anticipo collegato con quella
* selezionata nel compenso
*
* @return
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la missione il cui anticipo e' da aggiornare
*/
public void updateAnticipo(UserContext aUC, MissioneBulk missione) throws it.cnr.jada.comp.ComponentException, it.cnr.jada.persistency.PersistencyException {
super.updateBulk(aUC, missione.getAnticipo());
return;
}
/**
* Aggiornamento compenso
*
* Pre-post-conditions:
*
* Nome: aggiornamento compenso in automatico
* Pre: Il sistema salva una missione per aggiornarne alcuni campi che
* comportano l'aggiornamento dei relativi campi del compenso collegato.
* Post: Il sistema aggiorna il compenso collegato alla missione
*
* Nome: Rilettura del compenso modificato
* Pre: Il sistema ha aggiornato il compenso
* Post: Il sistema rilegge la versione del compenso aggiornata
*
* @return la missione il cui compenso e' stato aggiornato
* @param userContext lo UserContext che ha generato la richiesta
* @param missione la missione il cui compenso e' da aggiornare
*/
public MissioneBulk updateCompenso(UserContext userContext, MissioneBulk missione) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
CompensoHome compensoHome = (CompensoHome) getHome(userContext, CompensoBulk.class);
missione.getCompenso().setToBeUpdated();
compensoHome.update(missione.getCompenso(), userContext);
missione.setCompenso((CompensoBulk) compensoHome.findByPrimaryKey(missione.getCompenso()));
return missione;
}
/**
* Aggiorna importo associato a doc.amm. della scadenza
*
* Pre-post-conditions:
*
* Nome: aggiorna
* Pre: L'utente ha selezionato una scadenza di obbligazione per contabilizzare la missione
* Post: Il sistema aggiorna l'importo associato a documenti amministrativi della scadenza dell'obbligazione su cui
* la missione e' stata contabilizzata
*
* @return l'Obbligazione_scadenzarioBulk con l'importo aggiornato
* @param userContext lo UserContext che ha generato la richiesta
* @param scadenza l'Obbligazione_scadenzarioBulk per cui modificare l'importo associato a doc.amm.
*/
private IScadenzaDocumentoContabileBulk updateImportoAssociatoDocAmm(UserContext userContext, IScadenzaDocumentoContabileBulk scadenza) throws ComponentException {
try {
((IScadenzaDocumentoContabileHome) getHome(userContext, scadenza.getClass())).aggiornaImportoAssociatoADocAmm(userContext, scadenza);
} catch (it.cnr.jada.persistency.PersistencyException exc) {
throw handleException((OggettoBulk) scadenza, exc);
} catch (it.cnr.jada.bulk.BusyResourceException exc) {
throw handleException((OggettoBulk) scadenza, exc);
} catch (it.cnr.jada.bulk.OutdatedResourceException exc) {
throw handleException((OggettoBulk) scadenza, exc);
}
return scadenza;
}
/**
* Validazione esercizio data registrazione
* PreCondition:
* L'esercizio della data registrazione e' antecedente a quello di scrivania
* (quello della missione) ed e' APERTO
* PostCondition:
* La data di registrazione viene validata
*
* Validazione esercizio data registrazione
* PreCondition:
* L'esercizio della data registrazione e' antecedente a quello di scrivania
* (quello della missione) e NON e' APERTO
* PostCondition:
* La data di registrazione non viene validata
*
* @param aUC lo user context
* @param bulk l'istanza di MissioneBulk di cui e' variata la data di registrazione
*/
public void validaEsercizioDataRegistrazione(UserContext aUC, MissioneBulk missione) throws ComponentException {
try {
GregorianCalendar registrazioneGreg = (GregorianCalendar) missione.getGregorianCalendar(missione.getDt_registrazione());
// Verifico che l'esercizio della data di registrazione valorizzata dall'utente
// sia aperto
if (!verificaStatoEsercizio(aUC, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk(missione.getCd_cds(), new Integer(registrazioneGreg.get(Calendar.YEAR)))))
throw new it.cnr.jada.comp.ApplicationException("La data di registrazione non e' in un esercizio aperto !");
} catch (ApplicationException e) {
throw handleException(missione, e);
}
}
/**
* Valida massimale per tipo pasto
*
* Pre-post-conditions:
*
* Nome: valida massimale
* Pre: E' stata richiesta la validazione di una spesa di tipo pasto
* Il massimale del tipo pasto e' inferiore o uguale all'importo della spesa
* Post: La spesa supera la validazione
*
* Nome: valida massimale - errore
* Pre: E' stata richiesta la validazione di una spesa di tipo pasto
* Il massimale del tipo pasto della spesa e' superiore all'importo della spesa
* Post: La spesa non supera la validazione e l'errore viene segnalato all'utente
*
* @return MissioneBulk validata
* @param aUC lo UserContext che ha generato la richiesta
* @param spesa la Missione_dettaglioBulk per cui effettuare la validazione
* @param divisaDefault la DivisaBulk di default
*/
private Missione_dettaglioBulk validaMassimaleTipoPasto(UserContext aUC, Missione_dettaglioBulk spesa, DivisaBulk divisaDefault) throws it.cnr.jada.persistency.PersistencyException, ComponentException, it.cnr.jada.bulk.ValidationException, javax.ejb.EJBException {
BigDecimal massimalePastoEuro = new BigDecimal(0);
// MASSIMALE MISSIONE_TIPO_PASTO
massimalePastoEuro = getMassimaleEuro(
aUC,
spesa,
divisaDefault,
Optional.ofNullable(spesa)
.flatMap(missione_dettaglioBulk -> Optional.ofNullable(missione_dettaglioBulk.getTipo_pasto()))
.flatMap(missione_tipo_pastoBulk -> Optional.ofNullable(missione_tipo_pastoBulk.getDivisa()))
.flatMap(divisaBulk -> Optional.ofNullable(divisaBulk.getCd_divisa()))
.orElseThrow(() -> new ValidationException("Tipo pasto non valorizzato!")),
Optional.ofNullable(spesa)
.flatMap(missione_dettaglioBulk -> Optional.ofNullable(missione_dettaglioBulk.getTipo_pasto()))
.flatMap(missione_tipo_pastoBulk -> Optional.ofNullable(missione_tipo_pastoBulk.getLimite_max_pasto()))
.orElseThrow(() -> new ValidationException("Tipo pasto non valorizzato!")),
false);
// CONFRONTO IMPORTO SPESA CON MASSIMALE TIPO PASTO
if (massimalePastoEuro.compareTo(spesa.getIm_spesa_euro()) == -1)
throw new it.cnr.jada.bulk.ValidationException("L'importo della spesa supera il massimale del Tipo Pasto selezionato (€" + massimalePastoEuro + ")");
return spesa;
}
/**
* Valida massimale per tipo spesa
*
* Pre-post-conditions:
*
* Nome: valida massimale
* Pre: E' stata richiesta la validazione di una spesa
* Il massimale del tipo della spesa e' inferiore o uguale all'importo della spesa
* Post: La spesa supera la validazione
*
* Nome: valida massimale - errore
* Pre: E' stata richiesta la validazione di una spesa
* Il massimale del tipo della spesa e' superiore all'importo della spesa
* Post: La spesa non supera la validazione e l'errore viene segnalato all'utente
*
* @return MissioneBulk validata
* @param uc lo UserContext che ha generato la richiesta
* @param spesa la Missione_dettaglioBulk per cui effettuare la validazione
* @param divisaDefault la DivisaBulk di default
*/
private Missione_dettaglioBulk validaMassimaleTipoSpesa(UserContext aUC, Missione_dettaglioBulk spesa, DivisaBulk divisaDefault) throws it.cnr.jada.persistency.PersistencyException, ComponentException, it.cnr.jada.bulk.ValidationException, javax.ejb.EJBException {
BigDecimal massimaleSpesaEuro = new BigDecimal(0);
// MASSIMALE MISSIONE_TIPO_SPESA
massimaleSpesaEuro = getMassimaleEuro(aUC, spesa, divisaDefault, spesa.getTipo_spesa().getCd_divisa(), spesa.getTipo_spesa().getLimite_max_spesa(), true);
// CONFRONTO IMPORTO SPESA CON MASSIMALE TIPO SPESA
if (massimaleSpesaEuro.compareTo(spesa.getIm_spesa_euro()) == -1)
throw new it.cnr.jada.bulk.ValidationException("L'importo della spesa supera il massimale del Tipo Spesa selezionato (€" + massimaleSpesaEuro + ")");
spesa.setIm_spesa_max(massimaleSpesaEuro);
spesa.setIm_spesa_max(spesa.getIm_spesa_max().setScale(2, BigDecimal.ROUND_HALF_UP));
spesa.setIm_spesa_max_divisa(spesa.getTipo_spesa().getLimite_max_spesa());
spesa.setIm_spesa_max_divisa(spesa.getIm_spesa_max_divisa().setScale(2, BigDecimal.ROUND_HALF_UP));
return spesa;
}
/**
* Calcolo importi e validazione massimali importi
*
* Pre-post-conditions:
*
* Nome: calcola importi spesa per rimborso km
* Pre: E' stata richiesto il calcolo degli importi di una spesa per rimborso km
* Post: Il sistema calcola "im_spesa_euro" moltiplicando i km per l'indennità chilometrica (sempre in EURO).
* Il sistema inizializza pone : "im_spesa_euro", "im_spesa_divisa" e "im_totale_spesa" tutti uguali.
*
* Nome: conversione importo spesa con tipologia diversa da rimborso km
* Pre: E' stata richiesta la conversione dell'importo inserito dall'utente di una spesa diversa da rimborso km
* Post: Se l'utente ha selezionato una divisa straniera, il sistema converte "im_spesa_divisa" nella divisa di default
* (metodo 'getImportoSpesaEuro')
*
* Nome: validazione massimale spesa
* Pre: E' stata richiesta la validazione dell'importo della spesa
* Post: Il sistema verifica che "im_spesa_euro" non sia maggiore del massimale della spesa
* (limite_max_spesa eventualmente convertito se tipo_spesa.cd_divisa!=EURO), metodo 'validaMassimaleTipoSpesa'
*
* Nome: valida spesa di tipo pasto
* Pre: E' stata richiesta la validazione dell'importo di una spesa di tipo pasto
* Post: Il sistema verifica che "im_spesa_euro" non sia maggiore del massimale del pasto.
* (limite_max_pasto eventualmente convertito se tipo_pasto!=EURO), metodo 'validaMassimaleTipoPasto'
*
* Nome: calcolo importo totale spesa
* Pre: E' stato richiesto il calcolo del totale della spesa (EURO)
* Post: Se la spesa e' un trasporto l'"im_totale_spesa" e' uguale alla somma di "im_spesa_euro" con
* "im_maggiorazione" (eventualmente convertita se l'utente ha selezionato una divisa straniera).
* Se la spesa non e' un trasporto l'"im_totale_spesa" e' uguale a "im_spesa_euro".
*
* @return MissioneBulk validata
* @param uc lo UserContext che ha generato la richiesta
* @param missione la MissioneBulk a cui appartiene la spesa
* @param spesa la Missione_dettaglioBulk per cui effettuare i cacloli e la validazione degli importi
*/
public MissioneBulk validaMassimaliSpesa(UserContext aUC, MissioneBulk missione, Missione_dettaglioBulk spesa) throws ComponentException, javax.ejb.EJBException, it.cnr.jada.persistency.PersistencyException, it.cnr.jada.bulk.ValidationException {
DivisaBulk divisaDefault = getDivisaDefault(aUC);
if (divisaDefault == null)
throw new it.cnr.jada.bulk.ValidationException("Impossibile trovare la divisa di riferimento !");
// - Se la spesa e' un rimborso_km l'importo e' sempre in EURO (divisa disabilitata)
// e viene calcolato moltiplicando i km per l'indennita_chilometrica (sempre in EURO)
// - Altrimenti per le altre tipologie di spesa se l'utente ha selezionato una divisa
// diversa da EURO converto im_spesa_divisa in EURO (im_spesa_euro)
if (spesa.isRimborsoKm())
spesa.calcolaImportoRimborsoKm();
else
spesa.setIm_spesa_euro(spesa.getImportoSpesaEuro(divisaDefault));
// Verifico che l'importo inserito non superi il massimale
// del tipo spesa selezionato (massimale della tabella Missione_tipo_spesa)
spesa = validaMassimaleTipoSpesa(aUC, spesa, divisaDefault);
if (spesa.isPasto()) {
// Verifico che l'importo inserito non superi il massimale
// del tipo pasto selezionato (massimale della tabella Missione_tipo_pasto)
spesa = validaMassimaleTipoPasto(aUC, spesa, divisaDefault);
}
// Se la spesa e' un trasporto l'im_totale_spesa verra' calcolato sommando a im_spesa_euro
// la maggiorazione (eventualmente convertita).
// Per le altre tipologie di spesa l'im_totale_spesa e' uguale all'im_spesa_euro
if (spesa.isTrasporto()) {
spesa.calcolaMaggiorazioneTrasporto();
spesa.convertiMaggiorazioneInEuro(divisaDefault);
spesa.setIm_totale_spesa(spesa.getIm_maggiorazione_euro().add(spesa.getIm_spesa_euro()));
spesa.setIm_totale_spesa(spesa.getIm_totale_spesa().setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
} else {
spesa.setIm_totale_spesa(spesa.getIm_spesa_euro());
spesa.setIm_totale_spesa(spesa.getIm_totale_spesa().setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
}
return missione;
}
/**
* Viene richiesta la validazione dell'obbligazione associata alla missione
*
* Pre-post-conditions
*
* Pre: La missione e' collegata a compenso o ad anticipo di importo maggiore
* Post: Non esiste alcuna scadenza legata alla missione (non faccio controlli)
*
* Nome: Scadenza non selezionata
* Pre: Non e' stata selezionata la scadenza da associare alla missione
* Post: Non viene consentita l'associazione della scadenza con la missione
* Generata una ApplicationException con il messaggio: "Nessuna obbligazione associata!"
*
* Nome: Importi obbligazione/scadenza NULLI
* Pre: L'importo della obbligazione e/o della scadenza è nullo
* Post: Non viene consentita l'associazione della scadenza con la missione
* Generata una ApplicationException con il messaggio:
* "L'importo dell'obbligazione/scadenza è un dato obbligatorio"
*
* Nome: Importo scadenza diverso da quello della missione
* Pre: L'importo della scadenza è diverso da quello della missione
* Post: Non viene consentita l'associazione della scadenza con la missione
* Generata una ApplicationException con il messaggio:
* "La scadenza di obbligazione associata ha un importo diverso da quello della missione!"
*
* Nome: Data scadenza NON valida
* Pre: La scadenza selezionata ha una data minore della data di registrazione della missione
* Post: Non viene consentita l'associazione della scadenza con la missione
* Generata una ApplicationException con il messaggio:
* "La data della scadenza dell'obbligazione deve essere successiva alla data di registrazione della missione!"
*
* Nome: Terzo selezionato NON valido
* Pre: Il terzo selezionato è diverso dal terzo della missione oppure il tipo entità NON è DIVERSI
* Post: Non viene consentita l'associazione della scadenza con la missione
* Generata una ApplicationException con il messaggio:
* "L'obbligazione deve avere un creditore valido!"
*
* Nome: Tutte le validazioni precedenti superate
* Pre: L'obbligazione supera tutte le validazioni precedenti
* Post: Viene validata l'associazione della missione con la scadenza di obbligazione
*
* @param userContext lo UserContext che genera la richiesta
* @param scadenza la scadenza da validare
**/
public void validaObbligazione(UserContext userContext, Obbligazione_scadenzarioBulk scadenza, OggettoBulk bulk) throws ComponentException {
MissioneBulk missione = (MissioneBulk) bulk;
ObbligazioneBulk obbligazione = scadenza.getObbligazione();
if (obbligazione.getIm_obbligazione() == null)
throw new it.cnr.jada.comp.ApplicationException("L'importo dell'impegno è un dato obbligatorio");
if (scadenza.getIm_scadenza() == null)
throw new it.cnr.jada.comp.ApplicationException("L'importo della scadenza è un dato obbligatorio");
if (scadenza.getIm_scadenza().compareTo(missione.getImporto_scadenza_obbligazione()) != 0)
throw new it.cnr.jada.comp.ApplicationException("L'importo della scadenza di impegno deve essere " + missione.getImporto_scadenza_obbligazione().toString());
GregorianCalendar gcRegistrazione = (GregorianCalendar) missione.getGregorianCalendar(missione.getDt_registrazione()).clone();
gcRegistrazione.set(java.util.GregorianCalendar.HOUR_OF_DAY, 0);
gcRegistrazione.set(java.util.GregorianCalendar.MINUTE, 0);
gcRegistrazione.set(java.util.GregorianCalendar.SECOND, 0);
if (gcRegistrazione.getTime().compareTo(scadenza.getDt_scadenza()) >= 0)
throw new it.cnr.jada.comp.ApplicationException("La data della scadenza dell'impegno deve essere successiva alla data di registrazione della missione!");
validaTerzoObbligazione(userContext, missione, obbligazione);
controlloTrovato(userContext, scadenza);
}
/**
* stampaConBulk method comment.
*/
private void validateBulkForPrint(UserContext userContext, Stampa_vpg_missioneBulk stampa) throws ComponentException {
try {
if (stampa.getEsercizio() == null)
throw new it.cnr.jada.bulk.ValidationException("Il campo ESERCIZIO e' obbligatorio");
if (stampa.getCd_cds() == null)
throw new it.cnr.jada.bulk.ValidationException("Il campo CDS e' obbligatorio");
if (stampa.getPgInizio() == null)
throw new it.cnr.jada.bulk.ValidationException("Il campo NUMERO INIZIO MISSIONE è obbligatorio");
if (stampa.getPgFine() == null)
throw new it.cnr.jada.bulk.ValidationException("Il campo NUMERO FINE MISSIONE è obbligatorio");
if (stampa.getPgInizio().compareTo(stampa.getPgFine()) > 0)
throw new it.cnr.jada.bulk.ValidationException("Il NUMERO INIZIO MISSIONE non può essere superiore al NUMERO FINE MISSIONE");
} catch (it.cnr.jada.bulk.ValidationException ex) {
throw new ApplicationException(ex);
}
}
/**
* Validazione della Missione per Esercizio COEP precedente
*
* Gennaro Borriello/Luisa Farinella - (05/11/2004 18.11.25)
* Aggiunto controllo per i documenti RIPORTATI, in base all'esercizio COEP precedente
* all'es. di scrivania.
*/
private void validateEsercizioCOEP(it.cnr.jada.UserContext userContext, MissioneBulk missione) throws ComponentException {
LoggableStatement cs = null;
String status = null;
try {
if (missione.isRiportataInScrivania()) {
Integer es_prec = new Integer(it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue() - 1);
cs = new LoggableStatement(getConnection(userContext), "{ ? = call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
+ "CNRCTB200.isChiusuraCoepDef(?,?)}", false, this.getClass());
cs.registerOutParameter(1, java.sql.Types.VARCHAR);
cs.setObject(2, es_prec);
cs.setObject(3, missione.getCd_cds());
cs.executeQuery();
status = new String(cs.getString(1));
if (status.compareTo("Y") != 0) {
throw new it.cnr.jada.comp.ApplicationException("Attenzione: non è possibile eliminare il documento, poichè l'esercizio economico precedente non è chiuso.");
}
}
} catch (java.sql.SQLException ex) {
throw new it.cnr.jada.comp.ComponentException(ex);
} finally {
try {
if (cs != null)
cs.close();
} catch (Throwable t) {
throw new it.cnr.jada.comp.ComponentException(t);
}
}
}
/**
* Validazione del Terzo
*
* Pre-post-conditions
*
* Nome: Terzo assente
* Pre: Non è stato selezionato un terzo
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Inserire il terzo"
*
* Nome: Terzo non valido alla data registrazione
* Pre: Il terzo selezionato non è valido alla data registrazione
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Il Terzo selezionato non è valido in Data Registrazione"
*
* Nome: Modalita di pagamento assente
* Pre: Non è stato selezionata una modalita di pagamento
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Selezionare la Modalità di pagamento"
*
* Nome: Modalita di pagamento non valida
* Pre: La modalita di pagamento non e' valida (con banca)
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Selezionare una Modalità di pagamento valida"
*
* Nome: Tipo rapporto assente
* Pre: Non è stato selezionato un tipo rapporto
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Selezionare il Tipo Rapporto"
*
* Nome: Tipo rapporto non valido alla data inizio missione
* Pre: Il tipo rapporto selezionato non è valido in data inizio missione
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Il Tipo Rapporto selezionato non è valido alla Data Inizio Missione"
*
* Nome: Tipo trattamento assente
* Pre: Non è stato selezionato un tipo trattamento
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Selezionare il Tipo Trattamento"
*
* Nome: Tipo trattamento non valido alla data registrazione
* Pre: Il tipo trattamento non e' valido alla data di registrazione
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Il Tipo Trattamento selezionato non è valido alla Data Registrazione"
*
* Nome: Inquadramento assente
* Pre: Non è stato selezionato un inquadramento
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Selezionare l'Inquadramento"
*
* Nome: Inquadramento non valido alla data registrazione
* Pre: L'inquadramento non e' valido alla data di registrazione
* Post: Ritorna una ApplicationException con la descrizione dell'errore
* "Il Tipo Trattamento selezionato non è valido alla Data Registrazione"
*
* Nome: Terzo valido
* Pre: Il terzo selezionato non ha errori
* Post: Il terzo è valido e prosegue con l'operazione
*
* @param userContext lo UserContext che genera la richiesta
* @param missione la missione di cui validare il terzo
**/
// Viene richiesta la validazione del terzo selezionato
// Ritorna una ApplicationException con la descrizione
// dell'errore relativo
//
// errorCode Significato
// ========= ===========
// 0 Tutto bene
// 1 Terzo assente
// 2 Terzo non valido alla data registrazione
// 3 Controllo se ho inserito le modalità di pagamento
// 4 Banca non inserita
// 5 Tipo rapporto assente
// 6 Tipo di rapporto non valido in data inizio inizio missione
// 7 Inquadramento assente
// 8 Inquadramento non valido alla data registrazione
// 9 Tipo trattamento assente
// 10 Tipo trattamento non valido alla data registrazione
public void validaTerzo(UserContext userContext, MissioneBulk missione) throws ComponentException {
int error = validaTerzo(userContext, missione, true);
handleExceptionsTerzo(error);
}
/**
* Validazione del Terzo
*
* Pre-post-conditions
*
* Nome: Terzo assente
* Pre: Non è stato selezionato un terzo
* Post: Ritorna il valore 1
*
* Nome: Terzo non valido alla data registrazione
* Pre: Il terzo selezionato non è valido alla data registrazione
* Post: Ritorna il valore 2
*
* Nome: Modalita di pagamento assente
* Pre: Non è stato selezionata una modalita di pagamento
* Post: Ritorna il valore 3
*
* Nome: Banca non inserita
* Pre: Non è stato selezionato un conto corretto
* Post: Ritorna il valore 4
*
* Nome: Tipo rapporto assente
* Pre: Non è stato selezionato un tipo rapporto
* Post: Ritorna il valore 5
*
* Nome: Tipo rapporto non valido alla data inizio missione
* Pre: Il tipo rapporto selezionato non è valido in data inizio missione
* Post: Ritorna il valore 6
*
* Nome: Inquadramento assente
* Pre: Non è stato selezionato un inquadramento
* Post: Ritorna il valore 7
*
* Nome: Inquadramento non valido alla data inizio missione
* Pre: L'inquadramento selezionato non è valido in data inizio missione
* Post: Ritorna il valore 8
*
* Nome: Tipo trattamento assente
* Pre: Non è stato selezionato un tipo trattamento
* Post: Ritorna il valore 9
*
* Nome: Tipo trattamento non valido alla data registrazione
* Pre: Il tipo trattamento selezionato non è valido in data registrazione
* Post: Ritorna il valore 10
*
* Nome: Terzo valido
* Pre: Il terzo selezionato non ha errori
* Post: Ritorna il valore 0
*
* @param userContext lo UserContext che genera la richiesta
* @param missione la missione di cui validare il terzo
* @param checkModPag Flag che stabilisce se occorre validare anche le modalita
* di pagamento e la banca
* @return il codice di errore relativo
**/
//
// Viene richiesta la validazione del terzo selezionato
// Ritorna il codice di Errore relativo alla validzione
//
// errorCode Significato
// ========= ===========
// 0 Tutto bene
// 1 Terzo assente
// 2 Terzo non valido alla data registrazione
// 3 Controllo se ho inserito le modalità di pagamento
// 4 Banca non inserita
// 5 Tipo rapporto assente
// 6 Tipo di rapporto non valido in data inizio missione
// 7 Inquadramento assente
// 8 Inquadramento non valido alla data registrazione
// 9 Tipo trattamento assente
// 10 Tipo trattamento non valido alla data registrazione
//
public int validaTerzo(UserContext userContext, MissioneBulk missione, boolean checkModPag) throws ComponentException {
TerzoBulk terzo = missione.getTerzo();
// terzo assente
if (terzo == null)
return 1;
// terzo non valido alla data registrazione
if (terzo.getDt_fine_rapporto() != null && terzo.getDt_fine_rapporto().compareTo(missione.getDt_registrazione()) < 0)
return 2;
// Controllo se ho inserito le modalità di pagamento
if (checkModPag && missione.getModalita_pagamento() == null)
return 3;
// banca assente
if (checkModPag && missione.getBanca() == null)
return 4;
// tipo rapporto assente
if (missione.getTipo_rapporto() == null)
return 5;
// rapporto non valido in data inizio missione
if (!isTipoRapportoValido(userContext, missione))
return 6;
// inquadramento assente
if (missione.getPg_rif_inquadramento() == null)
return 7;
// inquadramento non valido alla data inizio missione
if (!isInquadramentoValido(userContext, missione))
return 8;
// tipo trattamento assente
if (missione.getTipo_trattamento() == null)
return 9;
// tipo trattamento non valido alla data registrazione
if (!isTipoTrattamentoValido(userContext, missione))
return 10;
return (0);
}
/**
* Viene controllato che il terzo selezionato nella missione corrisponda con al terzo selezionato
* nell'obbligazione
*
* Pre-post-conditions
*
* Nome: Terzo obbligazione non valido
* Pre: Non è stato selezionato il terzo nell'obbligazione
* Post: Ritorna un ApplicationException con la descrizione dell'errore
*
* Nome: Terzo obbligazione uguale al terzo della missione
* Pre: Il terzo selezionato nell'obbligazione corrisponde al terzo della missione
* Post: Viene validato il terzo
*
* Nome: L'anagrafica dell'obbligazione ha tipo entita DIVERSI
* Pre: L'anagafica associata al terzo dell'obbligazione ha come tipo entita DIVERSI
* Post: Viene validato il terzo
*
* Nome: Nessuna delle due condizioni precedenti è verificata
* Pre: Il terzo selezionato NON corrisponde al terzo della missione e
* l'anagrafica associata NON ha tipo entita DIVERSI
* Post: Ritorna un ApplicationException con la descrizione dell'errore
*
* @param userContext lo UserContext che genera la richiesta
* @param missione la missione di cui validare il terzo
* @param obblig l'obbligazione di cui validare il terzo
**/
private void validaTerzoObbligazione(UserContext userContext, MissioneBulk missione, ObbligazioneBulk obbligazione) throws ComponentException {
try {
TerzoBulk creditore = obbligazione.getCreditore();
TerzoHome terzoHome = (TerzoHome) getHome(userContext, TerzoBulk.class);
creditore = (TerzoBulk) terzoHome.findByPrimaryKey(obbligazione.getCreditore());
if (creditore == null || creditore.getCd_terzo() == null)
throw new it.cnr.jada.comp.ApplicationException("L'impegno deve avere un creditore valido!");
getHomeCache(userContext).fetchAll(userContext);
AnagraficoHome anaHome = (AnagraficoHome) getHome(userContext, AnagraficoBulk.class);
AnagraficoBulk anagrafico = (AnagraficoBulk) anaHome.findByPrimaryKey(creditore.getAnagrafico());
if (!missione.getTerzo().equalsByPrimaryKey(creditore) && !AnagraficoBulk.DIVERSI.equalsIgnoreCase(anagrafico.getTi_entita()))
throw new it.cnr.jada.comp.ApplicationException("La scadenza selezionata deve appartenere ad un'obbligazione che ha come creditore quello della missione!");
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(ex);
}
}
public boolean verificaStatoEsercizio(UserContext userContext, it.cnr.contab.config00.esercizio.bulk.EsercizioBulk anEsercizio) throws ComponentException {
try {
it.cnr.contab.config00.esercizio.bulk.EsercizioHome eHome = (it.cnr.contab.config00.esercizio.bulk.EsercizioHome) getHome(userContext, it.cnr.contab.config00.esercizio.bulk.EsercizioBulk.class);
return !eHome.isEsercizioChiuso(userContext, anEsercizio.getEsercizio(), anEsercizio.getCd_cds());
} catch (it.cnr.jada.persistency.PersistencyException e) {
throw handleException(e);
}
}
public boolean isDiariaEditable(UserContext context, Missione_tappaBulk tappa) throws it.cnr.jada.comp.ComponentException {
Parametri_cnrBulk parametriCnr = parametriCnr(context);
//Calendar cal = Calendar.getInstance();
//cal.setTime(tappa.getDt_inizio_tappa());
//int year = cal.get(Calendar.YEAR);
java.sql.Timestamp data_fine_diaria_miss_estero;
try {
Configurazione_cnrComponentSession sess = (Configurazione_cnrComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCONFIG00_EJB_Configurazione_cnrComponentSession");
data_fine_diaria_miss_estero = sess.getDt01(context, new Integer(0), "*", "DIARIA_MISS_ESTERO", "DATA_FINE");
} catch (RemoteException e) {
throw handleException(e);
}
if (tappa.getFl_comune_estero().booleanValue()) {
if ((!(tappa.getDt_inizio_tappa().compareTo(data_fine_diaria_miss_estero) > 0)) ||
(tappa.getMissione().getTerzo().getAnagrafico().getFl_abilita_diaria_miss_est().booleanValue()
&&
!(tappa.getMissione().getDt_inizio_missione().compareTo(tappa.getMissione().getTerzo().getAnagrafico().getDt_inizio_diaria_miss_est()) < 0)
&&
!(tappa.getMissione().getDt_fine_missione().compareTo(tappa.getMissione().getTerzo().getAnagrafico().getDt_fine_diaria_miss_est()) > 0)
)
) {
return true;
} else {
return (false);
}
} else {
if (!parametriCnr.getFl_diaria_miss_italia().booleanValue())
/*
&&
year == it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context).intValue())
*/ {
return (false);
} else
return (true);
}
}
/**
* Ricerca i parametri ente per l'anno di esercizio in scrivania
*
* @param aUC UserContext
* @return Parametri_cnrBulk contenente i parametri ente
* @throws it.cnr.jada.comp.ComponentException
*/
public Parametri_cnrBulk parametriCnr(UserContext aUC) throws it.cnr.jada.comp.ComponentException {
Parametri_cnrBulk param;
try {
param = (Parametri_cnrBulk) getHome(aUC, Parametri_cnrBulk.class).findByPrimaryKey(
new Parametri_cnrBulk(
((CNRUserContext) aUC).getEsercizio()));
} catch (PersistencyException ex) {
throw handleException(ex);
} catch (ComponentException ex) {
throw handleException(ex);
}
if (param == null) {
throw new ApplicationException("Parametri CNR non trovati.");
}
return param;
}
public boolean isTerzoCervellone(UserContext userContext, MissioneBulk missione) throws ComponentException {
if (missione.getCd_terzo() != null) {
try {
TerzoHome tHome = (TerzoHome) getHome(userContext, TerzoBulk.class);
TerzoBulk tKey = new TerzoBulk(missione.getCd_terzo());
TerzoBulk t = (TerzoBulk) tHome.findByPrimaryKey(tKey);
if (t == null) {
return false;
} else {
AnagraficoHome aHome = (AnagraficoHome) getHome(userContext, AnagraficoBulk.class);
AnagraficoBulk aKey = new AnagraficoBulk(t.getCd_anag());
AnagraficoBulk a = (AnagraficoBulk) aHome.findByPrimaryKey(aKey);
if (a.getFl_cervellone())
return true;
else
return false;
}
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(missione, ex);
}
} else
return false;
}
public java.util.List findListaMissioniSIP(UserContext userContext, String query, String dominio, String uo,
String terzo, String voce, String cdr, String gae,
String tipoRicerca, Timestamp data_inizio, Timestamp data_fine) throws ComponentException {
try {
VMissioneSIPHome home = (VMissioneSIPHome) getHome(userContext, VMissioneSIPBulk.class, "VMISSIONESIP_RID");
SQLBuilder sql = home.createSQLBuilder();
sql.setDistinctClause(true);
if (data_inizio != null && data_fine != null) {
sql.addSQLClause("AND", "DT_PAGAMENTO", SQLBuilder.GREATER_EQUALS, data_inizio);
sql.addSQLClause("AND", "DT_PAGAMENTO", SQLBuilder.LESS_EQUALS, data_fine);
}
if (uo != null)
sql.addSQLClause("AND", "CD_UNITA_ORGANIZZATIVA", SQLBuilder.EQUALS, uo);
if (terzo != null)
sql.addSQLClause("AND", "CD_TERZO", SQLBuilder.EQUALS, terzo);
if (voce != null)
sql.addSQLClause("AND", "CD_ELEMENTO_VOCE", SQLBuilder.EQUALS, voce);
if (cdr != null)
sql.addSQLClause("AND", "CD_CENTRO_RESPONSABILITA", SQLBuilder.EQUALS, cdr);
if (gae != null)
sql.addSQLClause("AND", "GAE", SQLBuilder.EQUALS, gae);
if (dominio.equalsIgnoreCase("pg_missione"))
sql.addSQLClause("AND", "PG_MISSIONE", SQLBuilder.EQUALS, query);
else if (dominio.equalsIgnoreCase("descrizione")) {
for (StringTokenizer stringtokenizer = new StringTokenizer(query, " "); stringtokenizer.hasMoreElements(); ) {
String queryDetail = stringtokenizer.nextToken();
if ((tipoRicerca != null && tipoRicerca.equalsIgnoreCase("selettiva")) || tipoRicerca == null) {
if (queryDetail.equalsIgnoreCase(RemoveAccent.convert(queryDetail)))
sql.addSQLClause("AND", "DS_MISSIONE", SQLBuilder.CONTAINS, queryDetail);
else {
sql.openParenthesis("AND");
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.CONTAINS, queryDetail);
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.CONTAINS, RemoveAccent.convert(queryDetail));
sql.closeParenthesis();
}
} else if (tipoRicerca.equalsIgnoreCase("puntuale")) {
if (queryDetail.equalsIgnoreCase(RemoveAccent.convert(queryDetail))) {
sql.openParenthesis("AND");
sql.addSQLClause("AND", "UPPER(DS_MISSIONE)", SQLBuilder.EQUALS, queryDetail.toUpperCase());
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.STARTSWITH, queryDetail + " ");
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.ENDSWITH, " " + queryDetail);
sql.closeParenthesis();
} else {
sql.openParenthesis("AND");
sql.openParenthesis("AND");
sql.addSQLClause("OR", "UPPER(DS_MISSIONE)", SQLBuilder.EQUALS, queryDetail.toUpperCase());
sql.addSQLClause("OR", "UPPER(DS_MISSIONE)", SQLBuilder.EQUALS, RemoveAccent.convert(queryDetail).toUpperCase());
sql.closeParenthesis();
sql.openParenthesis("OR");
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.STARTSWITH, queryDetail + " ");
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.STARTSWITH, RemoveAccent.convert(queryDetail) + " ");
sql.closeParenthesis();
sql.openParenthesis("OR");
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.ENDSWITH, " " + queryDetail);
sql.addSQLClause("OR", "DS_MISSIONE", SQLBuilder.ENDSWITH, " " + RemoveAccent.convert(queryDetail));
sql.closeParenthesis();
sql.closeParenthesis();
}
}
}
sql.addOrderBy("DS_MISSIONE");
}
return home.fetchAll(sql);
} catch (it.cnr.jada.persistency.PersistencyException ex) {
throw handleException(ex);
}
}
public void archiviaStampa(UserContext userContext, Date fromDate, Date untilDate, MissioneBulk missioneBulk, Integer... years) throws ComponentException {
MissioneHome missioneHome = (MissioneHome) getHome(userContext, MissioneBulk.class);
CompoundFindClause clauses = new CompoundFindClause();
CompoundFindClause clausesYear = new CompoundFindClause();
if (fromDate != null)
clauses.addClause(FindClause.AND, "dt_inizio_missione", SQLBuilder.GREATER_EQUALS, new Timestamp(fromDate.getTime()));
if (untilDate != null)
clauses.addClause(FindClause.AND, "dt_fine_missione", SQLBuilder.LESS_EQUALS, new Timestamp(untilDate.getTime()));
clauses.addClause(FindClause.AND, "ti_provvisorio_definitivo", SQLBuilder.EQUALS, "D");
for (Integer year : years) {
clausesYear.addClause(FindClause.OR, "esercizio", SQLBuilder.EQUALS, year);
}
clauses = CompoundFindClause.and(clauses, clausesYear);
try {
RemoteIterator missioni = cerca(userContext, clauses, missioneBulk);
while (missioni.hasMoreElements()) {
MissioneBulk missione = (MissioneBulk) missioni.nextElement();
try {
missione = (MissioneBulk) inizializzaBulkPerModifica(userContext, missione);
missioneHome.archiviaStampa(userContext, missione);
} catch (Exception ex) {
System.err.println("Missione:" + missione + " - " + ex);
continue;
}
}
} catch (RemoteException e) {
throw handleException(e);
}
}
public BigDecimal calcolaMinutiTappa(UserContext aUC, Missione_tappaBulk tappa) throws ComponentException {
LoggableStatement cs = null;
java.sql.ResultSet rs;
BigDecimal ore = new BigDecimal("0");
try {
try {
cs = new LoggableStatement(getConnection(aUC), "{?=call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
+ "CNRCTB500.calcolaMinutiTappa(?,?)}", false, this.getClass());
cs.registerOutParameter(1, java.sql.Types.DECIMAL);
cs.setObject(2, tappa.getDt_inizio_tappa());
cs.setObject(3, tappa.getDt_fine_tappa());
cs.executeQuery();
ore = cs.getBigDecimal(1);
} finally {
cs.close();
}
return ore;
} catch (java.sql.SQLException e) {
throw handleException(tappa, e);
}
}
public void cancellazioneMissioneDaGemis(UserContext userContext, Long idRimborsoMissioneGemis) throws ComponentException {
try {
MissioneHome home = (MissioneHome) getHome(userContext, MissioneBulk.class);
MissioneBulk missione = home.loadMissione(userContext, idRimborsoMissioneGemis);
if (missione != null){
logger.info("Missione Recuperata "+missione.getPg_missione());
missione = (MissioneBulk) inizializzaBulkPerModifica(userContext, missione);
logger.info("Missione Inizializzata "+missione.getPg_missione());
missione.setToBeDeleted();
eliminaConBulk(userContext, missione);
logger.info("Missione Eliminata "+missione.getPg_missione());
}
} catch (Throwable e) {
throw handleException(e);
}
}
}