using System;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System.Data;
using System.Collections.Generic;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Business.CUSTOM_PDF.ConsulenzaUnica;
using System.Linq;
using Consulenza.ReportWriter.Business.Entity;
using Consulenza.DataServices.fideuram.data.service;
using Consulenza.ReportWriter.Business.CHART_PDF;
using Dundas.Charting.WebControl;
namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    public class S62 : Entity.Section
    {
        /// <summary>
        ///S62.PropostaAdeguatezza idSezione = 105 
        /// </summary>
        private bool notaindicatoricomplessitafe;
        private string notagradoCoperturaComplessita;
		private string notaConcentrazioneProdottiComplessi;
        //Adriano: serve a determinare se il grado di concentrazione = 100, che nel caso dei clienti professionali significa valorizzare CC e CM a "n.a."
        private bool maxConcentrazione;
        //--Adriano
        public S62(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S62", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        protected override sealed void Draw()
        {
            var dati = GetDataSet();
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            AddElement(new PagePDF(PagePDF.PagePDFType.Generic));

            var intestazione = new SectionHeadingPDF(
                (isAdeguata ? "Proposta" : "Operazioni richieste") + ": adeguatezza",

                EnvironmentFacade.RendererFacade.XLeftLimit,
                EnvironmentFacade.RendererFacade.YUpperLimit,
                EnvironmentFacade.ReportEnvironment.FontFamily);

            AddElement(intestazione.ToElement());
            bool saltoPagina = false;
            
            bool visualizzaTabellaIndicatoriSintesi = GetOption<Opzione4_1>().Valore;
            bool visualizzaTabellaProdotti = GetOption<Opzione4_2>().Valore;          
            if (dati.Tables["indicatori"].Rows.Count > 0)
            {
                if (saltoPagina)
                    AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
                saltoPagina = true;

                if (getTesto1().Length > 0)
                {
                    AddElement(new SpacePDF(20));
                    AddElement(new FormattedTextAreaPDF(getTesto1(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                    AddElement(new SpacePDF(15));
                }

                #region profilo finanziario
                var dtPatrimonio = new DataTable();
                dtPatrimonio.Columns.Add(new DataColumn("controvalore"));
                dtPatrimonio.Columns.Add(new DataColumn("valore"));
                dtPatrimonio.Columns.Add(new DataColumn("descrizione"));
                dtPatrimonio.Columns.Add(new DataColumn("val"));

                for (int i = 0; i < dati.Tables["patrimoni"].Rows.Count / 2; )
                {
                    int r = 0;
                    foreach (DataRow ro in dati.Tables["patrimoni"].Rows)
                    {

                        if (r % 2 == 0)
                        {
                            DataRow row = dtPatrimonio.NewRow();
                            dtPatrimonio.Rows.Add(row);
                            dtPatrimonio.Rows[i]["controvalore"] = ro["Descrizione"].ToString();
                            dtPatrimonio.Rows[i]["valore"] = ro["Valore"].ToString();
                        }
                        else
                        {
                            dtPatrimonio.Rows[i]["descrizione"] = ro["Descrizione"].ToString();
                            dtPatrimonio.Rows[i]["val"] = ro["Valore"].ToString();

                            i++;
                        }
                        r++;

                    }

                }
                var countRow = dtPatrimonio.Rows.Count - 1;
                var tabellaPatrimonio = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtPatrimonio)
                {
                    Style = Style.ConsulenzaUnica,
                    Header = false,
                    Footer = false,
                    RowHeight = 25,
                    AlternateRow = false,
                    WidthSeparationLines = 0

                };
                tabellaPatrimonio.Columns.Add(new ColumnPDF("controvalore", 150, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo, "controvalore", string.Empty) { HeaderFontSize = 7, PaddingLeft = 5 });
                tabellaPatrimonio.Columns.Add(new ColumnPDF("valore", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "valore", string.Empty) { HeaderFontSize = 7, PaddingLeft = 5, BackgroundColor = ColorPDF.Bianco, PaddingRight = 15 });
                tabellaPatrimonio.Columns.Add(new ColumnPDF("descrizione", 150, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo, "descrizione", string.Empty) { HeaderFontSize = 7, PaddingLeft = 5 });
                tabellaPatrimonio.Columns.Add(new ColumnPDF("val", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "val", string.Empty) { HeaderFontSize = 7, PaddingLeft = 5, BackgroundColor = ColorPDF.Bianco });

                tabellaPatrimonio.Cells[2, countRow].BackgroundColor = dtPatrimonio.Rows[countRow]["descrizione"].ToString() == "" ? ColorPDF.Bianco : ColorPDF.Standard_Grigio_SfondoColonnaTabella;
                tabellaPatrimonio.Cells[1, countRow].FontColor = dtPatrimonio.Rows[countRow]["valore"].ToString().Equals("n.a.") ? ColorPDF.Nero : dtPatrimonio.Rows[countRow]["valore"].ToString().Equals("Adeguato") ? ColorPDF.Verde : ColorPDF.Rosso;
                tabellaPatrimonio.Cells[3, countRow].FontColor = dtPatrimonio.Rows[countRow]["val"].ToString().Equals("n.a.") ? ColorPDF.Nero : dtPatrimonio.Rows[countRow]["val"].ToString().Equals("Adeguato") ? ColorPDF.Verde : ColorPDF.Rosso;

                AddElement(tabellaPatrimonio);
                AddElement(new SpacePDF(10));

                #endregion

                #region indicatore di sintesi

                var tabellaIndicatori = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["indicatori"], dati.Tables["indicatoriFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    Footer = true,
                    HeaderFontSize = 7,
                    HeaderHeight = 30,
                    RowHeight = 30,
                    FooterHeight=50
                };

                tabellaIndicatori.Columns.Add(new ColumnPDF("Indicatore", 130, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo, "Indicatore", "Indicatore") { HeaderFontSize = 7 });
                tabellaIndicatori.Columns.Add(new ColumnPDF("Portafoglioattuale", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Portafoglioattuale", "Portafoglio<br> attuale") { HeaderFontSize = 7 });
                tabellaIndicatori.Columns.Add(new ColumnPDF("Operazioni", 55, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Operazioni", "Operazioni" + (isAdeguata ? "" : " richieste")) { HeaderFontSize = 7 });
                tabellaIndicatori.Columns.Add(new ColumnPDF("Portafoglioproposto", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Portafoglioproposto", "Portafoglio<br>" + (isAdeguata ? "proposto" : "prospettico")) { HeaderFontSize = 7 });
                tabellaIndicatori.Columns.Add(new ColumnPDF("Sogliamassima", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Sogliamassima", "Soglia<br> massima") { HeaderFontSize = 7 });
                tabellaIndicatori.Columns.Add(new ColumnPDF("Gradocopertura", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Gradocopertura", "Grado di<br> copertura") { HeaderFontSize = 7 });
                tabellaIndicatori.Columns.Add(new ColumnPDF("Adeguatezza", 65, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "Adeguatezza", "Adeguatezza") { HeaderFontSize = 7 });

                tabellaIndicatori.FooterColumns.Add(new ColumnPDF("label", 65, HorizontalAlignmentType.Sinistra, true, true, 6, ColumnType.Testo));
                tabellaIndicatori.FooterColumns.Add(new ColumnPDF("messaggio", 455, HorizontalAlignmentType.Sinistra, true, false, 6, ColumnType.Testo));


                for (int a = 0; a < dati.Tables["indicatori"].Rows.Count; a++)
                {
                    int iIndicatore = 0;
                    int iPortafoglioattuale= 1;
                    int iOperazioni = 2;
                    int iPortafoglioproposto = 3;
                    int iSogliamassima = 4;
                    int iGradocopertura = 5;
                    int iAdeguatezza = 6;
                    tabellaIndicatori.Cells[iIndicatore, a].FontBold = true;
                    tabellaIndicatori.Cells[iPortafoglioattuale, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaIndicatori.Cells[iOperazioni, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaIndicatori.Cells[iPortafoglioproposto, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaIndicatori.Cells[iSogliamassima, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    tabellaIndicatori.Cells[iGradocopertura, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                }

                AddElement(tabellaIndicatori);
                
                if (getNota1().Length > 0)
                {
                    AddElement(new SpacePDF(10));
                    AddElement(
                        new FormattedTextAreaPDF
                            ("(*) " + getNota1(), 
                            EnvironmentFacade.RendererFacade.XLeftLimit
                            ) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                    
                }
                if (getNota2().Length > 0)
                {
                    AddElement(new SpacePDF(5));
                    AddElement(new FormattedTextAreaPDF(getNota2(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                }

                //if (getNota62_1o11e2e12e3().Length > 0)
                //{
                //    AddElement(new SpacePDF(10));
                //    AddElement(new FormattedTextAreaPDF("(*) " + getNota62_1o11e2e12e3(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                //    //AddElement(new SpacePDF(15));
                //    //tabellaIndicatori.Notes.Add(
                //    //    new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                //    //        getNota1(),
                //    //        new[] { "Indicatore" },
                //    //        "Indicatore='Complessità'",
                //    //        TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign= ceTe.DynamicPDF.TextAlign.Justify}
                //    //        );
                //}
                //if (!isAdeguata && getNota62_5().Length > 0)
                //{
                //    AddElement(new SpacePDF(5));
                //    AddElement(new FormattedTextAreaPDF(getNota62_5(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

                //}
                //if (getNota62_4().Length > 0)
                //{
                //    AddElement(new SpacePDF(5));
                //    AddElement(new FormattedTextAreaPDF(getNota62_4(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

                //}
                //    //if (notaindicatoricomplessitafe)
                //    //{
                //    //    AddElement(new SpacePDF(10));
                //    //    AddElement(new FormattedTextAreaPDF("(**)" + getNotaIndicatori(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                //    //}


                //if (getNota62_6e7().Length > 0)
                //{
                //    AddElement(new SpacePDF(5));
                //    AddElement(new FormattedTextAreaPDF(getNota62_6e7(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

                //}
                #endregion



            }

            #region prodotti

            if (dati.Tables["prodotti"].Rows.Count > 0)
            {
                if (visualizzaTabellaIndicatoriSintesi && visualizzaTabellaProdotti)
                {
                    AddElement(new ImagePDF(435, 0.15F, "changepage.png") { Y = 745 - 5, AutoIncrementYWritable = false });
                    AddElement(new FormattedTextAreaPDF("continua alla pagina successiva", 450, 200) { Y = 745 - 5, AutoIncrementYWritable = false, FontSize = 6, AbsolutePosition = true });
                }
                if (saltoPagina)
                    AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
                saltoPagina = true;
                if (visualizzaTabellaIndicatoriSintesi && visualizzaTabellaProdotti)
                {
                    AddElement(new SpacePDF(2));

                    AddElement(new ImagePDF(37, 0.15F, "changepage.png") { AutoIncrementYWritable = false });
                    AddElement(new FormattedTextAreaPDF("continua dalla pagina precedente", 37 + 15, 200) { FontSize = 6, AutoIncrementYWritable = true });
                }

                if (getTesto3().Length > 0)
                {
                    AddElement(new SpacePDF(15));
                    AddElement(new FormattedTextAreaPDF(getTesto3(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                    AddElement(new SpacePDF(15));
                }

                #region tabella prodotti - indicatori di rischio


                var tabellaProdotti = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["prodotti"])
                {
                    Style = Style.ConsulenzaUnica,
                    Footer = false,
                    AlternateRow = false,
                    ShowBorderLastLine = false,
                    HeaderHeight = 28,
                    //RowHeight = 30,
                    //  FooterHeight=30,
                    HeaderMargin = 1,
                    WhiteSpacesHorizontalSeparator = true,
                    AdditionalSpaceBetweenHeadersAndTable = 2,
                    ShowSeparationLines = true,
                    ShowFooterSeparationLines = true,
                    HideLastSeparationLine = true,
                    HideFirstSeparationLine = true
                };

                //tabellaProdotti.Columns.Add(new ColumnPDF("Immagine", 1, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Objectpdf, "", "") { DeltaYContent=7});
                tabellaProdotti.Columns.Add(new ColumnPDF("Codicecontratto", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "CodiceContratto", "Codice<br>contratto") { HeaderFontSize = 7, PaddingLeft = 8});
                // Modifica per Saving Map
                tabellaProdotti.Columns.Add(new ColumnPDF("SavingMap", 10, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 6, ScaleColumnTypeImage = 0.50F });
                // Fine Modifica
                tabellaProdotti.Columns.Add(new ColumnPDF("Descrizione", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Nome", "Descrizione") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaProdotti.Columns.Add(new ColumnPDF("Controvaloreproposto", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore<br>" + (isAdeguata ? "proposto" : "prospettico")+ " (€)") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaProdotti.Columns.Add(new ColumnPDF("rischiomercato", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiomercato", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaProdotti.Columns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiocredito", "Rischio<br>Credito") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaProdotti.Columns.Add(new ColumnPDF("Compl", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Complessita", "Complessità") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaProdotti.Columns.Add(new ColumnPDF("Liquidita", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Liquidita", "Liquidità/<br>Liquidabilità") { HeaderFontSize = 7, PaddingRight = 4 });

                for (int h = 0; h < dati.Tables["prodotti"].Rows.Count; h++)
                {
                    DataRow prodotto = dati.Tables["prodotti"].Rows[h];
                    DataRow prodottoNextRow = h < dati.Tables["prodotti"].Rows.Count - 1 ? dati.Tables["prodotti"].Rows[h + 1] : null;
                    if ((!prodotto["CodArea"].Equals("") && prodottoNextRow != null && prodottoNextRow["Descrizione"].Equals("")) ||
                        (!prodotto["Descrizione"].Equals("") && prodotto["CodArea"].Equals("") && prodottoNextRow != null && prodottoNextRow["CodArea"].Equals("")))
                    {
                        tabellaProdotti.IndexesOfRowLinesToIgnoreSeparators.Add(h);
                    }

                    if (!prodotto["CodArea"].Equals(""))
                    {                        
                        tabellaProdotti.Cells[0, h].ColSpan = 3;
                        float deltaXSwitch;
                        //float deltaYSwitch;
                        switch (prodotto["CodArea"].ToString().ToUpper())
                        {
                            case "EXT":
                                deltaXSwitch = 1.5F;
                                //deltaYSwitch = -0.3F;
                                break;
                            case "INV":
                                deltaXSwitch = 2.2F;
                                //deltaYSwitch = -0.4F;
                                break;
                            case "PRE":
                                deltaXSwitch = 1.8F;
                                //deltaYSwitch = -0.3F;
                                break;
                            case "RIS":
                                deltaXSwitch = 1.3F;
                                //deltaYSwitch = -0.3F;
                                break;
                            case "LIQ":
                                deltaXSwitch = 1.5F;
                                //deltaYSwitch = -0.2F;
                                break;
                            default:
                                deltaXSwitch = 2;
                                //deltaYSwitch = 0;
                                break;
                        }
                        var listaOggetti = new List<ObjectPDF> {
                                        new RectanglePDF(7.5F, 8, ColorPDF.GetBy_AreaBisogno(prodotto["CodArea"].ToString())){DeltaY = 4.2F},//{DeltaY = deltaYSwitch-3},
                                        new FormattedTextAreaPDF
                                        {
                                            Text = prodotto["CodArea"].ToString().Substring(0,1),
                                            FontBold = true,
                                            FontColor = ColorPDF.Bianco,
                                            DeltaX = deltaXSwitch,
                                            //DeltaX = deltaXSwitch + 1,
                                            DeltaY = 1.7F,
                                            FontSize=7
                                        },
                                        new FormattedTextAreaPDF
                                        {
                                            Text = prodotto["Descrizione"].ToString(),
                                            FontBold = true,
                                            FontColor = ColorPDF.Nero,
                                            DeltaY = 1.7F,
                                            DeltaX = 10,
                                            FontSize=7
                                        }
                                    };

                        tabellaProdotti.Cells[0, h].ValueObjectList.AddRange(listaOggetti);
                        tabellaProdotti.Cells[0, h].BackgroundColor =
                        tabellaProdotti.Cells[1, h].BackgroundColor =
                        tabellaProdotti.Cells[2, h].BackgroundColor =
                        tabellaProdotti.Cells[3, h].BackgroundColor =
                        tabellaProdotti.Cells[4, h].BackgroundColor =
                        tabellaProdotti.Cells[5, h].BackgroundColor =
                        tabellaProdotti.Cells[6, h].BackgroundColor =
                        tabellaProdotti.Cells[7, h].BackgroundColor =
                        tabellaProdotti.Cells[8, h].BackgroundColor = ColorPDF.ConsulenzaUnica_Grigio_SfondoColonnaHeaderFooterTabella;
                        tabellaProdotti.Cells[0, h].FontBold =
                        tabellaProdotti.Cells[1, h].FontBold =
                        tabellaProdotti.Cells[2, h].FontBold =
                        tabellaProdotti.Cells[3, h].FontBold =
                        tabellaProdotti.Cells[4, h].FontBold =
                        tabellaProdotti.Cells[5, h].FontBold =
                        tabellaProdotti.Cells[6, h].FontBold =
                        tabellaProdotti.Cells[7, h].FontBold =
                        tabellaProdotti.Cells[8, h].FontBold = true;
                        tabellaProdotti.Cells[2, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[3, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[4, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[5, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[6, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[7, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[8, h].YContentOffset -= 0.9F;
                    }
                    else if (!prodotto["Descrizione"].Equals(""))
                    {
                        //if (prodotto["Descrizione"].ToString().Contains("- 02215"))
                        //{
                        //    int length = prodotto["Descrizione"].ToString().Length;
                        //}
                        var listaOggetti = new List<ObjectPDF> {
                                        new FormattedTextAreaPDF
                                        {
                                            Text = prodotto["Descrizione"].ToString(),
                                            FontBold = true,
                                            FontColor = ColorPDF.Nero,
                                            DeltaY = prodotto["Descrizione"].ToString().Length <= 42 ? 1.8F : -0.5F,
                                            FontSize=7,
                                            Width=185
                                        }
                                    };
                        tabellaProdotti.Cells[0, h].ColSpan = 3;
                        tabellaProdotti.Cells[0, h].ValueObjectList.AddRange(listaOggetti);
                        tabellaProdotti.Cells[0, h].BackgroundColor =
                        tabellaProdotti.Cells[1, h].BackgroundColor =
                        tabellaProdotti.Cells[2, h].BackgroundColor =
                        tabellaProdotti.Cells[3, h].BackgroundColor =
                        tabellaProdotti.Cells[4, h].BackgroundColor =
                        tabellaProdotti.Cells[5, h].BackgroundColor =
                        tabellaProdotti.Cells[6, h].BackgroundColor =
                        tabellaProdotti.Cells[7, h].BackgroundColor =
                        tabellaProdotti.Cells[8, h].BackgroundColor = Convert.ToBoolean(prodotto["BackgroundColor"]) ? ColorPDF.ConsulenzaUnica_Grigio_SfondoColonnaHeaderFooterTabella : ColorPDF.Bianco;
                        tabellaProdotti.Cells[0, h].FontBold =
                        tabellaProdotti.Cells[1, h].FontBold =
                        tabellaProdotti.Cells[2, h].FontBold =
                        tabellaProdotti.Cells[3, h].FontBold =
                        tabellaProdotti.Cells[4, h].FontBold =
                        tabellaProdotti.Cells[5, h].FontBold =
                        tabellaProdotti.Cells[6, h].FontBold =
                        tabellaProdotti.Cells[7, h].FontBold =
                        tabellaProdotti.Cells[8, h].FontBold = Convert.ToBoolean(prodotto["FontBold"]);
                        tabellaProdotti.Cells[2, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[3, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[4, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[5, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[6, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[7, h].YContentOffset -= 0.9F;
                        tabellaProdotti.Cells[8, h].YContentOffset -= 0.9F;

                        if (prodotto["Descrizione"].ToString().ToLower().Equals("portafoglio proposto")) {
                            for (int hx = 0; hx < dati.Tables["indicatori"].Rows.Count; hx++)
                            {
                                DataRow indicatore = dati.Tables["indicatori"].Rows[hx];
                                if (indicatore["Indicatore"].ToString().ToLower().Equals("rischio credito")) {
                                    prodotto["RischioCredito"] = indicatore["Portafoglioproposto"];
                                    break;
                                }
                            }
                        }
                        
                    }
                    else {
                            var listaOggetti = new List<ObjectPDF> {
                                            new FormattedTextAreaPDF
                                            {
                                                Text = prodotto["CodiceContratto"].ToString(),
                                                FontBold = false,
                                                FontColor = ColorPDF.Nero,
                                                DeltaY = 1.7F,
                                                FontSize=7,
                                                Width=185
                                            }
                                        };
                            tabellaProdotti.Cells[0, h].ValueObjectList.AddRange(listaOggetti);
                            tabellaProdotti.Cells[0, h].BackgroundColor =
                            tabellaProdotti.Cells[1, h].BackgroundColor =
                            tabellaProdotti.Cells[2, h].BackgroundColor =
                            tabellaProdotti.Cells[3, h].BackgroundColor =
                            tabellaProdotti.Cells[4, h].BackgroundColor =
                            tabellaProdotti.Cells[5, h].BackgroundColor =
                            tabellaProdotti.Cells[6, h].BackgroundColor =
                            tabellaProdotti.Cells[7, h].BackgroundColor =
                            tabellaProdotti.Cells[8, h].BackgroundColor = Convert.ToBoolean(prodotto["BackgroundColor"]) ? ColorPDF.ConsulenzaUnica_Grigio_SfondoColonnaHeaderFooterTabella : ColorPDF.Bianco;
                            tabellaProdotti.Cells[0, h].FontBold =
                            tabellaProdotti.Cells[1, h].FontBold =
                            tabellaProdotti.Cells[2, h].FontBold =
                            tabellaProdotti.Cells[3, h].FontBold =
                            tabellaProdotti.Cells[4, h].FontBold =
                            tabellaProdotti.Cells[5, h].FontBold =
                            tabellaProdotti.Cells[6, h].FontBold =
                            tabellaProdotti.Cells[7, h].FontBold =
                            tabellaProdotti.Cells[8, h].FontBold = Convert.ToBoolean(prodotto["FontBold"]);
                            tabellaProdotti.Cells[2, h].YContentOffset -= 0.9F;
                            tabellaProdotti.Cells[3, h].YContentOffset -= 0.9F;
                            tabellaProdotti.Cells[4, h].YContentOffset -= 0.9F;
                            tabellaProdotti.Cells[5, h].YContentOffset -= 0.9F;
                            tabellaProdotti.Cells[6, h].YContentOffset -= 0.9F;
                            tabellaProdotti.Cells[7, h].YContentOffset -= 0.9F;
                            tabellaProdotti.Cells[8, h].YContentOffset -= 0.9F;
                    }
                    for (int c = 0; c < tabellaProdotti.Columns.Count; c++)
                    {
                        if (c >= 3)
                            tabellaProdotti.Cells[c, h].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    }
                }
                //nota complessità indicatori: da chiedere dati

                if (getNota1().Length>0)
                {
                    //AddElement(new SpacePDF(5));
                    tabellaProdotti.Notes.Add(
                        new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
                            getNota1(),
                            new[] { "Compl" },
                            "",
                            TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify}
                            );
                }

                AddElement(tabellaProdotti);
                #endregion
            }
            #endregion

            #region focus emittenti

            if (dati.Tables["emittentiObb"].Rows.Count > 0 || dati.Tables["emittentiAz"].Rows.Count > 0 || dati.Tables["fondi"].Rows.Count > 0)
            {

                    if (saltoPagina)
                        AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
                    saltoPagina = true; 

                var intestazioneEmittenti = new ChapterHeadingPDF(
                    getCapitolo4(),
                    getTesto4(),
                    EnvironmentFacade.RendererFacade.XLeftLimit,
                    EnvironmentFacade.RendererFacade.YUpperLimit,
                   EnvironmentFacade.ReportEnvironment.FontFamily);

                AddElement(intestazioneEmittenti.ToElement());
            }

            #region emittenti obbligazionari
            if (dati.Tables["emittentiObb"].Rows.Count > 0)
            {
                var tabellaEmittentiObb = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["emittentiObb"], dati.Tables["emittentiObbfooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    Footer = true,
                    AlternateRow = false,
                    ShowBorderLastLine = false,
                    HeaderHeight = 30,
                    HeaderFontSize = 7,
                    AutoIncrementYWritable = true,
                    ShowSeparationLines = true


                };

                // Modifica per Saving Map
                tabellaEmittentiObb.Columns.Add(new ColumnPDF("SavingMap", 10, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 6, ScaleColumnTypeImage = 0.50F });
                // Fine Modifica

                tabellaEmittentiObb.Columns.Add(new ColumnPDF("Emittente", 175, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Testo, "Emittenti", datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato ? "*" : ""+ "Emittenti obbligazionari") { HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco, PaddingRight = 5 });
                tabellaEmittentiObb.Columns.Add(new ColumnPDF("Controvaloreproposto", 65, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Controvaloreproposto", "Controvalore<br>" + (isAdeguata ? "proposto" : "prospettico")+ " (€)") { PaddingRight = 5, HeaderFontSize =6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiObb.Columns.Add(new ColumnPDF("Franchigia", 65, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Testo, "Franchigia", "Franchigia controvalore (€)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiObb.Columns.Add(new ColumnPDF("Concentrazione", 70, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Concentrazione", "Concentrazione (%)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiObb.Columns.Add(new ColumnPDF("Soglia", 70, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Sogliaconcentrazione", "Soglia di concentrazione (%)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiObb.Columns.Add(new ColumnPDF("Adeguatezza", 65, HorizontalAlignmentType.Centrato, false, false, 6, ColumnType.Testo, "Adeguatezza", "Adeguatezza") { HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });

                tabellaEmittentiObb.FooterColumns.Add(new ColumnPDF("Emittente", 184, HorizontalAlignmentType.Sinistra, true, true, 6, ColumnType.Testo) );
                tabellaEmittentiObb.FooterColumns.Add(new ColumnPDF("Controvaloreproposto", 65, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiObb.FooterColumns.Add(new ColumnPDF("Franchigia", 65, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiObb.FooterColumns.Add(new ColumnPDF("Concentrazione", 70, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiObb.FooterColumns.Add(new ColumnPDF("Soglia", 70, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiObb.FooterColumns.Add(new ColumnPDF("Adeguatezza", 65, HorizontalAlignmentType.Centrato, true, true, 6, ColumnType.Testo) { PaddingRight = 4 });

                for (int l = 0; l < dati.Tables["emittentiObb"].Rows.Count; l++)
                {
                    DataRow concetrazione = dati.Tables["emittentiObb"].Rows[l];
                    //int indexEmittente = 0; 
                    int indexAdeguatezza = 5;
                    tabellaEmittentiObb.Cells[0, l].Value =concetrazione["Emittenti"].ToString().ToLower().Contains("titoli") ? "&nbsp;<i>"+concetrazione["Emittenti"].ToString()+"</i>" : concetrazione["Emittenti"].ToString() ;
                    

                    switch (concetrazione["Adeguatezza"].ToString())
                    {
                        case "Adeguatezza":
                            concetrazione["Adeguatezza"] = "Adeguato";
                            tabellaEmittentiObb.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Verde;
                            break;
                        case "Non Adeguatezza":
                            concetrazione["Adeguatezza"] = "Non adeguato";
                            tabellaEmittentiObb.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Rosso;
                            break;
                        default:
                            tabellaEmittentiObb.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Nero;
                            break;
                    }
                    tabellaEmittentiObb.Cells[1, l].HorizontalAlignment =
                        tabellaEmittentiObb.Cells[2, l].HorizontalAlignment =
                        tabellaEmittentiObb.Cells[3, l].HorizontalAlignment =
                        tabellaEmittentiObb.Cells[4, l].HorizontalAlignment = HorizontalAlignmentType.Destra;

                }               
                AddElement(tabellaEmittentiObb);
                if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato)
                {
                    string testoobbligazionarie = isAdeguata ? "In tabella sono riportati gli emittenti relativi a tutte le obbligazioni detenute dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme ad eventuali nuovi emittenti obbligazionari derivanti dalle operazioni effettuate nella presente proposta." : "In tabella sono riportati gli emittenti relativi a tutte le obbligazioni detenute dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme ad eventuali nuovi emittenti obbligazionari derivanti dalle operazioni da lei richieste al suo private banker.";
                    AddElement(new SpacePDF(10));
                    AddElement(new FormattedTextAreaPDF("(*) " + testoobbligazionarie, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                }
                AddElement(new SpacePDF(25));
            
            }
            #endregion

            #region emittenti azionari
            if (dati.Tables["emittentiAz"].Rows.Count > 0)
            {
                var tabellaEmittentiAz = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["emittentiAz"], dati.Tables["emittentiAzfooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    Footer = true,
                    AlternateRow = false,
                    ShowBorderLastLine = false,
                    HeaderHeight = 30,
                    HeaderFontSize = 7,
                    ShowSeparationLines = true


                };

                // Modifica per Saving Map
                tabellaEmittentiAz.Columns.Add(new ColumnPDF("SavingMap", 10, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 6, ScaleColumnTypeImage = 0.50F });
                // Fine Modifica

                tabellaEmittentiAz.Columns.Add(new ColumnPDF("Emittente", 165, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Testo, "Emittenti", datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato ? "*" : "" + "Emittenti azionari") { HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco, PaddingRight = 5 });
                tabellaEmittentiAz.Columns.Add(new ColumnPDF("Controvaloreproposto", 65, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Controvaloreproposto", "Controvalore<br>" + (isAdeguata ? "proposto" : "prospettico")+ " (€)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiAz.Columns.Add(new ColumnPDF("Franchigia", 65, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Testo, "Franchigia", "Franchigia controvalore (€)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiAz.Columns.Add(new ColumnPDF("Concentrazione", 70, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Concentrazione", "Concentrazione (%)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiAz.Columns.Add(new ColumnPDF("Soglia", 70, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Sogliaconcentrazione", "Soglia di concentrazione (%)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaEmittentiAz.Columns.Add(new ColumnPDF("Adeguatezza", 65, HorizontalAlignmentType.Centrato, false, false, 6, ColumnType.Testo, "Adeguatezza", "Adeguatezza") { HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });


                tabellaEmittentiAz.FooterColumns.Add(new ColumnPDF("Emittente", 174, HorizontalAlignmentType.Sinistra, true, true, 6, ColumnType.Testo));
                tabellaEmittentiAz.FooterColumns.Add(new ColumnPDF("Controvaloreproposto", 65, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiAz.FooterColumns.Add(new ColumnPDF("Franchigia", 65, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiAz.FooterColumns.Add(new ColumnPDF("Concentrazione", 70, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiAz.FooterColumns.Add(new ColumnPDF("Soglia", 70, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaEmittentiAz.FooterColumns.Add(new ColumnPDF("Adeguatezza", 65, HorizontalAlignmentType.Centrato, true, true, 6, ColumnType.Testo) { PaddingRight = 4 });

                for (int l = 0; l < dati.Tables["emittentiAz"].Rows.Count; l++)
                {
                    DataRow concetrazione = dati.Tables["emittentiAz"].Rows[l];
                    //int indexEmittente = 0;
                    int indexAdeguatezza = 6;

                    tabellaEmittentiAz.Cells[1, l].Value = concetrazione["Emittenti"].ToString().ToLower().Contains("titoli") ? "&nbsp;<i>" + concetrazione["Emittenti"].ToString() + "</i>" : concetrazione["Emittenti"].ToString();

                    switch (concetrazione["Adeguatezza"].ToString())
                    {
                        case "Adeguatezza":
                            concetrazione["Adeguatezza"] = "Adeguato";
                            tabellaEmittentiAz.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Verde;
                            break;
                        case "Non Adeguatezza":
                            concetrazione["Adeguatezza"] = "Non adeguato";
                            tabellaEmittentiAz.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Rosso;
                            break;
                        default:
                            tabellaEmittentiAz.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Nero;
                            break;
                    }
                    tabellaEmittentiAz.Cells[2, l].HorizontalAlignment =
               tabellaEmittentiAz.Cells[3, l].HorizontalAlignment =
               tabellaEmittentiAz.Cells[4, l].HorizontalAlignment =
               tabellaEmittentiAz.Cells[5, l].HorizontalAlignment = HorizontalAlignmentType.Destra;
                }
                AddElement(tabellaEmittentiAz);
                if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato)
                {
                    string testoaz = isAdeguata ? "In tabella sono riportati gli emittenti relativi a tutte le azioni detenute dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme ad eventuali nuovi emittenti azionari derivanti dalle operazioni effettuate nella presente proposta." : "In tabella sono riportati gli emittenti relativi a tutte le azioni detenute dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme ad eventuali nuovi emittenti azionari derivanti dalle operazioni da lei richieste al suo private banker.";
                    AddElement(new SpacePDF(10));
                    AddElement(new FormattedTextAreaPDF("(*) " + testoaz, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                }
                AddElement(new SpacePDF(25));
            }
            #endregion

            #region fondi speculativi
            if (dati.Tables["fondi"].Rows.Count > 0)
            {
                var tabellaFondi = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["fondi"], dati.Tables["fondifooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    Footer = true,
                    AlternateRow = false,
                    ShowBorderLastLine = false,
                    HeaderHeight = 27,
                    HeaderFontSize = 7,
                    RowHeight = 25,
                    ShowSeparationLines = true               

                };
                tabellaFondi.Columns.Add(new ColumnPDF("Emittente", 170, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Testo, "Emittenti", datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato ? "Fondi speculativi*" : "" + "Fondi speculativi") { HeaderFontSize = 6, PaddingRight = 5, BackgroundColor = ColorPDF.Bianco, FontSize = 7 });
                tabellaFondi.Columns.Add(new ColumnPDF("Controvaloreproposto", 100, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Controvaloreproposto", "Controvalore<br>" + (isAdeguata ? "proposto" : "prospettico") + " (€)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                //tabellaFondi.Columns.Add(new ColumnPDF("Franchigia", 65, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "Franchigia", "Franchigia<br>controvalore (€)") { BackgroundColor = ColorPDF.Bianco });
                tabellaFondi.Columns.Add(new ColumnPDF("Concentrazione", 90, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Concentrazione", "Concentrazione (%)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaFondi.Columns.Add(new ColumnPDF("Soglia", 90, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Decimale, "Sogliaconcentrazione", "Soglia di concentrazione (%)") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });
                tabellaFondi.Columns.Add(new ColumnPDF("Adeguatezza", 70, HorizontalAlignmentType.Centrato, false, false, 6, ColumnType.Testo, "Adeguatezza", "Adeguatezza") { PaddingRight = 5, HeaderFontSize = 6, BackgroundColor = ColorPDF.Bianco });

                tabellaFondi.FooterColumns.Add(new ColumnPDF("Emittente", 170, HorizontalAlignmentType.Sinistra, true, true, 6, ColumnType.Testo));
                tabellaFondi.FooterColumns.Add(new ColumnPDF("Controvaloreproposto", 100, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                //tabellaFondi.FooterColumns.Add(new ColumnPDF("Franchigia", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo));
                tabellaFondi.FooterColumns.Add(new ColumnPDF("Concentrazione", 90, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaFondi.FooterColumns.Add(new ColumnPDF("Soglia", 90, HorizontalAlignmentType.Destra, true, true, 6, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaFondi.FooterColumns.Add(new ColumnPDF("Adeguatezza", 70, HorizontalAlignmentType.Centrato, true, true, 6, ColumnType.Testo) { PaddingRight = 4 });

                for (int l = 0; l < dati.Tables["fondi"].Rows.Count; l++)
                {
                    DataRow concetrazione = dati.Tables["fondi"].Rows[l];
                    int indexEmittente = 0;
                    int indexAdeguatezza = 4;

                    tabellaFondi.Cells[0, l].Value = concetrazione["Emittenti"].ToString().ToLower().Contains("titoli") ? "&nbsp;<i>" + concetrazione["Emittenti"].ToString() + "</i>" : concetrazione["Emittenti"].ToString();
                    switch (concetrazione["Adeguatezza"].ToString())
                    {
                        case "Adeguatezza":
                            concetrazione["Adeguatezza"] = "Adeguato";
                            tabellaFondi.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Verde;
                            break;
                        case "Non Adeguatezza":
                            concetrazione["Adeguatezza"] = "Non adeguato";
                            tabellaFondi.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Rosso;
                            break;
                        default:
                            tabellaFondi.Cells[indexAdeguatezza, l].FontColor = ColorPDF.Nero;
                            break;
                    }
                    tabellaFondi.Cells[1, l].HorizontalAlignment =
              tabellaFondi.Cells[2, l].HorizontalAlignment =
              tabellaFondi.Cells[3, l].HorizontalAlignment = HorizontalAlignmentType.Destra;
                }
                AddElement(tabellaFondi);
                if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato)
                {
                    string testof = isAdeguata ? "In tabella sono riportati tutti i fondi speculativi detenuti dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme ad eventuali nuovi fondi speculativi derivanti dalle operazioni effettuate nella presente proposta." : " In tabella sono riportati tutti i fondi speculativi detenuti dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme ad eventuali nuovi fondi speculativi derivanti dalle operazioni da lei richieste al suo private banker.";
                    AddElement(new SpacePDF(10));
                    AddElement(new FormattedTextAreaPDF("(*) " + testof, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                }
                AddElement(new SpacePDF(25));

            }
            #endregion

            #endregion

            #region Orizzonete Temporale Liquidità / Liquidabilità
            if (dati.Tables["orizzonte"].Rows.Count == 5)
            {

                if (saltoPagina)
                    AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
                saltoPagina = true;

                var intestazioneLiquidita = new ChapterHeadingPDF(
                    Helper.ReplaceVariables(getCapitolo5(), base.EnvironmentFacade.ReportEnvironment),
                    Helper.ReplaceVariables(getTesto6(), base.EnvironmentFacade.ReportEnvironment),
                    EnvironmentFacade.RendererFacade.XLeftLimit,
                    EnvironmentFacade.RendererFacade.YUpperLimit,
                    EnvironmentFacade.ReportEnvironment.FontFamily);
                AddElement(intestazioneLiquidita.ToElement());


                #region Grafico

                var series = new List<Serie>();
                var coloreSerieAreaAdeguata = new ColorPDF(228, 235, 238);
                var coloreSerieAreaNonAdeguata = new ColorPDF(204, 217, 222);

                var graficoCombination = new CombinationPDF(EnvironmentFacade.RendererFacade.XLeftLimit + 80, 1F)
                {
                    Name = "comb",
                    Height = 200,
                    Width = 400,
                    MinorGridAxisY = false,
                    BackColor = coloreSerieAreaNonAdeguata,
                    LabelFormatAxisY = FormatType.Decimale2,

                    MarginAxisY = 0,
                    ShowLineAxisY = true,
                    ShowLabelAxisY = true,
                    StartFromZeroAxisY = true,
                    MaximumValueAxisY = 100, // valore fisso 
                    IntervalNumberAxisY = 6,
                    CustomLabelAxisY = new List<CombinationPDFCustomLabel>(){
                new CombinationPDFCustomLabel{Text = "0,00%", Value = 0d},
                new CombinationPDFCustomLabel{Text = "20,00%", Value = 20d},
                new CombinationPDFCustomLabel{Text = "40,00%", Value = 40d},
                new CombinationPDFCustomLabel{Text = "60,00%", Value = 60d},
                new CombinationPDFCustomLabel{Text = "80,00%", Value = 80d},
                new CombinationPDFCustomLabel{Text = "100,00%", Value = 100d}
            },

                    ShowLineAxisX = true,
                    ShowLabelAxisX = true,
                    StartFromZeroAxisX = true,
                    MaximumValueAxisX = 5, // valore fisso
                    IntervalNumberAxisX = 5,
                    CustomLabelAxisX = new List<CombinationPDFCustomLabel>(){
                new CombinationPDFCustomLabel{Text = "", Value = 1d},
                new CombinationPDFCustomLabel{Text = "", Value = 2d},
                new CombinationPDFCustomLabel{Text = "", Value = 3d},
                new CombinationPDFCustomLabel{Text = "", Value = 4d},
                new CombinationPDFCustomLabel{Text = "", Value = 5d}
            }
                };

                series.Add(
                        new Serie
                        {
                            Name = "AreaDiAdeguatezza",
                            Type = Dundas.Charting.WebControl.SeriesChartType.Area,
                            Color = coloreSerieAreaAdeguata,
                            BorderColor = ColorPDF.Nero,
                            BorderWidth = 1,
                            Points = new List<Point>() {
                            new Point {Values = new ValuesPointXY(0d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[4]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(1d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[4]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(1d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[3]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(2d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[3]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(2d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[2]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(3d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[2]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(3d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[1]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(4d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[1]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(4d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[0]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata},
                            new Point {Values = new ValuesPointXY(5d, Convert.ToDouble(dati.Tables["orizzonte"].Rows[0]["AdegOT"])),ShowLabelAxisY = false,ShowLabelAxisX = false,Color = coloreSerieAreaAdeguata}
                            }
                        }
                    );

                graficoCombination.SeriesCollection = series;

                AddElement(graficoCombination);

                var wx = graficoCombination.Width / graficoCombination.IntervalNumberAxisX;

                AddElement(new FormattedTextAreaPDF("Area di adeguatezza", graficoCombination.X + 20) { DeltaY = -20, FontSize = 7, AutoIncrementYWritable = false });
                AddElement(new FormattedTextAreaPDF("Area di non adeguatezza", graficoCombination.X + 300) { DeltaY = -190, FontSize = 7, AutoIncrementYWritable = false });


                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[4]["Orizzonte"].ToString(), graficoCombination.X + 18 + wx * 0) { DeltaY = 5, FontSize = 7, AutoIncrementYWritable = false });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[3]["Orizzonte"].ToString(), graficoCombination.X + 18 + wx * 1) { DeltaY = 5, FontSize = 7, AutoIncrementYWritable = false });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[2]["Orizzonte"].ToString(), graficoCombination.X + 18 + wx * 2) { DeltaY = 5, FontSize = 7, AutoIncrementYWritable = false });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[1]["Orizzonte"].ToString(), graficoCombination.X + 18 + wx * 3) { DeltaY = 5, FontSize = 7, AutoIncrementYWritable = false });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[0]["Orizzonte"].ToString(), graficoCombination.X + 18 + wx * 4) { DeltaY = 5, FontSize = 7, AutoIncrementYWritable = false });

                float allocOT = Convert.ToSingle(dati.Tables["orizzonte"].Rows[4]["AllocOT"]);
                allocOT = allocOT > 97 ? 97 : allocOT < 4 ? 4 : allocOT;
                float deltaY = allocOT * -2;
                float iDeltaY0 = Convert.ToSingle(dati.Tables["orizzonte"].Rows[0]["AllocOT"]) == 0 ? -2.5F : Convert.ToSingle(dati.Tables["orizzonte"].Rows[0]["AllocOT"]) == 100 ? 11 : 4;
                float iDeltaY1 = Convert.ToSingle(dati.Tables["orizzonte"].Rows[1]["AllocOT"]) == 0 ? -2.5F : Convert.ToSingle(dati.Tables["orizzonte"].Rows[1]["AllocOT"]) == 100 ? 11 : 4;
                float iDeltaY2 = Convert.ToSingle(dati.Tables["orizzonte"].Rows[2]["AllocOT"]) == 0 ? -2.5F : Convert.ToSingle(dati.Tables["orizzonte"].Rows[2]["AllocOT"]) == 100 ? 11 : 4;
                float iDeltaY3 = Convert.ToSingle(dati.Tables["orizzonte"].Rows[3]["AllocOT"]) == 0 ? -2.5F : Convert.ToSingle(dati.Tables["orizzonte"].Rows[3]["AllocOT"]) == 100 ? 11 : 4;
                float iDeltaY4 = Convert.ToSingle(dati.Tables["orizzonte"].Rows[4]["AllocOT"]) == 0 ? -2.5F : Convert.ToSingle(dati.Tables["orizzonte"].Rows[4]["AllocOT"]) == 100 ? 11 : 4;

                float xg = graficoCombination.X + wx / 2 + wx * 0;

                //AddElement(new RectanglePDF(xg, 7.000f, 7.000f, new ColorPDF(4, 112, 190)) { DeltaY = deltaY - 4, AutoIncrementYWritable = false, Angle = 45 });
                AddElement(new RectanglePDF(xg, 7.000f, 7.000f, new ColorPDF(4, 112, 190)) { DeltaY = deltaY - iDeltaY4, AutoIncrementYWritable = false, Angle = 45 });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[4]["AllocOTDesc"].ToString(), xg + 10) { DeltaY = deltaY - 3, FontSize = 7, AutoIncrementYWritable = false });

                allocOT = Convert.ToSingle(dati.Tables["orizzonte"].Rows[3]["AllocOT"]);
                allocOT = allocOT > 97 ? 97 : allocOT < 4 ? 4 : allocOT;
                deltaY = allocOT * -2;
                xg = graficoCombination.X + wx / 2 + wx * 1;
                AddElement(new RectanglePDF(xg, 7.000f, 7.000f, new ColorPDF(4, 112, 190)) { DeltaY = deltaY - iDeltaY3, AutoIncrementYWritable = false, Angle = 45 });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[3]["AllocOTDesc"].ToString(), xg + 10) { DeltaY = deltaY - 3, FontSize = 7, AutoIncrementYWritable = false });

                allocOT = Convert.ToSingle(dati.Tables["orizzonte"].Rows[2]["AllocOT"]);
                allocOT = allocOT > 97 ? 97 : allocOT < 4 ? 4 : allocOT;
                deltaY = allocOT * -2;
                xg = graficoCombination.X + wx / 2 + wx * 2;
                AddElement(new RectanglePDF(xg, 7.000f, 7.000f, new ColorPDF(4, 112, 190)) { DeltaY = deltaY - iDeltaY2, AutoIncrementYWritable = false, Angle = 45 });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[2]["AllocOTDesc"].ToString(), xg + 10) { DeltaY = deltaY - 3, FontSize = 7, AutoIncrementYWritable = false });

                allocOT = Convert.ToSingle(dati.Tables["orizzonte"].Rows[1]["AllocOT"]);
                allocOT = allocOT > 97 ? 97 : allocOT < 4 ? 4 : allocOT;
                deltaY = allocOT * -2;
                xg = graficoCombination.X + wx / 2 + wx * 3;
                AddElement(new RectanglePDF(xg, 7.000f, 7.000f, new ColorPDF(4, 112, 190)) { DeltaY = deltaY - iDeltaY1, AutoIncrementYWritable = false, Angle = 45 });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[1]["AllocOTDesc"].ToString(), xg + 10) { DeltaY = deltaY - 3, FontSize = 7, AutoIncrementYWritable = false });

                allocOT = Convert.ToSingle(dati.Tables["orizzonte"].Rows[0]["AllocOT"]);
                allocOT = allocOT > 97 ? 97 : allocOT < 4 ? 4 : allocOT;
                deltaY = allocOT * -2;
                xg = graficoCombination.X + wx / 2 + wx * 4;
                AddElement(new RectanglePDF(xg, 7.000f, 7.000f, new ColorPDF(4, 112, 190)) { DeltaY = deltaY - iDeltaY0, AutoIncrementYWritable = false, Angle = 45 });
                AddElement(new FormattedTextAreaPDF(dati.Tables["orizzonte"].Rows[0]["AllocOTDesc"].ToString(), xg + 10) { DeltaY = deltaY - 3, FontSize = 7, AutoIncrementYWritable = false });                
            

                AddElement(new SpacePDF(30));

                #endregion

                #region ADEGUATEZZA CAP ultimo


                var tabellaProgetti = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["orizzonte"])
                {
                    Style = Style.ConsulenzaUnica,
                    HeaderHeight = 30,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    Footer = false
                };

                tabellaProgetti.Columns.Add(new ColumnPDF("Oriztemp", 100, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Orizzonte", "Orizzonte<br>temporale") { HeaderFontSize = 7 });
                tabellaProgetti.Columns.Add(new ColumnPDF("Quest", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Questionario", "Questionario <br>MiFID (%)") { HeaderFontSize = 7, PaddingRight = 10 });
                tabellaProgetti.Columns.Add(new ColumnPDF("Porta", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Portafoglioattuale", "Portafoglio<br> attuale (%)") { HeaderFontSize = 7, PaddingRight = 10 });
                tabellaProgetti.Columns.Add(new ColumnPDF("Portp", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Portafoglioprospettico", "Portafoglio<br>" + (isAdeguata ? "proposto": "prospettico" )+ " (%)") { HeaderFontSize = 7, PaddingRight = 10 });
                tabellaProgetti.Columns.Add(new ColumnPDF("Adeg", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "AdegOT", "Adeguatezza per<br> OT (%)") { HeaderFontSize = 7, PaddingRight = 10 });
                tabellaProgetti.Columns.Add(new ColumnPDF("Alloc", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "AllocOTDesc", "Alloc." + (isAdeguata ? "proposta": "prospet." )+ "<br>per OT (%)") { HeaderFontSize = 7, PaddingRight = 10 });
                tabellaProgetti.Columns.Add(new ColumnPDF("Adeguatezza", 70, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "Adeguatezza", "Adeguatezza") { HeaderFontSize = 7 });
                int z = 0;
                foreach (DataRow r in dati.Tables["orizzonte"].Rows)
                {
                    tabellaProgetti.Cells[6, z].Value = r["Adeguatezza"].ToString().Equals("S") ? "Adeguato" : r["Adeguatezza"].ToString().Equals("N") ? "Non adeguato" : r["Adeguatezza"].ToString();
                    tabellaProgetti.Cells[6, z].FontColor = r["Adeguatezza"].ToString().Equals("S") ? ColorPDF.Verde : r["Adeguatezza"].ToString().Equals("N") ? ColorPDF.Rosso : ColorPDF.Nero;
                    
                    tabellaProgetti.Cells[1, z].HorizontalAlignment =
                    tabellaProgetti.Cells[2, z].HorizontalAlignment =
                    tabellaProgetti.Cells[3, z].HorizontalAlignment =
                    tabellaProgetti.Cells[4, z].HorizontalAlignment =
                    tabellaProgetti.Cells[5, z].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    z++;
                }

                AddElement(tabellaProgetti);
                if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato)
                {
                    string testoorizzonte = isAdeguata ? "La ripartizione del \"portafoglio attuale\" e del \"portafoglio proposto\" sui diversi orizzonti temporali prende in considerazione tutti i prodotti detenuti dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato "+datiSeiUnico.getClienteReport().codiceMandato+", insieme alle operazioni effettuate nella presente proposta (limitatamente al \"portafoglio proposto\")." : "La ripartizione del \"portafoglio attuale\" e del \"portafoglio prospettico\" sui diversi orizzonti temporali prende in considerazione tutti i prodotti detenuti dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato "+datiSeiUnico.getClienteReport().codiceMandato+", insieme alle operazioni da lei richieste al suo private banker (limitatamente al \"portafoglio prospettico\").";
                    AddElement(new SpacePDF(10));
                    AddElement(new FormattedTextAreaPDF("(*) " + datiSeiUnico.FormatBanca(testoorizzonte), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                }
                //if (false)//NOTA 62.8 ==> vedi dato con marianna
                //{
                //    string testo = isAdeguata ? "La valutazione di adeguatezza in termini di Liquidità/Liquidabilità è stata effettuata verificando che le operazioni d’investimento effettuate abbiano ad oggetto esclusivamente prodotti con un orizzonte temporale \"Entro 12 mesi\"." : "La valutazione di adeguatezza in termini di Liquidità/Liquidabilità è stata effettuata verificando che le operazioni d’investimento da lei richieste al suo private banker abbiano ad oggetto esclusivamente prodotti con un orizzonte temporale \"Entro 12 mesi\".";
                //    AddElement(new SpacePDF(10));
                //    AddElement(new FormattedTextAreaPDF("(*) " + datiSeiUnico.FormatBanca(testo), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                //}
                #endregion


            }

            #endregion

        }

        protected sealed override DataTable GetDataTable()
        {
            return null;
        }

        protected sealed override DataSet GetDataSet()
        {
            //Adriano
            #region Cliente professionale

            var cliente = datiSeiUnico.clienteUnit().anagrafica;

            bool profiloProfessionale;
            bool profiloAggressivo;
            bool profiloProfessionaleAggressivo;

            var profiler = new Profiler(cliente);
            profiloProfessionale = profiler.ProfiloProfessionale;
            profiloAggressivo = profiler.ProfiloAggressivo;
            profiloProfessionaleAggressivo = profiler.ProfiloProfessionaleAggressivo;

            //Adriano serve per test
            //profiloProfessionale = true;
            //profiloAggressivo = true;
            //profiloProfessionaleAggressivo = true;

            #endregion
            //--Adriano

            //Adriano: inserito var notaContrazioneProdottiComplessi da sostituire a chiamata diretta della getNota407() nel Draw(), da valorizzare solo in caso di Clienti retail
            // essendo richiesta l'omissione della suddetta nota per i Clienti Professionali
            notagradoCoperturaComplessita = "";
            notaConcentrazioneProdottiComplessi = "";
            if (!profiloProfessionale)
                notaConcentrazioneProdottiComplessi = getNota62_10();
            //--Adriano
            var ds = new DataSet();
            ds.Tables.Add(new DataTable("patrimoni"));
            ds.Tables.Add(new DataTable("indicatori"));
            ds.Tables.Add(new DataTable("prodotti"));
            ds.Tables.Add(new DataTable("prodottifooter"));
            ds.Tables.Add(new DataTable("emittentiObb"));
            ds.Tables.Add(new DataTable("emittentiObbfooter"));
            ds.Tables.Add(new DataTable("emittentiAz"));
            ds.Tables.Add(new DataTable("emittentiAzfooter"));
            ds.Tables.Add(new DataTable("fondi"));
            ds.Tables.Add(new DataTable("fondifooter"));
            ds.Tables.Add(new DataTable("orizzonte"));
            ds.Tables.Add(new DataTable("indicatoriFooter"));

            ds.Tables["patrimoni"].Columns.Add(new DataColumn("Descrizione", typeof(string)));
            ds.Tables["patrimoni"].Columns.Add(new DataColumn("Valore", typeof(string)));

            ds.Tables["indicatori"].Columns.Add(new DataColumn("Indicatore", typeof(string)));
            ds.Tables["indicatori"].Columns.Add(new DataColumn("Portafoglioattuale", typeof(string)));
            ds.Tables["indicatori"].Columns.Add(new DataColumn("Operazioni", typeof(string)));
            ds.Tables["indicatori"].Columns.Add(new DataColumn("Portafoglioproposto", typeof(string)));
            ds.Tables["indicatori"].Columns.Add(new DataColumn("Sogliamassima", typeof(string)));
            ds.Tables["indicatori"].Columns.Add(new DataColumn("Gradocopertura", typeof(string)));
            ds.Tables["indicatori"].Columns.Add(new DataColumn("Adeguatezza", typeof(string)));

            ds.Tables["indicatoriFooter"].Columns.Add(new DataColumn("label", typeof(string)));
            ds.Tables["indicatoriFooter"].Columns.Add(new DataColumn("messaggio", typeof(string)));

            ds.Tables["prodotti"].Columns.Add(new DataColumn("CodArea", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Descrizione", typeof(string)));
            // Modifica per Saving Map
            ds.Tables["prodotti"].Columns.Add(new DataColumn("SavingMap", typeof(string)));
            // Fine Modifica

            ds.Tables["prodotti"].Columns.Add(new DataColumn("CodiceContratto", typeof(string)));            
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Nome", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Rischiomercato", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Rischiocredito", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Complessita", typeof(string)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("Liquidita", typeof(string))); 
            ds.Tables["prodotti"].Columns.Add(new DataColumn("BackgroundColor", typeof(bool)));
            ds.Tables["prodotti"].Columns.Add(new DataColumn("FontBold", typeof(bool))); 
               
            ds.Tables["prodottifooter"].Columns.Add(new DataColumn("patrimonio", typeof(string)));
            ds.Tables["prodottifooter"].Columns.Add(new DataColumn("Complessivo", typeof(string)));
            ds.Tables["prodottifooter"].Columns.Add(new DataColumn("varDecodificato", typeof(string)));
            ds.Tables["prodottifooter"].Columns.Add(new DataColumn("rischioCreditoDecodificato", typeof(string)));
            ds.Tables["prodottifooter"].Columns.Add(new DataColumn("descrizioneClasseComplessita", typeof(string)));

            bool visualizzaTabellaIndicatoriSintesi = GetOption<Opzione4_1>().Valore;
            bool visualizzaTabellaProdotti = GetOption<Opzione4_2>().Valore;
            bool visualizzaSchedaEmittenti = GetOption<Opzione4_3>().Valore;
            bool visualizzaSchedaLiquidita = GetOption<Opzione4_4>().Valore;

            var adeguatezza = datiSeiUnico.rischioUnit().adeguatezza;
            var anagrafica = datiSeiUnico.clienteUnit().anagrafica;
            var stAdequatezza = datiSeiUnico.propostaUnit().stAdequatezza;
            var dettaglioProdotti = datiSeiUnico.propostaUnit().dettaglioProdotti.dettaglioProdotti.ToList();
            var dataProfiloEC = adeguatezza.adeguatezzaTopBean.caratteristicheCliente.dtInizioValiditaProfiloEC;
            var indicatoriNonAdeguati = new List<string>();

            #region profilo finanziario

            ds.Tables["patrimoni"].Rows.Add(
                "Profilo finanziario",
                anagrafica.descProfilo
            );
            ds.Tables["patrimoni"].Rows.Add(
                "Data inizio validità",
                anagrafica.dtSottoscrizione.ToShortDateString().Substring(0, 10)                 
             );
            ds.Tables["patrimoni"].Rows.Add(
            "Profilo esperienza e conoscenza",
            adeguatezza.adeguatezzaTopBean.caratteristicheCliente.descrizioneEsperienzaConoscenza
            );
            ds.Tables["patrimoni"].Rows.Add(
              "Data inizio validità",
              dataProfiloEC != DateTime.MinValue ? dataProfiloEC.ToShortDateString().Substring(0, 10) : "n.a."
           );
            ds.Tables["patrimoni"].Rows.Add(
                "Portafoglio attuale",
                ! adeguatezza.adeguatezzaTopBean.isAdeguatoSpecified ? "n.a." : 
                    adeguatezza.adeguatezzaTopBean.isAdeguato ? "Adeguato" : "Non adeguato"
             );
            ds.Tables["patrimoni"].Rows.Add(
                "Portafoglio " + (datiSeiUnico.flagAdeguatezzaPro() ? "proposto" : "prospettico"),
                !stAdequatezza.flagAdeguatezzaProSpecified ? "n.a." : stAdequatezza.flagAdeguatezzaPro ? "Adeguato" : "Non adeguato"
            );
            #endregion
   
            #region indicatore di sintesi

            if (visualizzaTabellaIndicatoriSintesi)
            {
				//maxConcentrazione = Convert.ToDouble(adeguatezza.adeguatezzaTopBean.listaAdeguatezza.AsEnumerable().FirstOrDefault(o => o.id == "CC").soglia.Replace(".", ",")) == 100;
                foreach (var item in from a in stAdequatezza.listaDettagliAdeguatezza  orderby a.ordinamento select a)
                {
                    {

                        //BugFix #2398 Aggiunto controllo per mettere la lettera maiuscola al patrimonio e alla Sogliamassima
                        //modifiche alla formattazione come per la 40
                        string[] lowerString = { "-", "n.a.", "n.d.", "n.c."};
                        string[] upperString = { "classe", "alta", "media", "bassa", "minima", "rischio" };
                        string adeguato =  !item.flagAdeguatezzaSpecified ? "n.a." : item.flagAdeguatezza ? "<font color='#00b046'>Adeguato</font>" : "<font color='#ff0000'>Non adeguato</font>";
                        if (!item.flagAdeguatezza)
                        {
                            indicatoriNonAdeguati.Add(item.descrizioneIndicatore);
                        }

                        if (item.idDescIndicatore == "CM")
                            //Adriano: è richiesta l'omissione della nota 40.6 in caso di cliente con contratto di consulenza professionale
                            if (!profiloProfessionale)
                                //--Adriano
                                notagradoCoperturaComplessita = getNota62_9();
                            else
                                notagradoCoperturaComplessita = "";

                        ds.Tables["indicatori"].Rows.Add(
                                //Indicatore
                                item.idDescIndicatore=="CC" ? "Concentrazione prodotti <br>complessi (%)" : 
                                    item.idDescIndicatore=="CM" ? item.descrizioneIndicatore + "*" 
                                : item.descrizioneIndicatore,
                                //Portafoglio Attuale
                                item.descrizioneIndicatore.ToLower().Contains("emittenti") || item.descrizioneIndicatore.ToLower().Contains("liq") ? "-" :
                                    lowerString.Contains(item.ptfAttuale.ToLower()) ? item.ptfAttuale.ToLower() : !item.descrizioneIndicatore.ToLower().Contains("frequenza") ?
                                            Helper.FormatCurrency(item.ptfAttuale.Replace(".", ",")) : Helper.FormatDecimal(item.ptfAttuale, 0), 
                                //Operazioni
                                item.ptfDelta.Equals("") ? "-" :
                                    !lowerString.Contains(item.ptfDelta.ToLower()) && !item.descrizioneIndicatore.ToLower().Contains("frequenza") ?
                                        (!item.ptfDelta.Contains(".") ? Helper.FormatDecimal(item.ptfDelta, 2) : item.ptfDelta.Replace(".", ",")) 
                                    : Helper.FormatDecimal(item.ptfDelta, 0),
                                //Portafoglio Proposto
                                    item.ptfProspettico.Equals("") ? "-" :
                                        !lowerString.Contains(item.ptfProspettico.ToLower()) && !item.descrizioneIndicatore.ToLower().Contains("frequenza") ? 
                                            Helper.FormatCurrency(item.ptfProspettico.ToString().Replace(".", ",")) : Helper.FormatDecimal(item.ptfProspettico, 0),                                
                                //Soglia massima
                                //Adriano
                                profiloProfessionale ?
                                    //Per i clienti con profilo professionale
                                    item.limiteMassimo
                                    //item.idDescIndicatore == "RM" ? profiloAggressivo ? "50,00" : item.limiteMassimo :
                                    //    item.idDescIndicatore == "FQ" ? "n.a." :
                                    //        item.idDescIndicatore == "CM" ? maxConcentrazione ? "n.a." : item.limiteMassimo :
                                    //            item.idDescIndicatore == "CC" ? maxConcentrazione ? "n.a." : item.limiteMassimo :
                                    //                item.limiteMassimo
                                    :
                                    //Per i clienti retail
                                    lowerString.Contains(item.limiteMassimo.ToLower()) ? item.limiteMassimo.ToLower() :
                                        upperString.Contains(item.limiteMassimo.ToLower()) ? Helper.CapitalizeWords(item.limiteMassimo) :
                                        item.descrizioneIndicatore.ToLower().Contains("frequenza") ? (item.limiteMassimo.Contains("9999") ? "n.a." : Helper.FormatDecimal(item.limiteMassimo, 0)) :
                                        item.limiteMassimo.Contains("9999") ? "n.a" :
                                        Helper.FormatCurrency(item.limiteMassimo.Replace(".", ",")),
                                //--Adriano
                                //originale
                                //lowerString.Contains(item.limiteMassimo.ToLower()) ? item.limiteMassimo.ToLower() :
                                //upperString.Contains(item.limiteMassimo.ToLower()) ? Helper.CapitalizeWords(item.limiteMassimo) :
                                //item.descrizioneIndicatore.ToLower().Contains("frequenza") ? (item.limiteMassimo.Contains("9999") ? "n.a." : Helper.FormatDecimal(item.limiteMassimo, 0)) :
                                //item.limiteMassimo.Contains("9999") ? "n.a" :
                                //Helper.FormatCurrency(item.limiteMassimo.Replace(".", ",")),

                                //Grado Copertura
                                item.copertura.Contains("-") ? item.copertura : item.idDescIndicatore=="CC" || item.descrizioneIndicatore.ToLower().Contains("frequenza") || item.descrizioneIndicatore.ToLower().Contains("emittenti") ? "-" : item.copertura != "n.c." ? item.copertura.Replace(".", ",") : item.copertura,
                                
                                //Adeguatezza
                                //Adriano: verificare che il valore non sia già esatto così come fornito dal WS...
                                profiloProfessionale ?
                                    item.idDescIndicatore == "CM" || item.idDescIndicatore == "CC" || item.idDescIndicatore == "FQ"  ? "<font color='#00b046'>Adeguato</font>" :
                                    adeguato :
                                    adeguato

                            //--Adriano
                            //originale:
                            ////item.idDescIndicatore == "CM" && notagradoCoperturaComplessita != "" ? 
                            //adeguato // + "<font color='#000000'>**</font>" : adeguato

                            );
                    }
                }
            }
            #endregion

            #region costi benefici

            var label = datiSeiUnico.propostaUnit().stDettaglioProposta.status == "VA" ? "Costi/Benefici" : "Esito Simulazione";
            var testo = "";
            if ("VA"==(datiSeiUnico.propostaUnit().stDettaglioProposta.status))
            {
                testo = stAdequatezza.descCostiBenefici==null ? "Non applicabile." : stAdequatezza.descCostiBenefici;
            }
            else if (indicatoriNonAdeguati.Count > 0)
            {
                testo = "Considerando l'impatto complessivo delle operazioni da lei richieste al suo private banker sul portafoglio, costituito dall'insieme dei contratti di cui lei risulti primo intestatario, il suo portafoglio prospettico risulta NON ADEGUATO per ";
                int i = 1;
                foreach (var indicatore in indicatoriNonAdeguati)
                {
                    testo = testo + indicatore + (i == indicatoriNonAdeguati.Count() ? "." : ",");
                    i++;
                }
               
            }
            else
            {
                testo = "Considerando l'impatto complessivo delle operazioni da lei richieste al suo private banker sul portafoglio, costituito dall'insieme dei contratti di cui lei risulti primo intestatario, il suo portafoglio prospettico risulta ADEGUATO.";
            }
            if (testo.Contains("NON ADEGUATE"))
            {
                testo = testo.Replace("NON ADEGUATE", "<font color=\"#EF3239\"><b>NON ADEGUATE</b></font>");
            }
            else if (testo.Contains("ADEGUATE"))
            {
                testo = testo.Replace("ADEGUATE", "<font color=\"#00B050\"><b>ADEGUATE</b></font>");
            }
            else if (testo.Contains("NON ADEGUATO"))
            {
                testo = testo.Replace("NON ADEGUATO", "<font color=\"#EF3239\"><b>NON ADEGUATO</b></font>");
            }
            else if (testo.Contains("ADEGUATO"))
            {
                testo = testo.Replace("ADEGUATO", "<font color=\"#00B050\"><b>ADEGUATO</b></font>");
            }

            ds.Tables["indicatoriFooter"].Rows.Add("Costi /<br>benefici", testo);

            #endregion

            #region prodotti

            if (visualizzaTabellaProdotti)
            {
                string[] notChAgg = { "PAT", "RA" };
                switch (raggruppaProdotti())
                {
                    #region AREE
                    case RaggruppaProdotti.AreaBisogno:
                        var elencoAreeProgetti = datiSeiUnico.propostaUnit().dettaglioProdotti.elencoAggregati.elencoAreeProgetti;
                        var areeDisplayInfos = datiSeiUnico.displayInfos().areeDisplayInfos;
                        foreach (rsAggregatoPosizioni areeProgetti in from o in elencoAreeProgetti
                                                                      join a in areeDisplayInfos on o.chiaveAggregazione.ToUpper() equals a.key.ToUpper()
                                                                      where o.posizioniAggregate != null && !notChAgg.Contains(o.chiaveAggregazione)
                                                                      orderby a.value.order
                                                                      select o)
                        {
                            string codArea = areeProgetti.chiaveAggregazione;
                            if (areeProgetti.ctvPro != 0)
                            {
                                if (areeProgetti.chiaveProgettoLinea == null)
                                {
                                    DataRow dr = ElencoProdotti(ds.Tables["prodotti"], areeProgetti, codArea, areeProgetti.descrizione);
                                    dr["Rischiocredito"] = "-";
                                    dr["Complessita"] = "-";
                                    dr["Liquidita"] = "-";
                                    if (codArea.Equals("Inv") || codArea.Equals("Pre"))
                                        continue;
                                }

                                if (areeProgetti.chiaveAggregazione.Equals("Inv") || areeProgetti.chiaveAggregazione.Equals("Pre"))
                                {
                                    DataRow dr = ElencoProdotti(ds.Tables["prodotti"], areeProgetti, "", areeProgetti.descrizione, true, true);
                                    dr["Rischiocredito"] = "-";
                                    dr["Complessita"] = "-";
                                    dr["Liquidita"] = "-";
                                }

                                foreach (rsSTPosizione dettaglioProdotto in from a in areeProgetti.posizioniAggregate
                                                                            join d in dettaglioProdotti on a.chiaveAggregazione
                                                                            equals d.chiaveAggregazione
                                                                            orderby d.ctvPro descending
                                                                            select d)
                                {
                                    if (dettaglioProdotto.ctvPro != 0)
                                        ElencoProdotti(ds.Tables["prodotti"], dettaglioProdotto, "", "");
                                }

                            }
                        }
                        TotaleAreadiBisogno(ds.Tables["prodotti"], elencoAreeProgetti); 
                        break;
#endregion
                    #region CATEGORIE
                    case RaggruppaProdotti.Categoria:
                        var elencoCategoria = datiSeiUnico.propostaUnit().dettaglioProdotti.elencoAggregati.elencoCategoria;
                        var displayCategories = datiSeiUnico.displayInfos().categoriaDisplayInfos;
                        
                        foreach (rsAggregatoPosizioni Categoria in from o in elencoCategoria
                                                                   join d in displayCategories
                                                                   on o.descrizione.ToUpper().Replace(" ", "") equals d.key
                                                                   where o.posizioniAggregate != null && !notChAgg.Contains(o.chiaveAggregazione)
                                                                   orderby d.value.order, o.ctvAttuale descending
                                                                   select o) {

                            ElencoProdotti(ds.Tables["prodotti"], Categoria, "", Categoria.descrizione, true, true);
                            foreach (rsSTPosizione dettaglioProdotto in from a in Categoria.posizioniAggregate 
                                                                join d in dettaglioProdotti on a.chiaveAggregazione equals d.chiaveAggregazione
                                                                        where d.ctvPro != 0
                                                                        orderby d.ctvPro descending
                                                                select d)  {
                                
                                    ElencoProdotti(ds.Tables["prodotti"], dettaglioProdotto, "", "");
                            }
                        }
                        TotaleCategoria(ds.Tables["prodotti"], elencoCategoria); 
                       
                        break;
                    #endregion

                    #region CONTRATTI   
                    case RaggruppaProdotti.Contratto:
                       var elencoContrattiLinea = datiSeiUnico.propostaUnit().dettaglioProdotti.elencoAggregati.elencoContrattiLinea;
                        var listaContrattiLinee = (from o in elencoContrattiLinea
                                                   where o.posizioniAggregate != null && !notChAgg.Contains(o.chiaveAggregazione)
                                                   select o).ToList();
                        var listaContratti = (from o in listaContrattiLinee where o.chiaveProgettoLinea == null orderby o.ctvPro descending select o).ToList();
                        var listaLinee = (from o in listaContrattiLinee where o.chiaveProgettoLinea != null orderby o.ctvPro descending select o).ToList();

                        foreach (rsAggregatoPosizioni contratto in listaContratti)
                        {
                            ElencoProdotti(ds.Tables["prodotti"], contratto, "", contratto.descrizione, true, true);
                            foreach (rsSTPosizione dettaglioProdotto in from a in contratto.posizioniAggregate
                                                                        join d in dettaglioProdotti on a.chiaveAggregazione equals d.chiaveAggregazione
                                                                        where d.ctvPro != 0 && a.flagLinea == false
                                                                        orderby d.ctvPro descending
                                                                        select d)
                            {

                                ElencoProdotti(ds.Tables["prodotti"], dettaglioProdotto, "", "");
                            }

                            foreach (rsAggregatoPosizioni linea in listaLinee)
                            {
                                if (linea.chiaveAggregazione.Equals(contratto.chiaveAggregazione))
                                {

                                    ElencoProdotti(ds.Tables["prodotti"], linea, "", linea.descrizione, true, true);
                                    foreach (rsSTPosizione dettaglioProdotto in from a in linea.posizioniAggregate
                                                                                join d in dettaglioProdotti on a.chiaveAggregazione equals d.chiaveAggregazione
                                                                                where d.ctvPro != 0 && a.flagLinea == true
                                                                                orderby d.ctvPro descending
                                                                                select d)
                                    {

                                        ElencoProdotti(ds.Tables["prodotti"], dettaglioProdotto, "", "");
                                    }
                                }

                            }


                        }

                        TotaleContratto(ds.Tables["prodotti"], elencoContrattiLinea);

                        #region old
                        //var elencoContrattiLinea = datiSeiUnico.propostaUnit().dettaglioProdotti.elencoAggregati.elencoContrattiLinea;
                        
                        //foreach (rsAggregatoPosizioni Categoria in from o in elencoContrattiLinea
                        //                                           where o.posizioniAggregate != null && !notChAgg.Contains(o.chiaveAggregazione)
                        //                                           orderby o.ctvPro descending
                        //                                           select o) {
                        //    ElencoProdotti(ds.Tables["prodotti"], Categoria, "", Categoria.descrizione, true, true);
                        //    foreach (rsSTPosizione dettaglioProdotto in from a in Categoria.posizioniAggregate                                                                
                        //                                        join d in dettaglioProdotti on a.chiaveAggregazione equals d.chiaveAggregazione
                        //                                        where d.ctvPro != 0
                        //                                        orderby d.ctvPro descending
                        //                                        select d)  {
                                  
                        //            ElencoProdotti(ds.Tables["prodotti"], dettaglioProdotto, "", "");
                        //    }
                        //}
                        //TotaleContratto(ds.Tables["prodotti"], elencoContrattiLinea); 

                        #endregion
                        break;
                    #endregion
                }

            }


            #endregion

            #region focus emittenti obbligazionari

                if (visualizzaSchedaEmittenti)
                {
                    ElencoConcentrazioneTitoli(
                        ds.Tables["emittentiObb"],
                        datiSeiUnico.propostaUnit().stAdequatezza.dettaglioConcentrazioneEmittenti.obbligazionari//adeguatezza.adeguatezzaTopBean.elencoConcentrazioneTitoli.obbligazionari,
                        );
                    TotaleConcentrazioneTitoli(ds.Tables["emittentiObbfooter"],
                        "Totale emittenti obbligazionari",
                        datiSeiUnico.propostaUnit().stAdequatezza.dettaglioConcentrazioneEmittenti
                        //adeguatezza.adeguatezzaTopBean.elencoConcentrazioneTitoli.concentrazioneTotObbligazionari
                        );
                }



                #endregion

            #region focus emittenti azionari
                if (visualizzaSchedaEmittenti)
                {
                    ElencoConcentrazioneTitoli(
                        ds.Tables["emittentiAz"],
                        datiSeiUnico.propostaUnit().stAdequatezza.dettaglioConcentrazioneEmittenti.azionari
                        );
                    TotaleConcentrazioneTitoli(
                        ds.Tables["emittentiAzfooter"],
                        "Totale emittenti azionari",
                        datiSeiUnico.propostaUnit().stAdequatezza.dettaglioConcentrazioneEmittenti
                        //adeguatezza.adeguatezzaTopBean.elencoConcentrazioneTitoli.concentrazioneTotAzionari
                        );
                }
                #endregion

            #region focus fondi speculativi

                if (visualizzaSchedaEmittenti)
                {
                    ElencoConcentrazioneTitoli(
                        ds.Tables["fondi"],
                        datiSeiUnico.propostaUnit().stAdequatezza.dettaglioConcentrazioneEmittenti.speculativi
                        );
                    TotaleConcentrazioneTitoli(
                        ds.Tables["fondifooter"],
                        "Totale emittente speculativi",
                        datiSeiUnico.propostaUnit().stAdequatezza.dettaglioConcentrazioneEmittenti
                        //adeguatezza.adeguatezzaTopBean.elencoConcentrazioneTitoli.concentrazioneTotSpeculativi
                        );
                }

                #endregion
            
            #region Forzatura adeguatezza per i clienti professionali
            //Adriano
            // bisogna forzare i valori di soglia ed adeguatezza per i clienti professionali
            if (visualizzaSchedaEmittenti)
            {
                if (profiloProfessionaleAggressivo)
                {

                    DateTime dataInizioContratto = cliente.dtSottoscrizione.Date;
                    DateTime dataReport = DateTime.Now.Date;
                    DateTime dataScadenzaSemestre = cliente.dtSottoscrizione.AddMonths(6);
                    //bool flagAdeguatezza = false;

                    if (DateTime.Compare(dataReport, dataScadenzaSemestre) <= 0)
                    {
                        //flagAdeguatezza = true;
                        ImpostaAdeguatezzaClientiProfessionali(ds.Tables["emittentiObb"], "Adeguatezza");
                        ImpostaAdeguatezzaClientiProfessionali(ds.Tables["emittentiAz"], "Adeguatezza");
                    }

                    //Nel caso dovessero essere forzati anche i valori di soglia...
                    //ImpostaValoriClientiProfessionali(ds.Tables["emittentiObb"], 50, "Adeguato", flagAdeguatezza);
                    //ImpostaValoriClientiProfessionali(ds.Tables["emittentiAz"], 50, "Adeguato", flagAdeguatezza);
                }
            }
            //--Adriano
            #endregion

            #region Orizzonte Temporale Liquidità / Liquidabilità

            ds.Tables["orizzonte"].Columns.Add(new DataColumn("Orizzonte", typeof(string)));
            ds.Tables["orizzonte"].Columns.Add(new DataColumn("Questionario", typeof(string)));
            ds.Tables["orizzonte"].Columns.Add(new DataColumn("Portafoglioattuale", typeof(string)));
            ds.Tables["orizzonte"].Columns.Add(new DataColumn("Portafoglioprospettico", typeof(string)));
            ds.Tables["orizzonte"].Columns.Add(new DataColumn("AdegOT", typeof(string)));
            ds.Tables["orizzonte"].Columns.Add(new DataColumn("AllocOT", typeof(string)));
            ds.Tables["orizzonte"].Columns.Add(new DataColumn("AllocOTDesc", typeof(string)));
            ds.Tables["orizzonte"].Columns.Add(new DataColumn("Adeguatezza", typeof(string)));
            
            if (stAdequatezza.listaAdegOrizzonteTemporale != null)
            {
                if (visualizzaSchedaLiquidita)
                {
                    foreach (var item in stAdequatezza.listaAdegOrizzonteTemporale)
                    {
                        ds.Tables["orizzonte"].Rows.Add(
                                           item.descrizione,
                                           Convert.ToDecimal(item.questionario),
                                           Convert.ToDecimal(item.portafoglioAttuale),
                                           Convert.ToDecimal(item.portafoglioProspettico),
                                           Convert.ToDecimal(item.adeguatezzaOT),
                                           Convert.ToDecimal(item.allocazionePropostaOT),
                                           !item.flagAdeguatezzaSpecified ? "-" : datiSeiUnico.FormatDecimal("{0}", item.allocazionePropostaOT),
                                           !item.flagAdeguatezzaSpecified ? "-" : item.flagAdeguatezza ? "S" : "N"
                            );
                    }
                    //dtProfilo.Rows.Add("Oltre 10 anni", "10.82", "27.00","100.00","10.82", true);
                    //dtProfilo.Rows.Add("Tra 7 e 10 anni", "25.00", "25.00", "100.00","25.00", false);
                }
            }


            //if (adeguatezza.adeguatezzaTopBean.elencoOrizzontiTemporali != null)
            //{
            //    if (visualizzaSchedaLiquidita)
            //    {
            //        foreach (var item in adeguatezza.adeguatezzaTopBean.elencoOrizzontiTemporali)
            //        {
            //            ds.Tables["orizzonte"].Rows.Add(item.timeHorizon,
            //                               Convert.ToDecimal(item.questionnaireMiFID),
            //                               Convert.ToDecimal(item.currentPortfolio),
            //                              Convert.ToDecimal(item.adequacyForHorizon),
            //                              Convert.ToDecimal(item.locationToHorizon),
            //                               datiSeiUnico.FormatDecimal("{0}", item.locationToHorizon),
            //                               item.adequacy
            //                );
            //        }
            //        //dtProfilo.Rows.Add("Oltre 10 anni", "10.82", "27.00","100.00","10.82", true);
            //        //dtProfilo.Rows.Add("Tra 7 e 10 anni", "25.00", "25.00", "100.00","25.00", false);
            //    }
            //}

            #endregion

            return ds;
        }
        
        

        private void ImpostaAdeguatezzaClientiProfessionali(DataTable dt, string adeguatezza)
        {
            foreach (DataRow row in dt.Rows)
            {
                row["Adeguatezza"] = adeguatezza;
            }
        }

        private void ImpostaValoriClientiProfessionali(DataTable dt, int soglia, string adeguatezza, bool flagAdeguatezza)
        {
            foreach (DataRow row in dt.Rows)
            {
                row["Sogliaconcentrazione"] = soglia;
                if (flagAdeguatezza)
                    row["Adeguatezza"] = adeguatezza;
            }
        }        
        
       
        public virtual string getNota1() { 
          string nota = "";
          string token = "";
          nota += token + getNota62_1();           
          nota += token + getNota62_11();
          nota += token + getNota62_2();
          //nota += token + getNota62_4();
          return datiSeiUnico.FormatBanca(nota);
        }
        public virtual string getNota2()
        {
            string nota = "";
            string token = " ";
            
            nota += token + getNota62_12();
            nota += token + getNota62_3();
            nota += token + getNota62_4();
            //nota += token + getNota62_15();

            nota += token + getNota62_5();
            //Adriano è richiesta l'omissione delle seguenti note in caso di clienti Professionali
            if (notagradoCoperturaComplessita != "")
                nota += token + notagradoCoperturaComplessita;
            if(notaConcentrazioneProdottiComplessi!="")
            nota += token + notaConcentrazioneProdottiComplessi;
            //--Adriano
            //originale:
            //nota += token + getNota62_9();
            //nota += token + getNota62_10();

            nota += token + getNota62_6();
            nota += token + getNota62_7();

            return datiSeiUnico.FormatBanca(nota);
        }
        public virtual string getNota3() {
            string nota = "";
            string token = "";
            nota += token + getNota62_13();
            return datiSeiUnico.FormatBanca(nota);
        }
        public virtual string getNota4()
        {
            string nota = "";
            string token = "";
            nota += token + getNota62_14();
            nota += token + getNota62_8();
            return datiSeiUnico.FormatBanca(nota);
        }
        
        public virtual string getNota62_1() {
            string nota = "";
            string token = "";            
            if (!datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato) {
                if ( datiSeiUnico.flagAdeguatezzaPro())
                    nota += token + "Complessità massima dei prodotti del patrimonio derivante dalla presente proposta (\"portafoglio proposto\").";
                else
                    nota += token + "Complessità massima dei prodotti del patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\").";
            }
            nota += getNota62_15();
            return nota;
        }
        public virtual string getNota62_11()
        {
            string codicemandato = datiSeiUnico.getClienteReport().codiceMandato;

            string nota = "";
            string token = "";
            if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato)
            {
                if (datiSeiUnico.flagAdeguatezzaPro())
                    nota += token + "Complessità massima dei prodotti detenuti attualmente dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + codicemandato + " e dei prodotti del patrimonio del mandato " + codicemandato + " derivante dalla presente proposta (\"portafoglio proposto\").";
                else
                    nota += token + "Complessità massima dei prodotti detenuti attualmente dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + codicemandato + " e dei prodotti del patrimonio del mandato " + codicemandato + " derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\").";

            }
            return nota;
        }

        //public virtual string getNota62_15() //62.12 Legale rappresentante - Delegato (nota fissa)
        //{
        //    var rappresentateDelegato = "";
        //    string nota = "";
        //    nota += "La soglia massima relativa all'indicatore di Complessità fa riferimento al profilo di Esperienza e Conoscenza del Legale Rappresentante/Delegato " + rappresentateDelegato;
        //    return datiSeiUnico.FormatBanca(nota);
        //}

        public virtual string getNota62_2()
        {
            return "";
        }
        public virtual string getNota62_12() {
            string codicemandato = datiSeiUnico.getClienteReport().codiceMandato;

            string nota = "";
            string token = "";

            if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato){
                if(datiSeiUnico.flagAdeguatezzaPro()){
                    nota += token + "La valutazione di adeguatezza prende in considerazione il patrimonio detenuto presso $/Banca/$ da tutti i mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + codicemandato + ", insieme al patrimonio del mandato " + codicemandato + " derivante dalla presente proposta (\"portafoglio proposto\"). Pertanto, gli indicatori di rischio presenti in questa scheda relativi al \"portafoglio proposto\" sono calcolati considerando tutti i prodotti detenuti dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + codicemandato + ", insieme alle operazioni effettuate nella presente proposta (limitatamente al \"portafoglio proposto\").";
                }else{
                    nota += token + "La valutazione di adeguatezza prende in considerazione il patrimonio detenuto presso $/Banca/$ da tutti i mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + codicemandato + ", insieme al patrimonio del mandato " + codicemandato + " derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\"). Pertanto, gli indicatori di rischio presenti in questa scheda relativi al \"portafoglio prospettico\" sono calcolati considerando tutti i prodotti detenuti dai mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + codicemandato + ", insieme alle operazioni da lei richieste al suo private banker (limitatamente al \"portafoglio prospettico\").";
                }
            }
            return nota;
        }
        public virtual string getNota62_3() {
            var disinvesti = datiSeiUnico.propostaUnit().dettaglioProdotti.dettaglioProdotti.FirstOrDefault(o => o.investi != 0) == null;

            string nota = "";
            string token = "";
            if (disinvesti) {
                nota += token + "A prescindere dai singoli indicatori di rischio relativi al patrimonio derivante dalla presente proposta (\"portafoglio proposto\"), la proposta risulta adeguata in quanto contiene esclusivamente operazioni di vendita / liquidazione / riscatto, che non sono oggetto di valutazione di adeguatezza.";
            }
            return nota;
        }
        public virtual string getNota62_4()
        {
            string nota = "";
            var GCproposto = datiSeiUnico.propostaUnit().stDettaglioProposta.copertura;
            var coperturaDeltaRM = datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("RM")).coperturaDelta;
            var coperturaDeltaRC = datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("RC")).coperturaDelta;
            var GCattuale = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura;
            bool coperturaAdeguatezza = GCproposto < 90 & coperturaDeltaRM.Equals("100.00");

            var varProposto = datiSeiUnico.propostaUnit().stDettaglioProposta.rischioMercato;
            var varAttuale = Convert.ToDecimal(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio.valoreVaR);
            var varMax = datiSeiUnico.piramideModelloUnit().questionarioMifid.profileVarMax;
            bool prospetticoMigliorativoVar = varProposto < varAttuale & varProposto > varMax;

            var rischioCreditoProposto = datiSeiUnico.propostaUnit().stDettaglioProposta.rischioCredito;
            var rischioCreditoMax = Convert.ToDecimal(datiSeiUnico.piramideModelloUnit().questionarioMifid.profileClassRcId);
            var rischioAttuale = datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio.classeRischioCredito;
            bool prospetticoMigliorativoRC = rischioCreditoProposto < rischioAttuale & rischioCreditoProposto > rischioCreditoMax;
            var list= datiSeiUnico.propostaUnit().dettaglioProdotti.dettaglioProdotti.Where(o => o.tipoOperazione != null).ToList();
            list.Where(o => o.liquidita == null).ToList().ForEach(o => o.liquidita = "n.c.");
            bool liqentro12mesi = list.Count > 0 ? list.All(x => x.liquidita.ToLower().Equals("entro 12 mesi")) : false;
            bool rischioisadeguato=!datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.isAdeguato;
            bool fladegLiquidita = datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("LQ")).flagAdeguatezza;
            bool liqIsAdeg = !datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza.FirstOrDefault(x => x.id.Equals("LQ")).isAdeguato;
            
            
            bool prospetticoMigliorativoLiquidita = liqentro12mesi &&
                datiSeiUnico.flagAdeguatezzaPro() && rischioisadeguato && fladegLiquidita && liqIsAdeg;
             

            string adeguata = datiSeiUnico.flagAdeguatezzaPro() ?
                        "effettuate sia coerente con la soglia massima associata al suo profilo finanziario" :
                        "da lei richieste al suo private banker sia coerente con la soglia massima associata al suo profilo finanziario";

            if (prospetticoMigliorativoVar || prospetticoMigliorativoRC || coperturaAdeguatezza || prospetticoMigliorativoLiquidita)
            {
                nota = "La valutazione di adeguatezza ";
                if (prospetticoMigliorativoVar || coperturaAdeguatezza)
                    nota += "in termini di Rischio Mercato (VaR) " + (prospetticoMigliorativoLiquidita || prospetticoMigliorativoRC || coperturaAdeguatezza ? "e " : "");
                if (prospetticoMigliorativoRC || coperturaAdeguatezza)
                    nota += "in termini di Rischio Credito " + (prospetticoMigliorativoLiquidita || coperturaAdeguatezza ? "e " : "");
                if (prospetticoMigliorativoLiquidita || coperturaAdeguatezza)
                    nota += "in termini di Liquidità/Liquidabilità ";
                nota += "è stata effettuata verificando che ";
                if (prospetticoMigliorativoVar || coperturaAdeguatezza)
                    nota += "il livello di Rischio Mercato (VaR) delle sole operazioni d’investimento " + adeguata + (prospetticoMigliorativoLiquidita || prospetticoMigliorativoRC || coperturaAdeguatezza ? " e che " : "");
                if (prospetticoMigliorativoRC || coperturaAdeguatezza)
                    nota += "la Classe di Rischio Credito delle sole operazioni d’investimento " + adeguata + (prospetticoMigliorativoLiquidita || coperturaAdeguatezza ? " e che " : "");
                if (prospetticoMigliorativoLiquidita || coperturaAdeguatezza)
                    nota += "le operazioni d’investimento " + (!datiSeiUnico.flagAdeguatezzaPro() ? "da lei richieste al suo private banker" : "effettuate") + " abbiano ad oggetto esclusivamente prodotti con un orizzonte temporale \"Entro 12 mesi\"";
                nota += ". ";

                //nota += getNota62_15();
            }

            return nota;
        }
        public virtual string getNota62_5()
        {
            string nota = "";

            var RM = !datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.AsEnumerable().FirstOrDefault(o => o.idDescIndicatore == "RM").copertura.Equals("100.00");
            var RC = !datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.AsEnumerable().FirstOrDefault(o => o.idDescIndicatore == "RC").copertura.Equals("100.00");
            if (!datiSeiUnico.flagAdeguatezzaPro() && (RM || RC))
            {



                nota += "Il patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\") risulta non adeguato al suo profilo finanziario in termini di " +
                        (RM ? RC ? "Rischio Mercato (VaR) e di Rischio Credito" : "Rischio Mercato (VaR)" : RC ? "Rischio Credito" : "") +
                        ", in quanto le operazioni da lei richieste al suo private banker hanno ad oggetto uno o più prodotti per cui non è disponibile " +
                        (RM ? RC ? "il relativo livello di Rischio Mercato (VaR) e la relativa classe di Rischio Credito" : "il relativo livello di Rischio Mercato (VaR)" : RC ? "la relativa classe di Rischio Credito" : "") +
                        ".";



            }
            return nota;
        }
        public virtual string getNota62_6() {
            string nota = "";
            string token = "";
            if (datiSeiUnico.propostaUnit().stAdequatezza.flagAdeguatezzaMIFIDPro)
            {
                nota += token + "La valutazione di adeguatezza del patrimonio derivante dalla presente proposta (\"portafoglio proposto\") non è necessaria in quanto tutti i prodotti oggetto delle operazioni di investimento effettuate non sono soggetti alla valutazione di adeguatezza MiFID.";
            }
            return nota;
        }
        public virtual string getNota62_7() {
            string nota = "";
            string token = "";
            if (datiSeiUnico.propostaUnit().stAdequatezza.flagVarEccessivamenteAdeguatoPro)
            {
                nota += token + "Il patrimonio derivante dalla presente proposta (\"portafoglio proposto\") risulta adeguato al suo profilo finanziario. Le segnaliamo, tuttavia, che il livello di Rischio Mercato (VaR) del patrimonio derivante dalla presente proposta (\"portafoglio proposto\") si posiziona su un valore sensibilmente inferiore rispetto alla soglia minima attribuita al suo profilo finanziario.";
              
            }
            return nota;
        }      


        public virtual string getNota62_9()
        {
            string nota = "";
            var CM = !datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("CM")).coperturaDelta.Equals("100.00");

            if (!datiSeiUnico.flagAdeguatezzaPro() && CM)
                nota += "<br>Il patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\") risulta non adeguato al suo profilo finanziario in termini di Complessità, in quanto le operazioni da lei richieste al suo private banker hanno ad oggetto uno o più prodotti per cui non è disponibile il relativo livello di Complessità.";
            return nota;
        }
        public virtual string getNota62_10()
        {
            string nota = "";
            // RILASCIO dopo 1035
            var pianificazioneVerticale = datiSeiUnico.propostaUnit().stPianificazioneVerticale;
            var adeguatezza = datiSeiUnico.propostaUnit().stAdequatezza;
            if (pianificazioneVerticale.risorseFinanziarieBFPro < 100000 &&
                !adeguatezza.flagAdeguatezzaPro == false &&
                (pianificazioneVerticale.complessitaMovimentazioniDec.Equals("Alta") ||
                pianificazioneVerticale.complessitaMovimentazioniDec.Equals("Molto Alta") ||
                pianificazioneVerticale.complessitaAcquistiDec.Equals("Alta") ||
                pianificazioneVerticale.complessitaAcquistiDec.Equals("Molto Alta")))
            {

                nota += "Il patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\") risulta non adeguato al suo profilo finanziario in quanto non è possibile investire in prodotti a complessità \"Alta\" o \"Molto Alta\" all'interno di un portafoglio prospettico inferiore a 100.000 Euro.";

            }
            return datiSeiUnico.FormatBanca(nota);

        }
        public virtual string getNota62_13()
        {
            return "";
        }
        public virtual string getNota62_14()
        {
            return "";
        }
        public virtual string getNota62_8()
        {
            return "";
        }
        public virtual string getNota62_15()
        {
            var delegato = datiSeiUnico.propostaUnit().stDettaglioProposta.delgato;
            var nota = "";
            if(delegato != null)
                nota = "<BR><BR>La soglia massima relativa all’indicatore di Complessità fa riferimento al profilo di Esperienza e Conoscenza "
                +"del Legale Rappresentante/Delegato " + delegato.cognomeDelegato + " " +delegato.nomeDelegato;
            return nota;
        }
      
       
       
         
        
        private DataRow ElencoProdotti(DataTable prodotti, rsAggregatoPosizioni areaProgetti, string codArea, string descrizione, bool fontBold = false, bool backGroundColor = false)
        {
            DataRow dr = prodotti.NewRow();
            dr["CodArea"] = codArea;
            dr["Descrizione"] = descrizione;
            dr["BackgroundColor"] = backGroundColor;
            dr["FontBold"] = fontBold; 
            
            dr["CodiceContratto"] = "";
            dr["Nome"] = descrizione;
            dr["Controvalore"] = areaProgetti.ctvPro;
            dr["Rischiomercato"] = areaProgetti.prometeiaInfos != null? areaProgetti.prometeiaInfos.varDecodificato : "-";
            dr["Rischiocredito"] = fontBold && !descrizione.ToLower().Contains("totale risorse") && !descrizione.ToLower().Contains("portafoglio")
                && !descrizione.ToLower().Contains("patrimonio") ? "-" : areaProgetti.prometeiaInfos != null ? areaProgetti.prometeiaInfos.rischioCreditoDecodificato == null ? 
                "n.a." : (areaProgetti.prometeiaInfos.rischioCreditoDecodificato.ToLower().Contains("classe") ? 
                Helper.CapitalizeWords(areaProgetti.prometeiaInfos.rischioCreditoDecodificato) : areaProgetti.prometeiaInfos.rischioCreditoDecodificato) 
                : "-";
            dr["Complessita"] = fontBold && !descrizione.ToLower().Contains("totale risorse") && !descrizione.ToLower().Contains("portafoglio")
                && !descrizione.ToLower().Contains("patrimonio") ? "-" : areaProgetti.complessitaDec;
            dr["Liquidita"] = "-";
            prodotti.Rows.Add(dr);
            return dr;
        }
        private DataRow ElencoProdotti(DataTable prodotti, rsSTPosizione dettaglioProdotto, string codArea, string descrizione, bool fontBold = false, bool backGroundColor = false)
        {
            DataRow dr = prodotti.NewRow();
            dr["CodArea"] = codArea;
            
            if (dettaglioProdotto.savingMap)
            //if (dettaglioProdotto.prodotto.nomeProdotto.Substring(0, 2).ToString().ToUpper() == "FV")
                dr["SavingMap"] = "SavingMap.png";

            dr["Descrizione"] = descrizione;
            dr["BackgroundColor"] = backGroundColor;
            dr["FontBold"] = fontBold; 
            dr["CodiceContratto"] =  dettaglioProdotto.codContratto==null?"": dettaglioProdotto.codContratto;
            dr["Nome"] = dettaglioProdotto.prodotto == null ? "" : dettaglioProdotto.prodotto.nomeProdotto;
            dr["Controvalore"] = dettaglioProdotto.ctvPro;
            dr["Rischiomercato"] = dettaglioProdotto.prodotto == null ? "" : dettaglioProdotto.prodotto.varProDec;
            dr["Rischiocredito"] = dettaglioProdotto.prodotto == null ? "" : dettaglioProdotto.prodotto.rischioCreditoDec;
            dr["Complessita"] = dettaglioProdotto.prodotto == null ? "" : dettaglioProdotto.prodotto.complessitaDec;
            dr["Liquidita"] = dettaglioProdotto.liquidita;        
            prodotti.Rows.Add(dr);
            return dr;
        }
        private void TotaleAreadiBisogno(DataTable prodotti, rsAggregatoPosizioni[] aggregatoPosizioni, bool fontBold = false, bool backGroundColor = false)
        {

             


            var dataDettaglioProdotti = datiSeiUnico.propostaUnit().dettaglioProdotti.dettaglioProdotti;

            rsAggregatoPosizioni RA = (from o in aggregatoPosizioni
                                       where o.posizioniAggregate != null && o.chiaveAggregazione.Equals("RA")
                                       select o).LastOrDefault();
            rsAggregatoPosizioni PAT = (from o in aggregatoPosizioni
                                        where o.posizioniAggregate != null && o.chiaveAggregazione.Equals("PAT")
                                        select o).FirstOrDefault();

            decimal OC = datiSeiUnico.PROPOSTO_OC;
            var CCN = from o in dataDettaglioProdotti where o.area.ToUpper().Equals("CC") orderby o.ctvPro descending select o;
            var EF = from o in dataDettaglioProdotti where o.area.ToUpper().Equals("SELF") && o.ctvPro < 0 && o.prodotto.codSottoprodotto.Equals("L191") orderby o.ctvPro descending select o;
            var ET = from o in dataDettaglioProdotti where o.area.ToUpper().Equals("SELF") && o.ctvPro < 0 && o.prodotto.codSottoprodotto.Equals("L192") orderby o.ctvPro descending select o;
            //AC
            var FO = from o in dataDettaglioProdotti where o.area.ToUpper().Equals("SELF") && o.ctvPro < 0 && o.prodotto.codSottoprodotto.Equals("V301") orderby o.ctvPro descending select o;

            //AC
            if (CCN.Count() != 0 || OC != 0 || EF.Count() != 0 || ET.Count() != 0||FO.Count()!=0)
            {

                DataRow drst = ElencoProdotti(prodotti, RA, "", "Totale risorse allocate", true, true);
                drst["Controvalore"] = datiSeiUnico.PROPOSTO_SUBTOTALE;
                drst["Complessita"]  += getNota1().Length > 0 ? "*" : "";

                if (OC != 0)
                {
                    rsSTPosizione item = new rsSTPosizione();
                    DataRow dr = ElencoProdotti(prodotti, item, "", "");
                    dr["Controvalore"] = OC;
                    dr["Nome"] = "Operazioni in corso";
                    dr["Rischiomercato"] = "n.c.";
                    dr["Rischiocredito"] = "n.c.";
                    dr["Complessita"] = "n.c.";
                    dr["Liquidita"] = "n.c."; 
                   
                }
                foreach (var item in CCN)
                {
                    DataRow dr =  ElencoProdotti(prodotti, item, "", "");
                    dr["Complessita"] = "n.c.";
                }
                foreach (var item in EF)
                {
                    DataRow dr = ElencoProdotti(prodotti, item, "", "");
                    dr["Complessita"] = "n.c.";
                }
                foreach (var item in ET)
                {
                    DataRow dr = ElencoProdotti(prodotti, item, "", "");
                    dr["Complessita"] = "n.c.";
                }
                //AC
                foreach (var item in FO)
                {
                    DataRow dr = ElencoProdotti(prodotti, item, "", "");
                    dr["Complessita"] = "n.c.";
                }
            }
            DataRow drtot = ElencoProdotti(prodotti, PAT, "", "Portafoglio " + (datiSeiUnico.flagAdeguatezzaPro() ? "proposto" : "prospettico"), true, true);
            drtot["Controvalore"] = datiSeiUnico.PROPOSTO_TOTALE;
            drtot["Complessita"] += getNota1().Length > 0 ? "*" : "";
        }
        private void TotaleCategoria(DataTable prodotti, rsAggregatoPosizioni[] aggregatoPosizioni, bool fontBold = false, bool backGroundColor = false)
        {
            var dataDettaglioProdotti = datiSeiUnico.propostaUnit().dettaglioProdotti.dettaglioProdotti;

            decimal OC = datiSeiUnico.PROPOSTO_OC;
            var CCN = from o in dataDettaglioProdotti where o.area.ToUpper().Equals("CC") orderby o.ctvPro descending select o;

            rsAggregatoPosizioni RA = (from o in aggregatoPosizioni
                                       where o.posizioniAggregate != null && o.chiaveAggregazione.Equals("RA")
                                       select o).LastOrDefault();
            rsAggregatoPosizioni PAT = (from o in aggregatoPosizioni
                                        where o.posizioniAggregate != null && o.chiaveAggregazione.Equals("PAT")
                                        select o).FirstOrDefault();
            if (OC != 0 || CCN.Count() != 0)
            {

                DataRow drsub = ElencoProdotti(prodotti, RA, "", "Totale risorse finanziarie", true, true);
                drsub["Controvalore"] = datiSeiUnico.PROPOSTO_SUBTOTALE + datiSeiUnico.PROPOSTO_GPELIGO;
                drsub["Complessita"] += getNota1().Length > 0 ? "*" : "";

                if (OC != 0)
                {
                    rsSTPosizione item = new rsSTPosizione();
                    DataRow dr = ElencoProdotti(prodotti, item, "", "");
                    dr["Controvalore"] = OC;
                    dr["Nome"] = "Operazioni in corso";
                    dr["Rischiomercato"] = "n.c.";
                    dr["Rischiocredito"] = "n.c.";
                    dr["Complessita"] = "n.c.";
                    dr["Liquidita"] = "n.c."; 
                }

                foreach (var item in CCN)
                {
                    DataRow dr =  ElencoProdotti(prodotti, item, "", "", false, false);
                    dr["Complessita"] = "n.c.";
                }

            }
            DataRow drtot = ElencoProdotti(prodotti, PAT, "", "Portafoglio " + (datiSeiUnico.flagAdeguatezzaPro() ? "proposto" : "prospettico"), true, true);
            drtot["Controvalore"] = datiSeiUnico.PROPOSTO_TOTALE;
            drtot["Complessita"] += getNota1().Length > 0 ? "*" : "";
        }
        private void TotaleContratto(DataTable prodotti, rsAggregatoPosizioni[] aggregatoPosizioni, bool fontBold = false, bool backGroundColor = false)
        {
            TotaleCategoria(prodotti, aggregatoPosizioni, fontBold, backGroundColor);
        }

        private void ElencoConcentrazioneTitoli(DataTable dt, Consulenza.DataServices.fideuram.data.service.stConcentrazioneEmittenteBean[] items)
        {
            if (dt.Columns.Count == 0)
            {
                if (dt.TableName == "fondi")
                {
                    dt.Columns.Add(new DataColumn("SavingMap", typeof(string)));
                    dt.Columns.Add(new DataColumn("Emittenti", typeof(string)));
                    dt.Columns.Add(new DataColumn("Controvaloreproposto", typeof(decimal)));

                    dt.Columns.Add(new DataColumn("Concentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Sogliaconcentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Adeguatezza", typeof(string)));
                }
                else
                {
                    dt.Columns.Add(new DataColumn("SavingMap", typeof(string)));
                    dt.Columns.Add(new DataColumn("Emittenti", typeof(string)));
                    dt.Columns.Add(new DataColumn("Controvaloreproposto", typeof(decimal)));
                    dt.Columns.Add(new DataColumn("Franchigia", typeof(string)));
                    dt.Columns.Add(new DataColumn("Concentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Sogliaconcentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Adeguatezza", typeof(string)));
                }
            }
            if (items != null)
            {
                foreach (var concentrazione in from e in items orderby e.ctv descending select e)
                {
                    string sSaving = "";
                    
                    //if (concentrazione.nomeEmittente.Substring(0, 1) == "I")
                    //    sSaving = "SavingMap.png";

                    if (dt.TableName == "fondi")
                    {
                        dt.Rows.Add(
                            sSaving,
                            concentrazione.nomeEmittente,
                            concentrazione.ctv,
                            concentrazione.concentrazione,
                            concentrazione.sogliaConcentrazione,
                            !concentrazione.flagAdeguatezzaSpecified ? "n.a." : concentrazione.flagAdeguatezza ? "Adeguatezza" : "Non Adeguatezza"
                        );
                    }
                    else
                    {
                        string fra = concentrazione.franchigia.ToString().Contains(".") ? Helper.FormatCurrency(concentrazione.franchigia.ToString().Replace(".", ",")) : Helper.FormatCurrency(concentrazione.franchigia.ToString());
                        bool naBoolean = concentrazione.franchigia == 0 && concentrazione.sogliaConcentrazione == 100 ? true : false;
                        dt.Rows.Add(
                            sSaving,
                            concentrazione.nomeEmittente,
                            concentrazione.ctv,
                            naBoolean ? "n.a." : fra,
                            concentrazione.concentrazione,
                            naBoolean ? "n.a." : concentrazione.sogliaConcentrazione.ToString(),
                            !concentrazione.flagAdeguatezzaSpecified ? "n.a." : concentrazione.flagAdeguatezza ? "Adeguatezza" : "Non Adeguatezza"
                        );
                    }
                    //ElencoConcentrazioneTitoli(dt, concentrazione.ite);
                }
            }
        }
        private void TotaleConcentrazioneTitoli(DataTable dt, string descrizione, Consulenza.DataServices.fideuram.data.service.stDettaglioConcentrazioneEmittenti items)
        {
            if (dt.Columns.Count == 0)
            {
                if (descrizione.ToLower().Contains("speculati"))
                {
                    dt.Columns.Add(new DataColumn("Emittenti", typeof(string)));
                    dt.Columns.Add(new DataColumn("Controvaloreproposto", typeof(decimal)));
                    dt.Columns.Add(new DataColumn("Concentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Sogliaconcentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Adeguatezza", typeof(string)));
                }
                else
                {
                    dt.Columns.Add(new DataColumn("Emittenti", typeof(string)));
                    dt.Columns.Add(new DataColumn("Controvaloreproposto", typeof(decimal)));
                    dt.Columns.Add(new DataColumn("Franchigia", typeof(string)));
                    dt.Columns.Add(new DataColumn("Concentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Sogliaconcentrazione", typeof(string)));
                    dt.Columns.Add(new DataColumn("Adeguatezza", typeof(string)));
                }
            }
            if(descrizione.ToLower().Contains("obbligazionari"))
                dt.Rows.Add(descrizione, items.ctvTotaleObbligazionari, "-", items.concentrazioneTotObbligazionari, "-", "-");
            else if (descrizione.ToLower().Contains("azionari"))
                dt.Rows.Add(descrizione, items.ctvTotaleAzionari,"-",  items.concentrazioneTotAzionari,"-", "-");
                else if (descrizione.ToLower().Contains("speculativ"))
                    dt.Rows.Add(descrizione, items.ctvTotaleSpeculativi, "-", items.concentrazioneTotSpeculativi, "-");
        }


        private string getFormat(string _valore)
        {
            string valore = "";
            try
            {
                if (_valore.ToLower().Contains("classe") || _valore.ToLower().Contains("alta") || _valore.ToLower().Contains("bassa") || _valore.ToLower().Contains("media") || _valore.ToLower().Contains("rischio") || _valore.ToLower().Contains("minima"))
                    valore = Helper.CapitalizeWords(_valore);
                else if (_valore.ToLower().Contains("n.c.") || _valore.ToLower().Contains("n.a.") || _valore.ToLower().Contains("n.d."))
                    valore = _valore.ToLower();
                else
                {
                    valore = Helper.FormatDecimal(_valore, 2);
                    valore.Replace(".", ",");//le aree principali hanno punto, altri virgola
                }

            }
            catch
            {
                valore = _valore;
            }
            return valore;
        }
        public virtual RaggruppaProdotti raggruppaProdotti()
        {
            return GetOption<Opzione6_2>().RaggruppaProdotti;

        }

        public virtual string getTesto1()
        {
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            string nota = "";
            if (isAdeguata)
                nota = datiSeiUnico.FormatBanca("Di seguito sono riportati i risultati della valutazione di adeguatezza della presente proposta, in riferimento a tutti gli indicatori di rischio che $/Banca/$ utilizza per valutare l'adeguatezza degli investimenti. Per ogni indicatore, ove previsti, sono riportati il livello massimo associato al suo profilo finanziario, il valore relativo al patrimonio che lei attualmente detiene presso $/Banca/$ (\"portafoglio attuale\") e il valore relativo al patrimonio derivante dalla presente proposta (\"portafoglio proposto\"), con indicazione del corrispondente grado di copertura.");
            else
                nota = datiSeiUnico.FormatBanca("Di seguito sono riportati i risultati della valutazione di adeguatezza delle operazioni da lei richieste al suo private banker, in riferimento a tutti gli indicatori di rischio che $/Banca/$ utilizza per valutare l'adeguatezza degli investimenti. Per ogni indicatore, ove previsti, sono riportati il livello massimo associato al suo profilo finanziario, il valore relativo al patrimonio che lei attualmente detiene presso $/Banca/$ (\"portafoglio attuale\") e il valore relativo al patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\"), con indicazione del corrispondente grado di copertura.");
        
            return nota; }
        public virtual bool getIndicatoricomplessita(string copertura)
        {
            var grado = copertura.Replace(".", ",");
            if (Convert.ToDouble(grado) != 100)
            {
                notaindicatoricomplessitafe = true;
                return true;
            }
            else
                return false;
        }
        //indicatore di sintesi
      
       

       
       

      

        //prodotti
        public virtual string getTesto3()
        {
            string nota = "Nella tabella sottostante sono riportati i prodotti che lei detiene presso $/Banca/$, con evidenza dei principali indicatori di rischio. ";
            string token = "";
            switch (raggruppaProdotti())
            {
                case RaggruppaProdotti.AreaBisogno:
                    nota += token + "I prodotti sono raggruppati per area di bisogno e, dove necessario, per progetto di investimento.";
                    token = " ";
                    break;
                case RaggruppaProdotti.Categoria:
                    nota += token + "I prodotti sono raggruppati secondo la categoria di appartenenza.";
                    token = " ";
                    break;
                case RaggruppaProdotti.Contratto:
                    nota += token + "I prodotti sono raggruppati secondo il contratto di appartenenza.";
                    token = " ";
                    break;
            }
            return datiSeiUnico.FormatBanca(nota);
        }
        
        

        //focus emittenti
        public virtual string getCapitolo4()
        {
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            return (isAdeguata ? "Proposta: adeguatezza" : "Operazioni richieste") + ": focus su concentrazione emittenti";
        }

        //focus emittenti
        public virtual string getTesto4()
        {
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            string nota = "";
            nota = isAdeguata ?
                datiSeiUnico.FormatBanca("In questa scheda sono riportati i risultati della valutazione di adeguatezza del patrimonio che lei detiene presso $/Banca/$, in riferimento all'indicatore di concentrazione. Per gli emittenti e i fondi speculativi del patrimonio che lei detiene presso $/Banca/$ sono riportati, ove previsti, il confronto tra il controvalore \"attuale\" e il controvalore sotto il quale non si applica il controllo di concentrazione (\"franchigia\"), e il confronto tra la concentrazione \"attuale\" e la soglia massima definita dal modello di adeguatezza.") :
                datiSeiUnico.FormatBanca("In questa scheda sono riportati i risultati della valutazione di adeguatezza delle operazioni da lei richieste al suo private banker che lei detiene presso $/Banca/$, in riferimento all'indicatore di concentrazione. Per gli emittenti e i fondi speculativi del patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\") sono riportati, ove previsti, il confronto tra il controvalore \"prospettico\" e il controvalore sotto il quale non si applica il controllo di concentrazione (\"franchigia\"), e il confronto tra la concentrazione \"prospettica\" e la soglia massima definita dal modello di adeguatezza.");
            return nota;
        }

        //Orizzonete Temporale Liquidità / Liquidabilità
        public virtual string getCapitolo5()
        {
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            return (isAdeguata ? "Adeguatezza" : "Operazioni richieste") +": focus su liquidità/liquidabilità";
        }

        //Orizzonete Temporale Liquidità / Liquidabilità 
        public virtual string getTesto6()
        {
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            string nota = "";
            nota = isAdeguata ?
                datiSeiUnico.FormatBanca("In questa scheda sono riportati i risultati della valutazione di adeguatezza del patrimonio che lei detiene presso $/Banca/$, in riferimento all'indicatore di liquidità/liquidabilità. Nel grafico sono indicate l'area di adeguatezza e l'area di non adeguatezza: la prima individua le situazioni in cui le caratteristiche di durata e di liquidità dei prodotti che lei detiene presso $/Banca/$ sono coerenti con i suoi orizzonti temporali di investimento, derivanti dalle risposte che lei ha fornito alla domanda 9 del questionario di profilatura.") :
                datiSeiUnico.FormatBanca("In questa scheda sono riportati i risultati della valutazione di adeguatezza delle operazioni da lei richieste al suo private banker, in riferimento all'indicatore di liquidità/liquidabilità. Nel grafico sono indicate l'area di adeguatezza e l'area di non adeguatezza: la prima individua le situazioni in cui le caratteristiche di durata e di liquidità dei prodotti che,sulla base delle operazioni da lei richieste al suo private banker concorrono alla determinazione del suo patrimonio, son ocoerenti con i suoi orizzonti temporali di investimento, derivanti dalle risposte che lei ha fornito alla domanda 9 del questionario di profilatura.");
            return nota;
        }
      
    }

}
