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

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    /// <summary>
    /// S65.PropostaProdottiNonRappresentabili idSezione = 108
    /// </summary>
    public class S65 : Entity.Section
    {
        /// <summary>
        ///
        /// </summary>
        public S65(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                if (!datiSeiUnico.isVincolo("prodottiCasa_nonrappPro"))
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S65", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

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

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

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

            AddElement(intestazione.ToElement());

            
            if (showAsset() && dati.Tables["prodottoPerAreaAsset"].Rows.Count > 0)
            {
                #region Testo Introduttivo Asset
                var titolo = "Prodotti non rappresentabili per asset class";
                AddElement(new SpacePDF(15));
                AddElement(new FormattedTextAreaPDF(titolo, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 9, FontBold = true });
                AddElement(new SpacePDF(20));
                AddElement(new FormattedTextAreaPDF(getTesto1(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                AddElement(new SpacePDF(15));
                #endregion

                #region Tabella dei prodotti non rappresentabili - Asset

                var tabellaAsset = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["prodottoPerAreaAsset"], dati.Tables["nonRappresentabiliAssetFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    Header = true,
                    Footer = true,
                    AlternateRow = false,
                    HeaderHeight = 25,
                    HeaderMargin = 2
                };

                #region Columns e Footer

                tabellaAsset.Columns.Add(new ColumnPDF("Immagine", 110 + 15, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Objectpdf, "CodiceContratto", "Codice<br>contratto") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 4, PaddingLeft = 2 });
                //tabellaEsposizione.Columns.Add(new ColumnPDF("DataSottoscrizione", 100, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Datasottoscrizione", "Data<br> sottoscrizione") { BackgroundColor = ColorPDF.Bianco });
                //tabellaEsposizione.Columns.Add(new ColumnPDF("CodiceContratto", 110+15, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Codicecontratto", "Codice<br> contratto") { HeaderFontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                tabellaAsset.Columns.Add(new ColumnPDF("Descrizione", 245, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", "Descrizione") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                tabellaAsset.Columns.Add(new ColumnPDF("ControvaloreProposto", 90, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Decimale, "ControvaloreProposto", "Controvalore<br>" + (isAdeguata ? "proposto" : "prospettico") + " (€)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                tabellaAsset.Columns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4, FontSize = 7, BackgroundColor = ColorPDF.Bianco });

                tabellaAsset.FooterColumns.Add(new ColumnPDF("Totale", 370, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
                tabellaAsset.FooterColumns.Add(new ColumnPDF("ControvaloreProposto", 90, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4 });
                tabellaAsset.FooterColumns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 5 });


                //tabellaAsset.Columns.Add(new ColumnPDF("Immagine", 15, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Objectpdf, string.Empty, string.Empty) { DeltaYContent = 4, PaddingLeft = 2 });
                ////tabellaAsset.Columns.Add(new ColumnPDF("DataSottoscrizione", 100, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Datasottoscrizione", "Data<br> sottoscrizione") { BackgroundColor = ColorPDF.Bianco });
                //tabellaAsset.Columns.Add(new ColumnPDF("CodiceContratto", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Codicecontratto", "Codice contratto") {HeaderFontSize=7,PaddingRight=4, BackgroundColor = ColorPDF.Bianco });
                //tabellaAsset.Columns.Add(new ColumnPDF("Descrizione", 245, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", "Descrizione") { HeaderFontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                //tabellaAsset.Columns.Add(new ColumnPDF("ControvaloreProposto", 90, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Decimale, "ControvaloreProposto", "Controvalore<br>proposto (€)") { HeaderFontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                //tabellaAsset.Columns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });

                //tabellaAsset.FooterColumns.Add(new ColumnPDF("Totale", 375, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                //tabellaAsset.FooterColumns.Add(new ColumnPDF("ControvaloreProposto", 90, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingLeft = 2, PaddingRight = 5 });
                //tabellaAsset.FooterColumns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                #endregion

                #region Cells

                int i = 0;
                foreach (DataRow rw in dati.Tables["prodottoPerAreaAsset"].Rows)
                {
                    var isTotal = Convert.ToBoolean(rw["IsTotal"]);
                    var isSubTotal = Convert.ToBoolean(rw["IsSubTotal"]);
                    if (isTotal || isSubTotal)
                    {
                        if (isTotal)
                        {
                            // Sfondo grigio per la riga identificata con isTotal [quella di intestazione di area]
                            for (int c = 0; c < tabellaAsset.Columns.Count; c++)
                            {
                                tabellaAsset.Cells[c, i].BackgroundColor = isSubTotal ?
                                ColorPDF.Bianco :
                                ColorPDF.Standard_Grigio_SfondoColonnaTabella;
                                tabellaAsset.Cells[c, i].FontBold = true;
                                tabellaAsset.Cells[c, i].FontColor = ColorPDF.Nero;
                            }

                            // Simboli dell'area di bisogno
                            var listaOggetti = new List<ObjectPDF>                            
                        {
                            new RectanglePDF(8, 8, ColorPDF.GetBy_AreaBisogno(rw["CodiceAreaBisogno"].ToString())),
                            new FormattedTextAreaPDF
                            {
                                Text = new AreaBisogno(rw["CodiceAreaBisogno"].ToString()).Abbreviazione,
                                    FontBold = true,
                                    FontColor = ColorPDF.Bianco,
                                    DeltaX = 2,
                                    FontSize = 7,
                             },
                             new FormattedTextAreaPDF
                             {
                                    Text = new AreaBisogno(rw["CodiceAreaBisogno"].ToString()).Nome,
                                    FontBold = true,
                                    FontColor = ColorPDF.Nero,
                                    DeltaX = 12F,
                                    FontSize = 7
                             } 
                        };

                            //Quadrato colorato indicatore Area
                            tabellaAsset.Cells[0, i].ValueObjectList.AddRange(listaOggetti);
                        }
                            if (isSubTotal)
                            {
                                var stringa = rw["CodiceContratto"].ToString();
                                tabellaAsset.Cells[0, i].ValueObject = new FormattedTextAreaPDF
                                {
                                    Text = stringa,
                                    FontBold = true,
                                    FontColor = ColorPDF.Nero,
                                    DeltaX = 2F,
                                    FontSize = 7,
                                    Width = 130
                                };
                            }
                        
                    }

                    else
                    {
                        var stringa = rw["CodiceContratto"].ToString();
                        tabellaAsset.Cells[0, i].ValueObject = new FormattedTextAreaPDF
                        {
                            Text = stringa,
                            FontBold = false,
                            FontColor = ColorPDF.Nero,
                            DeltaX = 2F,
                            FontSize = 7,
                            Width = 130,
                            DeltaY = 1
                        };
                    }

                    tabellaAsset.Cells[2, i].HorizontalAlignment =
                        tabellaAsset.Cells[3, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    i++;
                }
                //{
                //    var isTotal = Convert.ToBoolean(rw["IsTotal"]);
                //    var isSubTotal = Convert.ToBoolean(rw["IsSubTotal"]);

                //    if (isTotal)
                //    {
                //        // Sfondo grigio per la riga identificata con isTotal [quella di intestazione di area]
                //        for (int c = 0; c < tabellaAsset.Columns.Count; c++)
                //            tabellaAsset.Cells[c, i].BackgroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella;

                //        // Simboli dell'area di bisogno
                //        var listaOggetti = new List<ObjectPDF>                            
                //        {
                //            new RectanglePDF(10, 10, ColorPDF.GetBy_AreaBisogno(rw["CodiceAreaBisogno"].ToString())),
                //            new FormattedTextAreaPDF
                //            {
                //                Text = new AreaBisogno(rw["CodiceAreaBisogno"].ToString()).Abbreviazione,
                //                FontBold = true,
                //                FontSize=7,
                //                FontColor = ColorPDF.Bianco,
                //                DeltaX = 2
                //             }                            
                //        };

                //        //Quadrato colorato indicatore Area
                //        tabellaAsset.Cells[0, i].ValueObjectList.AddRange(listaOggetti);
                //    }
                //    tabellaAsset.Cells[3, i].HorizontalAlignment =
                //        tabellaAsset.Cells[4, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                //    i++;
                //}

                #endregion

                AddElement(tabellaAsset);

                #endregion

                AddElement(new SpacePDF(20));
            }

            if (showValutaria() && dati.Tables["prodottoPerAreaEsposizione"].Rows.Count > 0)
            {
                #region Testo Introduttivo Valutaria
                var titolo = "Prodotti non rappresentabili per esposizione valutaria";
                AddElement(new SpacePDF(15));
                AddElement(new FormattedTextAreaPDF(titolo, EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 9, FontBold = true });
                AddElement(new SpacePDF(15));
                AddElement(new FormattedTextAreaPDF(getTesto2(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize=7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify});
                AddElement(new SpacePDF(15));
                #endregion

                #region Tabella dei prodotti non rappresentabili - Esposizione Valutaria

                var tabellaEsposizione = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["prodottoPerAreaEsposizione"], dati.Tables["nonRappresentabiliEsposizioneFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    Header = true,
                    Footer = true,
                    AlternateRow = false,
                    HeaderHeight = 25,
                    HeaderMargin = 2
                };

                #region Columns e Footer

                tabellaEsposizione.Columns.Add(new ColumnPDF("Immagine", 110 + 15, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Objectpdf, "CodiceContratto", "Codice contratto") { HeaderFontSize = 7, FontSize = 7, DeltaYContent = 4, PaddingLeft = 2 });
                //tabellaEsposizione.Columns.Add(new ColumnPDF("DataSottoscrizione", 100, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Datasottoscrizione", "Data<br> sottoscrizione") { BackgroundColor = ColorPDF.Bianco });
                //tabellaEsposizione.Columns.Add(new ColumnPDF("CodiceContratto", 110+15, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Codicecontratto", "Codice<br> contratto") { HeaderFontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                tabellaEsposizione.Columns.Add(new ColumnPDF("Descrizione", 230, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", "Descrizione") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                tabellaEsposizione.Columns.Add(new ColumnPDF("ControvaloreProposto", 105, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Decimale, "ControvaloreProposto", "Controvalore<br>" + (isAdeguata ? "proposto" : "prospettico") + " (€)") { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4, BackgroundColor = ColorPDF.Bianco });
                tabellaEsposizione.Columns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4, FontSize = 7, BackgroundColor = ColorPDF.Bianco });

                tabellaEsposizione.FooterColumns.Add(new ColumnPDF("Totale", 355, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7 });
                tabellaEsposizione.FooterColumns.Add(new ColumnPDF("ControvaloreProposto", 105, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 4 });
                tabellaEsposizione.FooterColumns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { HeaderFontSize = 7, FontSize = 7, PaddingRight = 5});

                #endregion

                #region Cells

                int i = 0;
                foreach (DataRow rw in dati.Tables["prodottoPerAreaEsposizione"].Rows)
                {
                    var isTotal = Convert.ToBoolean(rw["IsTotal"]);
                    var isSubTotal = Convert.ToBoolean(rw["IsSubTotal"]);
                    if (isTotal || isSubTotal)
                    {
                        // Sfondo grigio per la riga identificata con isTotal [quella di intestazione di area]
                        if (isTotal)
                        {
                            for (int c = 0; c < tabellaEsposizione.Columns.Count; c++)
                            {
                                tabellaEsposizione.Cells[c, i].BackgroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella;
                                tabellaEsposizione.Cells[c, i].FontBold = true;
                                tabellaEsposizione.Cells[c, i].FontColor = ColorPDF.Nero;
                            }
                            var listaOggetti = new List<ObjectPDF>                            
                            {
                                new RectanglePDF(8, 8, ColorPDF.GetBy_AreaBisogno(rw["CodiceAreaBisogno"].ToString())),
                                new FormattedTextAreaPDF
                                {
                                    Text = new AreaBisogno(rw["CodiceAreaBisogno"].ToString()).Abbreviazione,
                                    FontBold = true,
                                    FontColor = ColorPDF.Bianco,
                                    DeltaX = 2,
                                    FontSize = 7,
                                 },
                                 new FormattedTextAreaPDF
                                 {
                                    Text = new AreaBisogno(rw["CodiceAreaBisogno"].ToString()).Nome,
                                        FontBold = true,
                                        FontColor = ColorPDF.Nero,
                                        DeltaX = 12F,
                                        FontSize = 7
                                 } 
                            };

                            //Quadrato colorato indicatore Area
                            tabellaEsposizione.Cells[0, i].ValueObjectList.AddRange(listaOggetti);
                        }
                            if (isSubTotal)
                            {
                                for (int c = 0; c < tabellaEsposizione.Columns.Count; c++)
                                {
                                    tabellaEsposizione.Cells[c, i].FontBold = true;
                                    tabellaEsposizione.Cells[c, i].FontColor = ColorPDF.Nero;
                                }

                                var stringa = rw["CodiceContratto"].ToString();
                                tabellaEsposizione.Cells[0, i].ValueObject = new FormattedTextAreaPDF
                                {
                                    Text = stringa,
                                    FontBold = true,
                                    FontColor = ColorPDF.Nero,
                                    DeltaX = 2F,
                                    FontSize = 7,
                                    Width = 130
                                };
                            }
                        
                    }

                    else
                    {
                        var stringa = rw["CodiceContratto"].ToString();
                        tabellaEsposizione.Cells[0, i].ValueObject = new FormattedTextAreaPDF
                        {
                            Text = stringa,
                            FontBold = false,
                            FontColor = ColorPDF.Nero,
                            DeltaX = 2F,
                            FontSize = 7,
                            Width = 130,
                            DeltaY = 1
                        };
                    }

                    tabellaEsposizione.Cells[2, i].HorizontalAlignment =
                        tabellaEsposizione.Cells[3, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    i++;
                }

                #endregion

                AddElement(tabellaEsposizione);

                #endregion

            }
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataTable.
        /// </summary>
        /// <returns></returns>
        protected override DataTable GetDataTable()
        {
            return null;
        }

        /// <summary>
        /// Recupera i dati necessari alla Section restituendo un DataSet.
        /// </summary>
        /// <returns></returns>
        protected override DataSet GetDataSet()
        {
            #region Definizione Dataset

            const string stringReplaceIfZero = " ";
            var ds = new DataSet();
            
            #endregion

            #region Estrazione ChiavePB + Servizi
            var chiaveClientePb = EnvironmentFacade.ReportEnvironment.Cliente.Chiave;
            var dataPiramideModello = datiSeiUnico.piramideModelloUnit().piramideModello.areaModello;
            var dettaglioProdotti = datiSeiUnico.propostaUnit().dettaglioProdotti;
            var dataProdottiNonRappresentabili_Asset = datiSeiUnico.propostaUnit().assetClass.distribuzionePerProdotti.listaProdotti.Where(o => o.rappresentabile == false);
            var dataProdottiNonRappresentabili_Esposizioni = datiSeiUnico.propostaUnit().esposizioneValutaria.distribuzionePerProdotti.listaProdotti.Where(o => o.rappresentabile == false);
            #endregion

            #region Asset - Prodotti non Rappresentabili

            ds.Tables.Add(new DataTable("nonRappresentabiliAsset"));
            ds.Tables["nonRappresentabiliAsset"].ExtendedProperties.Add("IndiceTabella", 1);
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("DescrizioneAreaBisogno", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("OrdinamentoAreaBisogno", typeof(int)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("DataSottoscrizione", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("CodiceContratto", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("Descrizione", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("ControvaloreProposto", typeof(decimal)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("IsTotal", typeof(bool)));
            ds.Tables["nonRappresentabiliAsset"].Columns.Add(new DataColumn("IsSubTotal", typeof(bool)));

            foreach (var prodotto in dataProdottiNonRappresentabili_Asset)
            {
                var itemPosizione = dettaglioProdotti.dettaglioProdotti.FirstOrDefault(o => o.chiaveAggregazione.Equals(prodotto.chiaveAggregazione));
                var itemPiramideModello = dataPiramideModello.FirstOrDefault(o => o.area.ToLower().Trim().Equals(itemPosizione.area.ToLower().Trim()));
                if (itemPosizione.ctvPro != 0)
                {
                    var rowProdotto = ds.Tables["nonRappresentabiliAsset"].NewRow();

                    rowProdotto["CodiceAreaBisogno"] = itemPosizione.area;
                    rowProdotto["DescrizioneAreaBisogno"] = itemPosizione.descAreaEstesa;
                    rowProdotto["OrdinamentoAreaBisogno"] = itemPiramideModello.ordinamento;
                    rowProdotto["DescrizioneProgetto"] = itemPosizione.nomeProgetto;
                    rowProdotto["DataSottoscrizione"] = itemPosizione.dtSottoscrizione.ToShortDateString();
                    rowProdotto["CodiceContratto"] = itemPosizione.codContratto;
                    rowProdotto["Descrizione"] = itemPosizione.prodotto.nomeProdotto;
                    rowProdotto["ControvaloreProposto"] = itemPosizione.ctvPro;
                    rowProdotto["VaR"] = itemPosizione.prodotto.varProDec;

                    rowProdotto["FontBold"] = false;
                    rowProdotto["ReplaceIfZero"] = false;
                    rowProdotto["CanLastRow"] = true;
                    rowProdotto["IsTotal"] = false;
                    rowProdotto["IsSubTotal"] = false;

                    ds.Tables["nonRappresentabiliAsset"].Rows.Add(rowProdotto);
                }
            }

            #endregion

            #region Esposizione valutaria - Prodotti non rappresentabili
            ds.Tables.Add(new DataTable("nonRappresentabiliEsposizione"));
            ds.Tables["nonRappresentabiliEsposizione"].ExtendedProperties.Add("IndiceTabella", 3);
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("DescrizioneAreaBisogno", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("OrdinamentoAreaBisogno", typeof(int)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("DataSottoscrizione", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("CodiceContratto", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("Descrizione", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("ControvaloreProposto", typeof(decimal)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("IsTotal", typeof(bool)));
            ds.Tables["nonRappresentabiliEsposizione"].Columns.Add(new DataColumn("IsSubTotal", typeof(bool)));

            foreach (var prodotto in dataProdottiNonRappresentabili_Esposizioni)
            {
                var itemPosizione = dettaglioProdotti.dettaglioProdotti.FirstOrDefault(o => o.chiaveAggregazione.Equals(prodotto.chiaveAggregazione));
                var itemPiramideModello = dataPiramideModello.FirstOrDefault(o => o.area.ToLower().Trim().Equals(itemPosizione.area.ToLower().Trim()));
                if (itemPosizione.ctvPro != 0)
                {
                    var rowProdotto = ds.Tables["nonRappresentabiliEsposizione"].NewRow();

                    rowProdotto["CodiceAreaBisogno"] = itemPosizione.area;
                    rowProdotto["DescrizioneAreaBisogno"] = itemPosizione.descAreaEstesa;
                    rowProdotto["OrdinamentoAreaBisogno"] = itemPiramideModello.ordinamento;
                    rowProdotto["DescrizioneProgetto"] = itemPosizione.nomeProgetto;
                    rowProdotto["DataSottoscrizione"] = itemPosizione.dtSottoscrizione.ToShortDateString();
                    rowProdotto["CodiceContratto"] = itemPosizione.codContratto;
                    rowProdotto["Descrizione"] = itemPosizione.prodotto.nomeProdotto;
                    rowProdotto["ControvaloreProposto"] = itemPosizione.ctvPro;
                    rowProdotto["VaR"] = itemPosizione.prodotto.varProDec;

                    rowProdotto["FontBold"] = false;
                    rowProdotto["ReplaceIfZero"] = false;
                    rowProdotto["CanLastRow"] = true;
                    rowProdotto["IsTotal"] = false;
                    rowProdotto["IsSubTotal"] = false;

                    ds.Tables["nonRappresentabiliEsposizione"].Rows.Add(rowProdotto);
                }
            }

            #endregion

            #region Raggruppamento per area di bisogno - Asset

            ds.Tables.Add(new DataTable("prodottoPerAreaAsset"));

            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("DescrizioneAreaBisogno", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("OrdinamentoAreaBisogno", typeof(int)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("DataSottoscrizione", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("CodiceContratto", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("Descrizione", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("ControvaloreProposto", typeof(decimal)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("IsTotal", typeof(bool)));
            ds.Tables["prodottoPerAreaAsset"].Columns.Add(new DataColumn("IsSubTotal", typeof(bool)));

            #region Prodotti raggruppati per area - Asset

            var viewAree = new DataView(ds.Tables["nonRappresentabiliAsset"]/*.AsEnumerable().Where(o => o.Field<decimal>("ControvaloreProposto") != 0).CopyToDataTable()*/) { Sort = "OrdinamentoAreaBisogno" };
            var dtAree = viewAree.ToTable(true, "CodiceAreaBisogno", "DescrizioneAreaBisogno", "OrdinamentoAreaBisogno");

                var area = string.Empty;
                var progetto = string.Empty;

                #region Prodotti

                foreach (DataRow rowAreaProgetto in dtAree.Rows)
                {
                    area = rowAreaProgetto["CodiceAreaBisogno"].ToString();

                    if (new AreaBisogno(area).Visibile)
                    {
                        //Progetti                   
                        var viewProgetti = new DataView(ds.Tables["nonRappresentabiliAsset"].Select("CodiceAreaBisogno='" + area + "'").OrderByDescending(o => o.Field<decimal>("ControvaloreProposto")).CopyToDataTable());
                        var dtProgetti = viewProgetti.ToTable(true, "DescrizioneProgetto");
                        var bIntestazioneArea = true; // la riga di intestazione dell'area va stampata una sola volta.
                        var bItestazioneProgetto = area == "Inv" || area == "Pre"; // la riga di intestazione del progetto va stampata solo per area Inv e Pre.

                        DataRow rowProdottiPerArea;

                        foreach (DataRow itemProgetto in dtProgetti.Rows)
                        {
                            progetto = itemProgetto["DescrizioneProgetto"].ToString();

                            // Subset di prodotti filtrati per Area/Progetto
                            var dtArea = ds.Tables["nonRappresentabiliAsset"].Select("CodiceAreaBisogno='" + area + "'").OrderByDescending(o => o.Field<decimal>("ControvaloreProposto")).CopyToDataTable();
                            var dtAreaProgetto = ds.Tables["nonRappresentabiliAsset"].Select("CodiceAreaBisogno='" + area + "' AND " + string.Format("DescrizioneProgetto ='{0}'", itemProgetto["DescrizioneProgetto"].ToString().Replace("'", "''"))).OrderByDescending(o => o.Field<decimal>("ControvaloreProposto")).CopyToDataTable();

                            if (bIntestazioneArea)
                            {
                                #region riga con background grigio di intestazione per ogni area

                                rowProdottiPerArea = ds.Tables["prodottoPerAreaAsset"].NewRow();
                                rowProdottiPerArea["CodiceAreaBisogno"] = rowAreaProgetto["CodiceAreaBisogno"];
                                rowProdottiPerArea["CodiceContratto"] = rowAreaProgetto["DescrizioneAreaBisogno"]; //FARE

                                // Totali per area                     
                                rowProdottiPerArea["ControvaloreProposto"] = dtArea.AsEnumerable().Sum(p => p.Field<decimal>("ControvaloreProposto"));

                                rowProdottiPerArea["FontBold"] = true;
                                rowProdottiPerArea["ReplaceIfZero"] = stringReplaceIfZero;
                                rowProdottiPerArea["CanLastRow"] = false;
                                rowProdottiPerArea["IsTotal"] = true;
                                rowProdottiPerArea["IsSubTotal"] = false;
                                ds.Tables["prodottoPerAreaAsset"].Rows.Add(rowProdottiPerArea);

                                bIntestazioneArea = false;
                                #endregion
                            }

                            if (bItestazioneProgetto)
                            {
                                #region Riga con background grigio di intestazione per ogni Progetto

                                rowProdottiPerArea = ds.Tables["prodottoPerAreaAsset"].NewRow();
                                rowProdottiPerArea["CodiceAreaBisogno"] = rowAreaProgetto["CodiceAreaBisogno"];
                                rowProdottiPerArea["CodiceContratto"] = progetto;

                                // Totali per area                     
                                rowProdottiPerArea["ControvaloreProposto"] = dtArea.AsEnumerable().Sum(p => p.Field<decimal>("ControvaloreProposto"));

                                rowProdottiPerArea["FontBold"] = true;
                                rowProdottiPerArea["ReplaceIfZero"] = stringReplaceIfZero;
                                rowProdottiPerArea["CanLastRow"] = false;
                                rowProdottiPerArea["IsTotal"] = false;
                                rowProdottiPerArea["IsSubTotal"] = true;

                                ds.Tables["prodottoPerAreaAsset"].Rows.Add(rowProdottiPerArea);

                                #endregion
                            }

                            // I prodotti della dtProdotti vengono mergiati sulla dtProdottiPerArea
                            ds.Tables["prodottoPerAreaAsset"].Merge(dtAreaProgetto);

                        }
                    }
                #endregion

                #endregion
            }
            #endregion

            #region Raggruppamento per area di bisogno - Esposizioni

                ds.Tables.Add(new DataTable("prodottoPerAreaEsposizione"));

                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("CodiceAreaBisogno", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("DescrizioneAreaBisogno", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("OrdinamentoAreaBisogno", typeof(int)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("DescrizioneProgetto", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("DataSottoscrizione", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("CodiceContratto", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("Descrizione", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("ControvaloreProposto", typeof(decimal)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("VaR", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("FontBold", typeof(bool)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("ReplaceIfZero", typeof(string)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("CanLastRow", typeof(bool)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("IsTotal", typeof(bool)));
                ds.Tables["prodottoPerAreaEsposizione"].Columns.Add(new DataColumn("IsSubTotal", typeof(bool)));

                #region Prodotti raggruppati per area - Asset

                viewAree = new DataView(ds.Tables["nonRappresentabiliEsposizione"]/*.AsEnumerable().Where(o => o.Field<decimal>("ControvaloreProposto") != 0).CopyToDataTable()*/) { Sort = "OrdinamentoAreaBisogno" };
                dtAree = viewAree.ToTable(true, "CodiceAreaBisogno", "DescrizioneAreaBisogno", "OrdinamentoAreaBisogno");

                area = string.Empty;
                progetto = string.Empty;

                #region Prodotti

                foreach (DataRow rowAreaProgetto in dtAree.Rows)
                {
                    area = rowAreaProgetto["CodiceAreaBisogno"].ToString();

                    if (new AreaBisogno(area).Visibile)
                    {
                        //Progetti                   
                        var viewProgetti = new DataView(ds.Tables["nonRappresentabiliEsposizione"].Select("CodiceAreaBisogno='" + area + "'").OrderByDescending(o => o.Field<decimal>("ControvaloreProposto")).CopyToDataTable());
                        var dtProgetti = viewProgetti.ToTable(true, "DescrizioneProgetto");
                        var bIntestazioneArea = true; // la riga di intestazione dell'area va stampata una sola volta.
                        var bItestazioneProgetto = area == "Inv" || area == "Pre"; // la riga di intestazione del progetto va stampata solo per area Inv e Pre.

                        DataRow rowProdottiPerArea;

                        foreach (DataRow itemProgetto in dtProgetti.Rows)
                        {
                            progetto = itemProgetto["DescrizioneProgetto"].ToString();

                            // Subset di prodotti filtrati per Area/Progetto
                            var dtArea = ds.Tables["nonRappresentabiliEsposizione"].Select("CodiceAreaBisogno='" + area + "'").OrderByDescending(o => o.Field<decimal>("ControvaloreProposto")).CopyToDataTable();
                            var dtAreaProgetto = ds.Tables["nonRappresentabiliEsposizione"].Select("CodiceAreaBisogno='" + area + "' AND "+ string.Format("DescrizioneProgetto ='{0}'", itemProgetto["DescrizioneProgetto"].ToString().Replace("'", "''"))).OrderByDescending(o => o.Field<decimal>("ControvaloreProposto")).CopyToDataTable();

                            if (bIntestazioneArea)
                            {
                                #region riga con background grigio di intestazione per ogni area

                                rowProdottiPerArea = ds.Tables["prodottoPerAreaEsposizione"].NewRow();
                                rowProdottiPerArea["CodiceAreaBisogno"] = rowAreaProgetto["CodiceAreaBisogno"];
                                rowProdottiPerArea["CodiceContratto"] = rowAreaProgetto["DescrizioneAreaBisogno"]; //FARE

                                // Totali per area                     
                                rowProdottiPerArea["ControvaloreProposto"] = dtArea.AsEnumerable().Sum(p => p.Field<decimal>("ControvaloreProposto"));

                                rowProdottiPerArea["FontBold"] = true;
                                rowProdottiPerArea["ReplaceIfZero"] = stringReplaceIfZero;
                                rowProdottiPerArea["CanLastRow"] = false;
                                rowProdottiPerArea["IsTotal"] = true;
                                rowProdottiPerArea["IsSubTotal"] = false;
                                ds.Tables["prodottoPerAreaEsposizione"].Rows.Add(rowProdottiPerArea);

                                bIntestazioneArea = false;
                                #endregion
                            }

                            if (bItestazioneProgetto)
                            {
                                #region Riga con background grigio di intestazione per ogni Progetto

                                rowProdottiPerArea = ds.Tables["prodottoPerAreaEsposizione"].NewRow();
                                rowProdottiPerArea["CodiceAreaBisogno"] = rowAreaProgetto["CodiceAreaBisogno"];
                                rowProdottiPerArea["CodiceContratto"] = progetto;

                                // Totali per area                     
                                rowProdottiPerArea["ControvaloreProposto"] = dtArea.AsEnumerable().Sum(p => p.Field<decimal>("ControvaloreProposto"));
                                
                                rowProdottiPerArea["FontBold"] = true;
                                rowProdottiPerArea["ReplaceIfZero"] = stringReplaceIfZero;
                                rowProdottiPerArea["CanLastRow"] = false;
                                rowProdottiPerArea["IsTotal"] = false;
                                rowProdottiPerArea["IsSubTotal"] = true;

                                ds.Tables["prodottoPerAreaEsposizione"].Rows.Add(rowProdottiPerArea);

                                #endregion
                            }

                            // I prodotti della dtProdotti vengono mergiati sulla dtProdottiPerArea
                            ds.Tables["prodottoPerAreaEsposizione"].Merge(dtAreaProgetto);

                        }
                    }
                #endregion

                #endregion
                }
                #endregion

            #region Asset - Prodotti non Rappresentabili Footer
            ds.Tables.Add(new DataTable("nonRappresentabiliAssetFooter"));
            ds.Tables.Add(new DataTable("nonRappresentabiliEsposizioneFooter"));
            ds.Tables["nonRappresentabiliAssetFooter"].Columns.Add(new DataColumn("Totale", typeof(string)));
            ds.Tables["nonRappresentabiliAssetFooter"].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
            ds.Tables["nonRappresentabiliAssetFooter"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["nonRappresentabiliAssetFooter"].Rows.Add(    "Totale prodotti non rappresentabili",
                                                                    ds.Tables["prodottoPerAreaAsset"].Select("IsTotal<>'true' AND IsSubTotal<>'true'").AsEnumerable().Sum(x => x.Field<decimal>("ControvaloreProposto")),
                                                                    "");
            #endregion

            #region Valutaria - Prodotti non Rappresentabili Footer
            ds.Tables["nonRappresentabiliEsposizioneFooter"].Columns.Add(new DataColumn("Totale", typeof(string)));
            ds.Tables["nonRappresentabiliEsposizioneFooter"].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
            ds.Tables["nonRappresentabiliEsposizioneFooter"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["nonRappresentabiliEsposizioneFooter"].Rows.Add("Totale prodotti non rappresentabili",
                                                                        ds.Tables["prodottoPerAreaEsposizione"].Select("IsTotal<>'true' AND IsSubTotal<>'true'").AsEnumerable().Sum(x => x.Field<decimal>("ControvaloreProposto")),
                                                                        "");
            #endregion

            return ds;
        }

        public virtual string getTesto1()
        {
            string testo = string.Empty;
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            string adeguataStr = isAdeguata ? "della presente proposta" : "delle operazioni da lei richieste al suo private banker";
            testo += "Nella tabella sottostante sono riportati i prodotti che, sulla base " + adeguataStr +", ";
            testo += "concorrono alla determinazione del suo patrimonio, ma che non è stato possibile rappresentare in termini di ";
            testo += "asset allocation. ";
            return testo;
        }

        public virtual string getTesto2()
        {
            string testo = string.Empty;
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
            string adeguataStr = isAdeguata ? "sulla base della presente proposta" : "delle operazioni da lei richieste al suo private banker";
            testo += "Nella tabella sottostante sono riportati i prodotti che, sulla base " + adeguataStr + ", ";
            testo += "concorrono alla determinazione del suo patrimonio, ma che non è stato possibile rappresentare in termini di ";
            testo += "esposizione valutaria. ";
            return testo;
        }

        public virtual bool showAsset()
        {
            return datiSeiUnico.isVincolo("v65000_1") ? false : GetOption<Opzione4_1>().Valore;
        }

        public virtual bool showValutaria()
        {
            return datiSeiUnico.isVincolo("v65000_2") ? false : GetOption<Opzione4_2>().Valore;
        }
        
    }
}
