using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Configuration; using System.Data; using System.Diagnostics; using System.Globalization; using System.Threading; using Amib.Threading; using LogFilePDF; using PDFGenerator.BusinessLayer; using PipelineLib; using NUnit.Framework; using System.IO; using ContrattoSei.Utilities; using DataAccessLayer; using System.Collections; namespace PDFGenerator { public class PDFGenerator { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private SmartThreadPool _smartThreadPool; private DataThread _dataThread; private ReportType _reportType; private string _tipoReport; private int _maxPDFGeneratorThreads; private List _tabelleSessione; public PDFGenerator(List tabelleSessione, DataThread dataThread) { string sCulture = UtilityManager.getAppSetting("CultureToUse"); //System.Globalization.CultureInfo.CreateSpecificCulture(sCulture); Thread.CurrentThread.CurrentCulture = new CultureInfo(sCulture); Thread.CurrentThread.CurrentUICulture = new CultureInfo(sCulture); _dataThread = dataThread; _tipoReport = dataThread.TipoReport; _reportType = dataThread.ReportType(); //.Find(delegate(ReportType r) { return r.Descrizione.ToUpper() == _tipoReport.ToUpper(); }); //_dataThread = new DataSectionParameter(); _tabelleSessione = tabelleSessione; //pk change remove multiThreadingPDFGeneratorThreads int multiT = 0;// int.Parse(UtilityManager.getAppSetting("multiThreadingPDFGeneratorThreads")); #region CHIAMATA MT CON GESTIONE ERRORI if (multiT.Equals(1)) { try { //IWorkItemResult[] workItemThread = new IWorkItemResult[4]; //int i = 0; _maxPDFGeneratorThreads = Convert.ToInt32(UtilityManager.getAppSetting("maxPDFGeneratorThreads")); STPStartInfo stpStartInfo = new STPStartInfo(); stpStartInfo.StartSuspended = true; stpStartInfo.MaxWorkerThreads = _maxPDFGeneratorThreads; stpStartInfo.MinWorkerThreads = 0; stpStartInfo.IdleTimeout = 60000; _smartThreadPool = new SmartThreadPool(stpStartInfo); _smartThreadPool.Start(); StringCollection _queries = UtilityBusinessLayer.getMTQueries(_reportType, _dataThread.DataAccess); WIGStartInfo wigStartInfo = new WIGStartInfo(); wigStartInfo.StartSuspended = true; Pipeline group = new Pipeline(_smartThreadPool, int.MaxValue); foreach (string query in _queries) { //dataThread.ArgomentiCawToErrore = argomentiCawToErrore; Worker worker = new Worker(query, _dataThread, tabelleSessione); group.AddTask(worker); } Debug.WriteLine(String.Format("PDF getting data thread: {0} started.", _dataThread.CodiceFiscale)); // PATRYK group.execute(); Debug.WriteLine(String.Format("PDF getting data for thread: {0} ended.", _dataThread.CodiceFiscale)); // PATRYK if (group.inException) { ScriviErroreNelDB(_dataThread.DataAccess, -292929, "Errore nel PDFGenerator group.inException INIZIO", -292929, "Gestore PDF", "Gestore PDF"); foreach (Task t in group.tasks) { if (t.taskData.innerException != null) { Console.WriteLine(t.taskData.name + " eccezione=" + t.taskData.innerException.Message); ScriviErroreNelDB(_dataThread.DataAccess, -292929, "Errore nel PDFGenerator group.inException DENTRO: " + t.taskData.name + " __ " + getException(t.taskData.innerException), -292929, "Gestore PDF", "Gestore PDF"); } } ScriviErroreNelDB(_dataThread.DataAccess, -292929, "Errore nel PDFGenerator group.inException FINE", -292929, "Gestore PDF", "Gestore PDF"); //StartTng(ambiente, cawTo_Bin, argomentiCawToErrore); //return 1; } } catch (Exception e) { try { logger.Error(String.Concat(e.Message, dataThread.CodiceFiscale)); } catch { } throw e; } finally { _smartThreadPool.Shutdown(); } } #endregion } public int Create() { string ambiente = ConfigurationManager.AppSettings["ambiente"]; string cawTo_Bin = ConfigurationManager.AppSettings["cawTo_Bin"]; string sPeriodico = ConfigurationManager.AppSettings["Periodico"]; DocumentPDF docPDF = null; //if (_dataThread.UtenteInfo != null) // docPDF.setUtenteSession(_dataThread.UtenteInfo); try { docPDF = new DocumentPDF(_dataThread, _tipoReport); //PORCATA DI FABRIZIO PER POTER AVERE DENTRO DATATHREAD tutto quello che occorre _dataThread.DocumentPDF = docPDF; //Thread POOL PER LE QUERY docPDF.insertCliente(); bool bCreaReport = this.createReport(docPDF); docPDF.inserisciLettera(); int identificativo = docPDF.insertIntoDB(); //string scriviLog = UtilityManager.getAppSetting("scriviLog"); if (identificativo > 0 && !_dataThread.Periodico) { GestoreLogPDF gLog = new GestoreLogPDF(identificativo); gLog.scriviLog(LogFilePDF.EventLog.C6_GenerazioneAutomaticaDiagnosiIniziale); } // FC MOdifica per gestione parallelizzazione processi // Il vaore "identificativo" è gestito dalla SP di inserimento in Gestione_PDF_FTP int identityReport = 0; //gestione Rigenerazione Report if (sPeriodico == "1") { // lettura IDentityReport identityReport = docPDF.getIdentityReport(_dataThread.Rete, _dataThread.CodiceFiscale, _dataThread.TipoReport.Substring(0, 1)); // Verifca e Cancellazione Del Report docPDF.deleteReportSuFileSystem(identityReport, _dataThread.NomeFileReport); // Fine Gestione rigenerazione Report } bool bScrittoPDf = false; identificativo = UtilityBusinessLayer.setEndThread(_dataThread, identificativo, docPDF.NumPage); //if (identificativo == 0) //{ // identificativo = UtilityBusinessLayer.getEndThread(_dataThread, identificativo, docPDF.NumPage); //} if (identityReport < 0) { try { logger.Error(identityReport.ToString()); List par = new List(); par.Add(new Parametro() { ParameterName = "FiscalCode", Value = _dataThread.CodiceFiscale }); par.Add(new Parametro() { ParameterName = "Rete", Value = _dataThread.Rete }); using (DataAccessDE de = new DataAccessDE(DBProvider.SqlServerStampeC6)) { de.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerStampeC6, ConfigurationManager.AppSettings.Get("SP_GESTIONE_PDF_REVERT_FISCAL_CODE"), par); } } catch (Exception ex) { logger.Error(ex.Message); } } else { bScrittoPDf = docPDF.scriviSuFileSystem(identificativo); } if (!bScrittoPDf) return -1; return 0; } catch (DataBaseException ex) { try { logger.Error(String.Concat(ex.Message, _dataThread.CodiceFiscale, _dataThread.Rete)); logger.Error(getException(ex)); } catch { } //StartTng(ambiente, cawTo_Bin, _dataThread.ArgomentiCawToErrore); Console.WriteLine(ex.Message); ScriviErroreNelDB(_dataThread.DataAccess, -292929, "Errore nel PDFGeneretor: " + getDataBaseException(ex), -292929, "Gestore PDF", "Gestore PDF"); // Marian Zaki: trial string message = ex.Message; message += "Cliente: " + _dataThread.CodiceFiscale + "; PB_Rete: " + _dataThread.Rete + _dataThread.Agente; Exception newThrownexception = new Exception(message); throw newThrownexception; } catch (Exception ex) { try { logger.Error(String.Concat(ex.Message, _dataThread.CodiceFiscale, _dataThread.Rete)); logger.Error(getException(ex)); } catch { } //StartTng(ambiente, cawTo_Bin, _dataThread.ArgomentiCawToErrore); Console.WriteLine(ex.Message); ScriviErroreNelDB(_dataThread.DataAccess, -292929, "Errore nel PDFGeneretor: " + getException(ex), -292929, "Gestore PDF", "Gestore PDF"); // Marian Zaki: trial string message = ex.Message; message += "Cliente: " + _dataThread.CodiceFiscale + "; PB_Rete: " + _dataThread.Rete + _dataThread.Agente; Exception newThrownexception = new Exception(message); throw newThrownexception; //Exception e = new Exception("Errore nel PDFGeneretor: " + ex.Message); //throw e; } finally { docPDF = null; } } private static string getDataBaseException(DataBaseException ecc) { const string aCapo = "#/n#"; string ritorno = ""; ritorno += aCapo; ritorno += " Informazioni Comando SQL:" + aCapo; ritorno += " sql file name: " + ecc.SqlFileName + aCapo; ritorno += " connection string: " + ecc.ConnectionStringWithoutCredentials + aCapo; //ritorno += " command text: " + ecc.CommandText + aCapo; //controllo se ci sono i parametri if (ecc.Parameters != null) { foreach (Parametro parametro in ecc.Parameters) { ritorno += aCapo; ritorno += " parametro: " + parametro.ParameterName + aCapo; ritorno += " dimensione: " + parametro.Size.ToString() + aCapo; ritorno += " direzione: " + parametro.Direction.ToString() + aCapo; ritorno += " tipo: " + parametro.DbType.ToString() + aCapo; if (parametro.Value == null) ritorno += " valore: null" + aCapo; else { string valoreParametro = ""; if (parametro.Size > 500) { valoreParametro = " valore: null(sono visualizzati solo i primi 500 bytes): " + parametro.Value.ToString().Substring(0, 500); } else { valoreParametro = " valore: " + parametro.Value.ToString(); } ritorno += valoreParametro + aCapo; } } } ritorno += aCapo; ritorno += " tipo: DataBaseException" + aCapo; ritorno += " descrizione: " + ecc.Eccezione.Message + aCapo; ritorno += " sorgente: " + ecc.Eccezione.Source + aCapo; ritorno += " traccia: " + FormattaErrore(ecc.StackTrace) + aCapo; return ritorno; } private static string getException(Exception ecc) { const string aCapo = "#/n#"; string ritorno = ""; ritorno += aCapo; ritorno += " tipo: " + ecc.GetType().ToString() + aCapo; ritorno += " descrizione: " + ecc.Message + aCapo; ritorno += " sorgente: " + ecc.Source + aCapo; if (ecc.InnerException != null) { ritorno += " descrizione Inner: " + ecc.InnerException.Message + aCapo; ritorno += " sorgente Inner: " + ecc.InnerException.Source + aCapo; } ritorno += " traccia: " + FormattaErrore(ecc.StackTrace) + aCapo; return ritorno; } private static string FormattaErrore(string errore) { const string aCapo = "#/n#"; const string spazio = " "; string separatore1 = " at "; string separatore2 = " in "; string separatore3 = ":line "; string erroreInterno = errore.Replace(separatore1, "@"); string ritorno = aCapo; //nome metodo e tutto il resto string[] messaggioErrore = erroreInterno.Split('@'); string messaggioSenzaSpazi; string[] messaggioInterno; foreach (string messaggio in messaggioErrore) { messaggioSenzaSpazi = messaggio.Trim(); if (messaggioSenzaSpazi != "") { messaggioSenzaSpazi = messaggioSenzaSpazi.Replace(separatore2, "@"); messaggioInterno = messaggioSenzaSpazi.Split('@'); if (messaggioInterno.GetUpperBound(0) == 1) { ritorno += spazio + "metodo: " + messaggioInterno[0] + aCapo; string fileLineaSingolo = messaggioInterno[1].Replace(separatore3, "@"); string[] fileLinea = fileLineaSingolo.Split('@'); ritorno += spazio + "percorsoFile: " + fileLinea[0] + aCapo; ritorno += spazio + "linea: " + fileLinea[1] + aCapo; ritorno += aCapo; } else { ritorno += spazio + "metodo: " + messaggioInterno[0] + aCapo; } } } return ritorno; } private void ScriviErroreNelDB(DataAccessDE dataAccess, int codiceErrore, string descrizioErrore, int localeId, string nomePackage, string descrizionePackage) { int scriviErroreNelDB = int.Parse(ConfigurationManager.AppSettings["scriviErroreNelDB"]); if (scriviErroreNelDB == 1) { try { List parametri = new List(); Parametro parametro = new Parametro(); parametro.DbType = DbType.Int32; parametro.ParameterName = "codiceErrore"; parametro.Value = codiceErrore; parametri.Add(parametro); parametro = new Parametro(); parametro.DbType = DbType.String; parametro.ParameterName = "descrizioErrore"; parametro.Value = descrizioErrore; parametri.Add(parametro); parametro = new Parametro(); parametro.DbType = DbType.DateTime; parametro.ParameterName = "dataTime"; parametro.Value = DateTime.Now; parametri.Add(parametro); parametro = new Parametro(); parametro.DbType = DbType.String; parametro.ParameterName = "localeID"; if (localeId == 0) parametro.Value = System.DBNull.Value; else parametro.Value = localeId; parametri.Add(parametro); parametro = new Parametro(); parametro.DbType = DbType.String; parametro.ParameterName = "descrizionePackage"; parametro.Value = descrizionePackage; parametri.Add(parametro); parametro = new Parametro(); parametro.DbType = DbType.String; parametro.ParameterName = "nomePackage"; parametro.Value = nomePackage; parametri.Add(parametro); DataAccess.ExecuteNonQueryStoredProcedure(DBProvider.SqlServerStampeC6, "[C6Mart].[UT_INSERT_ERROR]", parametri); } catch (Exception ex) { DataBaseException dataBaseException = (DataBaseException)ex; Console.WriteLine(dataBaseException.Message); } } } private static void StartTng(string ambiente, string cawTo_Bin, string argomentiCaw) { if (!ambiente.Equals("SVILUPPO")) { Process processTng = new Process(); try { processTng = Process.Start(cawTo_Bin, argomentiCaw); while (!processTng.HasExited) ; } catch (Exception ex) { throw new Exception("cawTo_Bin: Non riesco ad eseguire " + cawTo_Bin + " sulla macchina " + System.Environment.MachineName + ":" + ex.Message); } finally { processTng.Close(); processTng.Dispose(); } } } /// /// Popola l'oggetto Report. /// /// /// private bool createReport(DocumentPDF doc) { // Creo l'oggetto REPORT al quale aggiungero i Capitoli Report report = new Report(_reportType.TipoReport); // recupero gli eventuali intermediari DataTable dtIntermediari = new DataTable(); dtIntermediari = GetIntermediari(); DataSet dsAreeBisognoProgetto = new DataSet(); if (report.Tipo == TipoReport.MONITORAGGIO) { // recupero le aree/progetto da stampare per il dettaglio del monitoraggio DataTable dtAreeProgettiMonitorati = GetAreeMonitorate(); dtAreeProgettiMonitorati.TableName = "AreeMonitorate"; dsAreeBisognoProgetto.Tables.Add(dtAreeProgettiMonitorati.Copy()); } //Recupero tutti i dati sia dei capitoli, sia dei paragrafi che delle sezioni DataTable tabellaDati = getData(_reportType.IdReport, _reportType.IdModello); _dataThread.Schema = tabellaDati; //Recupero tutti i vincoli delle sezioni DataTable tabellaVincoli = getDataVincoli(_reportType.IdModello); // Associo l'oggetto DocumentPDF già creato alla proprietà DocumentPDF del Report. report.DocumentPDF = doc; //Recupero i capitoli. DataView viewCapitoli = new DataView(tabellaDati); DataTable tabellaCapitoli = viewCapitoli.ToTable(true, "idCapitolo", "titoloCapitolo", "testoCapitolo", "testoCapitoloAlternativo", "querySqlCapitolo", "nuovaPaginaCapitolo"); //Aggiungo tutti i capitoli al report. foreach (DataRow rowCapitoli in tabellaCapitoli.Rows) { CapitoloReport capitolo; if (rowCapitoli["querySqlCapitolo"].ToString().ToLower() == "intermediario") { if (dtIntermediari.Rows.Count == 1) { capitolo = new CapitoloReport(Convert.ToInt32(rowCapitoli["idCapitolo"]), rowCapitoli); capitolo.Intermediario = dtIntermediari.Rows[0]["Intermediario"].ToString(); if (capitolo.Intermediario.ToLower() == "altro") capitolo.Titolo = "Dettaglio Altro intermediario"; else { capitolo.Titolo = "Dettaglio " + capitolo.Intermediario; capitolo.TestoIntroduttivo = "Questo capitolo fornisce una rappresentazione del patrimonio finanziario che Lei detiene presso " + capitolo.Intermediario + "."; } AddParagrafiToCapitolo(capitolo, tabellaDati, tabellaVincoli, null); // aggiunge il capitolo al report report.Add(capitolo); } else { capitolo = new CapitoloReport(Convert.ToInt32(rowCapitoli["idCapitolo"]), rowCapitoli); AddParagrafiToCapitolo(capitolo, tabellaDati, tabellaVincoli, null); // aggiunge il capitolo al report report.Add(capitolo); } } else if (rowCapitoli["querySqlCapitolo"].ToString() == string.Empty) { capitolo = new CapitoloReport(Convert.ToInt32(rowCapitoli["idCapitolo"]), rowCapitoli); capitolo.Intermediario = string.Empty; AddParagrafiToCapitolo(capitolo, tabellaDati, tabellaVincoli, dsAreeBisognoProgetto); // aggiunge il capitolo al report report.Add(capitolo); } } // Disegno il Report. report.Disegna(); return true; } /// /// Aggiunge i paragrafi al capitolo passato in input. /// /// /// /// /// private void AddParagrafiToCapitolo(CapitoloReport capitolo, DataTable tabellaDati, DataTable tabellaVincoli, DataSet dsAreeBisognoProgetto) { //Recupero i paragrafi per ogni capitolo. DataView viewParagrafo = new DataView(tabellaDati); viewParagrafo.RowFilter = "idCapitolo = " + capitolo.Id.ToString(); DataTable tabellaParagrafi = viewParagrafo.ToTable(true, "idParagrafo", "ordineParagrafo", "titoloParagrafo", "sottoTitoloParagrafo", "testoParagrafo", "querySqlParagrafo", "indicizzatoParagrafo", "SpazioNecessarioSezioneSuccessiva"); ParagrafoReport paragrafo = null; int idParagrafo = -1; foreach (DataRow rowParagrafi in tabellaParagrafi.Rows) { idParagrafo = Convert.ToInt32(rowParagrafi["idParagrafo"]); paragrafo = new ParagrafoReport(Convert.ToInt32(rowParagrafi["idParagrafo"]), rowParagrafi); paragrafo.SpazioNecessarioSezioneSuccessiva = rowParagrafi["SpazioNecessarioSezioneSuccessiva"] == DBNull.Value ? 0 : Convert.ToInt32(rowParagrafi["SpazioNecessarioSezioneSuccessiva"]); if (rowParagrafi["querySqlParagrafo"].ToString().ToLower() == "rischiocredito") { if (_tipoReport.ToUpper() == "DIAGNOSI") { // recupero gli eventuali intermediari DataTable dtIntermediari = new DataTable(); dtIntermediari = GetIntermediari(); //Se ho solo un intermediario faccio vedere solo la 102 e 103 per fideuram, altrimenti devo mostrare complessivo, fideuram e altri instituti if (dtIntermediari.Rows.Count >= 1) { //COMPLESSIVO paragrafo = new ParagrafoReport(Convert.ToInt32(rowParagrafi["idParagrafo"]), rowParagrafi); //Per come è fatto il paragrafo del rischio credito il titolo lo metto a codice altrimenti dovevo aggiungere un capitolo non indicizzato paragrafo.Titolo = "Approfondimento Rischio Credito"; paragrafo.SpazioNecessarioSezioneSuccessiva = rowParagrafi["SpazioNecessarioSezioneSuccessiva"] == DBNull.Value ? 0 : Convert.ToInt32(rowParagrafi["SpazioNecessarioSezioneSuccessiva"]); paragrafo.IntermediarioPar = "Complessivo"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); capitolo.Add(paragrafo); //FIDEURAM paragrafo = new ParagrafoReport(Convert.ToInt32(rowParagrafi["idParagrafo"]), rowParagrafi); paragrafo.SpazioNecessarioSezioneSuccessiva = rowParagrafi["SpazioNecessarioSezioneSuccessiva"] == DBNull.Value ? 0 : Convert.ToInt32(rowParagrafi["SpazioNecessarioSezioneSuccessiva"]); paragrafo.IntermediarioPar = "BF"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); capitolo.Add(paragrafo); foreach (DataRow inter in dtIntermediari.Rows) { paragrafo = new ParagrafoReport(Convert.ToInt32(rowParagrafi["idParagrafo"]), rowParagrafi); paragrafo.SpazioNecessarioSezioneSuccessiva = rowParagrafi["SpazioNecessarioSezioneSuccessiva"] == DBNull.Value ? 0 : Convert.ToInt32(rowParagrafi["SpazioNecessarioSezioneSuccessiva"]); paragrafo.IntermediarioPar = inter["Intermediario"].ToString(); AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); capitolo.Add(paragrafo); } } else { paragrafo.Titolo = "Approfondimento Rischio Credito"; paragrafo.IntermediarioPar = "BF"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); // aggiunge il paragrafo al capitolo capitolo.Add(paragrafo); } } else //Monitoraggio { paragrafo.Titolo = "Approfondimento Rischio Credito"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); // aggiunge il paragrafo al capitolo capitolo.Add(paragrafo); } } else if (rowParagrafi["querySqlParagrafo"].ToString().ToLower() == "rischiocreditonew") { if (_tipoReport.ToUpper() == "DIAGNOSI") { // recupero gli eventuali intermediari DataTable dtIntermediari = new DataTable(); dtIntermediari = GetIntermediari(); //Se ho solo un intermediario faccio vedere solo la 102 e 103 per fideuram, altrimenti devo mostrare complessivo, fideuram e altri instituti if (dtIntermediari.Rows.Count >= 1) { //FIDEURAM paragrafo = new ParagrafoReport(Convert.ToInt32(rowParagrafi["idParagrafo"]), rowParagrafi); paragrafo.SpazioNecessarioSezioneSuccessiva = rowParagrafi["SpazioNecessarioSezioneSuccessiva"] == DBNull.Value ? 0 : Convert.ToInt32(rowParagrafi["SpazioNecessarioSezioneSuccessiva"]); paragrafo.IntermediarioPar = "BF"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); capitolo.Add(paragrafo); //foreach (DataRow inter in dtIntermediari.Rows) //{ paragrafo = new ParagrafoReport(Convert.ToInt32(rowParagrafi["idParagrafo"]), rowParagrafi); paragrafo.SpazioNecessarioSezioneSuccessiva = rowParagrafi["SpazioNecessarioSezioneSuccessiva"] == DBNull.Value ? 0 : Convert.ToInt32(rowParagrafi["SpazioNecessarioSezioneSuccessiva"]); //paragrafo.IntermediarioPar = inter["Intermediario"].ToString(); paragrafo.IntermediarioPar = "Altri Istituti"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); capitolo.Add(paragrafo); //} //COMPLESSIVO paragrafo = new ParagrafoReport(Convert.ToInt32(rowParagrafi["idParagrafo"]), rowParagrafi); //Per come è fatto il paragrafo del rischio credito il titolo lo metto a codice altrimenti dovevo aggiungere un capitolo non indicizzato paragrafo.Titolo = "Approfondimento Rischio Credito"; paragrafo.SpazioNecessarioSezioneSuccessiva = rowParagrafi["SpazioNecessarioSezioneSuccessiva"] == DBNull.Value ? 0 : Convert.ToInt32(rowParagrafi["SpazioNecessarioSezioneSuccessiva"]); paragrafo.IntermediarioPar = "Complessivo"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); capitolo.Add(paragrafo); } else { paragrafo.Titolo = "Approfondimento Rischio Credito"; paragrafo.IntermediarioPar = "BF"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); // aggiunge il paragrafo al capitolo capitolo.Add(paragrafo); } } else //Monitoraggio { paragrafo.Titolo = "Approfondimento Rischio Credito"; AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); // aggiunge il paragrafo al capitolo capitolo.Add(paragrafo); } } else { if (rowParagrafi["querySqlParagrafo"].ToString().ToLower() == "areemonitorate") // duplica i paragrafi per ogni area monitorata. { int numeroProgettiInvestimento = 0; DataRow[] drTotaleProgettiInvestimento = dsAreeBisognoProgetto.Tables["AreeMonitorate"].Select(" Need_Area = 'Inv'"); int totaleProgettiInvestimento = drTotaleProgettiInvestimento.Length; // 28/10/2015 federicaluca //int titoloParagrafoInvestimento = 0; // foreach (DataRow rAreeeMonitorate in dsAreeBisognoProgetto.Tables["AreeMonitorate"].Rows) { paragrafo = new ParagrafoReport(idParagrafo, rowParagrafi); paragrafo.Titolo = rAreeeMonitorate["Need_Estesa"].ToString(); paragrafo.AreaProgettoDescrizione = rAreeeMonitorate["Need_Estesa"].ToString(); paragrafo.AreaProgettoCodice = rAreeeMonitorate["Need_Area"].ToString(); paragrafo.AreaProgettoSottoMonitoraggio = rAreeeMonitorate["areaprogettosottomonitoraggio"] == DBNull.Value ? false : Convert.ToBoolean(rAreeeMonitorate["areaprogettosottomonitoraggio"]); //V Spostasto fuori dall'IF se l'area è inv //Ordinamento progetto (ambito Aree Monitorate) ZINZERI: if (//V Il filtro va fatto anche per le aree senza monit altrimenti la S86 non può filtrare correttamente paragrafo.AreaProgettoSottoMonitoraggio && rAreeeMonitorate["Ordinamento_Progetto"] != null && !rAreeeMonitorate["Ordinamento_Progetto"].Equals(System.DBNull.Value)) paragrafo.OrdinamentoProgettoPerAreeMonitorate = Convert.ToInt32(rAreeeMonitorate["Ordinamento_Progetto"]); if (rAreeeMonitorate["Need_Area"].ToString().ToLower() != "inv") paragrafo.NomeProgetto = string.Empty; else // è un area di investimento quindi mi recupero anche il nome del progetto. { //Nome progetto: paragrafo.NomeProgetto = rAreeeMonitorate["Nome_Progetto"].ToString(); // Se c'è un solo progetto in investimento chiamato "progetto investimento" // non deve essere stampato il nome di questo progetto come intestazione del paragrafo (proprietà SottoTitolo dell'oggettp paragrafo) //if ((totaleProgettiInvestimento == 1 && rAreeeMonitorate["Nome_Progetto"].ToString().ToLower() == "progetto investimento") || (rAreeeMonitorate == null)) if ((totaleProgettiInvestimento == 1 && rAreeeMonitorate["Nome_Progetto"].ToString().ToLower() == "progetto investimento")) paragrafo.SottoTitolo = string.Empty; else paragrafo.SottoTitolo = rAreeeMonitorate["Nome_Progetto"].ToString(); //Le sezioni useranno questo valore per impostare titoletti ed aspetti vari connessi: paragrafo.NumeroProgettiInvestimento = drTotaleProgettiInvestimento.Length; // va indicizzato solo il primo dei paragrafi di investimento nel caso ci siano + progetti. // ogni progetto di investimento è considerato un paragrafo nuovo. //Modifica per S43BIS, S43 e per Tipo Contratto != 0 if (numeroProgettiInvestimento > 0) paragrafo.Indicizzato = false; //if (numeroProgettiInvestimento > 0) //{ // switch (_dataThread.TipoReport.ToUpper()) // { // case "DIAGNOSI": // if (numeroProgettiInvestimento > 0) // paragrafo.Indicizzato = false; // break; // default: // if ((numeroProgettiInvestimento > 0) && (capitolo.Titolo == "Dettaglio Prodotti per Area di Bisogno")) // paragrafo.Indicizzato = true; // else // paragrafo.Indicizzato = true;//false // break; // } //} /*modifica federicaluca 27/10/2015: la modifica è dovuta ad una segnalazione del QC nella 3° reportistica 2015 * identificata con id2. Il problema riguardava una casistica particolare di clienti per i quali nella sezione * Monitoraggio per aree di bisogno' quando il primo progetto risultava non monitorato non veniva scritto il titoto * dell'area (ovvero del pargrafo stesso, esempio: '2.3 Investimento'. Per circoscrivere la modifica e non impattare * le altre sezioni abbiamo sottoposto l'intervento all'id 61 che identifica la sezione. */ if (paragrafo.Id == 61) { if (paragrafo.AreaProgettoSottoMonitoraggio == true) { numeroProgettiInvestimento++; } } else { numeroProgettiInvestimento++; } } AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); // aggiunge il paragrafo al capitolo capitolo.Add(paragrafo); } } else { AddSezioniToParagrafo(capitolo, paragrafo, tabellaDati, tabellaVincoli); // aggiunge il paragrafo al capitolo capitolo.Add(paragrafo); } } } //capitolo. } /// /// Aggiunge le sezioni al paragrafo. /// Di ciascuna sezione recupera e imposta i vincoli settati a livello di database. /// /// /// /// /// private void AddSezioniToParagrafo(CapitoloReport capitolo, ParagrafoReport paragrafo, DataTable tabellaDati, DataTable tabellaVincoli) { //Recupero le sezioni per ogni paragrafo DataView viewSezioni = new DataView(tabellaDati); viewSezioni.RowFilter = "idParagrafo = " + paragrafo.Id.ToString() + " AND idCapitolo= " + capitolo.Id.ToString(); // aggiungere il filtro del capitolo DataTable tabellaSezioni = viewSezioni.ToTable(true, "idSezione", "codiceSezione", "titoloSezione", "testoSezione", "testoSezioneAlternativo", "notaSezione", "notaSezioneAlternativo", "querySqlSezione", "indicizzatoSezione", "filtroSezione", "nuovaPaginaDopo"); foreach (DataRow rowSezioni in tabellaSezioni.Rows) { SezioneReport sezione; string codiceSez = rowSezioni["codiceSezione"].ToString(); sezione = new SezioneReport(_dataThread, _tabelleSessione, rowSezioni["codiceSezione"].ToString(), rowSezioni); sezione.FiltroSezione = rowSezioni["filtroSezione"].ToString(); //Assegno alla sezione (dovrebbero essere la 102 e 103) l'intermediario definito nel paragrafop if (paragrafo.IntermediarioPar != null) sezione.IntermediarioSez = paragrafo.IntermediarioPar; sezione.AreaProgettoDescrizione = paragrafo.AreaProgettoDescrizione; sezione.AreaProgettoCodice = paragrafo.AreaProgettoCodice; sezione.NomeProgetto = paragrafo.NomeProgetto; sezione.AreaProgettoSottoMonitoraggio = paragrafo.AreaProgettoSottoMonitoraggio; sezione.NumeroProgettiInvestimento = paragrafo.NumeroProgettiInvestimento; sezione.OrdinamentoProgettoPerAreeMonitorate = paragrafo.OrdinamentoProgettoPerAreeMonitorate; sezione.NuovaPaginaDopo = (Boolean)rowSezioni["nuovaPaginaDopo"]; // recupero i vincoli della sezione e setto la proprietà vincolo della stessa. if (tabellaVincoli != null) { DataView viewVincoli = new DataView(tabellaVincoli); viewVincoli.RowFilter = ("SezioneFisica = '" + sezione.Codice.Replace("'", "''") + "'"); DataTable datatableVincoli = viewVincoli.ToTable("datatableVincoli"); // Aggiungo i vincoli alla Sezione. sezione.ImpostaVincoli(datatableVincoli); } //Bido Jan 2011 release if (paragrafo.AreaProgettoCodice.ToLower() == "cc") { //paragrafo.Titolo = "Conti correnti a saldo negativo"; if (sezione.Codice == "S43BIS") { sezione.Titolo = string.Empty; paragrafo.Add(sezione); } } //End of Bido Jan 2011 release // aggiunge la sezione al paragrafo. if (paragrafo.AreaProgettoCodice.ToLower() == "na") { paragrafo.Titolo = "Risorse non allocate"; paragrafo.TestoIntroduttivo = "Nella tabella sono elencati i prodotti non ancora allocati sulle aree di bisogno."; if (sezione.Codice == "S43BIS") { sezione.Titolo = string.Empty; if (capitolo.Children.Count > 0) { ParagrafoReport pervParagrafo = capitolo.Children[capitolo.Children.Count - 1]; SezioneReport lastSezione = pervParagrafo.Children[pervParagrafo.Children.Count - 1]; lastSezione.NuovaPaginaDopo = false; } paragrafo.Add(sezione); } } else { // Per il progetto d'investimento "Prodotti non associati a progetti" stampo solo la S43BIS if (sezione.AreaProgettoCodice.ToLower() == "inv" && sezione.NomeProgetto.ToLower() == "prodotti non associati a progetti") { if (sezione.Codice == "S43BIS") paragrafo.Add(sezione); } else { paragrafo.Add(sezione); } } } } /// /// Recupera gli intermediari. /// /// private DataTable GetIntermediari() { if (UtilityManager.getAppSetting("Periodico") == "0") // utilizzo come giornaliero return SectionManager.GetDataSection(_tabelleSessione, "[C6Mart].[GESTIONE_S_Intermediari]", _dataThread); else return SectionManager.GetDataSection(_tabelleSessione, "[C6MartPeriodico].[GESTIONE_S_Intermediari]", _dataThread); } /// /// Recupera le aree/progetti da stampare nel dettaglio del monitoraggio. /// Originariamente non tutte le aree/progetti venivano stampati e il filtro veniva fatto direttamente sulla [C6MartPeriodico].[PL_AreeMonitorate]. /// Attualmente la richiesta è che devono essere stampate nel dettaglio anche le aree non oggetto di monitoraggio. /// /// private DataTable GetAreeMonitorate() { return SectionManager.GetDataSection(_tabelleSessione, "[C6MartPeriodico].[PL_AreeMonitorate]", _dataThread); } /// /// Lancia la R6_S_Generator e recupera i dati di tutto il report. /// /// /// /// private DataTable getData(int IdReport, int IdModello) { /*/ List parametri = new List(); return DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "[C6Mart].[SELECT_STRUTTURA_REPORT]", parametri); */ List parametri = new List(); Parametro parametro = new Parametro(); parametro.ParameterName = "idReport"; parametro.DbType = DbType.Int32; parametro.Value = IdReport; parametri.Add(parametro); parametro = new Parametro(); parametro.ParameterName = "idModello"; parametro.DbType = DbType.Int32; parametro.Value = IdModello; parametri.Add(parametro); //Usato come periodico if (UtilityManager.getAppSetting("Periodico") == "1") { parametro = new Parametro(); parametro.ParameterName = "periodicita"; parametro.DbType = DbType.String; parametro.Value = 'T'; parametri.Add(parametro); } return _dataThread.DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "C6Mart.GESTIONE_C6_S_Generator", parametri); } /// /// Lancia la R6_S_Vincoli e recupera i vincoli di tutte le sezioni /// /// /// private DataTable getDataVincoli(int IdModello) { List parametri = new List(); Parametro parametro = new Parametro(); parametro.ParameterName = "idModello"; parametro.DbType = DbType.Int32; parametro.Value = IdModello; parametri.Add(parametro); return _dataThread.DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "[C6Mart].[GESTIONE_C6_S_Vincoli]", parametri); } private int getIntFromBitArray(BitArray bitArray) { if (bitArray.Length > 32) throw new ArgumentException("Argument length shall be at most 32 bits."); int[] array = new int[1]; bitArray.CopyTo(array, 0); return array[0]; } } public class Worker : Task { string query; DataThread dataThread; List tabelleSessione; public Worker(string query, DataThread dt, List tabSess) { this.query = query; this.dataThread = dt; this.tabelleSessione = tabSess; this.taskData = new PipelineContext(dt.CodiceFiscale + "_" + query, this); } public override object Elaborate(Dictionary input) { SectionManager.GetDataSection(tabelleSessione, query, dataThread); return null; } } }