package dao;

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.Restrictions;
import org.hibernate.procedure.ProcedureCall;
import org.hibernate.procedure.ProcedureOutputs;
import org.hibernate.result.Output;
import org.hibernate.result.Outputs;
import org.hibernate.result.UpdateCountOutput;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import bean.AppVariables;
import bean.LogModificheBean;
import bean.LogVariazioniBean;
import bean.filters.DisposizioniFiltroBean;
import bean.filters.RicercaDisposizioniFilterBean;
import bean.query.DisposizioniRidExportBean;
import common.bean.UserData;
import common.dao.GenericDAO;
import common.dao.IDAO;
import common.utility.DateUtils;
import common.utility.StringUtilities;
import sicura.entities.DisposizioniRid;

@Repository
public class DisposizioniRidDAO extends GenericDAO<DisposizioniRid, Integer> implements IDAO<DisposizioniRid, Integer> {

	
	@Autowired
	GenericComboDAO genericComboDAO;
	@Autowired
	LogVariazioniDAO logVariazioniDAO;
	
	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<DisposizioniRid> disposizioni = list(-1,-1,disposizioniFiltroBean, profiloUtente, appVariables, appVariables.getUserId());
		
	
		try {
			for (int i=0;i<disposizioni.size();i++) {
				// verifica se la disposizione è cancellabile
				DisposizioniRid 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 = saveDisposizione(disposizione, userdata, appVariables);
					
					try {
						if (saveResult==0)
							logVariazioniDAO.saveAll(appVariables.getUserId(),appVariables.getDenominazioneUtente(), disposizione.getIddisposizione(),listaVariazioni);
					}catch(Exception ex) {
						// should never happen
						ex.printStackTrace();
					}
					return saveResult==0;
				} else
					res = false;
			}
			
		} finally {
			
		}
		return res;
	}
	
	public Integer count(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID) {
		boolean tx = startTransaction();
		
		try {
			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, true, false);
			
			Query q = currentSession().createSQLQuery(sql);
			
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0 && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());

			Integer res = ((Integer) q.uniqueResult());
			
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}

	public List<DisposizioniRid> filter(int startRecord, int length, String orderField, RicercaDisposizioniFilterBean filterBean, DisposizioniFiltroBean disposizioniFiltroBean){
		boolean tx = startTransaction();

		try{
			String sql = "select disposizioni_rid.* from disposizioni_rid WITH (NOLOCK)"+
						" LEFT JOIN DistintaFlussiInput WITH (NOLOCK) ON DistintaFlussiInput.IDDistintaFlusso = Disposizioni_RID.IDDistintaFlussoInput";
			sql += " where isNull(DistintaFlussiInput.MassiveLoadStatus,3) = 3 ";//AND RegolarizzazioneSEPA=2";
		
			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(DisposizioniRid.class);
			
			if (filterBean.getSelectedIds()!=null && filterBean.getSelectedIds().length>0 && filterBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", filterBean.getSelectedIds());
		
			
			if (startRecord>=0)
				q.setFirstResult(startRecord);
			if (length>0)
				q.setMaxResults(length);

			List<DisposizioniRid> res=null;
			
			try {
				res = q.list();
			} catch (Exception ex) {
				ex.printStackTrace();
				return new ArrayList<DisposizioniRid>();
			}
				
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}
	
	
	
	public Integer countFilter(RicercaDisposizioniFilterBean filterBean, DisposizioniFiltroBean disposizioniFiltroBean) {
		boolean tx = startTransaction();

		try{
			String sql = "select count(*) from disposizioni_rid WITH (NOLOCK)"+
						" LEFT JOIN DistintaFlussiInput WITH (NOLOCK) ON DistintaFlussiInput.IDDistintaFlusso = Disposizioni_RID.IDDistintaFlussoInput";
			sql += " where isNull(DistintaFlussiInput.MassiveLoadStatus,3) = 3 ";//AND RegolarizzazioneSEPA=2 ";
		
			sql += addFiltersToQuery(filterBean);
			if (disposizioniFiltroBean!=null)
				sql += addFiltriDisposizione(disposizioniFiltroBean);
			
			SQLQuery q=currentSession().createSQLQuery(sql);
			q=setQueryParameters(q, filterBean);
			
			Integer res = (Integer) q.uniqueResult();
			
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}

	private String addFiltersToQuery(RicercaDisposizioniFilterBean filterBean) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		String sql = "";
		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";
		
		if (filterBean.getFlagADataInserimento() && DateUtils.isDate(filterBean.getaDataInserimento()))
			sql += " and DataInserimentoDisposizione<='" + sdf.format(filterBean.getaDataInserimento())+" 23:59:59'"; //: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 (filterBean.getFlagDaValutaBeneficiario() && DateUtils.isDate(filterBean.getDaValutaBeneficiario()))
			sql += " and Data_Valuta_Destinatario>='" + sdf.format(filterBean.getDaValutaBeneficiario())+" 00:00:00'"; //:DaDataValuta";
		
		if (filterBean.getFlagAValutaBeneficiario() && DateUtils.isDate(filterBean.getaValutaBeneficiario()))
			sql += " and Data_Valuta_Destinatario<='" + sdf.format(filterBean.getaValutaBeneficiario())+" 23:59:59'"; //:aDataValuta";
		
		if(!StringUtilities.empty(filterBean.getDaImporto()))
			sql += " and ImportoDBGrid>=:daImporto";
		
		if(!StringUtilities.empty(filterBean.getaImporto()))
			sql += " and ImportoDBGrid<=:aImporto";
		
		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(!StringUtilities.empty(filterBean.getIdEndToEnd()))
			sql += " and Identificativo_EndToEnd = :idEndToEnd";
		
		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 = :numeroAssegno";

		if ("SDD Esteri".equalsIgnoreCase(filterBean.getTipoDisposizione()))
			sql += " and regolarizzazioneSepa='3'";
		
		if (filterBean.getSelectedIds()!=null && filterBean.getSelectedIds().length>0 && filterBean.getSelectedIds()[0]!=-1)
			sql += " and Disposizioni_RID.id in (:ids) ";

		
		return sql;
		
	}

	private SQLQuery setQueryParameters(SQLQuery q, RicercaDisposizioniFilterBean filterBean) {
			
		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.getDaImporto()))
			q.setParameter("daImporto",filterBean.getDaImporto().replace(',', '.'));
		
		if(!StringUtilities.empty(filterBean.getaImporto()))
			q.setParameter("aImporto",filterBean.getaImporto().replace(',', '.'));
		
		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());
//		String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, true);
//		
//		if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
//			sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
//		
//		Query q = currentSession().createSQLQuery(sql)
//				.setResultTransformer(new AliasToBeanResultTransformer(DisposizioniRidExportBean.class));
//
//		List<DisposizioniRid> disposizioni = q.list();
////		

		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(!StringUtilities.empty(filterBean.getIdEndToEnd()))
			q.setParameter("idEndToEnd",filterBean.getIdEndToEnd());
		
		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<DisposizioniRid> list(int startRecord, int length, DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID)  {
		boolean tx = startTransaction();
		List<DisposizioniRid> res=null;
		
		try {
			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, false);
			
			if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
				sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
			
			Query q = currentSession().createSQLQuery(sql)
					.addEntity(DisposizioniRid.class);
	
			if (startRecord>0 || length>0)
				q
					.setFirstResult(startRecord)
					.setMaxResults(length);
	
			if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0 && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
				q.setParameterList("ids", disposizioniFiltroBean.getSelectedIds());
			
			try {
				res = q.list();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		} finally {
			if (tx)
				tx = commit();
		}
			
		return res;
	}
	
	public List<String> exportFiltered(RicercaDisposizioniFilterBean ricercaDisposizioniFilterBean, String otherCode,
			AppVariables appVariables, String login) {
	  
	
		List<DisposizioniRid> 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<DisposizioniRid> disposizioni = list(-1,-1,disposizioniFiltroBean, profiloUtente, appVariables, userID);
		
		boolean tx = startTransaction();
		
		try {
//			String sql = generateQuery(disposizioniFiltroBean, profiloUtente, appVariables, userID, false, true);
//			
//			if (disposizioniFiltroBean.getOrderField()!=null && !"".equals(disposizioniFiltroBean.getOrderField()))
//				sql += getSQLOrderBy(disposizioniFiltroBean.getOrderField());
//			
//			Query q = currentSession().createSQLQuery(sql)
//					.setResultTransformer(new AliasToBeanResultTransformer(DisposizioniRidExportBean.class));
//	
//			List<DisposizioniRid> disposizioni = q.list();
//	//		
			List<String> res = generateCsv(disposizioni);
			
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}
	
	private List<String> generateCsvBean(List<DisposizioniRidExportBean> disposizioni) {
		List<String> res = new ArrayList<String>();
		res.add("StatoConvalida;iddisposizione;DataInserimentoDisposizione;IDDisposizioneFunzioneOrdinante;Data_Valuta_Destinatario;Data_Decorrenza_Garanzia;" + 
				"Tipo_Incasso_Rid;Importo;Descrizione_Disposizione;DenominazioneDestinatario;Codice_Abi_Destinatario;Cab_Destinatario;Banca_Sportello_Domic;" +
				"Codice_Abi_Ordinante;Conto_Ordinante;IDDistintaBanca;DescrizioneEsito;CodiceStornoSEPA;CoordinateIBANbeneficiario;DataEsitoDisposizione;"+
				"NomeSupportoFlussoInputCBI;MsgIdEsitoXML;");
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HHmm:ss");
		SimpleDateFormat sdfTime = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		
		for(DisposizioniRidExportBean disposizione: disposizioni)
			 res.add(""
//				"\"" + safeString(disposizione.getStatoConvalida())+"\";" +
//				"\"" + safeString(disposizione.getIddisposizione().toString())+"\";" +	
//				"\"" + (disposizione.getDataInserimentoDisposizione()!=null?sdfTime.format(disposizione.getDataInserimentoDisposizione()):"")+"\";" +
//				"\"" + safeString(disposizione.getIddisposizioneFunzioneOrdinante())+"\";" +
//				"\"" + (disposizione.getDataValutaDestinatario()!=null? sdf.format(disposizione.getDataValutaDestinatario()):"")+"\";" +
//				"\"" + (disposizione.getDataDecorrenzaGaranzia()!=null? sdf.format(disposizione.getDataDecorrenzaGaranzia()):"")+"\";" +
//				"\"" + disposizione.getTipoIncassoRid() + "\";" +
//				"\"" + safeString(disposizione.getImporto())+"\";" +
//				"\"" + safeString(disposizione.getDescrizioneDisposizione())+"\";" +
//				"\"" + safeString(disposizione.getDenominazioneDestinatario())+"\";" +
//				"\"" + safeString(disposizione.getCodiceAbiDestinatario())+"\";" +
//				"\"" + safeString(disposizione.getCabDestinatario())+"\";" +
//				"\"" + safeString(disposizione.getBancaSportelloDomic())+"\";" +
//				"\"" + safeString(disposizione.getCodiceAbiOrdinante())+"\";" +
//				"\"" + safeString(disposizione.getContoOrdinante())+"\";" +
//				"\"" + safeString(disposizione.getIddistintaBanca().toString())+"\";" +
//				"\"" + safeString(disposizione.getDescrizioneEsito())+"\";" +
//				"\"" + safeString( disposizione.getCodiceStornoSepa())+"\";" +
//				"\"" + safeString(disposizione.getCoordinateIbanbeneficiario())+"\";" +
//				"\"" + (disposizione.getDataEsitoDisposizione()!=null? sdf.format(disposizione.getDataEsitoDisposizione()):"")+"\";" +
//				"\"" + safeString(disposizione.getNomeSupportoFlussoInputCbi())+"\";" +
//				"\"" + safeString(disposizione.getMsgIdEsitoXml())+"\";"
			);
		return res;
	}


	private List<String> generateCsv(List<DisposizioniRid> disposizioni) {
		List<String> res = new ArrayList<String>();
		res.add("StatoConvalida;iddisposizione;DataInserimentoDisposizione;IDDisposizioneFunzioneOrdinante;Data_Valuta_Destinatario;Data_Decorrenza_Garanzia;" + 
				"Tipo_Incasso_Rid;Importo;Descrizione_Disposizione;DenominazioneDestinatario;Codice_Abi_Destinatario;Cab_Destinatario;Banca_Sportello_Domic;" +
				"Codice_Abi_Ordinante;Conto_Ordinante;IDDistintaBanca;DescrizioneEsito;CodiceStornoSEPA;CoordinateIBANbeneficiario;DataEsitoDisposizione;"+
				"NomeSupportoFlussoInputCBI;MsgIdEsitoXML;DataRicezioneEsito;");
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		SimpleDateFormat sdfTime = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		
		for(DisposizioniRid disposizione: disposizioni)
			 res.add(
				"\"" + safeString(decodificaStato(disposizione.getStatoConvalida()))+"\";" +
				"\"" + safeString(disposizione.getIddisposizione().toString())+"\";" +	
				"\"" + (disposizione.getDataInserimentoDisposizione()!=null?sdfTime.format(disposizione.getDataInserimentoDisposizione()):"")+"\";" +
				"\"" + safeString(disposizione.getIddisposizioneFunzioneOrdinante())+"\";" +
				"\"" + (disposizione.getDataValutaDestinatario()!=null? sdf.format(disposizione.getDataValutaDestinatario()):"")+"\";" +
				"\"" + (disposizione.getDataDecorrenzaGaranzia()!=null? sdf.format(disposizione.getDataDecorrenzaGaranzia()):"")+"\";" +
				"\"" + decodeCombo("RID", "Tipo_Incasso_Rid", disposizione.getTipoIncassoRid()) + "\";" +
				"\"" + safeString(disposizione.getImporto())+"\";" +
				"\"" + safeString(disposizione.getDescrizioneDisposizione())+"\";" +
				"\"" + safeString(disposizione.getDenominazioneDestinatario())+"\";" +
				"\"" + safeString(disposizione.getCodiceAbiDestinatario())+"\";" +
				"\"" + safeString(disposizione.getCabDestinatario())+"\";" +
				"\"" + safeString(disposizione.getBancaSportelloDomic())+"\";" +
				"\"" + safeString(disposizione.getCodiceAbiOrdinante())+"\";" +
				"\"" + safeString(disposizione.getContoOrdinante())+"\";" +
				"\"" + safeString((disposizione.getIddistintaBanca()!=null?disposizione.getIddistintaBanca().toString():""))+"\";" +
				"\"" + safeString(disposizione.getDescrizioneEsito())+"\";" +
				"\"" + safeString(decodeCombo("RID", "CodiceStornoSEPA", disposizione.getCodiceStornoSepa()))+"\";" +
				"\"" + safeString(disposizione.getCoordinateIbanbeneficiario())+"\";" +
				"\"" + (disposizione.getDataEsitoDisposizione()!=null? sdf.format(disposizione.getDataEsitoDisposizione()):"")+"\";" +
				"\"" + safeString(disposizione.getNomeSupportoFlussoInputCbi())+"\";" +
				"\"" + safeString(disposizione.getMsgIdEsitoXml())+"\";" +
				"\"" + (disposizione.getDataUltimoEsitoAcquisito()!=null? sdf.format(disposizione.getDataUltimoEsitoAcquisito()):"")+"\";" 
			);
		return res;
	}



	private String decodeCombo(String tipologia, String campo, String codice) {
		if (codice==null)
			return "";
		else
			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 generateQuery(DisposizioniFiltroBean disposizioniFiltroBean, String profiloUtente, AppVariables appVariables, String userID, boolean doCount, boolean forCsvExport) {
		
		String sql = "select ";
		if (forCsvExport) {
			sql += "case when Disposizioni_RID.StatoConvalida=-1 then 'Corretta' when Disposizioni_RID.StatoConvalida=2 then 'Warning' else 'Errata' end as statoConvalida," + 
					" iddisposizione, DataInserimentoDisposizione, IDDisposizioneFunzioneOrdinante, Data_Valuta_Destinatario,Data_Decorrenza_Garanzia,cd1.descrizione as tipoIncasso," + 
					" importo, Descrizione_Disposizione, denominazioneDestinatario, Codice_Abi_Destinatario, Cab_Destinatario, Banca_Sportello_Domic, Codice_Abi_Ordinante, conto_ordinante," + 
					" IDDistintaBanca, DescrizioneEsito, cd2.descrizione as codiceStornoSepa,CoordinateIBANbeneficiario,DataEsitoDisposizione,NomeSupportoFlussoInputCBI,MsgIdEsitoXML	";
		} else {
		sql += (doCount  
				? "Count(*)"
				: "Disposizioni_RID.* ");
		}
		sql += " from Disposizioni_RID WITH (NOLOCK)" ;
		
		if (forCsvExport) 
			sql += " left join Combo_Disposizioni cd1 on cd1.tipologia='RID' and cd1.campo='Tipo_Incasso_Rid' and cd1.codice=Disposizioni_RID.tipo_incasso_rid" + 
					" left join Combo_Disposizioni cd2 on cd2.tipologia='RID' and cd2.campo='CodiceStornoSEPA' and cd2.codice=Disposizioni_RID.CodiceStornoSEPA";

		
		
		if ("ListaDisposizioni".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata()) || 
			"ListaDisposizioniDanni".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())||
			"ListaDisposizioniEst".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())
			) {
			
				sql+= " LEFT JOIN DistintaFlussiInput WITH (NOLOCK) ON DistintaFlussiInput.IDDistintaFlusso = Disposizioni_RID.IDDistintaFlussoInput where 1=1 ";
			
				if ("UO".equals(appVariables.getProfiloLocale())) {
					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(appVariables.getProfiloLocale())) {
					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)";
		            sql += " ORDER BY Disposizioni_RID.ID";
				} else if ("TO".equals(appVariables.getProfiloLocale()) || "TR".equals(appVariables.getProfiloLocale()) || "VI".equals(appVariables.getProfiloLocale())) {
					sql +=  " and (StatoDisposizione='Approvata' OR StatoDisposizione='Confermata')";
		            sql += " AND (ISNULL(DistintaFlussiInput.MassiveLoadStatus,3) = 3)";
				}
				
			
		} else if ("DistinteBanca".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())) {
				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();
		} else if ("DistinteFlussiInput".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())) {
			if ("UO".equals(appVariables.getProfiloLocale())||
					"TR".equals(appVariables.getProfiloLocale())||
					"VI".equals(appVariables.getProfiloLocale())||
					"UR".equals(appVariables.getProfiloLocale())) {

				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') AND";
				sql += " IDDistintaFlussoInput=" + disposizioniFiltroBean.getIdDistintaFlusso();
			}
		} else if ("FiltroDisposizioni".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())||
				"FiltroDisposizioniReadOnly".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())||
				disposizioniFiltroBean.getTipoChiamata()==null) {
				
				sql += " where 1=1 ";
				
		} else
			sql += " where 1=1 ";

		sql += addFiltriDisposizione(disposizioniFiltroBean);

		if (disposizioniFiltroBean.getSelectedIds()!=null && disposizioniFiltroBean.getSelectedIds().length>0 && disposizioniFiltroBean.getSelectedIds()[0]!=-1)
			sql += " and Disposizioni_RID.id in (:ids) ";
		
		return sql;
		
	}

	private String addFiltriDisposizione(DisposizioniFiltroBean disposizioniFiltroBean) {
		String sql = "";
		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 (disposizioniFiltroBean.getInErrore()) {
			sql += " and StatoConvalida<>-1";
		}
		
		if ("ListaDisposizioniEst".equals(disposizioniFiltroBean.getTipoChiamata()))
			sql += " and regolarizzazioneSepa='3'";
		
		if (!StringUtilities.empty(disposizioniFiltroBean.getCodiceClienteDebitore()))
			sql += " and codiceClienteDebitore='" + disposizioniFiltroBean.getCodiceClienteDebitore()+"' ";
		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) {
		boolean tx = startTransaction();
		
		try{
			String sql = "select id, userId, data, ora, utente, nomeCampo, cast(campoPreModifica as nvarchar(255)) campoPreModifica, cast(campoPostModifica as nvarchar(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);	
			@SuppressWarnings("unchecked")
			List<LogModificheBean> res = q.list();
			
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}
	
	public List<LogModificheBean> logVariazioni(Integer id) {
		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);	
			@SuppressWarnings("unchecked")
			List<LogModificheBean> res = q.list();
			
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}
		

	public int saveDisposizione(DisposizioniRid disposizioneRid, UserData userdata, AppVariables appVariables) {
		
		boolean tx = startTransaction();
		Integer res=1;
		try {
			ProcedureCall call = currentSession().createStoredProcedureCall("spModifyDisposizioni_RID");
			
	
			call.registerParameter("Result",  Integer.class, ParameterMode.OUT);
	
			
			call.registerParameter("SecurityUserId", String.class, ParameterMode.IN).bindValue(appVariables.getUserId().trim());
			call.registerParameter("SecurityGuid", String.class, ParameterMode.IN).bindValue(appVariables.getGuid());
			call.registerParameter("ID", Integer.class, ParameterMode.IN).bindValue(disposizioneRid.getId());
			call.registerParameter("IDDisposizione", Integer.class, ParameterMode.IN).bindValue(disposizioneRid.getIddisposizione());
			call.registerParameter("IDDistintaBanca", Integer.class, ParameterMode.IN).bindValue(disposizioneRid.getIddistintaBanca());
			call.registerParameter("FlagIDDistintaBanca", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.getFlagIddistintaBanca());
			call.registerParameter("IDOrdinante", Integer.class, ParameterMode.IN).bindValue(disposizioneRid.getIdordinante());
			call.registerParameter("IDDestinatario", Integer.class, ParameterMode.IN).bindValue(disposizioneRid.getIddestinatario());
			call.registerParameter("IDDistintaFlussoInput", Integer.class, ParameterMode.IN).bindValue(disposizioneRid.getIddistintaFlussoInput());
			call.registerParameter("NumeroDisposizioneDistinta", Integer.class, ParameterMode.IN).bindValue(disposizioneRid.getNumeroDisposizioneDistinta());
			call.registerParameter("Causale", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCausale());
			call.registerParameter("FlagCausale", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCausale());
			call.registerParameter("Codice_Abi_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceAbiOrdinante());
			call.registerParameter("FlagCodice_Abi_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceAbiOrdinante());
			call.registerParameter("Cab_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCabOrdinante());
			call.registerParameter("FlagCab_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCabOrdinante());
			call.registerParameter("Conto_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getContoOrdinante());
			call.registerParameter("FlagConto_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagContoOrdinante());
			call.registerParameter("Codice_Abi_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceAbiDestinatario());
			call.registerParameter("FlagCodice_Abi_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceAbiDestinatario());
			call.registerParameter("Cab_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCabDestinatario());
			call.registerParameter("FlagCab_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCabDestinatario());
			call.registerParameter("Conto_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getContoDestinatario());
			call.registerParameter("FlagConto_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagContoDestinatario());
			call.registerParameter("StatoConvalida", Short.class, ParameterMode.IN).bindValue(disposizioneRid.getStatoConvalida());
			call.registerParameter("Banca_Sportello_Domic", String.class, ParameterMode.IN).bindValue(disposizioneRid.getBancaSportelloDomic());
			call.registerParameter("FlagBanca_Sportello_Domic", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagBancaSportelloDomic());
			call.registerParameter("Cin", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCin());
			
			call.registerParameter("FlagCin", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCin());
			call.registerParameter("Codice_Sia_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceSiaOrdinante());
			call.registerParameter("FlagCodice_Sia_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceSiaOrdinante());
			call.registerParameter("TipoCodice", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTipoCodice());
			call.registerParameter("FlagTipoCodice", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagTipoCodice());
			call.registerParameter("Indirizzo_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getIndirizzoOrdinante());
			call.registerParameter("FlagIndirizzo_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagIndirizzoOrdinante());
			call.registerParameter("Località_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getLocalitaOrdinante());
			call.registerParameter("FlagLocalità_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagLocalitaOrdinante());
			call.registerParameter("Codice_Fiscale_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceFiscaleOrdinante());
			call.registerParameter("FlagCodice_Fiscale_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceFiscaleOrdinante());
			call.registerParameter("DenominazioneDestinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getDenominazioneDestinatario());
			call.registerParameter("FlagDenominazioneDestinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDenominazioneDestinatario());
			call.registerParameter("Codice_Fiscale_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceFiscaleDestinatario());
			call.registerParameter("FlagCodice_Fiscale_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceFiscaleDestinatario());
			call.registerParameter("Indirizzo_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getIndirizzoDestinatario());
			call.registerParameter("FlagIndirizzo_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagIndirizzoDestinatario());
			call.registerParameter("Cap_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCapDestinatario());
			call.registerParameter("FlagCap_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCapDestinatario());
			call.registerParameter("Città_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCittaDestinatario());
			call.registerParameter("FlagCittà_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCittaDestinatario());
			call.registerParameter("Provincia_Destinatario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getProvinciaDestinatario());
			call.registerParameter("FlagProvincia_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagProvinciaDestinatario());
			call.registerParameter("CodiceClienteDebitore", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceClienteDebitore());
			call.registerParameter("FlagCodiceClienteDebitore", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceClienteDebitore());
			call.registerParameter("Azienda_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getAziendaOrdinante());
			call.registerParameter("FlagAzienda_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagAziendaOrdinante());
			call.registerParameter("ErroriCampiObbligatori", Short.class, ParameterMode.IN).bindValue(disposizioneRid.getErroriCampiObbligatori());
			call.registerParameter("ErroriCongruenza", Short.class, ParameterMode.IN).bindValue(disposizioneRid.getErroriCongruenza());
			call.registerParameter("ErroriCampiData", Short.class, ParameterMode.IN).bindValue(disposizioneRid.getErroriCampiData());
			call.registerParameter("ErroriPiazzatura", Short.class, ParameterMode.IN).bindValue(disposizioneRid.getErroriPiazzatura());
			call.registerParameter("FlagStampa", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagStampa());
			call.registerParameter("CoordinateIBANordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCoordinateIbanordinante());
			call.registerParameter("FlagCoordinateIBANordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCoordinateIbanordinante());
			call.registerParameter("CoordinateIBANbeneficiario", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCoordinateIbanbeneficiario());
			call.registerParameter("FlagCoordinateIBANbeneficiario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCoordinateIbanbeneficiario());
			call.registerParameter("DescrizioneConto", String.class, ParameterMode.IN).bindValue(disposizioneRid.getDescrizioneConto());
			call.registerParameter("FlagDescrizioneConto", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDescrizioneConto());
			call.registerParameter("Esito", String.class, ParameterMode.IN).bindValue(disposizioneRid.getEsito());
			call.registerParameter("FlagEsito", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagEsito());
			call.registerParameter("TipoCodiceRiferimento", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTipoCodiceRiferimento());
			call.registerParameter("FlagTipoCodiceRiferimento", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagTipoCodiceRiferimento());
			call.registerParameter("DescrizioneEsito", String.class, ParameterMode.IN).bindValue(disposizioneRid.getDescrizioneEsito());
			call.registerParameter("FlagDescrizioneEsito", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDescrizioneEsito());
	
	
			call.registerParameter("TipoAnomalia", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTipoAnomalia());
			call.registerParameter("FlagTipoAnomalia", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagTipoAnomalia());
			call.registerParameter("ValutaOrdinante", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getValutaOrdinante());
			call.registerParameter("FlagValutaOrdinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagValutaOrdinante());
			call.registerParameter("ValutaBeneficiario", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getValutaBeneficiario());
			call.registerParameter("FlagValutaBeneficiario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagValutaBeneficiario());
			call.registerParameter("DataOrdine", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataOrdine());
			call.registerParameter("FlagDataOrdine", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataOrdine());
	
			call.registerParameter("DataContabileAddebito", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataContabileAddebito());
			call.registerParameter("FlagDataContabileAddebito", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataContabileAddebito());
			call.registerParameter("DataEsecuzione", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataEsecuzione());
			call.registerParameter("FlagDataEsecuzione", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataEsecuzione());
			
			call.registerParameter("ImportoCommissioni", String.class, ParameterMode.IN).bindValue(disposizioneRid.getImportoCommissioni());
			call.registerParameter("FlagImportoCommissioni", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagImportoCommissioni());
			call.registerParameter("ImportoSpese", String.class, ParameterMode.IN).bindValue(disposizioneRid.getImportoSpese());
			call.registerParameter("FlagImportoSpese", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagImportoSpese());
			
			call.registerParameter("ImportoPenali", String.class, ParameterMode.IN).bindValue(disposizioneRid.getImportoPenali());
			call.registerParameter("FlagImportoPenali", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagImportoPenali());
			call.registerParameter("NumeroAssegnoEmesso", String.class, ParameterMode.IN).bindValue(disposizioneRid.getNumeroAssegnoEmesso());
			call.registerParameter("FlagNumeroAssegnoEmesso", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagNumeroAssegnoEmesso());
			call.registerParameter("UserID", String.class, ParameterMode.IN).bindValue(disposizioneRid.getUserId());
			call.registerParameter("ProvenienzaDisposizione", String.class, ParameterMode.IN).bindValue(disposizioneRid.getProvenienzaDisposizione());
			call.registerParameter("TipoFlussoInput", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTipoFlussoInput());
			call.registerParameter("IDDisposizioneFunzioneOrdinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getIddisposizioneFunzioneOrdinante());
			call.registerParameter("DataInserimentoDisposizione", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataInserimentoDisposizione());
			
			call.registerParameter("DataFlussoDisposizione", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataFlussoDisposizione());
			call.registerParameter("DataEsitoDisposizione", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataEsitoDisposizione());
			call.registerParameter("FlagDataEsitoDisposizione", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataEsitoDisposizione());
			call.registerParameter("StatoDisposizione", String.class, ParameterMode.IN).bindValue(disposizioneRid.getStatoDisposizione());
			call.registerParameter("FlagStatoDisposizione", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagStatoDisposizione());
			call.registerParameter("CodiceSocietà", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceSocieta());
			call.registerParameter("FlagCodiceSocietà", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceSocieta());
			call.registerParameter("FunzioneOrdinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getFunzioneOrdinante());
			call.registerParameter("FlagFunzioneOrdinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagFunzioneOrdinante());
			call.registerParameter("ContabilizzazioneMovimento", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isContabilizzazioneMovimento());
			call.registerParameter("FlagContabilizzazioneMovimento", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagContabilizzazioneMovimento());
			call.registerParameter("ForzaStatoAR", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isForzaStatoAr());
			
			call.registerParameter("LastSaved", byte[].class, ParameterMode.IN).bindValue(disposizioneRid.getLastSaved());
			
			call.registerParameter("Divisa_Conto_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getDivisaContoOrdinante());
			call.registerParameter("FlagDivisa_Conto_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.getFlagDivisaContoOrdinante());
			call.registerParameter("NoteFunzioneOrdinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getNoteFunzioneOrdinante());
			call.registerParameter("FlagNoteFunzioneOrdinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagNoteFunzioneOrdinante());
			call.registerParameter("NoteTesoreria", String.class, ParameterMode.IN).bindValue(disposizioneRid.getNoteTesoreria());
			call.registerParameter("FlagNoteTesoreria", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagNoteTesoreria());
			call.registerParameter("CodicePaese", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodicePaese());
			call.registerParameter("FlagCodicePaese", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodicePaese());
			call.registerParameter("CheckDigit", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCheckDigit());
			call.registerParameter("FlagCheckDigit", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCheckDigit());
			call.registerParameter("FacoltàStorno", String.class, ParameterMode.IN).bindValue(disposizioneRid.getFacoltaStorno());
			call.registerParameter("FlagFacoltàStorno", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagFacoltaStorno());
			call.registerParameter("StatoAllineamento", String.class, ParameterMode.IN).bindValue(disposizioneRid.getStatoAllineamento());
			call.registerParameter("FlagStatoAllineamento", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagStatoAllineamento());
			call.registerParameter("DataCreazioneFlussoOriginario", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataCreazioneFlussoOriginario());
			call.registerParameter("DataUltimoEsitoAcquisito", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataUltimoEsitoAcquisito());
			call.registerParameter("FlagDataUltimoEsitoAcquisito", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataUltimoEsitoAcquisito());
			call.registerParameter("CodiceRiferimento", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceRiferimento());
			call.registerParameter("FlagCodiceRiferimento", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceRiferimento());
			call.registerParameter("Data_Valuta_Destinatario", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataValutaDestinatario());
			call.registerParameter("FlagData_Valuta_Destinatario", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataValutaDestinatario());
			call.registerParameter("Data_Limite_Pagamento", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataLimitePagamento());
			call.registerParameter("FlagData_Limite_Pagamento", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataLimitePagamento());
			call.registerParameter("Data_Decorrenza_Garanzia", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataDecorrenzaGaranzia());
			call.registerParameter("FlagData_Decorrenza_Garanzia", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataDecorrenzaGaranzia());
			
			call.registerParameter("Tipo_Incasso_Rid", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTipoIncassoRid());
			call.registerParameter("FlagTipo_Incasso_Rid", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagTipoIncassoRid());
			call.registerParameter("Descrizione_Disposizione", String.class, ParameterMode.IN).bindValue(disposizioneRid.getDescrizioneDisposizione());
			call.registerParameter("FlagDescrizione_Disposizione", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDescrizioneDisposizione());
			call.registerParameter("TrasferimentoPosizione", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTrasferimentoPosizione());
			call.registerParameter("FlagTrasferimentoPosizione", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagTrasferimentoPosizione());
			call.registerParameter("Importo", String.class, ParameterMode.IN).bindValue(disposizioneRid.getImporto());
			call.registerParameter("FlagImporto", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagImporto());
			call.registerParameter("ImportoDBGrid", Double.class, ParameterMode.IN).bindValue(disposizioneRid.getImportoDbgrid());
			
			call.registerParameter("CausaleStorno", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCausaleStorno());
			call.registerParameter("FlagCausaleStorno", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCausaleStorno());
			call.registerParameter("FacoltàStornoEsito", String.class, ParameterMode.IN).bindValue(disposizioneRid.getFacoltaStornoEsito());
			call.registerParameter("FlagFacoltàStornoEsito", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagFacoltaStornoEsito());
			call.registerParameter("NumeroPolizza", String.class, ParameterMode.IN).bindValue(disposizioneRid.getNumeroPolizza());
			call.registerParameter("FlagNumeroPolizza", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagNumeroPolizza());
			
			call.registerParameter("NoTabellaContabilizzazione", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isNoTabellaContabilizzazione());
			call.registerParameter("FlagNoTabellaContabilizzazione", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagNoTabellaContabilizzazione());
			call.registerParameter("ContoPerCassa", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isContoPerCassa());
			call.registerParameter("FlagContoPerCassa", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagContoPerCassa());
			
			call.registerParameter("ClassificazioneConto", String.class, ParameterMode.IN).bindValue(disposizioneRid.getClassificazioneConto());
			call.registerParameter("FlagClassificazioneConto", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagClassificazioneConto());
			call.registerParameter("TipoSequenza", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTipoSequenza());
			call.registerParameter("FlagTipoSequenza", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagTipoSequenza());
			call.registerParameter("Data_Sottoscrizione_Mandato", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataSottoscrizioneMandato());
			call.registerParameter("FlagData_Sottoscrizione_Mandato", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataSottoscrizioneMandato());
			
			call.registerParameter("RegolarizzazioneSEPA", String.class, ParameterMode.IN).bindValue(disposizioneRid.getRegolarizzazioneSepa());
			call.registerParameter("FlagRegolarizzazioneSEPA", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagRegolarizzazioneSepa());
			call.registerParameter("Identificativo_Creditore", String.class, ParameterMode.IN).bindValue(disposizioneRid.getIdentificativoCreditore());
			call.registerParameter("FlagIdentificativo_Creditore", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagIdentificativoCreditore());
			call.registerParameter("Identificativo_EndToEnd", String.class, ParameterMode.IN).bindValue(disposizioneRid.getIdentificativoEndToEnd());
			call.registerParameter("FlagIdentificativo_EndToEnd", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagIdentificativoEndToEnd());
			
			call.registerParameter("Data_Scadenza_Originaria", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataScadenzaOriginaria());
			call.registerParameter("FlagData_Scadenza_Originaria", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataScadenzaOriginaria());
			call.registerParameter("Identificativo_Mandato", String.class, ParameterMode.IN).bindValue(disposizioneRid.getIdentificativoMandato());
			call.registerParameter("FlagIdentificativo_Mandato", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagIdentificativoMandato());
			call.registerParameter("CausaleMovimento", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCausaleMovimento());
			call.registerParameter("FlagCausaleMovimento", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCausaleMovimento());
			
			call.registerParameter("RamoMinisteriale", String.class, ParameterMode.IN).bindValue(disposizioneRid.getRamoMinisteriale());
			call.registerParameter("FlagRamoMinisteriale", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagRamoMinisteriale());
			call.registerParameter("DebitoreEffettivo", String.class, ParameterMode.IN).bindValue(disposizioneRid.getDebitoreEffettivo());
			call.registerParameter("FlagDebitoreEffettivo", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDebitoreEffettivo());
			call.registerParameter("Codice_CUC_Ordinante", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceCucOrdinante());
			call.registerParameter("FlagCodice_CUC_Ordinante", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceCucOrdinante());
			
			call.registerParameter("CodiceStornoCBI", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceStornoCbi());
			call.registerParameter("FlagCodiceStornoCBI", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceStornoCbi());
			call.registerParameter("CodiceStornoSEPA", String.class, ParameterMode.IN).bindValue(disposizioneRid.getCodiceStornoSepa());
			call.registerParameter("FlagCodiceStornoSEPA", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagCodiceStornoSepa());
			call.registerParameter("InformazioniAggiuntiveStorno", String.class, ParameterMode.IN).bindValue(disposizioneRid.getInformazioniAggiuntiveStorno());
			call.registerParameter("FlagInformazioniAggiuntiveStorno", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagInformazioniAggiuntiveStorno());
			
			call.registerParameter("TagXmlErrato", String.class, ParameterMode.IN).bindValue(disposizioneRid.getTagXmlErrato());
			call.registerParameter("FlagTagXmlErrato", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagTagXmlErrato());
			call.registerParameter("StatoDisposizioneNasDanni", String.class, ParameterMode.IN).bindValue(disposizioneRid.getStatoDisposizioneNasDanni());
			call.registerParameter("FlagStatoDisposizioneNasDanni", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagStatoDisposizioneNasDanni());
			call.registerParameter("DataCambioStatoDisposizioneNasDanni", Date.class, ParameterMode.IN).bindValue(disposizioneRid.getDataCambioStatoDisposizioneNasDanni());
			call.registerParameter("FlagDataCambioStatoDisposizioneNasDanni", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagDataCambioStatoDisposizioneNasDanni());
			
			call.registerParameter("NomeSupportoFlussoInputCBI", String.class, ParameterMode.IN).bindValue(disposizioneRid.getNomeSupportoFlussoInputCbi());
			call.registerParameter("FlagNomeSupportoFlussoInputCBI", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagNomeSupportoFlussoInputCbi());
			call.registerParameter("BIC_Creditore", String.class, ParameterMode.IN).bindValue(disposizioneRid.getBicCreditore());
			call.registerParameter("FlagBIC_Creditore", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagBicCreditore());
			call.registerParameter("MsgIdEsitoXML", String.class, ParameterMode.IN).bindValue(disposizioneRid.getMsgIdEsitoXml());
			call.registerParameter("FlagMsgIdEsitoXML", Boolean.class, ParameterMode.IN).bindValue(disposizioneRid.isFlagMsgIdEsitoXml());
			call.registerParameter("DisposizioneGuid", String.class, ParameterMode.IN).bindValue(disposizioneRid.getDisposizioneGuid());
			
			
			
			//int rows = call.executeUpdate();
			
			//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 (disposizioneRid.getIddistintaBanca()!=null && disposizioneRid.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, disposizioneRid.getIddistintaBanca());
						
						proc.execute();
						proc.getMoreResults();
							
						proc.getInt(1);
							
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						return -1;
					}
			 }
			 
			 
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
		
	}

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


	
	

}
