package dao;

import java.security.DomainLoadStoreParameter;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.persistence.ParameterMode;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.procedure.ProcedureCall;
import org.hibernate.result.Outputs;
import org.hibernate.result.UpdateCountOutput;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.hibernate.transform.ResultTransformer;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Repository;
import org.springframework.util.MultiValueMap;

import bean.AppVariables;
import bean.LogModificheBean;
import bean.LogVariazioniBean;
import bean.filters.DisposizioniFiltroBean;
import bean.filters.RicercaDisposizioniFilterBean;
import bean.query.DisposizioniAeaDecoded;
import common.bean.UserData;
import common.dao.GenericDAO;
import common.dao.IDAO;
import common.utility.DateUtils;
import common.utility.StringUtilities;
import sicura.entities.ComboDisposizioni;
import sicura.entities.DisposizioniAea;
import sicura.entities.DisposizioniBonifici;
import sicura.entities.LogModificheDisposizioni;

@Repository
public class DisposizioneAeaDAO extends GenericDAO<DisposizioniAea, Integer> implements IDAO<DisposizioniAea, Integer> {

	@Autowired
	GenericComboDAO genericComboDAO;
	@Autowired
	LogVariazioniDAO logVariazioniDAO;
	
	private enum TipoRicerca {TR_LISTA_DISPOSIZIONI, TR_DISTINTE_BANCA, TR_FLUSSI_INPUT, TR_FILTRO_DISPOSIZIONI, TR_LISTA_DISPOSIZIONI_READONLY};
	private TipoRicerca tipoRicerca;
	

	public boolean cancellazioneMassiva(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, UserData userdata, AppVariables appVariables) {
	
		if (profiloUtente=="VI" || disposizioniFiltroBean.getSelectedIds()==null ||  disposizioniFiltroBean.getSelectedIds().length<1)
			return false;
		
		boolean res = true;
		List<DisposizioniAea> disposizioni = list(-1,-1,disposizioniFiltroBean,userdata.getOtherCode(), appVariables,userdata.getLogin());
		
	
		try {
			for (int i=0;i<disposizioni.size();i++) {
				// verifica se la disposizione è cancellabile
				DisposizioniAea disposizione = disposizioni.get(i);

				
				if (disposizione.getStatoDisposizione().equalsIgnoreCase("Approvata")||
					disposizione.getStatoDisposizione().equalsIgnoreCase("Confermata")||
					disposizione.getStatoDisposizione().equalsIgnoreCase("Predisposta")) {

					// predisponi il log variazioni
					LogVariazioniBean logModifiche = new LogVariazioniBean();
					logModifiche.setFieldName("StatoDisposizione");
						logModifiche.setOldValue(disposizione.getStatoDisposizione());
						logModifiche.setNewValue("Cancellata");
						logModifiche.setTimestamp(new Date());

					List<LogVariazioniBean> listaVariazioni = new ArrayList<LogVariazioniBean>();
					listaVariazioni.add(logModifiche);				
				
					
					disposizione.setStatoDisposizione("Cancellata");
				
					int saveResult = save(disposizione, userdata, appVariables);
					try {
						if (saveResult==0)
							logVariazioniDAO.saveAll(appVariables.getUserId(),appVariables.getDenominazioneUtente(), disposizione.getIddisposizione(),listaVariazioni);
					}catch(Exception ex) {
						// should never happen
						ex.printStackTrace();
					}
					res = saveResult==0;
				} else
					res = false;
			}
			
		} finally {
			
		}
		return res;
	}
	
	@SuppressWarnings("unchecked")
	public List<DisposizioniAea> list(String codiceClienteDebitore, int start, int length) {
		boolean tx = startTransaction();
		List<DisposizioniAea> res=null;
		try {
			tipoRicerca = TipoRicerca.TR_LISTA_DISPOSIZIONI;
			
			Criteria crit = currentSession().createCriteria(DisposizioniAea.class);
			crit
				.add(Restrictions.eq("codiceClienteDebitore", codiceClienteDebitore))
				.addOrder(Order.asc("id"));
			
			try {
				res = crit.list();
			} catch(Exception ex) {
				ex.printStackTrace();
			}

		} finally {
			if (tx)
				commit();
		}
		return res;
		
	}
	
	public Integer count(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID) {
		return count(disposizioniFiltroBean, profiloUtente, appVariables, userID, null);
	}
	
	public Integer count(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID, Integer idDistinta) {
		Integer res = 0;
		boolean tx = startTransaction();
		try {
			if ("DistinteBanca".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_DISTINTE_BANCA;
			else if ("DistinteFlussiInput".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FLUSSI_INPUT;
			else if ("FiltroDisposizioni".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FILTRO_DISPOSIZIONI;
			else if  ("FiltroDisposizioniReadOnly".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_LISTA_DISPOSIZIONI_READONLY;
	
			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, true,false, tipoRicerca,idDistinta, null);
			
			Query q = currentSession().createSQLQuery(sql);
			
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0 && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());
			
			res = ((Integer) q.uniqueResult());
		} finally {
			if (tx)
				commit();
		}
		return res;
	}

	public List<DisposizioniAea> list(int startRecord, int length, DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID)  {
		boolean tx = startTransaction();
		try {
			if ("DistinteBanca".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_DISTINTE_BANCA;
			else if ("DistinteFlussiInput".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FLUSSI_INPUT;
			else if ("FiltroDisposizioni".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FILTRO_DISPOSIZIONI;
			else if  ("FiltroDisposizioniReadOnly".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_LISTA_DISPOSIZIONI_READONLY;
	
			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, false, tipoRicerca, null, disposizioniFiltroBean.getOrderField());
			
	//		if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
	//			sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
			
			Query q = currentSession().createSQLQuery(sql)
					.addEntity("d",DisposizioniAea.class);
	
			if (startRecord!=-1)
				q.setFirstResult(startRecord);
			if (length!=-1)
				q.setMaxResults(length);
	
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0 && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());
			
			List<DisposizioniAea> res =null;
			try {
				res = q.list();
			} catch(Exception ex) {
				ex.printStackTrace();
				return null;
			}
			return res;
		} finally {
			if (tx)
				commit();
		}
	}
	
	public List<String> exportFiltered(RicercaDisposizioniFilterBean ricercaDisposizioniFilterBean, String profiloUtente, AppVariables appVariables, String userID) {
		List<DisposizioniAea> disposizioni = filter(-1,0,null,ricercaDisposizioniFilterBean,null);
		boolean tx = startTransaction();
		try {
			List<String> res = generateCsv(disposizioni);
			return res;
		} finally {
			if (tx)
				commit();
		}
	}

	
	public List<String> export(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID) {
		List<String> res = null;
		boolean tx = startTransaction();
		try {
			if ("DistinteBanca".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_DISTINTE_BANCA;
			else if ("DistinteFlussiInput".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FLUSSI_INPUT;
			else if ("FiltroDisposizioni".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FILTRO_DISPOSIZIONI;
			else if  ("FiltroDisposizioniReadOnly".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_LISTA_DISPOSIZIONI_READONLY;
	
			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, false, tipoRicerca, null, null);
			
			if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
				sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
			
			Query q = currentSession().createSQLQuery(sql)
					.addEntity("d", DisposizioniAea.class);
	
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0  && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());
			
			List<DisposizioniAea> disposizioni=null;
			
			try {
				disposizioni = q.list();
			} catch (Exception ex) {
				ex.printStackTrace();
				disposizioni = new ArrayList<DisposizioniAea>();
			}		
			
			res = generateCsv(disposizioni);
			return res;
		} finally {
			if (tx)
				commit();
		}
		
	}

	private List<String> generateCsv(List<DisposizioniAea> disposizioni) {
		List<String> res = new ArrayList<String>();
		res.add("StatoConvalida;iddisposizione;StatoDisposizione;DataInserimentoDisposizione;Esito;IDDisposizioneFunzioneOrdinante;" + 
				"Causale;DenominazioneDestinatario;CodiceFiscaleSottoscrittore;Codice_Abi_Destinatario;Cab_Destinatario;Conto_Destinatario;"+
				"Cin;CodicePaese;CheckDigit;Banca_Sportello_Domic;Intestatario_Conto;CodiceFiscaleIntestatarioConto;StatoAllineamento;" +
				"Sottocampo_Descrizione;DataUltimoEsitoAcquisito;IDDistintaBanca;EsitoSepaRsnCode;EsitoSepaAddtlInf"
			);
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		SimpleDateFormat sdfTime = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		
		for(DisposizioniAea disposizione: disposizioni)
			res.add(
				"\"" + safeString(decodificaStato(disposizione.getStatoConvalida()))+"\";" +
				"\"" + safeString(disposizione.getIddisposizione().toString())+"\";" +	
				"\"" + safeString(disposizione.getStatoDisposizione())+"\";" +
				"\"" + (disposizione.getDataInserimentoDisposizione()!=null?sdfTime.format(disposizione.getDataInserimentoDisposizione()):"")+"\";" +
				"\"" + safeString(disposizione.getEsito())+"\";" +
				"\"" + safeString(disposizione.getIddisposizioneFunzioneOrdinante())+"\";" +
				"\"" + safeString(disposizione.getCausale())+"\";" +
				"\"" + safeString(disposizione.getDenominazioneDestinatario())+"\";" +
				"\"" + safeString(disposizione.getCodiceFiscaleSottoscrittore())+"\";" +
				"\"" + safeString(disposizione.getCodiceAbiDestinatario())+"\";" +
				"\"" + safeString(disposizione.getCabDestinatario())+"\";" +
				"\"" + safeString(disposizione.getContoDestinatario())+"\";" +
				"\"" + safeString(disposizione.getCin())+"\";" +
				"\"" + safeString(disposizione.getCodicePaese())+"\";" +
				"\"" + safeString(disposizione.getCheckDigit())+"\";" +
				"\"" + safeString(disposizione.getBancaSportelloDomic())+"\";" +
				"\"" + safeString(disposizione.getIntestatarioConto())+"\";" +
				"\"" + safeString(disposizione.getCodiceFiscaleIntestatarioConto())+"\";" +
				"\"" + safeString(decodeCombo("AEA", "StatoAllineamento", disposizione.getStatoAllineamento()))+"\";" +
				"\"" + safeString(disposizione.getSottocampoDescrizione())+"\";" +
				"\"" + (disposizione.getDataUltimoEsitoAcquisito()!=null? sdf.format(disposizione.getDataUltimoEsitoAcquisito()):"")+"\";" + 
				"\"" + safeString(disposizione.getIddistintaBanca().toString())+"\";" +
				"\"" + safeString(decodeCombo("AEA", "EsitoSepaRsnCode", disposizione.getEsitoSepaRsnCode()))+"\";" +
				"\"" + safeString(disposizione.getEsitoSepaAddtlInf())+"\";"
			);
		return res;
	}	

	private String decodeCombo(String tipologia, String campo, String codice) {
		return genericComboDAO.getComboValue("Combo_Disposizioni",  tipologia, campo, codice);
	}
	

	private String decodificaStato(Short statoConvalida) {
		switch(statoConvalida) {
		case -1: return "Corretta";
		case 2: return "Warning";
		default: return "Errata";
		}
	}

	private String decodificaStatoDisposizione(Short stato) {
		switch(stato) {
		case -1: return "Corretta";
		case 2: return "Warning";
		default: return "Errata";
		}
	}

	
	public List<DisposizioniAea> listDistinteBanca(int startRecord, int length, DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID, Integer idDistintaBanca)  {
		List<DisposizioniAea> res = null;
		boolean tx = startTransaction();
		try {
		
			if ("DistinteBanca".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_DISTINTE_BANCA;
			else if ("DistinteFlussiInput".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FLUSSI_INPUT;
			else if ("FiltroDisposizioni".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FILTRO_DISPOSIZIONI;
	
			
			tipoRicerca = TipoRicerca.TR_DISTINTE_BANCA;
			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, false,tipoRicerca, idDistintaBanca, disposizioniFiltroBean.getOrderField());
			
	//		if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
	//			sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
	//		
			Query q = currentSession().createSQLQuery(sql)
					.addEntity(DisposizioniAea.class);
	
			q
				.setFirstResult(startRecord)
				.setMaxResults(length);
	
			res=null;
			
			try{
				res= q.list();
			} catch(Exception ex) {
				ex.printStackTrace();
			}
		} finally {
			if (tx)
				commit();
		}
		return res;
	}
	
	public List<DisposizioniAea> listDistinteInput(int startRecord, int length, DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID, Integer idDistintaInput)  {
		List<DisposizioniAea> res = null;
		boolean tx = startTransaction();
		try {

			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, false, tipoRicerca, idDistintaInput, null);
			
			if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
				sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
			
			Query q = currentSession().createSQLQuery(sql)
					.addEntity(DisposizioniAea.class);
	
			q
				.setFirstResult(startRecord)
				.setMaxResults(length);
	
			res = null;
			try{
				res = q.list();
			} catch(Exception ex) {
				ex.printStackTrace();
			}
		} finally {
			if (tx)
				commit();
		}
		return res;
	}

	
	
	private String generateQuery(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID, boolean doCount, boolean addLookupFields, TipoRicerca tipoRicerca, Integer idDistintaBanca, String orderField) {
		
		String sql = "select " + (doCount  
				? "Count(*)"
				: "{d.*} ");
		
		if (!doCount && addLookupFields)
			sql += ",{cd.*}";
		
		sql += " from Disposizioni_AEA d WITH (NOLOCK)";

		if (addLookupFields)
			sql += " left join Combo_Disposizioni cd on cd.Tipologia='AEA' And cd.Campo='Causale' And cd.Codice=d.causale ";
		
		if ("DistinteBanca".equals(disposizioniFiltroBean.getTipoChiamata()))
			tipoRicerca = TipoRicerca.TR_DISTINTE_BANCA;
		else if ("DistinteFlussiInput".equals(disposizioniFiltroBean.getTipoChiamata()))
			tipoRicerca = TipoRicerca.TR_FLUSSI_INPUT;
		else if ("FiltroDisposizioni".equals(disposizioniFiltroBean.getTipoChiamata()))
			tipoRicerca = TipoRicerca.TR_FILTRO_DISPOSIZIONI;
		else if ("FiltroDisposizioniReadOnly".equals(disposizioniFiltroBean.getTipoChiamata()))
			tipoRicerca = TipoRicerca.TR_LISTA_DISPOSIZIONI_READONLY;
		else
			tipoRicerca = TipoRicerca.TR_LISTA_DISPOSIZIONI;
		
		switch (tipoRicerca) {
			case TR_LISTA_DISPOSIZIONI:
				 sql += " LEFT JOIN DistintaFlussiInput WITH (NOLOCK) ON DistintaFlussiInput.IDDistintaFlusso = d.IDDistintaFlussoInput where 1=1 ";

				if ("UO".equals(profiloUtente)) {
					sql += " and FunzioneOrdinante = :funzioneOrdinante";
					sql += " AND (StatoDisposizione='Inserita' OR StatoDisposizione='Approvata' OR StatoDisposizione='Confermata')";
					sql += " AND (ProvenienzaDisposizione='Manuale')";
					sql += " AND (ISNULL(DistintaFlussiInput.MassiveLoadStatus,3) = 3)";
				} else if ("UR".equals(profiloUtente)) {
					sql += addUserFilters(userID, appVariables.getGuid());
		            sql += " AND (StatoDisposizione='Inserita' OR StatoDisposizione='Approvata' OR StatoDisposizione='Confermata')";
		            sql += " AND (ProvenienzaDisposizione='Manuale')";
		            sql += " AND (ISNULL(DistintaFlussiInput.MassiveLoadStatus,3) = 3)";
		            if (!doCount)
		            	sql += ((orderField==null||"".equals(orderField))? " ORDER BY d.ID" : getSQLOrderBy(orderField));
				} else if ("TO".equals(profiloUtente) || "TR".equals(profiloUtente)|| "VI".equals(profiloUtente)) {
					sql +=  " and (StatoDisposizione='Approvata' OR StatoDisposizione='Confermata')";
		            sql += " AND (ISNULL(DistintaFlussiInput.MassiveLoadStatus,3) = 3)";
				}
				

				break;
				
			case TR_DISTINTE_BANCA:
				sql += " where (StatoDisposizione='Predisposta' OR StatoDisposizione='Validata' OR StatoDisposizione='Disposta' OR StatoDisposizione='Inviata' OR StatoDisposizione='Scartata' OR StatoDisposizione='Esitata' OR StatoDisposizione='Cancellata')  ";
				sql += " and idDistintaBanca="+ disposizioniFiltroBean.getIdDistintaBanca().toString();
				break;
				
			case TR_FLUSSI_INPUT:
				sql += " where (StatoDisposizione='Approvata' OR StatoDisposizione='Confermata' OR StatoDisposizione='Predisposta' OR StatoDisposizione='Validata' OR StatoDisposizione='Scartata' OR StatoDisposizione='Disposta' OR StatoDisposizione='Inviata' OR StatoDisposizione='Esitata' OR StatoDisposizione='Cancellata')";
				sql += " and IDDistintaFlussoInput=" + disposizioniFiltroBean.getIdDistintaFlusso().toString();
			
				break;
				
			default:
				sql += " where 1=1 ";
		}
		
		
		if (disposizioniFiltroBean!=null) {
			sql += addFiltriDisposizione(disposizioniFiltroBean);
			
		}
		
//		if (!doCount)
//			sql += ((orderField==null||"".equals(orderField))? " ORDER BY Disposizioni_AEA.ID" : getSQLOrderBy(orderField));

		
		return 	sql;
		
	}

	private String addFiltriDisposizione(DisposizioniFiltroBean disposizioniFiltroBean) {
		String sql="";
		if (disposizioniFiltroBean.getInErrore()) {
			sql += " and StatoConvalida<>-1";
		}

		if (disposizioniFiltroBean.getDestinatario()!=null && !"".equals(disposizioniFiltroBean.getDestinatario()))
			sql += " and denominazioneDestinatario like '%" + disposizioniFiltroBean.getDestinatario() + "%'"; 
		if (!"".equals(disposizioniFiltroBean.getStatoDisposizioni()))
			sql += " and statoDisposizione = '" + disposizioniFiltroBean.getStatoDisposizioni()+"'";
		if (!"".equals(disposizioniFiltroBean.getIdFunzioneOrdinante()))
			sql += " and iddisposizioneFunzioneOrdinante ='" + disposizioniFiltroBean.getIdFunzioneOrdinante()+"'";
		String importo = toDouble(disposizioniFiltroBean.getImporto());
		if (!"0".equals(importo))
			sql += " and importodbgrid=" + importo.replace(',','.');
		if (!"".equals(disposizioniFiltroBean.getStatoConvalida()))
			 sql += " and statoConvalida='" +disposizioniFiltroBean.getStatoConvalida() + "'";
		
		if (!StringUtilities.empty(disposizioniFiltroBean.getCodiceClienteDebitore()))
			sql += " and codiceClienteDebitore='" + disposizioniFiltroBean.getCodiceClienteDebitore()+"' ";
		
		if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0 && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
			sql += " and d.id in (:ids) ";
		
		return sql;
	}
	
	@SuppressWarnings("rawtypes")
	private String addUserFilters(String userID, String guid) {
		Query q = currentSession().createSQLQuery("EXEC spSecurityUtenteFunzioni :userid, :guid");
		q
			.setParameter("userid", userID)
			.setParameter("guid", guid)
		 	.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);		
		
		List res = q.list();
		
		String filters="";
		
		if (res.size()>0) {
			filters += "(FunzioneOrdinante='"+((Map)res.get(0)).get("FunzioneOrdinante")+"'";
			for (int i=1;i<res.size();i++) {
				
				Map row = (Map) res.get(i);
				filters += " OR (FunzioneOrdinante=" + row.get("FunzioneOrdinante") + "'";						
				
			}
			filters += ")";
		}
		
		return filters;
		
	
	}

	private Criteria addFilters(Criteria crit, DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables) {
		
		
		if (!"".equals(disposizioniFiltroBean.getDestinatario()))
			crit.add(Restrictions.ilike("denominazioneDestinatario", "%" + disposizioniFiltroBean.getDestinatario() + "%"));
		if (!"".equals(disposizioniFiltroBean.getStatoDisposizioni()))
			crit.add(Restrictions.eq("statoDisposizione", disposizioniFiltroBean.getStatoDisposizioni()));
		if (!"".equals(disposizioniFiltroBean.getIdFunzioneOrdinante()))
			crit.add(Restrictions.eq("iddisposizioneFunzioneOrdinante", disposizioniFiltroBean.getIdFunzioneOrdinante()));
		String importo = toDouble(disposizioniFiltroBean.getImporto());
		if (!"0".equals(importo))
			crit.add(Restrictions.eq("importo",importo));
		if (!"".equals(disposizioniFiltroBean.getStatoConvalida()))
			crit.add(Restrictions.eq("statoConvalida", disposizioniFiltroBean.getStatoConvalida()));
		
		
		
		return crit;				
	}
	
	public String toDouble(String importo) {
		DecimalFormat df = new DecimalFormat("#.00"); 
		try {
			Double dbl = Double.parseDouble(importo.replace(",", "."));
			String res = df.format(dbl);
			return res.replace(".", ",");
		} catch (Exception ex) {
			return "0";
		}
	}


	public List<LogModificheBean> logStati(Integer id) {
		List<LogModificheBean> res = null;
		boolean tx = startTransaction();
		try {
			String sql = "select id, userId, data, ora, utente, nomeCampo nomeCampo, cast(campoPreModifica as varchar(255)) campoPreModifica, cast(campoPostModifica as varchar(255)) as campoPostModifica " +
						" from LogModificheDisposizioni where iddisposizione=:id and NomeCampo='StatoDisposizione'"+
						" order by Data, Ora, id";
					
			Query q = currentSession().createSQLQuery(sql);
			q.setResultTransformer(new AliasToBeanResultTransformer(LogModificheBean.class));
			
			q.setParameter("id", id);	
			res = q.list();
		} finally {
			if (tx)
				commit();
		}
		return res;
	}
	
	public List<LogModificheBean> logVariazioni(Integer id) {
		List<LogModificheBean> res;
		boolean tx = startTransaction();		
		try {
			String sql = "select id, userId, data, ora, utente, nomeCampo, cast(campoPreModifica as varchar(255)) campoPreModifica, cast(campoPostModifica as varchar(255)) as campoPostModifica " +
					" from LogModificheDisposizioni where iddisposizione=:id and NomeCampo<>'StatoDisposizione'"+
					" order by Data, Ora, id";
				
			Query q = currentSession().createSQLQuery(sql);
			q.setResultTransformer(new AliasToBeanResultTransformer(LogModificheBean.class));
			
			q.setParameter("id", id);	
			res =  q.list();
		} finally {
			if (tx)
				commit();
		}
		return res;
	}

	public Integer save(DisposizioniAea disposizione, UserData userData, AppVariables appVariables)  {
		boolean tx = startTransaction();
		Integer res = -1;
		try {
		
			ProcedureCall call = currentSession().createStoredProcedureCall("spModifyDisposizioni_AEA");
			
	
			call.registerParameter("Result",  Integer.class, ParameterMode.OUT);
	
			
			call.registerParameter("SecurityUserId", String.class, ParameterMode.IN).bindValue(appVariables.getUserId());
			call.registerParameter("SecurityGuid", String.class, ParameterMode.IN).bindValue(appVariables.getGuid());
			call.registerParameter("ID", Integer.class, ParameterMode.IN).bindValue(disposizione.getId());
			call.registerParameter("IDDisposizione", Integer.class, ParameterMode.IN).bindValue(disposizione.getIddisposizione());
			call.registerParameter("IDDistintaBanca", Integer.class, ParameterMode.IN).bindValue(disposizione.getIddistintaBanca());
			call.registerParameter("FlagIDDistintaBanca", Boolean.class, ParameterMode.IN).bindValue(disposizione.getFlagIddistintaBanca());
			call.registerParameter("IDOrdinante", Integer.class, ParameterMode.IN).bindValue(disposizione.getIdordinante());
			call.registerParameter("IDDestinatario", Integer.class, ParameterMode.IN).bindValue(disposizione.getIddestinatario());
			call.registerParameter("IDDistintaFlussoInput", Integer.class, ParameterMode.IN).bindValue(disposizione.getIddistintaFlussoInput());
			call.registerParameter("NumeroDisposizioneDistinta", Integer.class, ParameterMode.IN).bindValue(disposizione.getNumeroDisposizioneDistinta());
			call.registerParameter("Causale", String.class, ParameterMode.IN).bindValue(disposizione.getCausale());
			call.registerParameter("FlagCausale", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCausale());
			call.registerParameter("Codice_Abi_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceAbiOrdinante());
			call.registerParameter("FlagCodice_Abi_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceAbiOrdinante());
			call.registerParameter("Cab_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getCabOrdinante());
			call.registerParameter("FlagCab_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCabOrdinante());
			call.registerParameter("Conto_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getContoOrdinante());
			call.registerParameter("FlagConto_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagContoOrdinante());
			call.registerParameter("Codice_Abi_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceAbiDestinatario());
			call.registerParameter("FlagCodice_Abi_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceAbiDestinatario());
			call.registerParameter("Cab_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getCabDestinatario());
			call.registerParameter("FlagCab_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCabDestinatario());
			call.registerParameter("Conto_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getContoDestinatario());
			call.registerParameter("FlagConto_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagContoDestinatario());
			call.registerParameter("StatoConvalida", Short.class, ParameterMode.IN).bindValue(disposizione.getStatoConvalida());
			call.registerParameter("Banca_Sportello_Domic", String.class, ParameterMode.IN).bindValue(disposizione.getBancaSportelloDomic());
			call.registerParameter("FlagBanca_Sportello_Domic", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagBancaSportelloDomic());
			call.registerParameter("Cin", String.class, ParameterMode.IN).bindValue(disposizione.getCin());
			call.registerParameter("FlagCin", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCin());
			call.registerParameter("Codice_Sia_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceSiaOrdinante());
			call.registerParameter("FlagCodice_Sia_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceSiaOrdinante());
			call.registerParameter("TipoCodice", String.class, ParameterMode.IN).bindValue(disposizione.getTipoCodice());
			call.registerParameter("FlagTipoCodice", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagTipoCodice());
			call.registerParameter("Indirizzo_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getIndirizzoOrdinante());
			call.registerParameter("FlagIndirizzo_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagIndirizzoOrdinante());
			call.registerParameter("Località_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getLocalitàOrdinante());
			call.registerParameter("FlagLocalità_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagLocalitàOrdinante());
			call.registerParameter("Codice_Fiscale_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceFiscaleOrdinante());
			call.registerParameter("FlagCodice_Fiscale_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceFiscaleOrdinante());
			call.registerParameter("DenominazioneDestinatario", String.class, ParameterMode.IN).bindValue(disposizione.getDenominazioneDestinatario());
			call.registerParameter("FlagDenominazioneDestinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDenominazioneDestinatario());
			call.registerParameter("Codice_Fiscale_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceFiscaleDestinatario());
			call.registerParameter("FlagCodice_Fiscale_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceFiscaleDestinatario());
			call.registerParameter("Indirizzo_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getIndirizzoDestinatario());
			call.registerParameter("FlagIndirizzo_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagIndirizzoDestinatario());
			call.registerParameter("Cap_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getCapDestinatario());
			call.registerParameter("FlagCap_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCapDestinatario());
			call.registerParameter("Città_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getCittàDestinatario());
			call.registerParameter("FlagCittà_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCittàDestinatario());
			call.registerParameter("Provincia_Destinatario", String.class, ParameterMode.IN).bindValue(disposizione.getProvinciaDestinatario());
			call.registerParameter("FlagProvincia_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagProvinciaDestinatario());
			call.registerParameter("CodiceClienteDebitore", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceClienteDebitore());
			call.registerParameter("FlagCodiceClienteDebitore", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceClienteDebitore());
			call.registerParameter("Azienda_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getAziendaOrdinante());
			call.registerParameter("FlagAzienda_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagAziendaOrdinante());
			call.registerParameter("ErroriCampiObbligatori", Short.class, ParameterMode.IN).bindValue(disposizione.getErroriCampiObbligatori());
			call.registerParameter("ErroriCongruenza", Short.class, ParameterMode.IN).bindValue(disposizione.getErroriCongruenza());
			call.registerParameter("ErroriCampiData", Short.class, ParameterMode.IN).bindValue(disposizione.getErroriCampiData());
			call.registerParameter("ErroriPiazzatura", Short.class, ParameterMode.IN).bindValue(disposizione.getErroriPiazzatura());
			call.registerParameter("FlagStampa", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStampa());
			call.registerParameter("CoordinateIBANordinante", String.class, ParameterMode.IN).bindValue(disposizione.getCoordinateIbanordinante());
			call.registerParameter("FlagCoordinateIBANordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCoordinateIbanordinante());
			call.registerParameter("CoordinateIBANbeneficiario", String.class, ParameterMode.IN).bindValue(disposizione.getCoordinateIbanbeneficiario());
			call.registerParameter("FlagCoordinateIBANbeneficiario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCoordinateIbanbeneficiario());
			call.registerParameter("DescrizioneConto", String.class, ParameterMode.IN).bindValue(disposizione.getDescrizioneConto());
			call.registerParameter("FlagDescrizioneConto", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDescrizioneConto());
			call.registerParameter("Esito", String.class, ParameterMode.IN).bindValue(disposizione.getEsito());
			call.registerParameter("FlagEsito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagEsito());
			call.registerParameter("TipoCodiceRiferimento", String.class, ParameterMode.IN).bindValue(disposizione.getTipoCodiceRiferimento());
			call.registerParameter("FlagTipoCodiceRiferimento", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagTipoCodiceRiferimento());
			call.registerParameter("DescrizioneEsito", String.class, ParameterMode.IN).bindValue(disposizione.getDescrizioneEsito());
			call.registerParameter("FlagDescrizioneEsito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDescrizioneEsito());
			call.registerParameter("TipoAnomalia", String.class, ParameterMode.IN).bindValue(disposizione.getTipoAnomalia());
			call.registerParameter("FlagTipoAnomalia", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagTipoAnomalia());
			call.registerParameter("ValutaOrdinante", Date.class, ParameterMode.IN).bindValue(disposizione.getValutaOrdinante());
			call.registerParameter("FlagValutaOrdinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagValutaOrdinante());
			call.registerParameter("ValutaBeneficiario", Date.class, ParameterMode.IN).bindValue(disposizione.getValutaBeneficiario());
			call.registerParameter("FlagValutaBeneficiario", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagValutaBeneficiario());
			call.registerParameter("DataOrdine", Date.class, ParameterMode.IN).bindValue(disposizione.getDataOrdine());
			call.registerParameter("FlagDataOrdine", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDataOrdine());
			call.registerParameter("DataContabileAddebito", Date.class, ParameterMode.IN).bindValue(disposizione.getDataContabileAddebito());
			call.registerParameter("FlagDataContabileAddebito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDataContabileAddebito());
			call.registerParameter("DataEsecuzione", Date.class, ParameterMode.IN).bindValue(disposizione.getDataEsecuzione());
			call.registerParameter("FlagDataEsecuzione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDataEsecuzione());
			call.registerParameter("ImportoCommissioni", String.class, ParameterMode.IN).bindValue(disposizione.getImportoCommissioni());
			call.registerParameter("FlagImportoCommissioni", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagImportoCommissioni());
			call.registerParameter("ImportoSpese", String.class, ParameterMode.IN).bindValue(disposizione.getImportoSpese());
			call.registerParameter("FlagImportoSpese", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagImportoSpese());
			call.registerParameter("ImportoPenali", String.class, ParameterMode.IN).bindValue(disposizione.getImportoPenali());
			call.registerParameter("FlagImportoPenali", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagImportoPenali());
			call.registerParameter("NumeroAssegnoEmesso", String.class, ParameterMode.IN).bindValue(disposizione.getNumeroAssegnoEmesso());
			call.registerParameter("FlagNumeroAssegnoEmesso", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagNumeroAssegnoEmesso());
			call.registerParameter("UserID", String.class, ParameterMode.IN).bindValue(disposizione.getUserId());
			call.registerParameter("ProvenienzaDisposizione", String.class, ParameterMode.IN).bindValue(disposizione.getProvenienzaDisposizione());
			call.registerParameter("TipoFlussoInput", String.class, ParameterMode.IN).bindValue(disposizione.getTipoFlussoInput());
			call.registerParameter("IDDisposizioneFunzioneOrdinante", String.class, ParameterMode.IN).bindValue(disposizione.getIddisposizioneFunzioneOrdinante());
			call.registerParameter("DataInserimentoDisposizione", Date.class, ParameterMode.IN).bindValue(disposizione.getDataInserimentoDisposizione());
			call.registerParameter("DataFlussoDisposizione", Date.class, ParameterMode.IN).bindValue(disposizione.getDataFlussoDisposizione());
			call.registerParameter("DataEsitoDisposizione", Date.class, ParameterMode.IN).bindValue(disposizione.getDataEsitoDisposizione());
			call.registerParameter("FlagDataEsitoDisposizione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDataEsitoDisposizione());
			call.registerParameter("StatoDisposizione", String.class, ParameterMode.IN).bindValue(disposizione.getStatoDisposizione());
			call.registerParameter("FlagStatoDisposizione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStatoDisposizione());
			call.registerParameter("CodiceSocietà", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceSocieta());
			call.registerParameter("FlagCodiceSocietà", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceSocieta());
			call.registerParameter("FunzioneOrdinante", String.class, ParameterMode.IN).bindValue(disposizione.getFunzioneOrdinante());
			call.registerParameter("FlagFunzioneOrdinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagFunzioneOrdinante());
			call.registerParameter("ContabilizzazioneMovimento", Boolean.class, ParameterMode.IN).bindValue(disposizione.isContabilizzazioneMovimento());
			call.registerParameter("FlagContabilizzazioneMovimento", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagContabilizzazioneMovimento());
			call.registerParameter("ForzaStatoAR", Boolean.class, ParameterMode.IN).bindValue(disposizione.isForzaStatoAr());
			call.registerParameter("LastSaved", byte[].class, ParameterMode.IN).bindValue(disposizione.getLastSaved());
			call.registerParameter("Divisa_Conto_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getDivisaContoOrdinante());
			call.registerParameter("FlagDivisa_Conto_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.getFlagDivisaContoOrdinante());
			call.registerParameter("NoteFunzioneOrdinante", String.class, ParameterMode.IN).bindValue(disposizione.getNoteFunzioneOrdinante());
			call.registerParameter("FlagNoteFunzioneOrdinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagNoteFunzioneOrdinante());
			call.registerParameter("NoteTesoreria", String.class, ParameterMode.IN).bindValue(disposizione.getNoteTesoreria());
			call.registerParameter("FlagNoteTesoreria", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagNoteTesoreria());
			call.registerParameter("Codice_di_Riferimento", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceDiRiferimento());
			call.registerParameter("FlagCodice_di_Riferimento", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceDiRiferimento());
			call.registerParameter("CodiceAutorizzazione", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceAutorizzazione());
			call.registerParameter("FlagCodiceAutorizzazione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceAutorizzazione());
			call.registerParameter("CodiceFiscaleSottoscrittore", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceFiscaleSottoscrittore());
			call.registerParameter("FlagCodiceFiscaleSottoscrittore", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceFiscaleSottoscrittore());
			call.registerParameter("CodicePaese", String.class, ParameterMode.IN).bindValue(disposizione.getCodicePaese());
			call.registerParameter("FlagCodicePaese", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodicePaese());
			call.registerParameter("CheckDigit", String.class, ParameterMode.IN).bindValue(disposizione.getCheckDigit());
			call.registerParameter("FlagCheckDigit", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCheckDigit());
			call.registerParameter("Intestatario_Conto", String.class, ParameterMode.IN).bindValue(disposizione.getIntestatarioConto());
			call.registerParameter("FlagIntestatario_Conto", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagIntestatarioConto());
			call.registerParameter("FacoltàStorno", String.class, ParameterMode.IN).bindValue(disposizione.getFacoltàStorno());
			call.registerParameter("FlagFacoltàStorno", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagFacoltàStorno());
			call.registerParameter("StatoAllineamento", String.class, ParameterMode.IN).bindValue(disposizione.getStatoAllineamento());
			call.registerParameter("FlagStatoAllineamento", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStatoAllineamento());
			call.registerParameter("Numero_Rate", String.class, ParameterMode.IN).bindValue(disposizione.getNumeroRate());
			call.registerParameter("FlagNumero_Rate", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagNumeroRate());
			call.registerParameter("Importo_Massimo_Rata", String.class, ParameterMode.IN).bindValue(disposizione.getImportoMassimoRata());
			call.registerParameter("FlagImporto_Massimo_Rata", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagImportoMassimoRata());
			call.registerParameter("Divisa_Importo_Massimo_Rata", String.class, ParameterMode.IN).bindValue(disposizione.getDivisaImportoMassimoRata());
			call.registerParameter("FlagDivisa_Importo_Massimo_Rata", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDivisaImportoMassimoRata());
			call.registerParameter("Scadenza_Prima_Rata", Date.class, ParameterMode.IN).bindValue(disposizione.getScadenzaPrimaRata());
			call.registerParameter("FlagScadenza_Prima_Rata", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagScadenzaPrimaRata());
			call.registerParameter("Scadenza_Ultima_Rata", Date.class, ParameterMode.IN).bindValue(disposizione.getScadenzaUltimaRata());
			call.registerParameter("FlagScadenza_Ultima_Rata", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagScadenzaUltimaRata());
			call.registerParameter("Sottocampo_Descrizione", String.class, ParameterMode.IN).bindValue(disposizione.getSottocampoDescrizione());
			call.registerParameter("FlagSottocampo_Descrizione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagSottocampoDescrizione());
			call.registerParameter("Data_Creazione_Disposizione", Date.class, ParameterMode.IN).bindValue(disposizione.getDataCreazioneDisposizione());
			call.registerParameter("FlagData_Creazione_Disposizione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDataCreazioneDisposizione());
			call.registerParameter("Storno_CAB_Addebito", String.class, ParameterMode.IN).bindValue(disposizione.getStornoCabAddebito());
			call.registerParameter("FlagStorno_CAB_Addebito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStornoCabAddebito());
			call.registerParameter("Storno_Conto_Addebito", String.class, ParameterMode.IN).bindValue(disposizione.getStornoContoAddebito());
			call.registerParameter("FlagStorno_Conto_Addebito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStornoContoAddebito());
			call.registerParameter("Codice_Individuale_da_Variare", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceIndividualeDaVariare());
			call.registerParameter("FlagCodice_Individuale_da_Variare", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceIndividualeDaVariare());
			call.registerParameter("Codice_Azienda_da_Variare", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceAziendaDaVariare());
			call.registerParameter("FlagCodice_Azienda_da_Variare", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceAziendaDaVariare());
			call.registerParameter("Tipo_Cod_Individuale_da_Variare", String.class, ParameterMode.IN).bindValue(disposizione.getTipoCodIndividualeDaVariare());
			call.registerParameter("FlagTipo_Cod_Individuale_da_Variare", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagTipoCodIndividualeDaVariare());
			call.registerParameter("Storno_ABI_Addebito", String.class, ParameterMode.IN).bindValue(disposizione.getStornoAbiAddebito());
			call.registerParameter("FlagStorno_ABI_Addebito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStornoAbiAddebito());
			call.registerParameter("Riferimenti_Originari", String.class, ParameterMode.IN).bindValue(disposizione.getRiferimentiOriginari());
			call.registerParameter("FlagRiferimenti_Originari", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagRiferimentiOriginari());
			call.registerParameter("Storno_Cin_Addebito", String.class, ParameterMode.IN).bindValue(disposizione.getStornoCinAddebito());
			call.registerParameter("FlagStorno_Cin_Addebito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStornoCinAddebito());
			call.registerParameter("Storno_CodicePaese_Addebito", String.class, ParameterMode.IN).bindValue(disposizione.getStornoCodicePaeseAddebito());
			call.registerParameter("FlagStorno_CodicePaese_Addebito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStornoCodicePaeseAddebito());
			call.registerParameter("Storno_CheckDigit_Addebito", String.class, ParameterMode.IN).bindValue(disposizione.getStornoCheckDigitAddebito());
			call.registerParameter("FlagStorno_CheckDigit_Addebito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagStornoCheckDigitAddebito());
			call.registerParameter("DataCreazioneFlussoOriginario", Date.class, ParameterMode.IN).bindValue(disposizione.getDataCreazioneFlussoOriginario());
			call.registerParameter("CodiceFiscaleIntestatarioConto", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceFiscaleIntestatarioConto());
			call.registerParameter("FlagCodiceFiscaleIntestatarioConto", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceFiscaleIntestatarioConto());
			call.registerParameter("DataUltimoEsitoAcquisito", Date.class, ParameterMode.IN).bindValue(disposizione.getDataUltimoEsitoAcquisito());
			call.registerParameter("FlagDataUltimoEsitoAcquisito", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDataUltimoEsitoAcquisito());
			call.registerParameter("NumeroPolizza", String.class, ParameterMode.IN).bindValue(disposizione.getNumeroPolizza());
			call.registerParameter("FlagNumeroPolizza", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagNumeroPolizza());
			call.registerParameter("NoTabellaContabilizzazione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isNoTabellaContabilizzazione());
			call.registerParameter("FlagNoTabellaContabilizzazione", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagNoTabellaContabilizzazione());
			call.registerParameter("ContoPerCassa", Boolean.class, ParameterMode.IN).bindValue(disposizione.isContoPerCassa());
			call.registerParameter("FlagContoPerCassa", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagContoPerCassa());
			call.registerParameter("TipoAllineamentoIBAN", String.class, ParameterMode.IN).bindValue(disposizione.getTipoAllineamentoIban());
			call.registerParameter("ClassificazioneConto", String.class, ParameterMode.IN).bindValue(disposizione.getClassificazioneConto());
			call.registerParameter("FlagClassificazioneConto", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagClassificazioneConto());
			call.registerParameter("TipoMandatoAEA", String.class, ParameterMode.IN).bindValue(disposizione.getTipoMandatoAea());
			call.registerParameter("FlagTipoMandatoAEA", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagTipoMandatoAea());
			call.registerParameter("TipoIncassoAEA", String.class, ParameterMode.IN).bindValue(disposizione.getTipoIncassoAea());
			call.registerParameter("FlagTipoIncassoAEA", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagTipoIncassoAea());
			call.registerParameter("Data_Sottoscrizione_Mandato", Date.class, ParameterMode.IN).bindValue(disposizione.getDataSottoscrizioneMandato());
			call.registerParameter("FlagData_Sottoscrizione_Mandato", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagDataSottoscrizioneMandato());
			call.registerParameter("RegolarizzazioneSEPA", String.class, ParameterMode.IN).bindValue(disposizione.getRegolarizzazioneSepa());
			call.registerParameter("FlagRegolarizzazioneSEPA", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagRegolarizzazioneSepa());
			call.registerParameter("Identificativo_Creditore", String.class, ParameterMode.IN).bindValue(disposizione.getIdentificativoCreditore());
			call.registerParameter("FlagIdentificativo_Creditore", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagIdentificativoCreditore());
			call.registerParameter("NomeSupportoFlussoInputCBI", String.class, ParameterMode.IN).bindValue(disposizione.getNomeSupportoFlussoInputCbi());
			call.registerParameter("FlagNomeSupportoFlussoInputCBI", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagNomeSupportoFlussoInputCbi());
			call.registerParameter("BIC_Creditore", String.class, ParameterMode.IN).bindValue(disposizione.getBicCreditore());
			call.registerParameter("FlagBIC_Creditore", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagBicCreditore());
			call.registerParameter("Identificativo_Mandato", String.class, ParameterMode.IN).bindValue(disposizione.getIdentificativoMandato());
			call.registerParameter("FlagIdentificativo_Mandato", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagIdentificativoMandato());
			call.registerParameter("Codice_CUC_Ordinante", String.class, ParameterMode.IN).bindValue(disposizione.getCodiceCucOrdinante());
			call.registerParameter("FlagCodice_CUC_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagCodiceCucOrdinante());
			call.registerParameter("EsitoSepaRsnCode", String.class, ParameterMode.IN).bindValue(disposizione.getEsitoSepaRsnCode());
			call.registerParameter("FlagEsitoSepaRsnCode", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagEsitoSepaRsnCode());
			call.registerParameter("EsitoCBIDecodificato", String.class, ParameterMode.IN).bindValue(disposizione.getEsitoCbidecodificato());
			call.registerParameter("FlagEsitoCBIDecodificato", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagEsitoCbidecodificato());
			call.registerParameter("EsitoSepaPrtry", String.class, ParameterMode.IN).bindValue(disposizione.getEsitoSepaPrtry());
			call.registerParameter("FlagEsitoSepaPrtry", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagEsitoSepaPrtry());
			call.registerParameter("EsitoSepaAddtlInf", String.class, ParameterMode.IN).bindValue(disposizione.getEsitoSepaAddtlInf());
			call.registerParameter("FlagEsitoSepaAddtlInf", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagEsitoSepaAddtlInf());
			call.registerParameter("EsitoSepaElmRfc", String.class, ParameterMode.IN).bindValue(disposizione.getEsitoSepaElmRfc());
			call.registerParameter("FlagEsitoSepaElmRfc", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagEsitoSepaElmRfc());
			call.registerParameter("EsitoMsgId", String.class, ParameterMode.IN).bindValue(disposizione.getEsitoMsgId());
			call.registerParameter("FlagEsitoMsgId", Boolean.class, ParameterMode.IN).bindValue(disposizione.isFlagEsitoMsgId());
			call.registerParameter("DisposizioneGuid", String.class, ParameterMode.IN).bindValue(disposizione.getDisposizioneGuid());

			
			
			//Outputs outputs = call.getOutputs();
			
			try {	
			
				Integer result = (Integer)call.getOutputs().getOutputParameterValue("Result");
				
				if (result==1)
					res = 0;

				/*UpdateCountOutput output = (UpdateCountOutput) outputs.getCurrent();
			
				if (output.getUpdateCount()>0)
					res = 0;
				else
					res = 1;
			*/
			} catch (Exception ex) {
				res = 4;
			}
			
			 if (disposizione.getIddistintaBanca()!=null && disposizione.getIddistintaBanca()!=0) {
					Connection connection = getConnection();
					CallableStatement proc;
					try {
						proc = connection.prepareCall("{? = call spRecalcDistinta (?,?,?)}");
							
						proc.registerOutParameter(1, Types.VARCHAR);
						proc.setString(2, appVariables.getUserId());
						proc.setString(3, appVariables.getGuid());
						proc.setObject(4, disposizione.getIddistintaBanca());
						
						proc.execute();
						proc.getMoreResults();
							
						proc.getInt(1);
							
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						return -1;
					}
			 }
		} finally {
			if (tx)
				commit();
		}
		return res;
	}
	
	
/********************** Filtro generale disposizioni ******************/
	
	public List<DisposizioniAea> filter(int startRecord, int length, String orderField, RicercaDisposizioniFilterBean filterBean, DisposizioniFiltroBean disposizioniFiltroBean){
		List<DisposizioniAea> res = null;
		boolean tx = startTransaction();
		try {
			String sql = "select disposizioni_aea.* from disposizioni_aea WITH (NOLOCK)"+
						" LEFT JOIN DistintaFlussiInput WITH (NOLOCK) ON DistintaFlussiInput.IDDistintaFlusso = Disposizioni_aea.IDDistintaFlussoInput";
			sql += " where isNull(DistintaFlussiInput.MassiveLoadStatus,3) = 3";
		
			sql += addFiltersToQuery(filterBean);
			if (disposizioniFiltroBean!=null)
				sql += addFiltriDisposizione(disposizioniFiltroBean);
			
			if (orderField!=null)
				sql += getSQLOrderBy(orderField);
			else
				sql += " order by id";
			
			SQLQuery q=currentSession().createSQLQuery(sql);
			q=setQueryParameters(q, filterBean);
			q.addEntity(DisposizioniAea.class);
			
			if (startRecord>=0)
				q.setFirstResult(startRecord);
			if (length>0)
				q.setMaxResults(length);
			
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0  && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());
			
			res=null;
			
			try {
				res = q.list();
			} catch (Exception ex) {
				ex.printStackTrace();
				return new ArrayList<DisposizioniAea>();
			}
				
		} finally {		
			if (tx)
				commit(); 
		}
		return res;
	}
	
	
	public Integer countFilter(RicercaDisposizioniFilterBean filterBean, DisposizioniFiltroBean disposizioniFiltroBean) {
		Integer res = 0;
		boolean tx = startTransaction();
		try {
			String sql = "select count(*) from disposizioni_Aea WITH (NOLOCK)"+
						" LEFT JOIN DistintaFlussiInput WITH (NOLOCK) ON DistintaFlussiInput.IDDistintaFlusso = disposizioni_aea.IDDistintaFlussoInput";
			sql += " where isNull(DistintaFlussiInput.MassiveLoadStatus,3) = 3";
		
			sql += addFiltersToQuery(filterBean);
			if (disposizioniFiltroBean!=null)
				sql += addFiltriDisposizione(disposizioniFiltroBean);
			
			SQLQuery q=currentSession().createSQLQuery(sql);
			q=setQueryParameters(q, filterBean);
			
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0  && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());
			
			res = (Integer) q.uniqueResult();
		} finally {
			if (tx)
				commit(); 
		}
		return res;
	}
	
	
	private String addFiltersToQuery(RicercaDisposizioniFilterBean filterBean) {
		if (filterBean==null)
			return "";
		
		String sql = "";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		if (!StringUtilities.empty(filterBean.getFunzioneOrdinante()))
			sql +=" and funzioneOrdinante=:funzioneOrdinante";

		if (!StringUtilities.empty(filterBean.getStatoDisposizione()))
			sql += " and statoDisposizione=:statoDisposizione";
		
		if (!StringUtilities.empty(filterBean.getProvenienza()))
			sql += " and ProvenienzaDisposizione=:provenienza";
		
		if (!StringUtilities.empty(filterBean.getStatoConvalida()))
			sql += " and StatoConvalida=:StatoConvalida";
		
		if (filterBean.getFlagDaDataInserimento() && DateUtils.isDate(filterBean.getDaDataInserimento()))
			//sql += " and DataInserimentoDisposizione>='"+sdf.format(filterBean.getDaDataInserimento())+" 00:00:00'";//:DaDataInserimentoDisposizione";
			sql += " and DataInserimentoDisposizione>=:DaDataInserimentoDisposizione";
		
		if (filterBean.getFlagADataInserimento() && DateUtils.isDate(filterBean.getaDataInserimento()))
			//sql += " and DataInserimentoDisposizione<='"+sdf.format(filterBean.getaDataInserimento())+" 23:59:59'";//:ADataInserimentoDisposizione";
			sql += " and DataInserimentoDisposizione<=:ADataInserimentoDisposizione";
		
		if (!StringUtilities.empty(filterBean.getDaDistinta()))
			sql += " and IDDistintaBanca>=:daDistintaBanca";
		
		if (!StringUtilities.empty(filterBean.getaDistinta()))
			sql += " and IDDistintaBanca<=:aDistintaBanca";

		if (!StringUtilities.empty(filterBean.getDestinatario()))
			sql += " and DenominazioneDestinatario like :destinatario";

		if(!StringUtilities.empty(filterBean.getCodiceFiscale()))
			sql += " and Codice_Fiscale_Destinatario like :codiceFiscale";
		
		if(!StringUtilities.empty(filterBean.getIdUnivoco()))
			sql += " and IDDisposizione = :idUnivoco";
		
		if(!StringUtilities.empty(filterBean.getIdFunzione()))
			sql += " and IDDisposizioneFunzioneOrdinante = :idFunzione";
		
		if(!StringUtilities.empty(filterBean.getNumeroPolizza()))
			sql += " and NumeroPolizza = :numeroPolizza";
		
		if(!StringUtilities.empty(filterBean.getAbiOrdinante()))
			sql += " and Codice_Abi_Ordinante = :abiOrdinante";
		
		if(!StringUtilities.empty(filterBean.getCabOrdinante()))
			sql += " and Cab_Ordinante = :cabOrdinante";
		
		if(!StringUtilities.empty(filterBean.getContoOrdinante()))
			sql += " and Conto_Ordinante = :contoOrdinante";
		
		if(!StringUtilities.empty(filterBean.getAbiDestinatario()))
			sql += " and Codice_Abi_Destinatario = :abiDestinatario";
		
		if(!StringUtilities.empty(filterBean.getCabDestinatario()))
			sql += " and Cab_Destinatario = :cabDestinatario";
		
		if(!StringUtilities.empty(filterBean.getContoDestinatario()))
			sql += " and Conto_Destinatario = :contoDestinatario";
		
		if(!StringUtilities.empty(filterBean.getCodiceDestinatario()))
			sql += " and CodiceClienteDebitore = :codiceDestinatario";
		
		if (filterBean.getFlagDaDataRicezioneEsito() && DateUtils.isDate(filterBean.getDaDataRicezioneEsito()))
			//sql += " and DataUltimoEsitoAcquisito>='"+sdf.format(filterBean.getDaDataRicezioneEsito())+" 00:00:00'";//::DaDataRicezioneEsito";
			sql += " and DataUltimoEsitoAcquisito>=:DaDataRicezioneEsito";
		
		if (filterBean.getFlagADataRicezioneEsito() && DateUtils.isDate(filterBean.getaDataRicezioneEsito()))
			//sql += " and DataUltimoEsitoAcquisito<='"+sdf.format(filterBean.getaDataRicezioneEsito())+" 23:59:59'";//::aDataRicezioneEsito";
			sql += " and DataUltimoEsitoAcquisito<=:aDataRicezioneEsito";

		if(!StringUtilities.empty(filterBean.getEsitoDisposizione()))
			if ("0".equals(filterBean.getEsitoDisposizione()))
				sql += " and Esito is null";
			else
				sql += " and Esito = :esitoDisposizione";
		
		if(!StringUtilities.empty(filterBean.getCausaleStorno()))
			sql += " and DescrizioneEsito like :causaleStorno";
		
		if(!StringUtilities.empty(filterBean.getNumeroAssegno()))
			sql += " and NumeroAssegnoEmesso like :numeroAssegno";
		
		
		return sql;
		
	}

	private SQLQuery setQueryParameters(SQLQuery q, RicercaDisposizioniFilterBean filterBean) {
			
		if (filterBean == null)
			return q;
		
		if (!StringUtilities.empty(filterBean.getFunzioneOrdinante()))
			q.setParameter("funzioneOrdinante", filterBean.getFunzioneOrdinante());

		if (!StringUtilities.empty(filterBean.getStatoDisposizione()))
			q.setParameter("statoDisposizione", filterBean.getStatoDisposizione());
		
		if (!StringUtilities.empty(filterBean.getProvenienza()))
			q.setParameter("provenienza",filterBean.getProvenienza());
		
		if (!StringUtilities.empty(filterBean.getStatoConvalida()))
			q.setParameter("StatoConvalida",filterBean.getStatoConvalida());
		
		if (filterBean.getFlagDaDataInserimento() && DateUtils.isDate(filterBean.getDaDataInserimento()))
			q.setParameter("DaDataInserimentoDisposizione",startOfDay(filterBean.getDaDataInserimento()));
		
		if (filterBean.getFlagADataInserimento() && DateUtils.isDate(filterBean.getaDataInserimento()))
			q.setParameter("ADataInserimentoDisposizione",endOfDay(filterBean.getaDataInserimento()));
		
		if (!StringUtilities.empty(filterBean.getDaDistinta()))
			q.setParameter("daDistintaBanca",filterBean.getDaDistinta());
		
		if (!StringUtilities.empty(filterBean.getaDistinta()))
			q.setParameter("aDistintaBanca",filterBean.getaDistinta());

		if (!StringUtilities.empty(filterBean.getDestinatario()))
			q.setParameter("destinatario",filterBean.getDestinatario()+"%");

//		if (filterBean.getFlagDaValutaBeneficiario() && DateUtils.isDate(filterBean.getDaValutaBeneficiario()))
//			q.setParameter("DaDataValuta",startOfDay(filterBean.getDaValutaBeneficiario()));
//		
//		if (filterBean.getFlagAValutaBeneficiario() && DateUtils.isDate(filterBean.getaValutaBeneficiario()))
//			q.setParameter("aDataValuta",endOfDay(filterBean.getaValutaBeneficiario()));
		
		
		if(!StringUtilities.empty(filterBean.getCodiceFiscale()))
			q.setParameter("codiceFiscale", filterBean.getCodiceFiscale()+"%");
		
		if(!StringUtilities.empty(filterBean.getIdUnivoco()))
			q.setParameter("idUnivoco",filterBean.getIdUnivoco());
		
		if(!StringUtilities.empty(filterBean.getIdFunzione()))
			q.setParameter("idFunzione",filterBean.getIdFunzione());
		
		if(!StringUtilities.empty(filterBean.getNumeroPolizza()))
			q.setParameter("numeroPolizza",filterBean.getNumeroPolizza());
		
		if(!StringUtilities.empty(filterBean.getAbiOrdinante()))
			q.setParameter("abiOrdinante",filterBean.getAbiOrdinante());
		
		if(!StringUtilities.empty(filterBean.getCabOrdinante()))
			q.setParameter("cabOrdinante",filterBean.getCabOrdinante());
		
		if(!StringUtilities.empty(filterBean.getContoOrdinante()))
			q.setParameter("contoOrdinante",filterBean.getContoOrdinante());
		
		if(!StringUtilities.empty(filterBean.getAbiDestinatario()))
			q.setParameter("abiDestinatario",filterBean.getAbiDestinatario());
		
		if(!StringUtilities.empty(filterBean.getCabDestinatario()))
			q.setParameter("cabDestinatario",filterBean.getCabDestinatario());
		
		if(!StringUtilities.empty(filterBean.getContoDestinatario()))
			q.setParameter("contoDestinatario",filterBean.getContoDestinatario());
		
		if(!StringUtilities.empty(filterBean.getCodiceDestinatario()))
			q.setParameter("codiceDestinatario",filterBean.getCodiceDestinatario());
		
		if (filterBean.getFlagDaDataRicezioneEsito() && DateUtils.isDate(filterBean.getDaDataRicezioneEsito()))
			q.setParameter("DaDataRicezioneEsito",startOfDay(filterBean.getDaDataRicezioneEsito()));
		
		if (filterBean.getFlagADataRicezioneEsito() && DateUtils.isDate(filterBean.getaDataRicezioneEsito()))
			q.setParameter("aDataRicezioneEsito",endOfDay(filterBean.getaDataRicezioneEsito()));

		if(!StringUtilities.empty(filterBean.getEsitoDisposizione()))
			if (!"0".equals(filterBean.getEsitoDisposizione()))
				q.setParameter("esitoDisposizione",filterBean.getEsitoDisposizione());
		
		if(!StringUtilities.empty(filterBean.getCausaleStorno()))
			q.setParameter("causaleStorno","%"+filterBean.getCausaleStorno()+"%");
		
		if(!StringUtilities.empty(filterBean.getNumeroAssegno()))
			q.setParameter("numeroAssegno",filterBean.getNumeroAssegno());

		
		return q;
			
	}

	public List<DisposizioniAeaDecoded> listDecoded(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID)  {

		List<DisposizioniAeaDecoded> res = null;
		boolean tx = startTransaction();
		try {
			
			if ("DistinteBanca".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_DISTINTE_BANCA;
			else if ("DistinteFlussiInput".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FLUSSI_INPUT;
			else if ("FiltroDisposizioni".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_FILTRO_DISPOSIZIONI;
			else if  ("FiltroDisposizioniReadOnly".equals(disposizioniFiltroBean.getTipoChiamata()))
				tipoRicerca = TipoRicerca.TR_LISTA_DISPOSIZIONI_READONLY;
	
			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, true, tipoRicerca, null, disposizioniFiltroBean.getOrderField());
			
	//		if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
	//			sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
			
			
			Query q = currentSession().createSQLQuery(sql).addEntity("d",DisposizioniAea.class).addEntity("cd", ComboDisposizioni.class);
			q.setResultTransformer(new ResultTransformer() {
				
				@Override
				public Object transformTuple(Object[] tuple, String[] aliases) {
					return new DisposizioniAeaDecoded((DisposizioniAea) tuple[0], (ComboDisposizioni) tuple[1]);
				}
				
				@Override
				public List transformList(List collection) {
					return collection;
				}
			});	
	
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0  && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());
			
			
			res = (List<DisposizioniAeaDecoded>)q.list();// 
			
			try {
				//res = q.list();
			} catch(Exception ex) {
				ex.printStackTrace();
				return null;
			}
		} finally {
			if (tx)
				commit();
		}
		return res;
	}


	public List<DisposizioniAeaDecoded> filterDecoded(RicercaDisposizioniFilterBean filterBean){
		List<DisposizioniAeaDecoded> res = null;
		boolean tx = startTransaction();
		try {
		
			String sql = "select {d.*}, {cd.*} from disposizioni_aea d WITH (NOLOCK)"+
						" LEFT JOIN DistintaFlussiInput WITH (NOLOCK) ON DistintaFlussiInput.IDDistintaFlusso = d.IDDistintaFlussoInput"+
						" left join Combo_Disposizioni cd on cd.Tipologia='AEA' And cd.Campo='Causale' And cd.Codice=d.causale ";
			sql += " where isNull(DistintaFlussiInput.MassiveLoadStatus,3) = 3";
		
			sql += addFiltersToQuery(filterBean);
	
			
			SQLQuery q=currentSession().createSQLQuery(sql).addEntity("d",DisposizioniAea.class).addEntity("cd", ComboDisposizioni.class);
			q=setQueryParameters(q, filterBean);
			q.setResultTransformer(new ResultTransformer() {
				
				@Override
				public Object transformTuple(Object[] tuple, String[] aliases) {
					return new DisposizioniAeaDecoded((DisposizioniAea) tuple[0], (ComboDisposizioni) tuple[1]);
				}
				
				@Override
				public List transformList(List collection) {
					return collection;
				}
			});	
			

			
			res=null;
			
			try {
				res = q.list();
			} catch (Exception ex) {
				ex.printStackTrace();
				return new ArrayList<DisposizioniAeaDecoded>();
			}
		} finally {		
			if (tx)
				commit(); 
		}
		return res;
	}

	public List<DisposizioniAea> listByDistintaBancaNoTransaction(Integer idDistintaBanca) {
		Query q = currentSession().createSQLQuery("select {d.*} from Disposizioni_Aea d where iddistintabanca=" + idDistintaBanca)
				.addEntity("d", DisposizioniAea.class);
		
		List<DisposizioniAea> res = q.list();
		return res;
	}

	
	
	
}
