TP_SEI_Project/root/Batch/SeiLoader/CaricamentoParallelo.cs
2025-04-15 12:10:19 +02:00

578 lines
22 KiB
C#

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];
}
}
}
}