using System;
using Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using Consulenza.ReportWriter.Business.Entity;
using System.Data;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Manager.Integration;
using System.Collections.Generic;
using System.Linq;
using Consulenza.ReportWriter.Business.CUSTOM_PDF.ConsulenzaUnica;

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    /// <summary>
    ///S31.PatrimonioAltriIstitutiDettaglioProdotti  idSezione = 74
    /// </summary>
    public class S31 : Entity.Section 
    {
        //FINIRE IL DRAW: FOOTER DI ENTRAMBI E CONTROLLARE IL RAGGRUPPAMENTO PER CATEGORIE
        public string NomeIntermediario { get; set; }
        
        bool notaproxy;
        private List<string> _elencocategorie = new List<string>();
        public S31(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S31", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        //protected override sealed void OLD_Draw()
        //{
        //    var dati = GetDataSet();

        //    TablePDF tabellaCategorie = null;

        //    #region Raggruppamento per Categoria

        //    if (raggruppamentoCategoria())
        //    {
        //        AddElement(new PagePDF(PagePDF.PagePDFType.Generic) { ID="pagina1"});

        //        var intestazione = new SectionHeadingPDF(
        //            getTitolo(),

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

        //        AddElement(intestazione.ToElement());
        //        AddElement(new SpacePDF(20));
        //        AddElement(new FormattedTextAreaPDF(getTestoIntro(), EnvironmentFacade.RendererFacade.XLeftLimit) { TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, FontSize = 7 });
        //        AddElement(new SpacePDF(15));

        //        DataView view = new DataView(dati.Tables["categorie"].AsEnumerable().OrderBy(o => o.Field<int>("Ordinamento")).CopyToDataTable());
        //        DataTable dtCategoria = view.ToTable(true, "Categoria");
        //        DataTable dtFinale = new DataTable();
        //        dtFinale.Columns.Add("Categoria", typeof(string));
        //        dtFinale.Columns.Add("Intermediario", typeof(string));
        //        dtFinale.Columns.Add("ChiaveProdotto", typeof(string));
        //        dtFinale.Columns.Add("NomeProdotto", typeof(string));
        //        dtFinale.Columns.Add("Controvalore", typeof(string));
        //        dtFinale.Columns.Add("Versatonetto", typeof(string));
        //        dtFinale.Columns.Add("Utileperdita", typeof(string));
        //        dtFinale.Columns.Add("Rischiocredito", typeof(string));
        //        dtFinale.Columns.Add("VaR", typeof(string));

        //        foreach (DataRow it in dati.Tables["categorie"].Rows)
        //        {
        //            dtFinale.Rows.Add(it["Categoria"].ToString(), it["Intermediario"].ToString(), it["ChiaveProdotto"].ToString(), it["NomeProdotto"].ToString(), it["Controvalore"].ToString(), it["Versatonetto"].ToString(), it["Utileperdita"].ToString(), it["Rischiocredito"].ToString(), it["VaR"].ToString());
        //        }


        //        for (int i = 0; i < dtCategoria.Rows.Count; i++)
        //        {

        //            var categoria = dtFinale.Select("Categoria ='" + dtCategoria.Rows[i]["Categoria"].ToString() + "'").CopyToDataTable();// : dati.Tables[0].Select("Categoria ='" + p["Categoria"].ToString() + "' AND Intermediario='" + p["Intermediario"].ToString() + "'").CopyToDataTable();
        //            var footer = dati.Tables["categorieFooter"].AsEnumerable().Where(o => o.Field<string>("Categoria").Contains(dtCategoria.Rows[i]["Categoria"].ToString())).CopyToDataTable();
        //            bool notaproxyCat = categoria.AsEnumerable().Any(o => o.Field<string>("ChiaveProdotto").ToString() == "0");
        //            decimal copertura = Convert.ToDecimal(footer.Rows[0]["Copertura"]);
        //            bool notaGrado = getNota1(copertura).Length > 0;
        //            string testoNotaGrado = getNota1(copertura);
        //            bool presenzaAsterischiProxy = categoria.AsEnumerable().Any(o => o.Field<string>("VaR").ToString().Contains(notaGrado ? "**" : "*"));
        //            string testoNotaProxy = notaproxyCat ? getNotaProxyVar() : "";
        //            bool tuttivarnc = categoria.AsEnumerable().All(o => o.Field<string>("VaR").ToString() == "n.c." || o.Field<string>("VaR").ToString() == "0,00" || o.Field<string>("Categoria").ToString().ToLower().Contains("conti"));
        //            tabellaCategorie = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, categoria, footer)
        //            {
        //                Style = Style.ConsulenzaUnica,
        //                Footer = true,
        //                AlternateRow = false,
        //                ShowBorderLastLine = false,
        //                HeaderHeight = 22,
        //                //MinimumRowHeight = 27,
        //                //RowHeight = 27,
        //                HeaderFontSize = 7,
        //                ID=dtCategoria.Rows[i]["Categoria"].ToString(),
        //                TitleRow = true,
        //                TitleRowText = dtCategoria.Rows[i]["Categoria"].ToString(),
        //                TitleRowBorder = BorderTitleRowType.Nessuno,
        //                TitleRowSpace = 15,
        //                //,
        //                PageBreak=true

        //            };
        //            tabellaCategorie.Columns.Add(new ColumnPDF("Intermediario", 105, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Intermediario", "Intermediario") { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7  });
        //            tabellaCategorie.Columns.Add(new ColumnPDF("NomeProdotto", 120, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Descrizione") { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
        //            tabellaCategorie.Columns.Add(new ColumnPDF("Controvaloreattuale", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore <br>attuale (€)") { PaddingRight = 3, HeaderPaddingLeft = 5, HeaderFontSize = 7, FontSize = 7 });
        //            tabellaCategorie.Columns.Add(new ColumnPDF("Versatonetto", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Versatonetto", "Versato<br>netto (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
        //            tabellaCategorie.Columns.Add(new ColumnPDF("Utileperdita", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Utileperdita", "Utile/<br>Perdita (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
        //            tabellaCategorie.Columns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiocredito", "Rischio<br>Credito") { HeaderFontSize = 7, HeaderPaddingLeft = 4, FontSize = 7, PaddingLeft = 4});
        //            tabellaCategorie.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderPaddingLeft = 4, PaddingRight = 4, HeaderFontSize = 7, FontSize = 7 });
        //           int a = 0;
        //           foreach (var item in categoria.Rows)
        //           {

        //               tabellaCategorie.Cells[2, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
        //               tabellaCategorie.Cells[3, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
        //               tabellaCategorie.Cells[4, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
        //               tabellaCategorie.Cells[5, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
        //               tabellaCategorie.Cells[6, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
        //               a++;
        //           }
        //           tabellaCategorie.FooterColumns.Add(new ColumnPDF("Totale", 225, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
        //           tabellaCategorie.FooterColumns.Add(new ColumnPDF("Controvaloreattuale", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
        //           tabellaCategorie.FooterColumns.Add(new ColumnPDF("Versatonetto", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
        //           tabellaCategorie.FooterColumns.Add(new ColumnPDF("Utileperdita", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
        //           tabellaCategorie.FooterColumns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7});
        //           tabellaCategorie.FooterColumns.Add(new ColumnPDF("VaRfooter", 40, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 2, HeaderFontSize = 7, FontSize = 7 });
        //           AddElement(tabellaCategorie);
        //            if (notaGrado)
        //            {
        //                AddElement(new SpacePDF(10));
        //               AddElement(new FormattedTextAreaPDF("(*) " +testoNotaGrado, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

        //           }


        //            if (notaproxyCat && !tuttivarnc && presenzaAsterischiProxy)
        //            {
        //                AddElement(new SpacePDF(7));
        //                string ast = notaGrado ? "(**) " : "(*) ";
        //                AddElement(new FormattedTextAreaPDF(ast + testoNotaProxy, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

        //            }
        //            AddElement(new SpacePDF(8));
        //         }

        //    }
        //    #endregion

        //    #region stampa per intermediari
        //    else
        //    {
        //        for (int i = 0; i < dati.Tables["Intermediari"].Rows.Count; i++)
        //        {
        //            NomeIntermediario = "«" + dati.Tables["Intermediari"].Rows[i]["NomeIntermediario"].ToString()+"»";

        //            AddElement(new PagePDF(PagePDF.PagePDFType.Generic));

        //            var intestazione = new SectionHeadingPDF(
        //                string.Format(getTitolo(), NomeIntermediario),

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

        //            AddElement(intestazione.ToElement());
        //            AddElement(new SpacePDF(20));
        //            AddElement(new FormattedTextAreaPDF(getTestoIntro(), EnvironmentFacade.RendererFacade.XLeftLimit) { TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, FontSize = 7 });


        //            //DataView view = new DataView(dati.Tables["categorie" + i]);
        //            DataView view = new DataView(dati.Tables["categorie" + i].AsEnumerable().OrderBy(o => o.Field<int>("Ordinamento")).CopyToDataTable());
        //            DataView view2 = new DataView(dati.Tables["footer" + i]);
        //            DataTable dtCategoria = view.ToTable(true, "Categoria");
        //            DataTable dtCategoriaFooter = view2.ToTable(true, "Copertura", "CategoriaString");
        //            DataTable dtFinale = new DataTable();

        //            dtFinale.Columns.Add("Categoria", typeof(string));
        //           // dtFinale.Columns.Add("Intermediario", typeof(string));
        //            dtFinale.Columns.Add("ChiaveProdotto", typeof(string));
        //            dtFinale.Columns.Add("NomeProdotto", typeof(string));
        //            dtFinale.Columns.Add("Controvalore", typeof(string));
        //            dtFinale.Columns.Add("Versatonetto", typeof(string));
        //            dtFinale.Columns.Add("Utileperdita", typeof(string));
        //            dtFinale.Columns.Add("Rischiocredito", typeof(string));
        //            dtFinale.Columns.Add("VaR", typeof(string));

        //            foreach (DataRow it in dati.Tables["categorie"+i].Rows)
        //            {
        //                dtFinale.Rows.Add(it["Categoria"].ToString(),it["ChiaveProdotto"].ToString(), it["NomeProdotto"].ToString(), it["Controvalore"].ToString(), it["Versatonetto"].ToString(), it["Utileperdita"].ToString(), it["Rischiocredito"].ToString(), it["VaR"].ToString());
        //            }

        //            for (int b = 0; b < dtCategoria.Rows.Count; b++)
        //            {
        //                //for (int c = 0; c < dtCategoriaFooter.Rows.Count; c++)
        //                {
        //                    var categoria = dtFinale.Select("Categoria ='" + dtCategoria.Rows[b]["Categoria"].ToString() + "'").CopyToDataTable();// : dati.Tables[0].Select("Categoria ='" + p["Categoria"].ToString() + "' AND Intermediario='" + p["Intermediario"].ToString() + "'").CopyToDataTable();
        //                    var footer = dati.Tables["footer" + i].AsEnumerable().Where(o => o.Field<string>("Categoria").Contains(dtCategoria.Rows[b]["Categoria"].ToString())).CopyToDataTable();
        //                    var coperturaNota = dtCategoriaFooter.AsEnumerable().FirstOrDefault(o => o.Field<string>("CategoriaString").Contains(dtCategoria.Rows[b]["Categoria"].ToString()));
        //                    bool notaproxyCat = categoria.AsEnumerable().Any(o => o.Field<string>("ChiaveProdotto").ToString() == "0");
        //                    bool tuttivarnc = categoria.AsEnumerable().All(o => o.Field<string>("VaR").ToString() == "n.c." || o.Field<string>("VaR").ToString() == "0,00" || o.Field<string>("Categoria").ToString().ToLower().Contains("conti"));
        //                    string testoNotaProxy = notaproxyCat ? getNotaProxyVar() : "";
        //                    decimal copertura = Convert.ToDecimal(footer.Rows[0]["Copertura"]);
        //                    bool notaGrado = getNota1(copertura).Length > 0;
        //                    string testoNotaGrado = notaGrado ? getNota1(copertura) : "";
        //                    bool presenzaAsterischiProxy = categoria.AsEnumerable().Any(o => o.Field<string>("VaR").ToString().Contains(notaGrado ? "**" : "*"));
        //                    AddElement(new SpacePDF(b > 0 ? 10 : 1));
        //                    //AddElement(new FormattedTextAreaPDF(dtCategoria.Rows[i]["Categoria"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 9, FontBold = true });
        //                    //AddElement(new SpacePDF(10));
        //                    tabellaCategorie = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, categoria, footer)
        //                    {
        //                        Style = Style.ConsulenzaUnica,
        //                        Footer = true,
        //                        AlternateRow = false,
        //                        ShowBorderLastLine = false,
        //                        HeaderHeight = 22,
        //                        //MinimumRowHeight = 27,
        //                        RowHeight = 17,
        //                        HeaderFontSize = 7,
        //                        TitleRow = true,
        //                        TitleRowText = dtCategoria.Rows[b]["Categoria"].ToString(),
        //                        TitleRowBorder = BorderTitleRowType.Nessuno,
        //                        TitleRowSpace = 14
        //                    };
        //                    tabellaCategorie.Columns.Add(new ColumnPDF("NomeProdotto", 200, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Descrizione") { HeaderFontSize = 7, FontSize = 7 });
        //                    tabellaCategorie.Columns.Add(new ColumnPDF("Controvaloreattuale", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore <br>attuale (€)") { PaddingRight = 3, HeaderPaddingLeft = 5, HeaderFontSize = 7, FontSize = 7 });
        //                    tabellaCategorie.Columns.Add(new ColumnPDF("Versatonetto", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Versatonetto", "Versato<br>netto (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
        //                    tabellaCategorie.Columns.Add(new ColumnPDF("Utileperdita", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Utileperdita", "Utile/<br>Perdita (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
        //                    tabellaCategorie.Columns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiocredito", "Rischio<br>Credito") { HeaderFontSize = 7, HeaderPaddingLeft = 4, FontSize = 7, PaddingLeft = 4 });
        //                    tabellaCategorie.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderPaddingLeft = 4, PaddingRight = 4, HeaderFontSize = 7, FontSize = 7 });
        //                    int a = 0;
        //                    foreach (var item in categoria.Rows)
        //                    {

        //                        tabellaCategorie.Cells[1, a].HorizontalAlignment =
        //                        tabellaCategorie.Cells[2, a].HorizontalAlignment =
        //                        tabellaCategorie.Cells[3, a].HorizontalAlignment =
        //                        tabellaCategorie.Cells[4, a].HorizontalAlignment = 
        //                        tabellaCategorie.Cells[5, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
        //                        a++;
        //                    }
        //                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Totale", 200, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
        //                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Controvaloreattuale", 75, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 3 });
        //                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Versatonetto", 75, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 3 });
        //                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Utileperdita", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 3 });
        //                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
        //                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("VaRfooter", 40, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
        //                    float y = tabellaCategorie.Y;
        //                    AddElement(tabellaCategorie);
        //                    if (notaGrado)
        //                    {
        //                        AddElement(new SpacePDF(10));
        //                        AddElement(new FormattedTextAreaPDF("(*) " + testoNotaGrado, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

        //                    }


        //                    if (notaproxyCat && !tuttivarnc && presenzaAsterischiProxy)
        //                    {
        //                        AddElement(new SpacePDF(7));
        //                        string ast = notaGrado ? "(**) " : "(*) ";
        //                        AddElement(new FormattedTextAreaPDF(ast + testoNotaProxy, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

        //                    }
        //                    AddElement(new SpacePDF(8));
        //                }
        //            }


        //        }
        //    }

        //    #endregion                   
        //}

        protected override sealed void Draw()
        {
            var dati = GetDataSet();

            TablePDF tabellaCategorie = null;

            // Modifiche 20190628 per Evolutiva

            string sVerticalText;

            if (EnvironmentFacade.ReportEnvironment.ReportType.Equals(ReportType.Unica_Nucleo))
            {
                sVerticalText = "";
            }
            else
            {
                sVerticalText = "Le eventuali informazioni riguardanti investimenti da lei detenuti presso altri intermediari vengono elaborate secondo le indicazioni da lei ";
                if (EnvironmentFacade.ReportEnvironment.PrivateBanker.CodiceRete.Equals("F"))
                {
                    sVerticalText = sVerticalText + "fornite e/ o disponibili sul mercato, per le quali Fideuram non garantisce la completezza e la veridicità. ";
                    sVerticalText = sVerticalText + "La preghiamo di comunicare a Fideuram ogni successiva variazione a tali informazioni, al fine di consentire a Fideuram la correzione e l’aggiornamento dei dati contenuti ";
                    sVerticalText = sVerticalText + "nel presente report.Gli investimenti detenuti presso altri intermediari vengono utilizzati da Fideuram con finalità meramente informative e secondo le indicazioni da lei fornite, ";
                    sVerticalText = sVerticalText + "in modo da offrire una rappresentazione unitaria degli investimenti, senza con ciò formare oggetto di raccomandazioni personalizzate o di rendicontazione ufficiale.";
                }
                else
                {
                    sVerticalText = sVerticalText + "fornite e/ o disponibili sul mercato, per le quali Sanpaolo Invest SIM non garantisce la completezza e la veridicità. ";
                    sVerticalText = sVerticalText + "La preghiamo di comunicare a Sanpaolo Invest SIM ogni successiva variazione a tali informazioni, al fine di consentire a Sanpaolo Invest SIM la correzione e l’aggiornamento dei dati contenuti ";
                    sVerticalText = sVerticalText + "nel presente report.Gli investimenti detenuti presso altri intermediari vengono utilizzati da Sanpaolo Invest SIM con finalità meramente informative e secondo le indicazioni da lei fornite, ";
                    sVerticalText = sVerticalText + "in modo da offrire una rappresentazione unitaria degli investimenti, senza con ciò formare oggetto di raccomandazioni personalizzate o di rendicontazione ufficiale.";
                }
            }
            

            FormattedTextAreaPDF testoPaginaVerticale = null;
            testoPaginaVerticale = new FormattedTextAreaPDF(sVerticalText, EnvironmentFacade.RendererFacade.XLeftLimit - 35, 620)
            {
                TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify,
                FontSize = 5,
                TextVerticalDirection = true,
                Y = 745
            };
            // Fine Modifiche 

            #region Raggruppamento per Categoria

            if (raggruppamentoCategoria())
            {

                AddElement(new PagePDF(PagePDF.PagePDFType.Generic) { ID = "pagina1" });

                var intestazione = new SectionHeadingPDF(
                    getTitolo(),

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

                AddElement(intestazione.ToElement());
                // Modifiche 20190628 per Evolutiva
                //AddElement(new SpacePDF(20));
                // Fine Modifiche
                AddElement(new FormattedTextAreaPDF(getTestoIntro(), EnvironmentFacade.RendererFacade.XLeftLimit) { TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, FontSize = 7 });
                AddElement(new SpacePDF(15));

                DataView view = new DataView(dati.Tables["categorie"].AsEnumerable().OrderBy(o => o.Field<int>("Ordinamento")).CopyToDataTable());
                DataTable dtCategoria = view.ToTable(true, "Categoria");
                DataTable dtFinale = new DataTable();
                dtFinale.Columns.Add("Categoria", typeof(string));
                dtFinale.Columns.Add("Intermediario", typeof(string));
                dtFinale.Columns.Add("ChiaveProdotto", typeof(string));
                dtFinale.Columns.Add("NomeProdotto", typeof(string));
                dtFinale.Columns.Add("Controvalore", typeof(string));
                dtFinale.Columns.Add("Versatonetto", typeof(string));
                dtFinale.Columns.Add("Utileperdita", typeof(string));
                dtFinale.Columns.Add("Rischiocredito", typeof(string));
                dtFinale.Columns.Add("VaR", typeof(string));

                foreach (DataRow it in dati.Tables["categorie"].Rows)
                {
                    dtFinale.Rows.Add(it["Categoria"].ToString(), it["Intermediario"].ToString(), it["ChiaveProdotto"].ToString(), it["NomeProdotto"].ToString(), it["Controvalore"].ToString(), it["Versatonetto"].ToString(), it["Utileperdita"].ToString(), it["Rischiocredito"].ToString(), it["VaR"].ToString());
                }


                for (int i = 0; i < dtCategoria.Rows.Count; i++)
                {

                    var categoria = dtFinale.Select("Categoria ='" + dtCategoria.Rows[i]["Categoria"].ToString() + "'").CopyToDataTable();// : dati.Tables[0].Select("Categoria ='" + p["Categoria"].ToString() + "' AND Intermediario='" + p["Intermediario"].ToString() + "'").CopyToDataTable();
                    var footer = dati.Tables["categorieFooter"].AsEnumerable().Where(o => o.Field<string>("Categoria").Contains(dtCategoria.Rows[i]["Categoria"].ToString())).CopyToDataTable();
                    bool notaproxyCat = categoria.AsEnumerable().Any(o => o.Field<string>("ChiaveProdotto").ToString() == "0");
                    decimal copertura = Convert.ToDecimal(footer.Rows[0]["Copertura"]);
                    bool notaGrado = getNota1(copertura).Length > 0;
                    string testoNotaGrado = getNota1(copertura);
                    bool presenzaAsterischiProxy = categoria.AsEnumerable().Any(o => o.Field<string>("VaR").ToString().Contains(notaGrado ? "**" : "*"));
                    string testoNotaProxy = notaproxyCat ? getNotaProxyVar() : "";
                    bool tuttivarnc = categoria.AsEnumerable().All(o => o.Field<string>("VaR").ToString() == "n.c." || o.Field<string>("VaR").ToString() == "0,00" || o.Field<string>("Categoria").ToString().ToLower().Contains("conti"));
                    tabellaCategorie = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, categoria, footer)
                    {
                        Style = Style.ConsulenzaUnica,
                        Footer = true,
                        AlternateRow = false,
                        ShowBorderLastLine = false,
                        HeaderHeight = 22,
                        //MinimumRowHeight = 27,
                        //RowHeight = 27,
                        HeaderFontSize = 7,
                        ID = dtCategoria.Rows[i]["Categoria"].ToString(),
                        TitleRow = true,
                        TitleRowText = dtCategoria.Rows[i]["Categoria"].ToString(),
                        TitleRowBorder = BorderTitleRowType.Nessuno,
                        TitleRowSpace = 15,
                        //,
                        PageBreak = true

                    };
                    tabellaCategorie.Columns.Add(new ColumnPDF("Intermediario", 105, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Intermediario", "Intermediario") { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.Columns.Add(new ColumnPDF("NomeProdotto", 120, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Descrizione") { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.Columns.Add(new ColumnPDF("Controvaloreattuale", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore <br>attuale (€)") { PaddingRight = 3, HeaderPaddingLeft = 5, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.Columns.Add(new ColumnPDF("Versatonetto", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Versatonetto", "Versato<br>netto (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.Columns.Add(new ColumnPDF("Utileperdita", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Utileperdita", "Utile/<br>Perdita (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.Columns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiocredito", "Rischio<br>Credito") { HeaderFontSize = 7, HeaderPaddingLeft = 4, FontSize = 7, PaddingLeft = 4 });
                    tabellaCategorie.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderPaddingLeft = 4, PaddingRight = 4, HeaderFontSize = 7, FontSize = 7 });
                    int a = 0;
                    foreach (var item in categoria.Rows)
                    {

                        tabellaCategorie.Cells[2, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                        tabellaCategorie.Cells[3, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                        tabellaCategorie.Cells[4, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                        tabellaCategorie.Cells[5, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                        tabellaCategorie.Cells[6, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                        a++;
                    }
                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Totale", 225, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Controvaloreattuale", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Versatonetto", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Utileperdita", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 3, HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
                    tabellaCategorie.FooterColumns.Add(new ColumnPDF("VaRfooter", 40, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 2, HeaderFontSize = 7, FontSize = 7 });
                    AddElement(tabellaCategorie);
                    if (notaGrado)
                    {
                        AddElement(new SpacePDF(10));
                        AddElement(new FormattedTextAreaPDF("(*) " + testoNotaGrado, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

                    }


                    if (notaproxyCat && !tuttivarnc && presenzaAsterischiProxy)
                    {
                        AddElement(new SpacePDF(7));
                        string ast = notaGrado ? "(**) " : "(*) ";
                        AddElement(new FormattedTextAreaPDF(ast + testoNotaProxy, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

                    }
                    AddElement(new SpacePDF(8));
                }

            }
            #endregion

            #region stampa per intermediari
            else
            {
                for (int i = 0; i < dati.Tables["Intermediari"].Rows.Count; i++)
                {
                    NomeIntermediario = "«" + dati.Tables["Intermediari"].Rows[i]["NomeIntermediario"].ToString() + "»";

                    AddElement(new PagePDF(PagePDF.PagePDFType.Generic));

                    var intestazione = new SectionHeadingPDF(
                        string.Format(getTitolo(), NomeIntermediario),

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

                    AddElement(intestazione.ToElement());
                    // Modifiche 20190628 per Evolutiva
                    //AddElement(new SpacePDF(20));
                    // Fine Modifiche
                    AddElement(new FormattedTextAreaPDF(getTestoIntro(), EnvironmentFacade.RendererFacade.XLeftLimit) { TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, FontSize = 7 });


                    //DataView view = new DataView(dati.Tables["categorie" + i]);
                    DataView view = new DataView(dati.Tables["categorie" + i].AsEnumerable().OrderBy(o => o.Field<int>("Ordinamento")).CopyToDataTable());
                    DataView view2 = new DataView(dati.Tables["footer" + i]);
                    DataTable dtCategoria = view.ToTable(true, "Categoria");
                    DataTable dtCategoriaFooter = view2.ToTable(true, "Copertura", "CategoriaString");
                    DataTable dtFinale = new DataTable();

                    dtFinale.Columns.Add("Categoria", typeof(string));
                    // dtFinale.Columns.Add("Intermediario", typeof(string));
                    dtFinale.Columns.Add("ChiaveProdotto", typeof(string));
                    dtFinale.Columns.Add("NomeProdotto", typeof(string));
                    dtFinale.Columns.Add("Controvalore", typeof(string));
                    dtFinale.Columns.Add("Versatonetto", typeof(string));
                    dtFinale.Columns.Add("Utileperdita", typeof(string));
                    dtFinale.Columns.Add("Rischiocredito", typeof(string));
                    dtFinale.Columns.Add("VaR", typeof(string));

                    foreach (DataRow it in dati.Tables["categorie" + i].Rows)
                    {
                        dtFinale.Rows.Add(it["Categoria"].ToString(), it["ChiaveProdotto"].ToString(), it["NomeProdotto"].ToString(), it["Controvalore"].ToString(), it["Versatonetto"].ToString(), it["Utileperdita"].ToString(), it["Rischiocredito"].ToString(), it["VaR"].ToString());
                    }

                    for (int b = 0; b < dtCategoria.Rows.Count; b++)
                    {
                        //for (int c = 0; c < dtCategoriaFooter.Rows.Count; c++)
                        {
                            var categoria = dtFinale.Select("Categoria ='" + dtCategoria.Rows[b]["Categoria"].ToString() + "'").CopyToDataTable();// : dati.Tables[0].Select("Categoria ='" + p["Categoria"].ToString() + "' AND Intermediario='" + p["Intermediario"].ToString() + "'").CopyToDataTable();
                            var footer = dati.Tables["footer" + i].AsEnumerable().Where(o => o.Field<string>("Categoria").Contains(dtCategoria.Rows[b]["Categoria"].ToString())).CopyToDataTable();
                            var coperturaNota = dtCategoriaFooter.AsEnumerable().FirstOrDefault(o => o.Field<string>("CategoriaString").Contains(dtCategoria.Rows[b]["Categoria"].ToString()));
                            bool notaproxyCat = categoria.AsEnumerable().Any(o => o.Field<string>("ChiaveProdotto").ToString() == "0");
                            bool tuttivarnc = categoria.AsEnumerable().All(o => o.Field<string>("VaR").ToString() == "n.c." || o.Field<string>("VaR").ToString() == "0,00" || o.Field<string>("Categoria").ToString().ToLower().Contains("conti"));
                            string testoNotaProxy = notaproxyCat ? getNotaProxyVar() : "";
                            decimal copertura = Convert.ToDecimal(footer.Rows[0]["Copertura"]);
                            bool notaGrado = getNota1(copertura).Length > 0;
                            string testoNotaGrado = notaGrado ? getNota1(copertura) : "";
                            bool presenzaAsterischiProxy = categoria.AsEnumerable().Any(o => o.Field<string>("VaR").ToString().Contains(notaGrado ? "**" : "*"));
                            AddElement(new SpacePDF(b > 0 ? 10 : 1));
                            //AddElement(new FormattedTextAreaPDF(dtCategoria.Rows[i]["Categoria"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 9, FontBold = true });
                            //AddElement(new SpacePDF(10));
                            tabellaCategorie = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, categoria, footer)
                            {
                                Style = Style.ConsulenzaUnica,
                                Footer = true,
                                AlternateRow = false,
                                ShowBorderLastLine = false,
                                HeaderHeight = 22,
                                //MinimumRowHeight = 27,
                                RowHeight = 17,
                                HeaderFontSize = 7,
                                TitleRow = true,
                                TitleRowText = dtCategoria.Rows[b]["Categoria"].ToString(),
                                TitleRowBorder = BorderTitleRowType.Nessuno,
                                TitleRowSpace = 14
                            };
                            tabellaCategorie.Columns.Add(new ColumnPDF("NomeProdotto", 200, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Descrizione") { HeaderFontSize = 7, FontSize = 7 });
                            tabellaCategorie.Columns.Add(new ColumnPDF("Controvaloreattuale", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore <br>attuale (€)") { PaddingRight = 3, HeaderPaddingLeft = 5, HeaderFontSize = 7, FontSize = 7 });
                            tabellaCategorie.Columns.Add(new ColumnPDF("Versatonetto", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Versatonetto", "Versato<br>netto (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
                            tabellaCategorie.Columns.Add(new ColumnPDF("Utileperdita", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Utileperdita", "Utile/<br>Perdita (€)") { PaddingRight = 3, HeaderPaddingLeft = 7, HeaderFontSize = 7, FontSize = 7 });
                            tabellaCategorie.Columns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiocredito", "Rischio<br>Credito") { HeaderFontSize = 7, HeaderPaddingLeft = 4, FontSize = 7, PaddingLeft = 4 });
                            tabellaCategorie.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderPaddingLeft = 4, PaddingRight = 4, HeaderFontSize = 7, FontSize = 7 });
                            int a = 0;
                            foreach (var item in categoria.Rows)
                            {

                                tabellaCategorie.Cells[1, a].HorizontalAlignment =
                                tabellaCategorie.Cells[2, a].HorizontalAlignment =
                                tabellaCategorie.Cells[3, a].HorizontalAlignment =
                                tabellaCategorie.Cells[4, a].HorizontalAlignment =
                                tabellaCategorie.Cells[5, a].HorizontalAlignment = HorizontalAlignmentType.Destra;
                                a++;
                            }
                            tabellaCategorie.FooterColumns.Add(new ColumnPDF("Totale", 200, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
                            tabellaCategorie.FooterColumns.Add(new ColumnPDF("Controvaloreattuale", 75, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 3 });
                            tabellaCategorie.FooterColumns.Add(new ColumnPDF("Versatonetto", 75, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 3 });
                            tabellaCategorie.FooterColumns.Add(new ColumnPDF("Utileperdita", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 3 });
                            tabellaCategorie.FooterColumns.Add(new ColumnPDF("Rischiocredito", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
                            tabellaCategorie.FooterColumns.Add(new ColumnPDF("VaRfooter", 40, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
                            float y = tabellaCategorie.Y;
                            AddElement(tabellaCategorie);
                            if (notaGrado)
                            {
                                AddElement(new SpacePDF(10));
                                AddElement(new FormattedTextAreaPDF("(*) " + testoNotaGrado, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

                            }


                            if (notaproxyCat && !tuttivarnc && presenzaAsterischiProxy)
                            {
                                AddElement(new SpacePDF(7));
                                string ast = notaGrado ? "(**) " : "(*) ";
                                AddElement(new FormattedTextAreaPDF(ast + testoNotaProxy, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });

                            }
                            AddElement(new SpacePDF(8));
                        }
                    }


                }
            }

            #endregion
            // Modifiche 20190628 per Evolutiva
            var listaOggettiDaRipetere = new List<ObjectPDF> { testoPaginaVerticale };
            //AddElement(listaOggettiDaRipetere);
            AddElement(new RepeaterPDF(listaOggettiDaRipetere));
            // Fine Modifiche 
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataTable.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataTable GetDataTable()
        { 
            return null;
        }
        
        
        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected sealed override DataSet GetDataSet()
        {
            var ds = new DataSet();


            var intermediari = datiSeiUnico.patrimonioUnit().patrimonioTerzi.patrimonioTerziBean.intermediari;
            var prometeiaInfosCategoria = datiSeiUnico.patrimonioUnit().patrimonioTerzi.patrimonioTerziBean.prometeiaInfosCategoria;
            var distribuzione = datiSeiUnico.patrimonioUnit().patrimonioTerzi.categoria.distribuzione;
            var categoriaDisplayInfos = datiSeiUnico.displayInfos().categoriaDisplayInfos;
            var dettaglioProdotti = datiSeiUnico.patrimonioUnit().patrimonioTerzi.dettaglioProdotti.dettaglioProdotti;
          
           
            #region categoria
            
            if (raggruppamentoCategoria()) 
            {                
                #region colonne tabelle

                ds.Tables.Add(new DataTable("categorie"));
                ds.Tables.Add(new DataTable("categorieFooter"));


                ds.Tables["categorie"].Columns.Add(new DataColumn("Categoria", typeof(string)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("Intermediario", typeof(string)));                
                ds.Tables["categorie"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("Versatonetto", typeof(decimal)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("Utileperdita", typeof(decimal)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("Rischiocredito", typeof(string)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("VaR", typeof(string)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("Ordinamento", typeof(int)));
                ds.Tables["categorie"].Columns.Add(new DataColumn("ChiaveProdotto", typeof(string)));
           

                ds.Tables["categorieFooter"].Columns.Add(new DataColumn("Categoria", typeof(string)));
                ds.Tables["categorieFooter"].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
                ds.Tables["categorieFooter"].Columns.Add(new DataColumn("Versatonetto", typeof(decimal)));
                ds.Tables["categorieFooter"].Columns.Add(new DataColumn("Utileperdita", typeof(decimal)));
                ds.Tables["categorieFooter"].Columns.Add(new DataColumn("Rischiocredito", typeof(string)));
                ds.Tables["categorieFooter"].Columns.Add(new DataColumn("VaRfooter", typeof(string)));
                ds.Tables["categorieFooter"].Columns.Add(new DataColumn("Copertura", typeof(decimal)));
             
                #endregion

                foreach (var categoria in prometeiaInfosCategoria)
                {
                    foreach (var posizione in dettaglioProdotti)
                    {
                        if (posizione.prodotto.alberatura.livello2.Equals(categoria.key))
                        {

                            if (!_elencocategorie.Contains(posizione.prodotto.alberatura.livello2))
                                _elencocategorie.Add(posizione.prodotto.alberatura.livello2);

                            var order = categoriaDisplayInfos.FirstOrDefault(o => o.key.Equals(categoria.key.ToUpper().Replace(" ", "")));

                            var coperturaProdotto = posizione.prodotto;


                            bool notavargrado = posizione.prodotto.alberatura.livello2.ToLower().Contains("conti") ? false : getNota1(categoria.value.stat.copertura).Length > 0;



                            DataRow dr = ds.Tables["categorie"].NewRow();
                            var categoriaLivello = posizione.prodotto.alberatura.livello2;
                            dr["Categoria"] = categoriaLivello;
                            dr["Intermediario"] = posizione.nomeIntermediario;
                            dr["NomeProdotto"] = posizione.prodotto.nomeProdotto;
                            dr["Controvalore"] = posizione.ctv;
                            dr["Versatonetto"] = posizione.versamentoNetto;
                            dr["Utileperdita"] = posizione.utilePerdita;
                            dr["Rischiocredito"] = (categoriaLivello.ToLower().Contains("conti") && posizione.ctv < 0) ? "n.c." : posizione.prodotto.rischioCreditoDecodificato;
                            dr["VaR"] = (categoriaLivello.ToLower().Contains("conti") && posizione.ctv < 0) ? "n.c." : (posizione.prodotto.chiaveProdotto == 0 && notavargrado && posizione.prodotto.varDecodificato.ToLower() != "n.c." ?
                                posizione.prodotto.varDecodificato + "**" : posizione.prodotto.chiaveProdotto == 0 && !notavargrado && posizione.prodotto.varDecodificato.ToLower() != "n.c." && !posizione.prodotto.alberatura.livello2.ToLower().Contains("conti") ? posizione.prodotto.varDecodificato + "*" : posizione.prodotto.varDecodificato);
                            dr["Ordinamento"] = order.value.order;
                            dr["ChiaveProdotto"] = posizione.prodotto.chiaveProdotto;
                            ds.Tables["categorie"].Rows.Add(dr);
                            if ((posizione.prodotto.varDecodificato.Replace(".", ",").Equals("0,00") && categoriaLivello.ToLower().Contains("conti")) && posizione.ctv > 0)
                                dr["VaR"] = "0,00";
                             
                        }
                        else { 
                        
                        
                        }

                    }
                }
                ds.Tables["categorie"].AsEnumerable().OrderByDescending(o => o.Field<decimal>("Controvalore")).CopyToDataTable();
                
                foreach (string cat in _elencocategorie)
                {
                    var prometeiaInfo = (from o in prometeiaInfosCategoria where o.key == cat select o.value).FirstOrDefault();
                    
                    ds.Tables["categorieFooter"].Rows.Add(string.Format("Totale {0}",cat),
                                                Convert.ToDecimal(ds.Tables["categorie"].AsEnumerable().Where(o => o.Field<string>("Categoria") == cat).CopyToDataTable().Compute("Sum(Controvalore)", string.Empty)).ToString(),
                                                Convert.ToDecimal(ds.Tables["categorie"].AsEnumerable().Where(o => o.Field<string>("Categoria") == cat).CopyToDataTable().Compute("Sum(Versatonetto)", string.Empty)).ToString(),
                                                Convert.ToDecimal(ds.Tables["categorie"].AsEnumerable().Where(o => o.Field<string>("Categoria") == cat).CopyToDataTable().Compute("Sum(Utileperdita)", string.Empty)).ToString(),
                                                "",
                                                prometeiaInfo.varDecodificato + (getNota1(prometeiaInfo.stat.copertura).Length > 0 ? "*"  : ""),
                                                prometeiaInfo.stat.copertura
                                                // distribuzione.elencoSlice.Where(o => o.descrizione.Equals(cat)).FirstOrDefault().prometeiaInfo.varDecodificato + (getNota1(cat).Length > 0 && ds.Tables["categorie"].AsEnumerable().Any(o => o.Field<string>("ChiaveProdotto").ToString() == "0") ? "*"  : "")
                                                );
                   
                    
                }
                
            }
               

            #endregion
            #region intermediari
            else
            {
                if (intermediari != null)
                {
                    ds.Tables.Add(new DataTable("Intermediari"));
                    
                    ds.Tables["Intermediari"].Columns.Add(new DataColumn("NomeIntermediario", typeof(string)));
                    ds.Tables["Intermediari"].Columns.Add(new DataColumn("Controvalore", typeof(decimal))); //per ordinamento: quale scheda di intermediario stampare prima
                    //ds.Tables["Intermediari"].Columns.Add(new DataColumn("NotaProxy", typeof(bool)));
                    int i = 0;
                    foreach (var item in from o in intermediari orderby o.ctvIntermediario descending select o) //pagina si ripete per ogni intermediario della lista
                    {
                        var categoriePrometeia = item.prometeiaInfosCategoria;
                   
                        var listaprodotti = dettaglioProdotti.Where(o => o.nomeIntermediario.Equals(item.nomeIntermediario));
                        ds.Tables["Intermediari"].Rows.Add(item.nomeIntermediario, item.ctvIntermediario);
                       
                        
                        string categorie = "categorie" + i;
                        string footer = "footer" + i;
                        ds.Tables.Add(new DataTable(categorie));
                        ds.Tables.Add(new DataTable(footer));
                        string categoriacurr = "";
                        if (listaprodotti.Count() > 0)
                        {
                            

                            ds.Tables[categorie].Columns.Add(new DataColumn("Categoria", typeof(string)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("Intermediario", typeof(string)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("Versatonetto", typeof(decimal)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("Utileperdita", typeof(decimal)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("Rischiocredito", typeof(string)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("VaR", typeof(string)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("ChiaveProdotto", typeof(string)));
                            ds.Tables[categorie].Columns.Add(new DataColumn("Ordinamento", typeof(int)));

                            ds.Tables[footer].Columns.Add(new DataColumn("Categoria", typeof(string)));
                            ds.Tables[footer].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
                            ds.Tables[footer].Columns.Add(new DataColumn("Versatonetto", typeof(decimal)));
                            ds.Tables[footer].Columns.Add(new DataColumn("Utileperdita", typeof(decimal)));
                            ds.Tables[footer].Columns.Add(new DataColumn("Rischiocredito", typeof(string)));
                            ds.Tables[footer].Columns.Add(new DataColumn("VaRfooter", typeof(string)));
                            ds.Tables[footer].Columns.Add(new DataColumn("Copertura", typeof(decimal)));
                            ds.Tables[footer].Columns.Add(new DataColumn("CategoriaString", typeof(string)));

                            foreach (var prodotto in listaprodotti)
                            {
                                var order = categoriaDisplayInfos.FirstOrDefault(o => o.key.Equals(prodotto.prodotto.alberatura.livello2.ToUpper().Replace(" ", "")));
                                
                                if (!_elencocategorie.Contains(prodotto.prodotto.alberatura.livello2))
                                        _elencocategorie.Add(prodotto.prodotto.alberatura.livello2);
                                categoriacurr = prodotto.prodotto.alberatura.livello2;
                                decimal var = categoriePrometeia.FirstOrDefault(o => o.key.Equals(categoriacurr)).value.stat.copertura;
                                bool notavargrado = prodotto.prodotto.alberatura.livello2.ToLower().Contains("conti") ? false : getNota1(var).Length > 0;
                                var VaR = prodotto.prodotto.alberatura.livello2.ToLower().Contains("conti") && prodotto.ctv < 0 ? "n.c." : "";
                                ds.Tables[categorie].Rows.Add(prodotto.prodotto.alberatura.livello2,
                                                    prodotto.nomeIntermediario,
                                                    prodotto.prodotto.nomeProdotto,
                                                    prodotto.ctv,
                                                    prodotto.versamentoNetto,
                                                    prodotto.utilePerdita,
                                                    (VaR.Equals("") ? prodotto.prodotto.rischioCreditoDecodificato : VaR),
                                                    VaR.Equals("") ? (prodotto.prodotto.chiaveProdotto == 0 && notavargrado && prodotto.prodotto.varDecodificato.ToLower() != "n.c." && !prodotto.prodotto.varDecodificato.Replace(".", ",").Equals("0,00") ? prodotto.prodotto.varDecodificato + "**" : prodotto.prodotto.chiaveProdotto == 0 && !notavargrado && prodotto.prodotto.varDecodificato.ToLower() != "n.c." && !prodotto.prodotto.varDecodificato.Replace(".", ",").Equals("0,00") && !prodotto.prodotto.alberatura.livello2.ToLower().Contains("conti") ? prodotto.prodotto.varDecodificato + "*" : prodotto.prodotto.varDecodificato) : VaR,
                                                    prodotto.prodotto.chiaveProdotto,
                                                    order.value.order
                                                    );
                            }

                            ds.Tables[categorie].AsEnumerable().OrderByDescending(o => o.Field<decimal>("Controvalore")).CopyToDataTable();
                            foreach (string cat in _elencocategorie)
                            {
                                if (ds.Tables[categorie].AsEnumerable().FirstOrDefault(o => o.Field<string>("Categoria") == cat) != null)
                                {
                                    var prometeiaCategoria = categoriePrometeia.FirstOrDefault(o => o.key.Equals(cat)).value;
                                    ds.Tables[footer].Rows.Add(string.Format("Totale {0}", cat),
                                                                Convert.ToDecimal(ds.Tables[categorie].AsEnumerable().Where(o => o.Field<string>("Categoria") == cat).CopyToDataTable().Compute("Sum(Controvalore)", string.Empty)).ToString(),
                                                                Convert.ToDecimal(ds.Tables[categorie].AsEnumerable().Where(o => o.Field<string>("Categoria") == cat).CopyToDataTable().Compute("Sum(Versatonetto)", string.Empty)).ToString(),
                                                                Convert.ToDecimal(ds.Tables[categorie].AsEnumerable().Where(o => o.Field<string>("Categoria") == cat).CopyToDataTable().Compute("Sum(Utileperdita)", string.Empty)).ToString(),
                                                                "",
                                                                prometeiaCategoria.varDecodificato + ((getNota1(prometeiaCategoria.stat.copertura).Length > 0) ? "*" : ""),//Helper.FormatDecimal(patrimonioTerzi.categoria.distribuzione.elencoSlice.Where(o => o.descrizione.ToLower().Equals(cat.ToLower())).FirstOrDefault().prometeiaInfo.varDecodificato.ToString(), 2) + (getNota1(cat).Length > 0 /*&& ds.Tables[categorie].AsEnumerable().Any(o => o.Field<string>("ChiaveProdotto").ToString() == "0")*/ ? "*" : "")
                                                                prometeiaCategoria.stat.copertura,
                                                                cat
                                                                );

                                    

                                    
                                                                
                                }
                            }
                        }
                        
                        i++;
                    }
                    ds.Tables["Intermediari"].AsEnumerable().OrderByDescending(o => o.Field<decimal>("Controvalore")).CopyToDataTable();
                }
            }
            #endregion

            return ds;
        }
        public virtual bool raggruppamentoCategoria()
        {
             return GetOption<Opzione6>().Valore.Equals("S");
        }
        public virtual string getTitolo()
        {
            return raggruppamentoCategoria() ? "Patrimonio altri Istituti: dettaglio prodotti" : "Patrimonio altri Istituti: {0}";
        }
        public virtual string getTestoIntro()
        {
            string testo = "";
            testo = !raggruppamentoCategoria() ?
            "In questa scheda sono riportati i prodotti che lei detiene presso " + NomeIntermediario + ", raggruppati secondo le categorie di appartenenza, con indicazione del relativo intermediario."
            : "In questa scheda sono riportati i prodotti che lei detiene presso altri Istituti, raggruppati secondo la categoria di appartenenza, con indicazione del relativo intermediario.";
            return testo;
            
        }
        public virtual string getNota1(string categoria)
        {
            string nota = "";
            return "";
            var gradoCopertura = datiSeiUnico.patrimonioUnit().patrimonioTerzi.categoria.distribuzione.elencoSlice.Where(o => o.descrizione.Equals(categoria)).FirstOrDefault().prometeiaInfo.stat.copertura;

            if (gradoCopertura < 100 && gradoCopertura > 0)
            {
                try
                {
                    nota = string.Format("Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.", gradoCopertura == 0 ? gradoCopertura.ToString() : Helper.FormatCurrency(gradoCopertura.ToString()));
                }
                catch
                {
                    nota = "";
                }
            }

            return nota;
        }

        public virtual string getNota1(decimal copertura)
        {
            string nota = "";
            if (copertura > 0 && copertura < 100)
            {
                try
                {
                    nota = string.Format("Grado di copertura prodotti in termini di Rischio Mercato (VaR): {0}.", copertura == 0 ? copertura.ToString() : Helper.FormatCurrency(copertura.ToString()));
                }
                catch
                {
                    nota = "";
                }
            }

            return nota;
        }
        public virtual string getNotaProxyVar()
        {
          
            return "Non è stato possibile calcolare il rischio dei prodotti contrassegnati sulla base delle loro specifiche caratteristiche. Il VaR indicato è calcolato in modo approssimato utilizzando gli indici di mercato associati all'asset allocation da lei fornita.";
        }
    }
}
