using System; using System.Collections.Generic; //using System.Collections; using System.Text; using System.Data; using SEILoader.SEI; using SEILoader.SIMPB; using SEILoader.GlobalPosition; using SEILoader.RicercaClienteWS; using System.Security.Cryptography.X509Certificates; using System.Net.Security; using System.Runtime.CompilerServices; using System.Threading; using log4net; namespace SEILoader { class CaricamentoParallelo { private static string _idElaborazione = null; private static int _n =-1; private static int _sleep = 0; private static int _maxErrors = 0; private static int _errors = 0; private static bool _calcolaPB; private static char _tipoElaborazioneParallela; private static int _numeroclienti = 0; private static CaricamentoParallelo[] coList; private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public static void avviaCaricamentoParallelo(int n, string idElab, int sleepTime, int maxErrors, bool calcolaPB,int numeroClienti,char tipoElaborazioneParallela) { log.Info("avviaCaricamentoParallelo( n=" + n + ", idElab=" + idElab + ", sleepTime=" + sleepTime + ", maxErrors=" + maxErrors); if (_n != -1) { throw new Exception("pool di connessioni giá inizializzato"); } _n = n; _idElaborazione = idElab; _sleep = sleepTime; _maxErrors = maxErrors; _errors = 0; _calcolaPB = calcolaPB; _numeroclienti = numeroClienti; _tipoElaborazioneParallela = tipoElaborazioneParallela; coList = new CaricamentoParallelo[n]; for (int i = 0; i < n; i++) { coList[i] = new CaricamentoParallelo(i); coList[i].avviaCaricamentoParallelo(); } } public static bool aspettaConclusione() { bool finished = false; while (!finished) { finished = true; System.Threading.Thread.Sleep(1000); for (int i = 0; i < _n; i++) { finished = finished && coList[i].finished; } } if (_maxErrors >= _errors) return true; return false; } private SEI.CaricamentoMassivoService c_ws; private RicercaClienteWS.RicercaCliente rc_ws; private GlobalPosition.GlobalPosition gp_ws; private Adeguatezza.Adeguatezza ad_ws; private bool finished = false; private int _contatore; private CaricamentoParallelo(int contatore) { this._contatore = contatore; string codiceApplicazione = Properties.Settings.Default.codiceApplicazione; string useridSIMPB = Properties.Settings.Default.useridSIMPB; string pwdSIMPB = Properties.Settings.Default.pwdSIMPB; System.Net.NetworkCredential cred = new System.Net.NetworkCredential(useridSIMPB, pwdSIMPB); c_ws = new CaricamentoMassivoService(); c_ws.Timeout = Properties.Settings.Default.timeoutWS; c_ws.caricamentoClienteCompleted += new caricamentoClienteCompletedEventHandler(caricamentoClienteCompletato); rc_ws = new RicercaCliente(); rc_ws.PreAuthenticate = true; rc_ws.Credentials = cred; rc_ws.Timeout = Properties.Settings.Default.timeoutWS; rc_ws.getListaClientiCompleted += new getListaClientiCompletedEventHandler(richiestaCalcoloPBCompletato); gp_ws = new GlobalPosition.GlobalPosition(); gp_ws.PreAuthenticate = true; gp_ws.Credentials = cred; gp_ws.Timeout = Properties.Settings.Default.timeoutWS; gp_ws.getContrattoSintesiperClienteFASE1Completed += new getContrattoSintesiperClienteFASE1CompletedEventHandler(richiestaContrattoSintesiCompletata); ad_ws = new Adeguatezza.Adeguatezza(); ad_ws.PreAuthenticate = true; ad_ws.Credentials = cred; ad_ws.Timeout = Properties.Settings.Default.timeoutWS; ad_ws.SimulazioneCompleted += new Adeguatezza.SimulazioneCompletedEventHandler(richiestaAdeguatezzaCompletata); //System.Net.SecurityProtocolType.Ssl3; System.Net.ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(VerifyServerCertificate); } private void avviaCaricamentoParallelo() { log4net.ThreadContext.Properties["idCaricamento"] = this._contatore; log.Debug("avviaCaricamentoParallelo"); CaricamentoClienteData pc = DbManager.getProssimoCliente(); if (pc == null || _errors >= _maxErrors ) { this.finished = true; return; } Thread.Sleep(_sleep); if (_calcolaPB) this.richiediCalcoloPbCliente(pc); else this.richiediCaricamentoCliente(pc); } private void richiediCalcoloPbCliente(CaricamentoClienteData pc) { log.Debug("richiediCalcoloPbCliente +cliente("+pc.ToString()+")"); string codiceApplicazione = Properties.Settings.Default.codiceApplicazione; int token = TokenManager.getToken(pc.rete); ChiavePB chiavePB = new ChiavePB(); chiavePB.codiceAgente = pc.pb; chiavePB.codiceRete = pc.rete; RicercaClienteWS.InfoClient infoClient = new RicercaClienteWS.InfoClient(); infoClient.codiceApplicazione = codiceApplicazione; infoClient.codiceRete = pc.rete; infoClient.versioneDatabaseSIMPB = token; RicercaClienteWS.ChiaveCliente[] chiaviCliente = new RicercaClienteWS.ChiaveCliente[1]; chiaviCliente[0] = new RicercaClienteWS.ChiaveCliente(); chiaviCliente[0].codiceAgente = pc.pb; chiaviCliente[0].codicefiscale = pc.cf; chiaviCliente[0].codiceRete = pc.rete; chiaviCliente[0].codiceMandato = null; chiaviCliente[0].potenzialeClienteNAC = false; modificaChiaveCliente(ref chiaviCliente[0]); rc_ws.getListaClientiAsync( chiavePB,chiaviCliente,infoClient, pc); } void richiestaCalcoloPBCompletato(object sender, getListaClientiCompletedEventArgs args) { log4net.ThreadContext.Properties["idCaricamento"] = this._contatore; //Display the return value CaricamentoClienteData pcInit = (CaricamentoClienteData)args.UserState; log.Debug("richiestaCalcoloPBCompletato cliente(" + pcInit.ToString() + ")"); try { ListaClienteRes listaClienteRes = args.Result; if(listaClienteRes.info.errors.Length>0){ if (listaClienteRes.info.errors[0].codiceErrore != 0){ if (listaClienteRes.allListaCliente.Length > 0 ) { string pb = listaClienteRes.allListaCliente[0].codiceAgente; pcInit.pb = pb; } } } if (_tipoElaborazioneParallela == 'X' || _tipoElaborazioneParallela == 'A') { if (listaClienteRes.allListaCliente.Length == 1) { ListaCliente cliente = listaClienteRes.allListaCliente[0]; if (cliente.cognome.Length > 0) { if (_tipoElaborazioneParallela == 'X') { TracingManager.addNewClienteInListaCaricati(); } try { if(!pcInit.cf.Contains("@")){ DbManager.AggiornaAnagrafica(pcInit.rete, pcInit.cf, cliente.cognome, cliente.nome); }; } catch (DataBaseException dex) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", dex.Message), _idElaborazione); } catch (Exception ex) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", ex.Message), _idElaborazione); } if (_tipoElaborazioneParallela == 'X') { TracingManager.TracciaStatisticheIntermedie(_idElaborazione); this.avviaCaricamentoParallelo(); return; } } } } } catch (Exception ex) { log.Warn(" errore nel calcolo PB del cliente(" + pcInit.ToString() + "): " + ex.Message); } if (_tipoElaborazioneParallela == 'W') richiediContrattoSintesi(pcInit); else if (_tipoElaborazioneParallela == 'Z') richiediAdeguatezza(pcInit); else richiediCaricamentoCliente(pcInit); } private void richiediCaricamentoCliente(CaricamentoClienteData pc) { log.Debug("richiediCaricamentoCliente cliente(" + pc.ToString() + ")"); string codiceApplicazione = Properties.Settings.Default.codiceApplicazione; int token = TokenManager.getToken(pc.rete); c_ws.caricamentoClienteAsync(pc.rete, pc.cf, pc.pb, codiceApplicazione, _idElaborazione, token, pc); TracingManager.addNewClienteInListaCaricati(); } private void richiediAdeguatezza(CaricamentoClienteData pc) { log.Debug("richiediAdeguatezza cliente(" + pc.ToString() + ")"); string codiceApplicazione = Properties.Settings.Default.codiceApplicazione; int token = TokenManager.getToken(pc.rete); Adeguatezza.ChiaveCliente chiaveCliente = new Adeguatezza.ChiaveCliente(); Adeguatezza.InfoClient infoClient = new Adeguatezza.InfoClient(); //TODO GESTIONE CODICE MANDATO chiaveCliente.CodiceAgente = pc.pb; chiaveCliente.CodiceFiscale = pc.cf; chiaveCliente.CodiceAgenteReale = pc.pb; chiaveCliente.NomeAgenteReale = "GIOVANNI"; chiaveCliente.CognomeAgenteReale = "FERRARA"; modificaChiaveCliente(ref chiaveCliente); infoClient.CodiceApplicazione = codiceApplicazione; infoClient.CodiceRete = pc.rete; infoClient.VersioneDatabaseSIMPB = token; Adeguatezza.TipoDettaglioContratto[] contratti = new SEILoader.Adeguatezza.TipoDettaglioContratto[1]; Adeguatezza.TipoDettaglioContratto contratto = new SEILoader.Adeguatezza.TipoDettaglioContratto(); contratto.CodiceContratto = "NUOVO101000"; contratto.TipologiaContratto = ""; contratto.CodiceProdotto = "01"; contratto.CodiceSottoProdotto = "F29"; contratto.DescrizioneSottoProdotto = "FONDITALIA CORE 3 R"; contratto.TipoProdotto = "FI"; contratto.CodiceISIN = "LU0349158815"; contratto.CodiceISINProxy = "LU0349158815"; contratto.CodiceTitolo = ""; contratto.CodiceTipoAsset = ""; contratto.Conto = ""; contratto.CustodiaGaranzia = ""; contratto.FlagPCT = ""; contratto.CodiceTipoOperazione = 1; contratto.DescrizioneTipoOperazione = "1"; contratto.ValoreCTV = 100.0; contratto.ValorePluri = 100.0; contratto.QuantitaOValoreNominale = 100.0; contratto.CodiceDivisa = ""; contratto.FlagCoveredWarrant = "0"; contratti[0] = contratto; ad_ws.SimulazioneAsync(contratti, chiaveCliente, infoClient, pc); TracingManager.addNewClienteInListaCaricati(); } private void richiestaAdeguatezzaCompletata(object sender, Adeguatezza.SimulazioneCompletedEventArgs args) { log4net.ThreadContext.Properties["idCaricamento"] = this._contatore; //Display the return value CaricamentoClienteData pcInit = (CaricamentoClienteData) args.UserState; log.Debug("richiestaAdeguatezzaCompletata cliente(" + pcInit.ToString() + ")"); try { Adeguatezza.SimulazioneRes res = args.Result; string var = "-1"; if (res.ValoriSimulazione != null) { foreach (Adeguatezza.ValoriSimulazione valore in res.ValoriSimulazione) { var = valore.VARIniziale.ToString(); } } dumpAdeguatezza(var, pcInit); if (res.info.Errors.Length > 0) { if (res.info.Errors[0].CodiceErrore != 0) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", res.info.Errors[0].MessaggioPerUtenteFinale), _idElaborazione); log.Error("richiestaAdeguatezzaCompletata errore:" + res.info.Errors[0].DescrizioneInterna); } } } catch (DataBaseException dex) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", dex.Message), _idElaborazione); } catch (Exception ex) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", ex.Message), _idElaborazione); } TracingManager.TracciaStatisticheIntermedie(_idElaborazione); this.avviaCaricamentoParallelo(); } private void richiediContrattoSintesi(CaricamentoClienteData pc) { log.Debug("richiediContrattoSintesi cliente(" + pc.ToString() + ")"); string codiceApplicazione = Properties.Settings.Default.codiceApplicazione; int token = TokenManager.getToken(pc.rete); GlobalPosition.ChiaveCliente chiaveCliente = new GlobalPosition.ChiaveCliente(); GlobalPosition.InfoClient infoClient = new GlobalPosition.InfoClient(); chiaveCliente.codiceAgente = pc.pb; chiaveCliente.codicefiscale = pc.cf; chiaveCliente.codiceRete = pc.rete; chiaveCliente.potenzialeClienteNAC=true; modificaChiaveCliente(ref chiaveCliente); infoClient.codiceApplicazione = codiceApplicazione; infoClient.codiceRete = pc.rete; infoClient.versioneDatabaseSIMPB = token; String status = ""; gp_ws.getContrattoSintesiperClienteFASE1Async(chiaveCliente,status, infoClient, pc); TracingManager.addNewClienteInListaCaricati(); } private void richiestaContrattoSintesiCompletata(object sender, getContrattoSintesiperClienteFASE1CompletedEventArgs args) { log4net.ThreadContext.Properties["idCaricamento"] = this._contatore; //Display the return value CaricamentoClienteData pcInit = (CaricamentoClienteData)args.UserState; log.Debug("richiestaContrattoSintesiCompletata cliente(" + pcInit.ToString() + ")"); try { ContrattoSintesiperClienteFASE1Res res = args.Result; if (res.info.errors.Length > 0) { if (res.info.errors[0].codiceErrore != 0) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", res.info.errors[0].messaggioPerUtenteFinale), _idElaborazione); } else { dumpContrattoSintesi(res, pcInit); } } else { dumpContrattoSintesi(res, pcInit); } } catch (DataBaseException dex) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", dex.Message), _idElaborazione); } catch (Exception ex) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", ex.Message), _idElaborazione); } TracingManager.TracciaStatisticheIntermedie(_idElaborazione); this.avviaCaricamentoParallelo(); } private void caricamentoClienteCompletato(object sender, caricamentoClienteCompletedEventArgs args) { log4net.ThreadContext.Properties["idCaricamento"] = this._contatore; //Display the return value CaricamentoClienteData pcInit = (CaricamentoClienteData)args.UserState; log.Debug("caricamentoClienteCompletato cliente(" +pcInit.ToString()+")" ); try { int esito = args.Result; if (esito == Properties.Settings.Default.erroreTokenCambiato) { TokenManager.resetTokens(); } if (esito != Properties.Settings.Default.esitoOk) { _errors++; TracingManager.TracciaErrore(pcInit, esito.ToString(),_idElaborazione); }; } catch (Exception ex) { TracingManager.TracciaErrore(pcInit, string.Format("-1: {0}", ex.Message), _idElaborazione); } TracingManager.TracciaStatisticheIntermedie(_idElaborazione); this.avviaCaricamentoParallelo(); } private static bool VerifyServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) return true; foreach (X509ChainStatus s in chain.ChainStatus) { // allows expired certificates if (string.Equals(s.Status.ToString(), "NotTimeValid", StringComparison.OrdinalIgnoreCase)) return true; } return true; } private static void dumpAdeguatezza(string var, CaricamentoClienteData pc) { DbManager.insertVar(pc, var); log.Info(pc + ":" + var); } private static void dumpContrattoSintesi(ContrattoSintesiperClienteFASE1Res res,CaricamentoClienteData pc) { foreach (ContrattoSintesiperClienteFASE1 c in res.tuttiContrattiSintesiFASE1) { string riga = c.codiceContratto; riga += ";" + c.numeroPolizza; riga += ";" + c.numeroPolizza; riga += ";" + c.Conto; riga += ";" + c.Rubricato; riga += ";" + c.CustodiaGaranzia; riga += ";" + c.tipoProdotto; riga += ";" + c.codiceInterno; riga += ";" + c.codicesottoProdotto; riga += ";" + c.codiceMAF; riga += ";" + c.pctKey; riga += ";" + c.pctTitoloCollegato; riga += ";" + c.pctDescrizionteTitoloCollegato; riga += ";" + c.quote; riga += ";" + c.prezzo; riga += ";" + c.ctv; riga += ";" + c.partvia; riga += ";" + c.partviaal; riga += ";" + c.datadiRiferimento; riga += ";" + c.datadiSottoscrizione; riga += ";" + c.dataValNavAl; riga += ";" + c.codiceStato; /* riga += ";" + c.dataInizioRendimento; riga += ";" + c.rendimentoDaSottoscrizione; riga += ";" + c.dataTrimestreRendimento; riga += ";" + c.rendimentoDaInizioTrimestre; riga += ";" + c.dataAnnoRendimento; riga += ";" + c.rendimentoDaInizioAnno; riga += ";" + c.valore; riga += ";" + c.CVN; */ DbManager.insertContrattoSintesi(pc,c); log.Debug(pc + ":" + riga); } } private static void modificaChiaveCliente(ref Adeguatezza.ChiaveCliente _chiaveCliente) { string[] valori = _chiaveCliente.CodiceFiscale.Split('@'); if(valori.Length>1){ _chiaveCliente.CodiceFiscale = DbManager.getPiva(valori[0]); _chiaveCliente.CodiceMandato= valori[1]; } } private static void modificaChiaveCliente(ref GlobalPosition.ChiaveCliente _chiaveCliente) { string[] valori = _chiaveCliente.codicefiscale.Split('@'); if (valori.Length > 1) { _chiaveCliente.codicefiscale = DbManager.getPiva(valori[0]); _chiaveCliente.codiceMandato = valori[1]; } } private static void modificaChiaveCliente(ref RicercaClienteWS.ChiaveCliente _chiaveCliente) { string[] valori = _chiaveCliente.codicefiscale.Split('@'); if (valori.Length > 1) { _chiaveCliente.codicefiscale = DbManager.getPiva(valori[0]); _chiaveCliente.codiceMandato = valori[1]; } } } }