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

namespace Consulenza.ReportWriter.Manager.Section.Unica
{
    public class S56 : Entity.Section
    {
        /// <summary>
        ///S56.PropostaDettaglioOperazioni idSezione = 99
        /// </summary>
        public S56(EnvironmentFacade environmentFacade, int idSection)
            : base(environmentFacade, idSection)
        {
            try
            {
                Draw();
            }
            catch (Exception ex)
            {
                SectionLogger.Write("S56", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
            }
        }

        protected override sealed void Draw()
        {
            var dati = GetDataSet();
            bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();

            AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
            var intestazione = new SectionHeadingPDF(
                   (isAdeguata ? "Proposta" : "Operazioni richieste") + ": dettaglio operazioni",

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

            AddElement(intestazione.ToElement());

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



            #region     Tabella delle Sintesi
            if (dati.Tables["sintesiOperazioni"].Rows.Count > 0)
            {
                var sintesiOperazioni = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["sintesiOperazioni"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };
                #region Label
                  AddElement(new FormattedTextAreaPDF("Sintesi delle operazioni proposte", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion
                AddElement(new SpacePDF(4));
                #region Tabella

                sintesiOperazioni.Columns.Add(new ColumnPDF("nuoveSottoscrizioni", 130, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Decimale, "nuoveSottoscrizioni", "(A) <font color=#000000>Nuove sottoscrizioni (€)</font>") { HeaderFontSize = 7 });
                sintesiOperazioni.Columns.Add(new ColumnPDF("aggiuntivi", 130, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Decimale, "aggiuntivi", "(B) <font color=#000000>Investimenti aggiuntivi (€)</font>") { HeaderFontSize = 7 });
                sintesiOperazioni.Columns.Add(new ColumnPDF("disinvestimenti", 130, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Decimale, "disinvestimenti", "(C) <font color=#000000>Disinvestimenti (€)</font>") { HeaderFontSize = 7 });
                sintesiOperazioni.Columns.Add(new ColumnPDF("saldo", 130, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Decimale, "saldo", "(A+B-C) <font color=#000000>Saldo operazioni (€)</font>") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                for (int i = 0; i < dati.Tables["sintesiOperazioni"].Rows.Count; i++)
                {
                    sintesiOperazioni.Cells[0, i].HorizontalAlignment =
                    sintesiOperazioni.Cells[1, i].HorizontalAlignment =
                    sintesiOperazioni.Cells[2, i].HorizontalAlignment =
                    sintesiOperazioni.Cells[3, i].HorizontalAlignment = HorizontalAlignmentType.Centrato;
                }
                #endregion
                AddElement(sintesiOperazioni);
               
            }

            #endregion

            #region Tabella delle Operazioni

            if (dati.Tables["operazioni"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                AddElement(new FormattedTextAreaPDF("Nuove sottoscrizioni, Investimenti aggiuntivi, Disinvestimenti", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion 
                var tabellaOperazioni = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioni"], dati.Tables["operazionifooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                // Modifica per Saving Map

                tabellaOperazioni.Columns.Add(new ColumnPDF("SavingMap", 13, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 10, ScaleColumnTypeImage = 0.50F });
                // Fine Modifica
                tabellaOperazioni.Columns.Add(new ColumnPDF("codContratto", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "codContratto", "Codice<br>Contratto") { HeaderFontSize = 7 });
                tabellaOperazioni.Columns.Add(new ColumnPDF("Prodotto", 142, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Prodotto", "Prodotto") { HeaderFontSize = 7 });
                tabellaOperazioni.Columns.Add(new ColumnPDF("codInterno", 35, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "codInterno", "Codice<br>Interno") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaOperazioni.Columns.Add(new ColumnPDF("Controvaloreattuale", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvaloreattuale", "Controvalore<br>attuale (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                tabellaOperazioni.Columns.Add(new ColumnPDF("ApportiDisinvest", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ApportiDisinvest", "Apporti/<br>Disinvest. (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                tabellaOperazioni.Columns.Add(new ColumnPDF("Controvaloreproposto", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvaloreproposto", "Controvalore<br>" + (isAdeguata ? "proposto (€)" : "prospettico (€)")) { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                tabellaOperazioni.Columns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "Rischio<br>Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                tabellaOperazioni.FooterColumns.Add(new ColumnPDF("Prodotto", 265, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                tabellaOperazioni.FooterColumns.Add(new ColumnPDF("Controvaloreattuale", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaOperazioni.FooterColumns.Add(new ColumnPDF("ApportiDisinvest", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaOperazioni.FooterColumns.Add(new ColumnPDF("Controvaloreproposto", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaOperazioni.FooterColumns.Add(new ColumnPDF("VaR", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                for (int i = 0; i < dati.Tables["operazioni"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioni"].Rows[i][0].ToString() == "$")
                    {
                        tabellaOperazioni.Cells[1, i].FontBold =
                        tabellaOperazioni.Cells[2, i].FontBold =
                        tabellaOperazioni.Cells[4, i].FontBold =
                        tabellaOperazioni.Cells[5, i].FontBold =
                        tabellaOperazioni.Cells[6, i].FontBold = true;
                        tabellaOperazioni.Cells[1, i].ColSpan = 2;

                    }
                    else
                    {
                        tabellaOperazioni.Cells[1, i].FontBold =
                        tabellaOperazioni.Cells[2, i].FontBold =
                        tabellaOperazioni.Cells[4, i].FontBold =
                        tabellaOperazioni.Cells[5, i].FontBold =
                        tabellaOperazioni.Cells[6, i].FontBold = false;
                        tabellaOperazioni.Cells[1, i].ColSpan = 0;

                    }
                }

                for (int i = 0; i < dati.Tables["operazioni"].Rows.Count; i++)
                {
                    tabellaOperazioni.Cells[4, i].HorizontalAlignment =
                    tabellaOperazioni.Cells[5, i].HorizontalAlignment =
                    tabellaOperazioni.Cells[6, i].HorizontalAlignment =
                    tabellaOperazioni.Cells[7, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                }

                AddElement(tabellaOperazioni);
            }
            #endregion

            #region Tabella Pac Terzi

            if (dati.Tables["operazioniPACTerzi"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(A)</font> Nuove sottoscrizioni - Piani di accumulo capitale", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion 
                var operazioniPACTerzi = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniPACTerzi"], dati.Tables["operazioniPACTerziFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                operazioniPACTerzi.Columns.Add(new ColumnPDF("nomeProdotto", 160, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "nomeProdotto", "Prodotto") { HeaderFontSize = 7 });
                operazioniPACTerzi.Columns.Add(new ColumnPDF("codiceInterno", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "codiceInterno", "Codice<br>Interno") { HeaderFontSize = 7 });
                operazioniPACTerzi.Columns.Add(new ColumnPDF("primoVersamento", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "primoVersamento", "Primo<br>versamento (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACTerzi.Columns.Add(new ColumnPDF("rata", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "rata", "Rata (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACTerzi.Columns.Add(new ColumnPDF("frequenza", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "frequenza", "Frequenza/<br>Durata") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACTerzi.Columns.Add(new ColumnPDF("valoreNominale", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "valoreNominale", "Valore<br>nominale (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACTerzi.Columns.Add(new ColumnPDF("var", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "var", "Rischio<br>Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                operazioniPACTerzi.FooterColumns.Add(new ColumnPDF("Prodotto", 210, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                operazioniPACTerzi.FooterColumns.Add(new ColumnPDF("primoVersamento", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniPACTerzi.FooterColumns.Add(new ColumnPDF("rata", 50, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniPACTerzi.FooterColumns.Add(new ColumnPDF("frequenza", 65, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniPACTerzi.FooterColumns.Add(new ColumnPDF("valoreNominale", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniPACTerzi.FooterColumns.Add(new ColumnPDF("var", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                //Formatto la riga di aggregazione 
                for (int i = 0; i < dati.Tables["operazioniPACTerzi"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniPACTerzi"].Rows[i][0].ToString() == "$")
                    {
                        operazioniPACTerzi.Cells[0, i].FontBold = true;
                        operazioniPACTerzi.Cells[0, i].ColSpan = 6;
                    }
                    else
                    {
                        operazioniPACTerzi.Cells[0, i].FontBold = false;
                        operazioniPACTerzi.Cells[0, i].ColSpan = 0;
                        operazioniPACTerzi.Cells[2, i].HorizontalAlignment =
                        operazioniPACTerzi.Cells[3, i].HorizontalAlignment =
                        operazioniPACTerzi.Cells[5, i].HorizontalAlignment =
                        operazioniPACTerzi.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    }

                }


                AddElement(operazioniPACTerzi);
            }
            #endregion

            #region Tabella Fonditalia 
           
            if (dati.Tables["operazioniPACFonditalia"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(A)</font> Nuove sottoscrizioni - Piani di accumulo capitale", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion 
                var operazioniPACFonditalia = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniPACFonditalia"], dati.Tables["operazioniPACFonditaliaFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                operazioniPACFonditalia.Columns.Add(new ColumnPDF("nomeProdotto", 170, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "nomeProdotto", "Prodotto") { HeaderFontSize = 7 });
                operazioniPACFonditalia.Columns.Add(new ColumnPDF("codiceInterno", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "codiceInterno", "Codice<br>Interno") { HeaderFontSize = 7 });
                operazioniPACFonditalia.Columns.Add(new ColumnPDF("primoVersamento", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "primoVersamento", "Primo<br>versamento (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACFonditalia.Columns.Add(new ColumnPDF("rata", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "rata", "Rata (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACFonditalia.Columns.Add(new ColumnPDF("frequenza", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "frequenza", "Frequenza") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACFonditalia.Columns.Add(new ColumnPDF("valoreNominale", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "valoreNominale", "Valore<br>nominale (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPACFonditalia.Columns.Add(new ColumnPDF("var", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "var", "Rischio<br>Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                operazioniPACFonditalia.FooterColumns.Add(new ColumnPDF("Prodotto", 210, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                operazioniPACFonditalia.FooterColumns.Add(new ColumnPDF("primoVersamento", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniPACFonditalia.FooterColumns.Add(new ColumnPDF("rata", 50, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniPACFonditalia.FooterColumns.Add(new ColumnPDF("frequenza", 65, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniPACFonditalia.FooterColumns.Add(new ColumnPDF("valoreNominale", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniPACFonditalia.FooterColumns.Add(new ColumnPDF("var", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                //Formatto la riga di aggregazione 
                for (int i = 0; i < dati.Tables["operazioniPACFonditalia"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniPACFonditalia"].Rows[i][0].ToString() == "$")
                    {
                        operazioniPACFonditalia.Cells[0, i].FontBold =
                        operazioniPACFonditalia.Cells[2, i].FontBold =
                        operazioniPACFonditalia.Cells[3, i].FontBold =
                        operazioniPACFonditalia.Cells[4, i].FontBold =
                        operazioniPACFonditalia.Cells[5, i].FontBold = true;
                    }
                    else
                    {
                        operazioniPACFonditalia.Cells[2, i].FontBold =
                        operazioniPACFonditalia.Cells[3, i].FontBold =
                        operazioniPACFonditalia.Cells[4, i].FontBold =
                        operazioniPACFonditalia.Cells[5, i].FontBold = 
                        operazioniPACFonditalia.Cells[0, i].FontBold = false;
                        
                    }
                    operazioniPACFonditalia.Cells[2, i].HorizontalAlignment =
                    operazioniPACFonditalia.Cells[3, i].HorizontalAlignment =
                    operazioniPACFonditalia.Cells[5, i].HorizontalAlignment =
                    operazioniPACFonditalia.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;

                }


                AddElement(operazioniPACFonditalia);
            }

            #endregion

            #region Tabella Conversioni Programmate NS
            if (dati.Tables["operazioniCPNS"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(A)</font> Nuove sottoscrizioni - Conversioni programmate", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion
                var operazioniCPNS = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniCPNS"], dati.Tables["operazioniCPNSFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                operazioniCPNS.Columns.Add(new ColumnPDF("Prodotto", 160, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Prodotto", "Nome prodotto") { HeaderFontSize = 7 });
                operazioniCPNS.Columns.Add(new ColumnPDF("CodiceInterno", 30, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "CodiceInterno", "Codice<br>Interno") { HeaderFontSize = 7 });
                operazioniCPNS.Columns.Add(new ColumnPDF("ControvaloreSottoscrizione", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreSottoscrizione", "Controvalore<br>sottoscrizione (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPNS.Columns.Add(new ColumnPDF("Durata", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Rata", "Rata (€)<br>Durata") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPNS.Columns.Add(new ColumnPDF("Conversione", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Conversione", "Conversione (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPNS.Columns.Add(new ColumnPDF("ControvalorePropost", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvalorePropost", "Controvalore<br>proposto (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPNS.Columns.Add(new ColumnPDF("Var", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Var", "Rischio Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                operazioniCPNS.FooterColumns.Add(new ColumnPDF("NomeProdotto", 190, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                operazioniCPNS.FooterColumns.Add(new ColumnPDF("CtvSottoscrizione", 75, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniCPNS.FooterColumns.Add(new ColumnPDF("Durata", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniCPNS.FooterColumns.Add(new ColumnPDF("Conversione", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniCPNS.FooterColumns.Add(new ColumnPDF("ControvalorePropost", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniCPNS.FooterColumns.Add(new ColumnPDF("Var", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                //Formatto la riga di aggregazione 
                for (int i = 0; i < dati.Tables["operazioniCPNS"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniCPNS"].Rows[i][0].ToString() == "$")
                    {
                        operazioniCPNS.Cells[0, i].FontBold =
                        operazioniCPNS.Cells[2, i].FontBold =
                        operazioniCPNS.Cells[3, i].FontBold =
                        operazioniCPNS.Cells[4, i].FontBold =
                        operazioniCPNS.Cells[5, i].FontBold = true;
                    }
                    else
                    {
                        operazioniCPNS.Cells[2, i].FontBold =
                        operazioniCPNS.Cells[3, i].FontBold =
                        operazioniCPNS.Cells[4, i].FontBold =
                        operazioniCPNS.Cells[5, i].FontBold =
                        operazioniCPNS.Cells[0, i].FontBold = false;

                    }
                    operazioniCPNS.Cells[2, i].HorizontalAlignment =
                    operazioniCPNS.Cells[3, i].HorizontalAlignment =
                    operazioniCPNS.Cells[4, i].HorizontalAlignment =
                    operazioniCPNS.Cells[5, i].HorizontalAlignment =
                    operazioniCPNS.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;

                }


                AddElement(operazioniCPNS);

            }
            #endregion

            #region Tabella Conversioni Programmate PV

            if (dati.Tables["operazioniCPCV"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(B)</font> Investimenti aggiuntivi / <font color=#FF0000>(C)</font> Disinvestimenti - Conversioni programmate", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion
                var operazioniCPCV = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniCPCV"], dati.Tables["operazioniCPCVFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                operazioniCPCV.Columns.Add(new ColumnPDF("Prodotto", 160, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Prodotto", "Nome prodotto") { HeaderFontSize = 7 });
                operazioniCPCV.Columns.Add(new ColumnPDF("CodiceInterno", 35, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "CodiceInterno", "Codice<br>Interno") { HeaderFontSize = 7 });
                operazioniCPCV.Columns.Add(new ColumnPDF("ControvaloreAttuale", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreAttuale", "Controvalore<br>attuale (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPCV.Columns.Add(new ColumnPDF("Rata", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rata", "Rata(€)<br>Frequenza/<br>Durata") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPCV.Columns.Add(new ColumnPDF("Conversione", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Conversione", "Conversione (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPCV.Columns.Add(new ColumnPDF("ControvaloreProposto", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreProposto", "Controvalore<br>proposto (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniCPCV.Columns.Add(new ColumnPDF("Var", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Var", "Rischio Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                operazioniCPCV.FooterColumns.Add(new ColumnPDF("NomeProdotto", 195, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                operazioniCPCV.FooterColumns.Add(new ColumnPDF("ControvaloreAttuale", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniCPCV.FooterColumns.Add(new ColumnPDF("Durata", 50, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniCPCV.FooterColumns.Add(new ColumnPDF("Conversione", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniCPCV.FooterColumns.Add(new ColumnPDF("ControvaloreProposto", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniCPCV.FooterColumns.Add(new ColumnPDF("Var", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                //Formatto la riga di aggregazione 
                for (int i = 0; i < dati.Tables["operazioniCPCV"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniCPCV"].Rows[i][0].ToString() == "$")
                    {
                        operazioniCPCV.Cells[0, i].FontBold =
                        operazioniCPCV.Cells[2, i].FontBold =
                        operazioniCPCV.Cells[3, i].FontBold =
                        operazioniCPCV.Cells[4, i].FontBold =
                        operazioniCPCV.Cells[5, i].FontBold = true;
                    }
                    else
                    {
                        operazioniCPCV.Cells[2, i].FontBold =
                        operazioniCPCV.Cells[3, i].FontBold =
                        operazioniCPCV.Cells[4, i].FontBold =
                        operazioniCPCV.Cells[5, i].FontBold =
                        operazioniCPCV.Cells[0, i].FontBold = false;

                    }
                    operazioniCPCV.Cells[2, i].HorizontalAlignment =
                    operazioniCPCV.Cells[3, i].HorizontalAlignment =
                    operazioniCPCV.Cells[4, i].HorizontalAlignment =
                    operazioniCPCV.Cells[5, i].HorizontalAlignment =
                    operazioniCPCV.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;

                }
                AddElement(operazioniCPCV);
            }
            #endregion

            #region Tabella delle CP OLD


            //if (dati.Tables["operazioniLabelCP"].Rows.Count > 0)
            //{
            //    Boolean isPS = false;
            //    if (dati.Tables["tipoOperazioni"].Rows.Count > 0)//è una PS
            //    {
            //        isPS = true;
            //    }
            //    AddElement(new SpacePDF(25));
            //    #region Label
            //    AddElement(new FormattedTextAreaPDF(isPS ? "Operazioni Servizio Step Up" : "Nuova sottoscrizione e Servizio Step Up", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
            //    AddElement(new SpacePDF(15));
            //    AddElement(new FormattedTextAreaPDF("Tipologia Step Up: ", EnvironmentFacade.RendererFacade.XLeftLimit, 90) { FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false, FontSize = 8 });
            //    AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelCP"].Rows[0]["Tipologia"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 90, 50) { AutoIncrementYWritable = false, FontSize = 7 });
            //    AddElement(new FormattedTextAreaPDF("Importo Step Up (€): ", EnvironmentFacade.RendererFacade.XLeftLimit + 150, 120) { FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false, FontSize = 8 });
            //    AddElement(new FormattedTextAreaPDF(Helper.FormatCurrency(dati.Tables["operazioniLabelCP"].Rows[0]["Importo"].ToString()), EnvironmentFacade.RendererFacade.XLeftLimit + 250, 70) { AutoIncrementYWritable = false, FontSize = 7 });
            //    AddElement(new FormattedTextAreaPDF("Durata: ", EnvironmentFacade.RendererFacade.XLeftLimit + 340, 40) { FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false, FontSize = 8 });
            //    AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelCP"].Rows[0]["Durata"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 380, 40) { AutoIncrementYWritable = false, FontSize = 7 });
            //    #endregion
            //    AddElement(new SpacePDF(25));
            //    #region tabella
            //    var tabellaCP = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniCP"], dati.Tables["operazioniCPfooter"])
            //    {
            //        Style = Style.ConsulenzaUnica,
            //        AlternateRow = false,
            //        ShowSeparationLines = true,
            //        WidthSeparationLines = 0.5F,
            //        RowHeight = 25
            //    };

            //    tabellaCP.Columns.Add(new ColumnPDF("Prodotto", 126, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Prodotto", "Prodotto") { HeaderFontSize = 7 });
            //    tabellaCP.Columns.Add(new ColumnPDF("StatoCP", 29, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Immagine, "StatoCP", string.Empty) { DeltaYContent = 10, ScaleColumnTypeImage = 0.50F });
            //    tabellaCP.Columns.Add(new ColumnPDF("ControvaloreSottoscrizione", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreSottoscrizione", (isPS ? "Controvalore<br>attuale (€)" : "Controvalore<br>sottoscrizione (€)")) { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaCP.Columns.Add(new ColumnPDF("ConversioneProgrammata", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ConversioneProgrammata", "Servizio<br>Step Up (€)") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaCP.Columns.Add(new ColumnPDF("Rata", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Rata", "Rata (€)") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaCP.Columns.Add(new ColumnPDF("ControvaloreProposto", 85, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ControvaloreProposto", "Controvalore<br>" + (isAdeguata ? "proposto (€)" : "prospettico (€)")) { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaCP.Columns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaR", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });

            //    tabellaCP.FooterColumns.Add(new ColumnPDF("Prodotto", 155, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
            //    tabellaCP.FooterColumns.Add(new ColumnPDF("ControvaloreSottoscrizione", 85, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaCP.FooterColumns.Add(new ColumnPDF("ConversioneProgrammata", 85, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaCP.FooterColumns.Add(new ColumnPDF("Rata", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaCP.FooterColumns.Add(new ColumnPDF("ControvaloreProposto", 85, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaCP.FooterColumns.Add(new ColumnPDF("VaR", 40, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

            //    tabellaCP.Notes.Add(
            //            new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
            //           "Servizio Step Up in uscita.",
            //           new[] { "" },
            //           string.Empty,
            //           TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella,
            //           new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.60F, "cpInUscita.png"))
            //            { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left });
            //    tabellaCP.Notes.Add(
            //            new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
            //            "Servizio Step Up in entrata.",
            //            new[] { "" },
            //            string.Empty,
            //            TableNotePDF.TableNoteAsteriskPositionType.PieDiTabella,
            //            new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.60F, "cpInEntrata.png"))
            //            { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left });

            //    #endregion
            //    for (int i = 0; i < dati.Tables["operazioniCP"].Rows.Count; i++)
            //    {
            //        tabellaCP.Cells[2, i].HorizontalAlignment =
            //        tabellaCP.Cells[3, i].HorizontalAlignment =
            //        tabellaCP.Cells[4, i].HorizontalAlignment =
            //        tabellaCP.Cells[5, i].HorizontalAlignment =
            //        tabellaCP.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
            //    }
            //    AddElement(tabellaCP);


            //    AddElement(new SpacePDF(20));
            //}
            #endregion

            #region Tabella delle PPI NS 
            
            if (dati.Tables["operazioniPPINS"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(A)</font> Nuove sottoscrizioni - Programma periodico di investimento", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion
                var operazioniPPINS = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniPPINS"], dati.Tables["operazioniPPINSFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                operazioniPPINS.Columns.Add(new ColumnPDF("NomeProdotto", 160, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Nome prodotto") { HeaderFontSize = 7 });
                operazioniPPINS.Columns.Add(new ColumnPDF("CodiceInterno", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "CodiceInterno", "Codice<br>Interno") { HeaderFontSize = 7, HeaderPaddingLeft = 9, PaddingLeft = 9 });
                operazioniPPINS.Columns.Add(new ColumnPDF("CtvSottoscrizione", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "CtvSottoscrizione", "Controvalore<br>sottoscrizione (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPPINS.Columns.Add(new ColumnPDF("Frequenza", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Frequenza", "Frequenza/<br>Durata") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPPINS.Columns.Add(new ColumnPDF("Conversione", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Conversione", "Conversione (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPPINS.Columns.Add(new ColumnPDF("CtvProposto", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "CtvProposto", "Controvalore<br>proposto (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniPPINS.Columns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Var", "Rischio Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                operazioniPPINS.FooterColumns.Add(new ColumnPDF("NomeProdotto", 210, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                operazioniPPINS.FooterColumns.Add(new ColumnPDF("CtvSottoscrizione", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniPPINS.FooterColumns.Add(new ColumnPDF("Frequenza", 50, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniPPINS.FooterColumns.Add(new ColumnPDF("Conversione", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniPPINS.FooterColumns.Add(new ColumnPDF("CtvProposto", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniPPINS.FooterColumns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                //Formatto la riga di aggregazione 
                for (int i = 0; i < dati.Tables["operazioniPPINS"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniPPINS"].Rows[i][0].ToString() == "$")
                    {
                        operazioniPPINS.Cells[0, i].FontBold =
                        operazioniPPINS.Cells[2, i].FontBold =
                        operazioniPPINS.Cells[3, i].FontBold =
                        operazioniPPINS.Cells[4, i].FontBold =
                        operazioniPPINS.Cells[5, i].FontBold = true;
                    }
                    else
                    {
                        operazioniPPINS.Cells[2, i].FontBold =
                        operazioniPPINS.Cells[3, i].FontBold =
                        operazioniPPINS.Cells[4, i].FontBold =
                        operazioniPPINS.Cells[5, i].FontBold =
                        operazioniPPINS.Cells[0, i].FontBold = false;

                    }
                    operazioniPPINS.Cells[2, i].HorizontalAlignment =
                    operazioniPPINS.Cells[4, i].HorizontalAlignment =
                    operazioniPPINS.Cells[5, i].HorizontalAlignment =
                    operazioniPPINS.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;

                }
                AddElement(operazioniPPINS);
            }
            #endregion

            #region Tabella delle PPI PV

            AddElement(new SpacePDF(25));
           
            if (dati.Tables["operazioniPPIPV"].Rows.Count > 0)
            {
                #region Label
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(B)</font> Investimenti aggiuntivi / <font color=#FF0000>(C)</font> Disinvestimenti - Programma periodico di investimento", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion 
                var tabellaKS = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniPPIPV"], dati.Tables["operazioniPPIPVFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                tabellaKS.Columns.Add(new ColumnPDF("NomeProdotto", 160, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Nome prodotto") { HeaderFontSize = 7 });
                tabellaKS.Columns.Add(new ColumnPDF("CodiceInterno", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "CodiceInterno", "Codice<br>Interno") { HeaderFontSize = 7, HeaderPaddingLeft = 9, PaddingLeft = 9 });
                tabellaKS.Columns.Add(new ColumnPDF("CtvSottoscrizione", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "CtvSottoscrizione", "Controvalore<br>sottoscrizione (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                tabellaKS.Columns.Add(new ColumnPDF("Frequenza", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Frequenza", "Frequenza/<br>Durata") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                tabellaKS.Columns.Add(new ColumnPDF("Conversione", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Conversione", "Conversione (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                tabellaKS.Columns.Add(new ColumnPDF("CtvProposto", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "CtvProposto", "Controvalore<br>proposto (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                tabellaKS.Columns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Var", "Rischio Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                tabellaKS.FooterColumns.Add(new ColumnPDF("NomeProdotto", 210, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                tabellaKS.FooterColumns.Add(new ColumnPDF("CtvSottoscrizione", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaKS.FooterColumns.Add(new ColumnPDF("Frequenza", 50, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                tabellaKS.FooterColumns.Add(new ColumnPDF("Conversione", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaKS.FooterColumns.Add(new ColumnPDF("CtvProposto", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaKS.FooterColumns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                //Formatto la riga di aggregazione 
                for (int i = 0; i < dati.Tables["operazioniPPINS"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniPPINS"].Rows[i][0].ToString() == "$")
                    {
                        tabellaKS.Cells[0, i].FontBold =
                        tabellaKS.Cells[2, i].FontBold =
                        tabellaKS.Cells[3, i].FontBold =
                        tabellaKS.Cells[4, i].FontBold =
                        tabellaKS.Cells[5, i].FontBold = true;
                    }
                    else
                    {
                        tabellaKS.Cells[2, i].FontBold =
                        tabellaKS.Cells[3, i].FontBold =
                        tabellaKS.Cells[4, i].FontBold =
                        tabellaKS.Cells[5, i].FontBold =
                        tabellaKS.Cells[0, i].FontBold = false;

                    }
                    tabellaKS.Cells[2, i].HorizontalAlignment =
                    tabellaKS.Cells[4, i].HorizontalAlignment =
                    tabellaKS.Cells[5, i].HorizontalAlignment =
                    tabellaKS.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;

                }

                AddElement(tabellaKS);

            }
            //if (dati.Tables["operazioniLabelKS"].Rows.Count > 0)
            //{
            //    AddElement(new SpacePDF(25));
            //    #region Label
            //    AddElement(new FormattedTextAreaPDF("Nuova sottoscrizione di Old Mutual Wealth Italy - In Prima Persona con programma periodico di investimento", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundMarginLeft = 5, BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            //    AddElement(new SpacePDF(15));
            //    AddElement(new FormattedTextAreaPDF("Frequenza switch: ", EnvironmentFacade.RendererFacade.XLeftLimit, 90) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelKS"].Rows[0]["Frequenza"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 90, 50) { FontSize = 7, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF("Durata programma: ", EnvironmentFacade.RendererFacade.XLeftLimit + 180, 90) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelKS"].Rows[0]["Durata"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 275, 50) { FontSize = 7, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF("Importo programma: ", EnvironmentFacade.RendererFacade.XLeftLimit + 350, 100) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF(Helper.FormatCurrency(dati.Tables["operazioniLabelKS"].Rows[0]["Importo"].ToString()), EnvironmentFacade.RendererFacade.XLeftLimit + 450) { FontSize = 7, AutoIncrementYWritable = true });
            //    AddElement(new SpacePDF(7));
            //    AddElement(new FormattedTextAreaPDF("Investimento iniziale: ", EnvironmentFacade.RendererFacade.XLeftLimit) { FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false, FontSize = 8 });
            //    AddElement(new FormattedTextAreaPDF(Helper.FormatCurrency(dati.Tables["operazioniLabelKS"].Rows[0]["Investimentoiniziale"].ToString()), EnvironmentFacade.RendererFacade.XLeftLimit + 105) { FontSize = 7, AutoIncrementYWritable = true });
            //    #endregion
            //    AddElement(new SpacePDF(15));
            //    #region tabella
            //    var tabellaKS = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniKS"], dati.Tables["operazioniKSfooter"])
            //    {
            //        Style = Style.ConsulenzaUnica,
            //        AlternateRow = false,
            //        ShowSeparationLines = true,
            //        WidthSeparationLines = 0.5F,
            //        RowHeight = 25
            //    };

            //    // Modifica per Saving Map
            //    tabellaKS.Columns.Add(new ColumnPDF("SavingMap", 13, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 10, ScaleColumnTypeImage = 0.50F });
            //    // Fine Modifica
            //    tabellaKS.Columns.Add(new ColumnPDF("Prodotto", 167, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "ProdottoDestinazione", "Prodotto di destinazione") { HeaderFontSize = 7 });
            //    tabellaKS.Columns.Add(new ColumnPDF("Controvaloreattuale", 95, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvaloreattuale", "Controvalore<br>attuale (€)") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaKS.Columns.Add(new ColumnPDF("Controvaloreproposto", 95, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvaloreproposto", "Controvalore<br>" + (isAdeguata ? "proposto (€)" : "prospettico (€)")) { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaKS.Columns.Add(new ColumnPDF("Rischiocredito", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiocredito", "Rischio<br>Credito") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaKS.Columns.Add(new ColumnPDF("VaR", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "RischioVaR", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });

            //    tabellaKS.FooterColumns.Add(new ColumnPDF("Prodotto", 180, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
            //    tabellaKS.FooterColumns.Add(new ColumnPDF("Controvaloreattuale", 95, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaKS.FooterColumns.Add(new ColumnPDF("Controvaloreproposto", 95, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaKS.FooterColumns.Add(new ColumnPDF("Rischiocredito", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
            //    tabellaKS.FooterColumns.Add(new ColumnPDF("VaR", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

            //    #endregion
            //    for (int i = 0; i < dati.Tables["operazioniKS"].Rows.Count; i++)
            //    {
            //        tabellaKS.Cells[2, i].HorizontalAlignment =
            //            tabellaKS.Cells[3, i].HorizontalAlignment =
            //            tabellaKS.Cells[4, i].HorizontalAlignment =
            //            tabellaKS.Cells[5, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
            //    }
            //    AddElement(tabellaKS);

            //    AddElement(new SpacePDF(20));
            //}
            #endregion

            #region Tabella delle RS
            if (dati.Tables["operazioniFVI"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(A)</font> Nuove sottoscrizioni - Premio periodico", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                #endregion
                var operazioniFVI = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniFVI"], dati.Tables["operazioniFVIFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    HeaderHeight = 30
                };

                operazioniFVI.Columns.Add(new ColumnPDF("NomeProdotto", 160, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NomeProdotto", "Nome prodotto") { HeaderFontSize = 7 });
                operazioniFVI.Columns.Add(new ColumnPDF("CodiceInterno", 55, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "CodiceInterno", "Codice<br>Interno") { HeaderFontSize = 7, PaddingLeft = 10, HeaderPaddingLeft = 10 });
                operazioniFVI.Columns.Add(new ColumnPDF("PremioUnicoAggiuntivo", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PremioUnicoAggiuntivo", "Premio unico<br>aggiuntivo (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniFVI.Columns.Add(new ColumnPDF("Frequenza", 50, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Frequenza", "Rata (€)/<br>Frequenza") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniFVI.Columns.Add(new ColumnPDF("NumeroAnnualita", 65, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "NumeroAnnualita", "Numero<br>annualità") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniFVI.Columns.Add(new ColumnPDF("PianoVersamenti", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "PianoVersamenti", "Piano dei<br>versamenti (€)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });
                operazioniFVI.Columns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Var", "Rischio Mercato<br>(VaR %)") { HeaderPaddingLeft = 4, HeaderFontSize = 7, PaddingRight = 4 });

                operazioniFVI.FooterColumns.Add(new ColumnPDF("NomeProdotto", 215, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                operazioniFVI.FooterColumns.Add(new ColumnPDF("PremioUnicoAggiuntivo", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniFVI.FooterColumns.Add(new ColumnPDF("Frequenza", 50, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniFVI.FooterColumns.Add(new ColumnPDF("NumeroAnnualita", 65, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                operazioniFVI.FooterColumns.Add(new ColumnPDF("PianoVersamenti", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                operazioniFVI.FooterColumns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

                //Formatto la riga di aggregazione 
                for (int i = 0; i < dati.Tables["operazioniFVI"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniFVI"].Rows[i][0].ToString() == "$")
                    {
                        operazioniFVI.Cells[0, i].FontBold =
                        operazioniFVI.Cells[2, i].FontBold =
                        operazioniFVI.Cells[3, i].FontBold =
                        operazioniFVI.Cells[4, i].FontBold =
                        operazioniFVI.Cells[5, i].FontBold = true;
                    }
                    else
                    {
                        operazioniFVI.Cells[2, i].FontBold =
                        operazioniFVI.Cells[3, i].FontBold =
                        operazioniFVI.Cells[4, i].FontBold =
                        operazioniFVI.Cells[5, i].FontBold =
                        operazioniFVI.Cells[0, i].FontBold = false;

                    }
                    operazioniFVI.Cells[2, i].HorizontalAlignment =
                    operazioniFVI.Cells[3, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    operazioniFVI.Cells[4, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                    operazioniFVI.Cells[5, i].HorizontalAlignment =
                    operazioniFVI.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;

                }
                AddElement(operazioniFVI);
            }

            #endregion

            #region Tabella delle RM OLD
            //if (dati.Tables["operazioniLabelRM"].Rows.Count > 0)
            //{
            //    AddElement(new SpacePDF(25));
            //    #region Label
            //    AddElement(new FormattedTextAreaPDF("Nuova sottoscrizione a premio periodico", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundMarginLeft = 5, BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
            //    AddElement(new SpacePDF(15));
            //    AddElement(new FormattedTextAreaPDF("Tipo rateazione: ", EnvironmentFacade.RendererFacade.XLeftLimit, 80) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelRM"].Rows[0]["TipoRata"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 80) { FontSize = 7, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF("Rata programmata (€): ", EnvironmentFacade.RendererFacade.XLeftLimit + 180, 105) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF(Helper.FormatCurrency(dati.Tables["operazioniLabelRM"].Rows[0]["Rata"].ToString()), EnvironmentFacade.RendererFacade.XLeftLimit + 290, 50) { FontSize = 7, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF("Numero annualità: ", EnvironmentFacade.RendererFacade.XLeftLimit + 380, 100) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelRM"].Rows[0]["Numero"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 470) { FontSize = 7, AutoIncrementYWritable = true });
            //    AddElement(new SpacePDF(7));
            //    AddElement(new FormattedTextAreaPDF("Premio unico aggiuntivo (€): ", EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
            //    AddElement(new FormattedTextAreaPDF(Helper.FormatCurrency(dati.Tables["operazioniLabelRM"].Rows[0]["Premio"].ToString()), EnvironmentFacade.RendererFacade.XLeftLimit + 135) { FontSize = 7, AutoIncrementYWritable = true });
            //    #endregion
            //    AddElement(new SpacePDF(15));
            //    #region tabella
            //    var tabellaRM = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniRM"], dati.Tables["operazioniRMfooter"])
            //    {
            //        Style = Style.ConsulenzaUnica,
            //        AlternateRow = false,
            //        ShowSeparationLines = true,
            //        WidthSeparationLines = 0.5F,
            //        RowHeight = 25
            //    };

            //    // Modifica per Saving Map
            //    tabellaRM.Columns.Add(new ColumnPDF("SavingMap", 13, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 10, ScaleColumnTypeImage = 0.50F });
            //    // Fine Modifica
            //    tabellaRM.Columns.Add(new ColumnPDF("Prodotto", 127, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Prodotto", "Prodotto") { HeaderFontSize = 7 });
            //    tabellaRM.Columns.Add(new ColumnPDF("Controvaloreattuale", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Rata", "Rata programm.<br>(€)") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaRM.Columns.Add(new ColumnPDF("Controvaloreproposto", 90, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Premioaggiuntivo", "Premio unico<br>aggiuntivo (€)") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaRM.Columns.Add(new ColumnPDF("Premiversati", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Premiversati", "Premi versati<br>sottoscr. (€)") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaRM.Columns.Add(new ColumnPDF("Rischiocredito", 70, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Rischiocredito", "Rischio<br>Credito") { HeaderFontSize = 7, PaddingRight = 4 });
            //    tabellaRM.Columns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "RischioVaR", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });

            //    tabellaRM.FooterColumns.Add(new ColumnPDF("Prodotto", 140, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
            //    tabellaRM.FooterColumns.Add(new ColumnPDF("Controvaloreattuale", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaRM.FooterColumns.Add(new ColumnPDF("Controvaloreproposto", 90, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaRM.FooterColumns.Add(new ColumnPDF("Premiversati", 80, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
            //    tabellaRM.FooterColumns.Add(new ColumnPDF("Rischiocredito", 70, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
            //    tabellaRM.FooterColumns.Add(new ColumnPDF("VaR", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });

            //    for (int i = 0; i < dati.Tables["operazioniRM"].Rows.Count; i++)
            //    {
            //        tabellaRM.Cells[2, i].HorizontalAlignment =
            //            tabellaRM.Cells[3, i].HorizontalAlignment =
            //            tabellaRM.Cells[4, i].HorizontalAlignment =
            //            tabellaRM.Cells[5, i].HorizontalAlignment =
            //            tabellaRM.Cells[6, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
            //    }
            //    #endregion
            //    AddElement(tabellaRM);
            //}
            #endregion

            #region Fondo Pensione
            if (dati.Tables["operazioniFondoPensione"].Rows.Count > 0)
            {
                AddElement(new SpacePDF(25));
                #region Label
                //AddElement(new FormattedTextAreaPDF(Helper.ReplaceVariables("Adesione al Fondo Pensione $/Banca/$", base.EnvironmentFacade.ReportEnvironment), EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundMarginLeft = 5, BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
                //AddElement(new SpacePDF(15));
                //AddElement(new FormattedTextAreaPDF("Adesione con trasferimento da altra forma pensionistica: ", EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = false });
                //AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelFondoPensione"].Rows[0]["Adesionetrasferimento"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 260) { FontSize = 7, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(10));
                //AddElement(new FormattedTextAreaPDF("Contributi programmati per la prestazione principale", EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 8, FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontBold = true, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(7));
                //AddElement(new FormattedTextAreaPDF("Contributo dell'Aderente: ", EnvironmentFacade.RendererFacade.XLeftLimit) { FontColor = ColorPDF.Nero, FontSize = 7, FontBold = true, AutoIncrementYWritable = false });
                //AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelFondoPensione"].Rows[0]["ContributoAderente"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 110) { FontSize = 7, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(7));
                //AddElement(new FormattedTextAreaPDF("Contributo del Datore di lavoro: ", EnvironmentFacade.RendererFacade.XLeftLimit) { FontColor = ColorPDF.Nero, FontSize = 7, FontBold = true, AutoIncrementYWritable = false });
                //AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelFondoPensione"].Rows[0]["ContributoDatorelavoro"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 135) { FontSize = 7, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(7));
                //AddElement(new FormattedTextAreaPDF("Conferimento del TFR: ", EnvironmentFacade.RendererFacade.XLeftLimit) { FontColor = ColorPDF.Nero, FontSize = 7, FontBold = true, AutoIncrementYWritable = false });
                //AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelFondoPensione"].Rows[0]["ConferimentoTFR"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 100) { FontSize = 7, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(10));
                //AddElement(new FormattedTextAreaPDF("Contributi e premi versati all'adesione (€)", EnvironmentFacade.RendererFacade.XLeftLimit) { FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontSize = 8, FontBold = true, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(7));
                //AddElement(new FormattedTextAreaPDF("Contributo dell'Aderente: ", EnvironmentFacade.RendererFacade.XLeftLimit) { FontColor = ColorPDF.Nero, FontSize = 7, FontBold = true, AutoIncrementYWritable = false });
                //AddElement(new FormattedTextAreaPDF(Helper.FormatCurrency(dati.Tables["operazioniLabelFondoPensione"].Rows[0]["AdesioneAderente"].ToString()), EnvironmentFacade.RendererFacade.XLeftLimit + 110) { FontSize = 7, AutoIncrementYWritable = false });

                ////AddElement(new FormattedTextAreaPDF("Premio di primo anno per le prestazioni assicurative accessorie: ", EnvironmentFacade.RendererFacade.XLeftLimit+230) { FontColor = ColorPDF.Nero, FontSize = 7, FontBold = true, AutoIncrementYWritable = false });
                //AddElement(new FormattedTextAreaPDF("Contributo aggiuntivo dell’Aderente: ", EnvironmentFacade.RendererFacade.XLeftLimit + 230) { FontColor = ColorPDF.Nero, FontSize = 7, FontBold = true, AutoIncrementYWritable = false });
                //AddElement(new FormattedTextAreaPDF(dati.Tables["operazioniLabelFondoPensione"].Rows[0]["PremioPrimoAnno"].ToString(), EnvironmentFacade.RendererFacade.XLeftLimit + 385) { FontSize = 7, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(15));
                //AddElement(new FormattedTextAreaPDF("Destinazione dei versamenti al Fondo Pensione", EnvironmentFacade.RendererFacade.XLeftLimit) { FontColor = ColorPDF.ConsulenzaUnica_Rosso, FontSize = 8, FontBold = true, AutoIncrementYWritable = true });
                //AddElement(new SpacePDF(10));
               
                AddElement(new FormattedTextAreaPDF("<font color=#FF0000>(A)</font> Nuove sottoscrizioni - Fondo Pensione Fideuram", EnvironmentFacade.RendererFacade.XLeftLimit) { BackGroundColor = ColorPDF.Bianco, FontColor = ColorPDF.Nero, FontSize = 8, FontBold = true, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, BackGroundMarginLeft = 5 });
                
                #endregion

                #region tabella
                var tabellaFondoPensione = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["operazioniFondoPensione"], dati.Tables["operazioniFondoPensioneFooter"])
                {
                    Style = Style.ConsulenzaUnica,
                    AlternateRow = false,
                    ShowSeparationLines = true,
                    WidthSeparationLines = 0.5F,
                    RowHeight = 25,
                    RowsPadding = 3,
                    HeaderHeight = 30,

                };

                // Modifica per Saving Map
                tabellaFondoPensione.Columns.Add(new ColumnPDF("SavingMap", 13, HorizontalAlignmentType.Sinistra, false, false, 6, ColumnType.Immagine, "SavingMap", string.Empty) { DeltaYContent = 10, ScaleColumnTypeImage = 0.50F });
                // Fine Modifica
                tabellaFondoPensione.Columns.Add(new ColumnPDF("Prodotto", 149, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Prodotto", "Prodotto") { HeaderFontSize = 7 });
                tabellaFondoPensione.Columns.Add(new ColumnPDF("ContributiversatiAdesione", 75, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ContributiversatiAdesione", "Contributi versati<br>all'adesione (€)") { HeaderFontSize = 7, PaddingRight = 5 });
                tabellaFondoPensione.Columns.Add(new ColumnPDF("ContrAderenteDatorePerc", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ContrAderenteDatorePerc", "Contributo Aderente/<br>Datore (%)") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaFondoPensione.Columns.Add(new ColumnPDF("ContrAderenteDatore", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "ContrAderenteDatore", "Contributo Aderente/<br>Datore (€)") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaFondoPensione.Columns.Add(new ColumnPDF("TFR", 40, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "TFR", "TFR (%)") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaFondoPensione.Columns.Add(new ColumnPDF("Altraformapensione", 68, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Altraformapensione", "Trasf. da altra<br>forma pens. (%)") { HeaderFontSize = 7, PaddingRight = 4 });
                tabellaFondoPensione.Columns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Var", "Rischio<br>Mercato<br>VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });

                tabellaFondoPensione.FooterColumns.Add(new ColumnPDF("Prodotto", 162, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo));
                tabellaFondoPensione.FooterColumns.Add(new ColumnPDF("ContributiversatiAdesione", 75, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaFondoPensione.FooterColumns.Add(new ColumnPDF("ContrAderenteDatorePerc", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaFondoPensione.FooterColumns.Add(new ColumnPDF("ContrAderenteDatore", 60, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale) { PaddingRight = 4 });
                tabellaFondoPensione.FooterColumns.Add(new ColumnPDF("TFR", 40, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                tabellaFondoPensione.FooterColumns.Add(new ColumnPDF("Altraformapensione", 68, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Testo) { PaddingRight = 4 });
                tabellaFondoPensione.FooterColumns.Add(new ColumnPDF("Var", 45, HorizontalAlignmentType.Destra, true, true, 7, ColumnType.Decimale));

                for (int i = 0; i < dati.Tables["operazioniFondoPensione"].Rows.Count; i++)
                {
                    if (dati.Tables["operazioniFondoPensione"].Rows[i][0].ToString() == "$")
                    {
                        tabellaFondoPensione.Cells[1, i].FontBold =
                        tabellaFondoPensione.Cells[2, i].FontBold =
                        tabellaFondoPensione.Cells[3, i].FontBold =
                        tabellaFondoPensione.Cells[4, i].FontBold =
                        tabellaFondoPensione.Cells[5, i].FontBold = true;
                        tabellaFondoPensione.Cells[1, i].ColSpan = 2;
                    }
                    else
                    {
                        tabellaFondoPensione.Cells[1, i].FontBold =
                        tabellaFondoPensione.Cells[2, i].FontBold =
                        tabellaFondoPensione.Cells[3, i].FontBold =
                        tabellaFondoPensione.Cells[4, i].FontBold =
                        tabellaFondoPensione.Cells[5, i].FontBold = false;
                        tabellaFondoPensione.Cells[1, i].ColSpan = 0;
                    }
                    tabellaFondoPensione.Cells[2, i].HorizontalAlignment =
                    tabellaFondoPensione.Cells[3, i].HorizontalAlignment =
                    tabellaFondoPensione.Cells[4, i].HorizontalAlignment =
                    tabellaFondoPensione.Cells[5, i].HorizontalAlignment =
                    tabellaFondoPensione.Cells[6, i].HorizontalAlignment =
                    tabellaFondoPensione.Cells[7, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
                }

                #endregion
                AddElement(tabellaFondoPensione);
            }

            #endregion
        }

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


        protected sealed override DataSet GetDataSet()
        {
            #region datatable
            var ds = new DataSet();

            ds.Tables.Add(new DataTable("sintesiOperazioniLabel"));
            ds.Tables.Add(new DataTable("sintesiOperazioni"));
            //ds.Tables.Add(new DataTable("sintesiOperazionifooter"));

            ds.Tables.Add(new DataTable("tipoOperazioni"));
            ds.Tables.Add(new DataTable("operazioni"));
            ds.Tables.Add(new DataTable("DToperazioni"));
            ds.Tables.Add(new DataTable("operazionifooter"));

            ds.Tables.Add(new DataTable("operazioniLabelPACTerzi"));
            ds.Tables.Add(new DataTable("operazioniPACTerzi"));
            ds.Tables.Add(new DataTable("operazioniPACTerziFooter"));

            ds.Tables.Add(new DataTable("operazioniLabelPACFonditalia"));
            ds.Tables.Add(new DataTable("operazioniPACFonditalia"));
            ds.Tables.Add(new DataTable("operazioniPACFonditaliaFooter"));

            ds.Tables.Add(new DataTable("operazioniLabelCPNS"));
            ds.Tables.Add(new DataTable("operazioniCPNS"));
            ds.Tables.Add(new DataTable("operazioniCPNSFooter"));

            ds.Tables.Add(new DataTable("operazioniLabelCPCV"));
            ds.Tables.Add(new DataTable("operazioniCPCV"));
            ds.Tables.Add(new DataTable("operazioniCPCVFooter"));

            ds.Tables.Add(new DataTable("operazioniLabelCP"));
            ds.Tables.Add(new DataTable("operazioniCP"));
            ds.Tables.Add(new DataTable("operazioniCPfooter"));

            ds.Tables.Add(new DataTable("operazioniLabelPPINS"));
            ds.Tables.Add(new DataTable("operazioniPPINS"));
            ds.Tables.Add(new DataTable("operazioniPPINSFooter"));

            ds.Tables.Add(new DataTable("operazioniLabelPPIPV"));//ex KE
            ds.Tables.Add(new DataTable("operazioniPPIPV"));
            ds.Tables.Add(new DataTable("operazioniPPIPVFooter"));

            ds.Tables.Add(new DataTable("operazioniLabelFVI"));
            ds.Tables.Add(new DataTable("operazioniFVI"));
            ds.Tables.Add(new DataTable("operazioniFVIFooter"));

            ds.Tables.Add(new DataTable("operazioniLabelFondoPensione"));
            ds.Tables.Add(new DataTable("operazioniFondoPensione"));
            ds.Tables.Add(new DataTable("operazioniFondoPensionefooter"));
            #endregion

            #region dati e condizioni
            var posizioni = datiSeiUnico.propostaUnit().dettaglioProdotti.dettaglioProdotti;
            var dettaglioOperazioni = datiSeiUnico.propostaUnit().dettaglioOperazioni.elencoDettagliOperazioni.ToList();
            string[] codInterno = { };
            string[] codTipoOperazione = { };
            decimal ctvSottoprodotto;


            #endregion

            var listaopnormali = posizioni.ToList();
            var listaoperazioninormali = dettaglioOperazioni.ToList();

            var listaLiquiditaKEKSPV = new posizioneOperazione[0].ToList();

            #region sintesiOperazioni
            ds.Tables["sintesiOperazioni"].Columns.Add(new DataColumn("nuoveSottoscrizioni", typeof(decimal)));
            ds.Tables["sintesiOperazioni"].Columns.Add(new DataColumn("aggiuntivi", typeof(decimal)));
            ds.Tables["sintesiOperazioni"].Columns.Add(new DataColumn("disinvestimenti", typeof(decimal)));
            ds.Tables["sintesiOperazioni"].Columns.Add(new DataColumn("saldo", typeof(decimal)));

            decimal totaleNuoveSottoscrizioni = 0;
            decimal totaleAggiuntivi = 0;
            decimal totaleDisinvestimenti = 0;


            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 select new { posizione = p, dettaglioOperazione = d })
            {
                var operazioni = item.dettaglioOperazione.listaOperzioni.FirstOrDefault();// && !(codTipoOperazione.Contains(item.posizione.tipoOperazione) && tipoContratto.Contains(l.stDettaglioContratto.tipoContratto)));

                if (operazioni != null)
                {


                    if (operazioni.codTipoOperazione.Equals("NS"))
                    {
                        totaleNuoveSottoscrizioni = totaleNuoveSottoscrizioni + item.posizione.ctvPro;

                    }
                    else if (operazioni.investi > 0)
                    {
                        totaleAggiuntivi = totaleAggiuntivi + item.posizione.investi;
                    }
                    else
                    {
                        totaleDisinvestimenti = totaleDisinvestimenti + item.posizione.disinvesti * (-1);
                    }

                }
            }
            ds.Tables["sintesiOperazioni"].Rows.Add(
                totaleNuoveSottoscrizioni,
                totaleAggiuntivi,
                totaleDisinvestimenti,
                totaleNuoveSottoscrizioni + totaleAggiuntivi + totaleDisinvestimenti);





            #endregion

            #region PAC Terzi
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("id", typeof(string)));
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("nomeProdotto", typeof(string)));
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("codiceInterno", typeof(string)));
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("primoVersamento", typeof(decimal)));
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("rata", typeof(decimal)));
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("frequenza", typeof(string)));
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("valoreNominale", typeof(decimal)));
            ds.Tables["operazioniPACTerzi"].Columns.Add(new DataColumn("var", typeof(decimal)));


            ds.Tables["operazioniPACTerziFooter"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniPACTerziFooter"].Columns.Add(new DataColumn("primoVersamento", typeof(decimal)));
            ds.Tables["operazioniPACTerziFooter"].Columns.Add(new DataColumn("rata", typeof(string)));
            ds.Tables["operazioniPACTerziFooter"].Columns.Add(new DataColumn("frequenza", typeof(string)));
            ds.Tables["operazioniPACTerziFooter"].Columns.Add(new DataColumn("valoreNominale", typeof(string)));
            ds.Tables["operazioniPACTerziFooter"].Columns.Add(new DataColumn("var", typeof(string)));


            codTipoOperazione = new string[] { "NS" };
            codInterno = new string[] { "01"};
            string [] tipoProdotto = new string[] { "FI" };
            string [] contestoWizard = new string[] { "PAC" };
            var mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();


            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where !codInterno.Contains(p.prodotto.codInterno) && tipoProdotto.Contains(p.prodotto.tipoProdotto)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {
                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where codTipoOperazione.Contains(l.codTipoOperazione) && contestoWizard.Contains(l.stDettaglioContratto.contestoWizard)
                                 select l;
                if (operazioni.Count() != 1)
                    continue;

                listaopnormali.Remove(item.posizione);

                var operazione = operazioni.LastOrDefault();
                string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);

            }


            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                ds.Tables["operazioniPACTerzi"].Rows.Add(
                             "$",descContratto, "", null, null, "",null, null
                            );
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    ds.Tables["operazioniPACTerzi"].Rows.Add(
                      "",
                      posOper.posizione.prodotto.nomeProdotto,
                      posOper.posizione.prodotto.codSottoprodottoFE,
                      posOper.operazione.primoVersamento,
                      posOper.operazione.importoRata,
                      decodeFrequenza(posOper.operazione.frequenza) + "<br>" + posOper.operazione.durata + " " + posOper.operazione.tipoDurata,
                      posOper.operazione.valoreNominalePiano,
                      posOper.operazione.rischioMercato
                     );

                }

            }

            ds.Tables["operazioniPACTerziFooter"].Rows.Add(
               "Totale",
               ds.Tables["operazioniPACTerzi"].AsEnumerable().Where(x => x.Field<string>("ID") != "$").Sum(x => x.Field<decimal>("primoVersamento")),
               "-",
               "-",
               "-",
               "-"
           );


            #endregion

            #region PAC Fonditalia
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("id", typeof(string)));
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("nomeProdotto", typeof(string)));
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("codiceInterno", typeof(string)));
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("primoVersamento", typeof(decimal)));
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("rata", typeof(decimal)));
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("frequenza", typeof(string)));
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("valoreNominale", typeof(decimal)));
            ds.Tables["operazioniPACFonditalia"].Columns.Add(new DataColumn("var", typeof(decimal)));

            ds.Tables["operazioniPACFonditaliaFooter"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniPACFonditaliaFooter"].Columns.Add(new DataColumn("primoVersamento", typeof(decimal)));
            ds.Tables["operazioniPACFonditaliaFooter"].Columns.Add(new DataColumn("rata", typeof(string)));
            ds.Tables["operazioniPACFonditaliaFooter"].Columns.Add(new DataColumn("frequenza", typeof(string)));
            ds.Tables["operazioniPACFonditaliaFooter"].Columns.Add(new DataColumn("valoreNominale", typeof(string)));
            ds.Tables["operazioniPACFonditaliaFooter"].Columns.Add(new DataColumn("var", typeof(string)));

            codTipoOperazione = new string[] { "NS" };
            codInterno = new string[] { "01" };
             tipoProdotto = new string[] { "FI" };
             contestoWizard = new string[] { "PAC" };
             mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();


            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where codInterno.Contains(p.prodotto.codInterno) && tipoProdotto.Contains(p.prodotto.tipoProdotto)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {
                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where codTipoOperazione.Contains(l.codTipoOperazione) && contestoWizard.Contains(l.stDettaglioContratto.contestoWizard)
                                 select l;
                if (operazioni.Count() != 1)
                    continue;

                listaopnormali.Remove(item.posizione);

                var operazione = operazioni.LastOrDefault();
                string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                             
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);
            }


            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                ds.Tables["operazioniPACFonditalia"].Rows.Add(
                            "$", descContratto, "",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.primoVersamento),
                            mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.rataProgrammata),
                            "-",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.valoreNominalePiano), 
                            null
                            );
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    ds.Tables["operazioniPACFonditalia"].Rows.Add(
                      "",
                      posOper.posizione.prodotto.nomeProdotto,
                      posOper.posizione.prodotto.codSottoprodottoFE,
                      posOper.operazione.primoVersamento,
                      posOper.operazione.importoRata,
                      decodeFrequenza(posOper.operazione.stDettaglioContratto.frequenza),
                      posOper.operazione.valoreNominalePiano,
                      posOper.operazione.rischioMercato
                     );

                }

            }


            ds.Tables["operazioniPACFonditaliaFooter"].Rows.Add(
               "Totale",
               ds.Tables["operazioniPACFonditalia"].AsEnumerable().Where(x => x.Field<string>("ID") != "$").Sum(x => x.Field<decimal>("primoVersamento")),
               "-",
               "-",
               "-",
               "-"
           );
            #endregion

            #region Conversioni Programmate NS

            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("id", typeof(string)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("ControvaloreSottoscrizione", typeof(decimal)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("Rata", typeof(string)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("Durata", typeof(string)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("ControvalorePropost", typeof(decimal)));
            ds.Tables["operazioniCPNS"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["operazioniCPNSFooter"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniCPNSFooter"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["operazioniCPNSFooter"].Columns.Add(new DataColumn("Rata", typeof(string)));
            ds.Tables["operazioniCPNSFooter"].Columns.Add(new DataColumn("Conversione", typeof(string)));
            ds.Tables["operazioniCPNSFooter"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniCPNSFooter"].Columns.Add(new DataColumn("Var", typeof(string)));

            codTipoOperazione = new string[] { "NS" };
            codInterno = new string[] { "XY", "FO" };
            mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();

            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where codInterno.Contains(p.prodotto.codInterno)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {
                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where codTipoOperazione.Contains(l.codTipoOperazione) && (l.importoConversioneProgrammata != 0)
                                 select l;
                var operazione = operazioni.LastOrDefault();
                if (operazione == null)
                {
                    continue;
                }
                listaopnormali.Remove(item.posizione);

                string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);
            }

            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                ds.Tables["operazioniCPNS"].Rows.Add(
                            "$", descContratto, "",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.ctvSottoscrizione),
                           "-",
                            "-",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro),
                            null
                            );
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    ds.Tables["operazioniCPNS"].Rows.Add(
                      "",
                      posOper.posizione.prodotto.nomeProdotto,
                      posOper.posizione.prodotto.codSottoprodottoFE,
                      posOper.operazione.ctvSottoscrizione,
                      posOper.operazione.importoRata,
                      posOper.operazione.durata + " Mesi",
                      posOper.operazione.importoConversioneProgrammata,
                      posOper.posizione.ctvPro,
                      posOper.operazione.rischioMercato
                     );
                }
            }

            if (ds.Tables["operazioniCPNS"].Rows.Count > 0)
            {
                ds.Tables["operazioniCPNSFooter"].Rows.Add(
                  "Totale operazioni",
                  ds.Tables["operazioniCPNS"].AsEnumerable().Where(x => x.Field<string>("id") != "$").Sum(x => x.Field<decimal>("ControvaloreSottoscrizione")),
                  "-",
                  "-",
                  ds.Tables["operazioniCPNS"].AsEnumerable().Where(x => x.Field<string>("id") != "$").Sum(x => x.Field<decimal>("ControvalorePropost")),
                  "-"
                 );
            }
            #endregion

            #region Conversioni Programmate CV

            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("id", typeof(string)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("Rata", typeof(string)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("Durata", typeof(string)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("ControvaloreProposto", typeof(decimal)));
            ds.Tables["operazioniCPCV"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["operazioniCPCVFooter"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniCPCVFooter"].Columns.Add(new DataColumn("ControvaloreAttuale", typeof(decimal)));
            ds.Tables["operazioniCPCVFooter"].Columns.Add(new DataColumn("Rata", typeof(string)));
            ds.Tables["operazioniCPCVFooter"].Columns.Add(new DataColumn("Conversione", typeof(string)));
            ds.Tables["operazioniCPCVFooter"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniCPCVFooter"].Columns.Add(new DataColumn("Var", typeof(string)));

            codTipoOperazione = new string[] { "CP" };
            codInterno = new string[] { "XY", "FO" };
            mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();

            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where codInterno.Contains(p.prodotto.codInterno)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {
                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where codTipoOperazione.Contains(l.codTipoOperazione) 
                                 select l;
                var operazione = operazioni.LastOrDefault();
                if (operazione == null)
                {
                    continue;
                }
                listaopnormali.Remove(item.posizione);

                string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);



            }
          


            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                ds.Tables["operazioniCPCV"].Rows.Add(
                            "$", descContratto, "",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvAttuale),
                            "-",
                            "-",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro),
                            null
                            );
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    ds.Tables["operazioniCPCV"].Rows.Add(
                      "",
                      posOper.posizione.prodotto.nomeProdotto,
                      posOper.posizione.prodotto.codSottoprodottoFE,
                      posOper.posizione.ctvAttuale,
                      posOper.operazione.importoRata,
                      posOper.operazione.durata + " Mesi",
                      posOper.operazione.investiSpecified ? posOper.operazione.investi : posOper.operazione.disinvesti * (-1),
                      posOper.posizione.ctvPro,
                      posOper.operazione.rischioMercato
                     );

                }
                if (ds.Tables["operazioniCPCV"].Rows.Count > 0)
                {
                    ds.Tables["operazioniCPCVFooter"].Rows.Add(
                      "Totale operazioni",
                      ds.Tables["operazioniCPCV"].AsEnumerable().Where(x => x.Field<string>("id") != "$").Sum(x => x.Field<decimal>("ControvaloreAttuale")),
                      "-",
                      "-",
                      ds.Tables["operazioniCPCV"].AsEnumerable().Where(x => x.Field<string>("id") != "$").Sum(x => x.Field<decimal>("ControvaloreProposto")),
                      "-"
                     );
                }

            }

            //è necessario aggiungere alla mappa dei contratti anche quelli dei fondi con attivazione della conversione programmata

            codTipoOperazione = new string[] { "CV" };
            tipoProdotto = new string[] { "FI" };
            mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();

            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where tipoProdotto.Contains(p.prodotto.tipoProdotto)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {
                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where codTipoOperazione.Contains(l.codTipoOperazione) && (l.frequenza != null)
                                 select l;
                var operazione = operazioni.LastOrDefault();
                if (operazione == null)
                {
                    continue;
                }
                listaopnormali.Remove(item.posizione);

                string key = item.posizione.codContratto + " - " + item.posizione.prodotto.nomeContratto;
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);



            }

            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                ds.Tables["operazioniCPCV"].Rows.Add(
                            "$", descContratto, "",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvAttuale),
                           "-",
                            "-",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro),
                            null
                            );
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    ds.Tables["operazioniCPCV"].Rows.Add(
                      "",
                      posOper.posizione.prodotto.nomeProdotto,
                      posOper.posizione.prodotto.codSottoprodotto,
                      posOper.posizione.ctvAttuale,
                      posOper.operazione.importoRata,
                      decodeFrequenza(posOper.operazione.frequenza),
                      posOper.operazione.investiSpecified ? posOper.operazione.investi : posOper.operazione.disinvesti*(-1),
                      posOper.posizione.ctvPro,
                      posOper.operazione.rischioMercato
                     );

                }

            }

            #endregion

            #region CP OLD
            //ds.Tables["tipoOperazioni"].Columns.Add(new DataColumn("Tipologia", typeof(string)));

            //ds.Tables["operazioniLabelCP"].Columns.Add(new DataColumn("Tipologia", typeof(string)));
            //ds.Tables["operazioniLabelCP"].Columns.Add(new DataColumn("Importo", typeof(decimal)));
            //ds.Tables["operazioniLabelCP"].Columns.Add(new DataColumn("Durata", typeof(string)));

            //ds.Tables["operazioniCP"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            //ds.Tables["operazioniCP"].Columns.Add(new DataColumn("codiceInterno", typeof(string)));
            ////ds.Tables["operazioniCP"].Columns.Add(new DataColumn("StatoCP", typeof(string)));
            //ds.Tables["operazioniCP"].Columns.Add(new DataColumn("ControvaloreSottoscrizione", typeof(decimal)));
            //ds.Tables["operazioniCP"].Columns.Add(new DataColumn("Rata", typeof(decimal)));
            //ds.Tables["operazioniCP"].Columns.Add(new DataColumn("ConversioneProgrammata", typeof(decimal)));

            //ds.Tables["operazioniCP"].Columns.Add(new DataColumn("ControvaloreProposto", typeof(decimal)));
            //ds.Tables["operazioniCP"].Columns.Add(new DataColumn("VaR", typeof(string)));

            //ds.Tables["operazioniCPfooter"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            //ds.Tables["operazioniCPfooter"].Columns.Add(new DataColumn("ControvaloreSottoscrizione", typeof(decimal)));
            //ds.Tables["operazioniCPfooter"].Columns.Add(new DataColumn("ConversioneProgrammata", typeof(decimal)));
            //ds.Tables["operazioniCPfooter"].Columns.Add(new DataColumn("Rata", typeof(decimal)));
            //ds.Tables["operazioniCPfooter"].Columns.Add(new DataColumn("ControvaloreProposto", typeof(decimal)));
            //ds.Tables["operazioniCPfooter"].Columns.Add(new DataColumn("VaR", typeof(string)));

            //codTipoOperazione = new string[] { "CP" };
            //codInterno = new string[] { "XY", "FO" };
            //foreach (var item in from p in posizioni
            //                     join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
            //                     where codInterno.Contains(p.prodotto.codInterno)
            //                     orderby p.ctvPro descending
            //                     select new { posizione = p, dettaglioOperazione = d })
            //{

            //    var operazioni = from l in item.dettaglioOperazione.listaOperzioni
            //                     where codTipoOperazione.Contains(l.codTipoOperazione) || (l.importoConversioneProgrammata != 0)
            //                     select l;
            //    var operazione = operazioni.LastOrDefault();
            //    if (operazione == null)
            //    {
            //        continue;
            //    }
            //    Boolean isPS = false;
            //    var importoConversioneProgrammata = operazione.importoConversioneProgrammata;
            //    if (codTipoOperazione.Contains(operazione.codTipoOperazione))
            //    {
            //        ds.Tables["tipoOperazioni"].Rows.Add("PS");
            //        isPS = true;
            //    }
            //    if (item.posizione.isCPUscita)
            //    {//prendo solo la posizione in uscita CP              
            //        string tipologiaCP = "totale";
            //        decimal importo = 0;
            //        if (codTipoOperazione.Contains(operazione.codTipoOperazione))//CP
            //        {
            //            if (operazione.ctv > 0)
            //            {
            //                tipologiaCP = "parziale";
            //            }
            //            importo = operazione.disinvesti;
            //            importoConversioneProgrammata = (-1) * importo;
            //        }
            //        else //è NS
            //        {
            //            if (operazione.investi != 0)
            //            {
            //                tipologiaCP = "parziale";
            //            }
            //            importo = (-1) * operazione.importoConversioneProgrammata;
            //        }
            //        ds.Tables["operazioniLabelCP"].Rows.Add(
            //             tipologiaCP,
            //             importo,
            //             operazione.durata + " Mesi"
            //         );
            //    }
            //    else
            //    {
            //        if (isPS)
            //        { //per PS l'importo sta su investi
            //            importoConversioneProgrammata = operazione.investi;
            //        }
            //    }

            //    var controvaloreattuale = item.posizione.ctvAttuale;
            //    var ctvSottoscrizione = operazione.ctvSottoscrizione;
            //    string statoCP = "";
            //    if (item.posizione.isCPEntrata)
            //    {
            //        statoCP = "cpInEntrata.png";
            //    }
            //    else if (item.posizione.isCPUscita)
            //    {
            //        statoCP = "cpInUscita.png";
            //    }

            //    ds.Tables["operazioniCP"].Rows.Add(
            //                 item.posizione.prodotto.nomeProdotto,
            //                 statoCP,
            //                 isPS ? controvaloreattuale : ctvSottoscrizione,
            //                 importoConversioneProgrammata,
            //                 operazione.importoRata,
            //                 item.posizione.ctvPro,
            //                 item.posizione.prodotto.varProDec);
            //    //  listaoperazioninormali.Remove(item.dettaglioOperazione);
            //}

            //ds.Tables["operazioniCPfooter"].Rows.Add(
            //          "Totale",
            //          ds.Tables["operazioniCP"].AsEnumerable().Sum(x => x.Field<decimal>("ControvaloreSottoscrizione")),
            //          ds.Tables["operazioniCP"].AsEnumerable().Sum(x => x.Field<decimal>("ConversioneProgrammata")),
            //          ds.Tables["operazioniCP"].AsEnumerable().Sum(x => x.Field<decimal>("Rata")),
            //          ds.Tables["operazioniCP"].AsEnumerable().Sum(x => x.Field<decimal>("ControvaloreProposto")),
            //          ""
            //      );

            #endregion

            string[] tipoContratto = { };

            #region PPI NS
   
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("CtvSottoscrizione", typeof(decimal)));
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("Durata", typeof(string)));
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniLabelPPINS"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("id", typeof(string)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("CtvSottoscrizione", typeof(decimal)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("Durata", typeof(string)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniPPINS"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["operazioniPPINSFooter"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniPPINSFooter"].Columns.Add(new DataColumn("CtvSottoscrizione", typeof(decimal)));
            ds.Tables["operazioniPPINSFooter"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniPPINSFooter"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniPPINSFooter"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniPPINSFooter"].Columns.Add(new DataColumn("Var", typeof(string)));


            codInterno = new string[] { "KE", "KS" };
            codTipoOperazione = new string[] { "NS"};
            tipoContratto = new string[] { "PPI" };
            ctvSottoprodotto = 0;
            mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();

            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where codInterno.Contains(p.prodotto.codInterno)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {

                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where codTipoOperazione.Contains(l.codTipoOperazione) && l.stDettaglioContratto!=null && l.stDettaglioContratto.stDettaglioLinea[0]!=null && l.stDettaglioContratto.stDettaglioLinea[0].durataPPI != null
                                 select l;
              
                if (operazioni.Count() != 1)
                    continue;

                var operazione = operazioni.LastOrDefault();
                string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);

                listaopnormali.Remove(item.posizione);
            }
            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                string codProd = mapPosizioneOperazioni[descContratto][0].posizione.prodotto.codInterno;
                posizioneOperazione obj = new posizioneOperazione();
                DataServices.fideuram.data.service.rsSTPosizione pos = new DataServices.fideuram.data.service.rsSTPosizione();
                DataServices.fideuram.data.service.rsSTProdotto prod = new DataServices.fideuram.data.service.rsSTProdotto();
                prod.nomeProdotto = codProd == "KE" ? "In Pers - Linea liquidità" : "In PPers - Linea liquidità";
                prod.codSottoprodotto = "LIQUI";
                prod.codSottoprodottoFE = "-";
                pos.prodotto = new DataServices.fideuram.data.service.rsSTProdotto();
                pos.prodotto = prod;
                DataServices.fideuram.data.service.stDettaglioOperazioneBean oper = new DataServices.fideuram.data.service.stDettaglioOperazioneBean();
                oper.ctvSottoscrizione = mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro);
                pos.ctvPro = 0;
                oper.stDettaglioContratto = new DataServices.fideuram.data.service.stDettaglioContrattoBean();
                var listaLinea = new DataServices.fideuram.data.service.stDettaglioLineaBean[0].ToList();
                DataServices.fideuram.data.service.stDettaglioLineaBean linea = new DataServices.fideuram.data.service.stDettaglioLineaBean();
                linea.frequenzaPPI = mapPosizioneOperazioni[descContratto][0].operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPPI;
                linea.durataPPI = mapPosizioneOperazioni[descContratto][0].operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI;
                listaLinea.Add(linea);
                oper.stDettaglioContratto.stDettaglioLinea = listaLinea.ToArray();
                obj.posizione = pos;
                obj.operazione = oper;
                
                mapPosizioneOperazioni[descContratto].Add(obj);
                listaLiquiditaKEKSPV.Add(obj);
            }

  
                foreach (var descContratto in mapPosizioneOperazioni.Keys)
                {
                    ctvSottoprodotto = mapPosizioneOperazioni[descContratto].AsEnumerable().Where(x => x.posizione.prodotto.codSottoprodotto == "LIQUI").Sum(x => x.operazione.ctvSottoscrizione);
                    ds.Tables["operazioniPPINS"].Rows.Add(
                                "$", descContratto, "-",
                                ctvSottoprodotto,
                                "-",
                                "-",
                                mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro) - ctvSottoprodotto,
                                mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro),
                                "-"
                                );
                    foreach (var posOper in mapPosizioneOperazioni[descContratto])
                    {
                        ds.Tables["operazioniPPINS"].Rows.Add(
                          "",
                          posOper.posizione.prodotto.nomeProdotto,
                          posOper.posizione.prodotto.codSottoprodottoFE,
                          //da verificare se funziona sulla operazioni che non abbiamo forzato
                          //posOper.operazione.ctvSottoscrizione,
                          "LIQUI" == (posOper.posizione.prodotto.codSottoprodotto) ? posOper.operazione.ctvSottoscrizione.ToString(): "0",
                          "W" == (posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPPI) ? "Settimanale" + "<br>" + decodeDurataPPI(posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI).ToUpper() : "Mensile" + "<br>" + decodeDurataPPI(posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI).ToUpper(),
                          decodeDurataPPI(posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI),
                          //posOper.posizione.ctvPro - posOper.operazione.ctvSottoscrizione,
                          "LIQUI"==(posOper.posizione.prodotto.codSottoprodotto) ? (0 - posOper.operazione.ctvSottoscrizione) : posOper.posizione.ctvPro,
                          posOper.posizione.ctvPro,
                          posOper.operazione.rischioMercato
                         ) ;

                    }

                }

                ds.Tables["operazioniPPINSFooter"].Rows.Add(
                   "Totale operazioni",
                   ds.Tables["operazioniPPINS"].AsEnumerable().Where(x => x.Field<string>("ID") != "$").Sum(x => x.Field<decimal>("CtvSottoscrizione")),
                   "-",
                   ds.Tables["operazioniPPINS"].AsEnumerable().Where(x => x.Field<string>("ID") != "$").Sum(x => x.Field<decimal>("Conversione")),
                   ds.Tables["operazioniPPINS"].AsEnumerable().Where(x => x.Field<string>("ID") != "$").Sum(x => x.Field<decimal>("CtvProposto")),
                   "-"
               );



            #endregion
            
            #region PPI PV
            // var ke = posizioni.Where(p => p.prodotto.codInterno.Equals("KE") && (p.tipoOperazione.Equals("NS") || p.tipoOperazione.Equals("CV"))).ToList();
            //operazioniLabelKE
            //operazioniKE
            //operazioniKEfooter
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("CtvSottoscrizione", typeof(decimal)));
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("Durata", typeof(string)));
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniLabelPPIPV"].Columns.Add(new DataColumn("Var", typeof(string)));


            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("id", typeof(string)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("CtvSottoscrizione", typeof(decimal)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("Durata", typeof(string)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniPPIPV"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("CtvSottoscrizione", typeof(decimal)));
            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("Durata", typeof(string)));
            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("Conversione", typeof(decimal)));
            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("CtvProposto", typeof(decimal)));
            ds.Tables["operazioniPPIPVFooter"].Columns.Add(new DataColumn("Var", typeof(string)));


            codInterno = new string[] { "KE", "KS" };
            codTipoOperazione = new string[] { "NS" };
            tipoContratto = new string[] { "PPI" };
            mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();

            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where codInterno.Contains(p.prodotto.codInterno)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {

                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where !codTipoOperazione.Contains(l.codTipoOperazione) && l.stDettaglioContratto != null && l.stDettaglioContratto.stDettaglioLinea[0] != null && l.stDettaglioContratto.stDettaglioLinea[0].durataPPI != null
                                 select l;

                if (operazioni.Count() != 1)
                    continue;

                var operazione = operazioni.LastOrDefault();
                string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);

                // non è necessario rimuovere le operazioni dalla lista delle operazioni normali perchè da specifiche paragrafo 5.4.2.1	Logiche Programma periodico di investimento
                //è necessario forzare due operazioni, una che rappresenti l'apertura del PPI e verrà mostrata in questa tabella, e una conversione fittizia che 
                //invece è rappresentata nella tabella delle operazioni normali. è infatti necessario gestire l'operazione fittizia sulla liquidità
                //listaopnormali.Remove(item.posizione);
            }
            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                string codProd = mapPosizioneOperazioni[descContratto][0].posizione.prodotto.codInterno;
                posizioneOperazione obj = new posizioneOperazione();
                DataServices.fideuram.data.service.rsSTPosizione pos = new DataServices.fideuram.data.service.rsSTPosizione();
                DataServices.fideuram.data.service.rsSTProdotto prod = new DataServices.fideuram.data.service.rsSTProdotto();
                prod.nomeProdotto = codProd == "KE" ? "In Pers - Linea liquidità" : "In PPers - Linea liquidità";
                prod.codSottoprodotto = "LIQUI";
                prod.codSottoprodottoFE = "-";
                pos.prodotto = new DataServices.fideuram.data.service.rsSTProdotto();
                DataServices.fideuram.data.service.stDettaglioOperazioneBean oper = new DataServices.fideuram.data.service.stDettaglioOperazioneBean();
                oper.ctvSottoscrizione = mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro);
                pos.ctvPro = 0;
                oper.stDettaglioContratto = new DataServices.fideuram.data.service.stDettaglioContrattoBean();
                oper.stDettaglioContratto.stDettaglioLinea = new DataServices.fideuram.data.service.stDettaglioLineaBean[0];
                var listaLinea = new DataServices.fideuram.data.service.stDettaglioLineaBean[0].ToList();
                DataServices.fideuram.data.service.stDettaglioLineaBean linea = new DataServices.fideuram.data.service.stDettaglioLineaBean();
                linea.frequenzaPPI = mapPosizioneOperazioni[descContratto][0].operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPPI;
                linea.durataPPI = mapPosizioneOperazioni[descContratto][0].operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI;
                listaLinea.Add(linea);
                oper.stDettaglioContratto.stDettaglioLinea = listaLinea.ToArray();
                obj.posizione = pos;
                obj.operazione = oper;
                mapPosizioneOperazioni[descContratto].Add(obj);
                
            }


            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                ds.Tables["operazioniPPIPV"].Rows.Add(
                            "$", descContratto, "-",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.ctvSottoscrizione),
                            "-",
                            "-",
                            mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro - x.operazione.ctvSottoscrizione),
                            mapPosizioneOperazioni[descContratto].Sum(x => x.posizione.ctvPro),
                            "-"
                            );
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    ds.Tables["operazioniPPIPV"].Rows.Add(
                      "-",
                      posOper.posizione.prodotto.nomeProdotto,
                      posOper.posizione.prodotto.codSottoprodottoFE,
                      //da verificare se funziona sulla operazioni che non abbiamo forzato
                      posOper.operazione.ctvSottoscrizione,
                      "W" == (posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPPI) ? "Settimanale" + "<br>" + decodeDurataPPI(posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI).ToUpper() : "Mensile" + "<br>" + decodeDurataPPI(posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI).ToUpper(),
                      decodeDurataPPI(posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPPI),
                      posOper.posizione.ctvPro - posOper.operazione.ctvSottoscrizione,
                      posOper.posizione.ctvPro,
                      posOper.operazione.rischioMercato
                     );

                }

            }

            #endregion

            #region FVI Premio periodico

            ds.Tables["operazioniLabelFVI"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniLabelFVI"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniLabelFVI"].Columns.Add(new DataColumn("PremioUnicoAggiuntivo", typeof(decimal)));
            ds.Tables["operazioniLabelFVI"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniLabelFVI"].Columns.Add(new DataColumn("NumeroAnnualita", typeof(string)));
            ds.Tables["operazioniLabelFVI"].Columns.Add(new DataColumn("PianoVersamenti", typeof(decimal)));
            ds.Tables["operazioniLabelFVI"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("id", typeof(string)));
            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("CodiceInterno", typeof(string)));
            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("PremioUnicoAggiuntivo", typeof(decimal)));
            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("NumeroAnnualita", typeof(string)));
            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("PianoVersamenti", typeof(decimal)));
            ds.Tables["operazioniFVI"].Columns.Add(new DataColumn("Var", typeof(string)));

            ds.Tables["operazioniFVIfooter"].Columns.Add(new DataColumn("NomeProdotto", typeof(string)));
            ds.Tables["operazioniFVIfooter"].Columns.Add(new DataColumn("PremioUnicoAggiuntivo", typeof(decimal)));
            ds.Tables["operazioniFVIfooter"].Columns.Add(new DataColumn("Frequenza", typeof(string)));
            ds.Tables["operazioniFVIfooter"].Columns.Add(new DataColumn("NumeroAnnualita", typeof(string)));
            ds.Tables["operazioniFVIfooter"].Columns.Add(new DataColumn("PianoVersamenti", typeof(decimal)));
            ds.Tables["operazioniFVIfooter"].Columns.Add(new DataColumn("Var", typeof(string)));
           

            tipoContratto = new string[] { "PPR" };
            mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();

            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {

                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where tipoContratto.Contains(l.stDettaglioContratto.tipoContratto)
                                 select l;

                if (operazioni.Count() != 1)
                    continue;

                var operazione = operazioni.FirstOrDefault();
                string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                if (!mapPosizioneOperazioni.ContainsKey(key))
                {
                    mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                }
                posizioneOperazione obj = new posizioneOperazione();
                obj.posizione = item.posizione;
                obj.operazione = operazione;

                mapPosizioneOperazioni[key].Add(obj);

              
                listaopnormali.Remove(item.posizione);
            }




            decimal impAggiuntivo;
            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                impAggiuntivo = mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.stDettaglioContratto.impAggiuntivo);
                if(impAggiuntivo>0)
                {
                    ds.Tables["operazioniFVI"].Rows.Add(
                    "$", descContratto, "",
                    mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.stDettaglioContratto.impAggiuntivo * x.operazione.percOperazione / 100),
                    "-",
                    "-",
                    mapPosizioneOperazioni[descContratto].Sum(x => (x.operazione.stDettaglioContratto.impAggiuntivo * x.operazione.percOperazione / 100) + x.operazione.rataProgrammata* x.operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPpv * x.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPpv),
                    null
                    );
                }
                else{
                    ds.Tables["operazioniFVI"].Rows.Add(
                    "$", descContratto, "",
                    mapPosizioneOperazioni[descContratto].Sum(x => x.operazione.stDettaglioContratto.stDettaglioLinea[0].impAggiuntivo * x.operazione.percOperazione / 100),
                    "-",
                    "-",
                    mapPosizioneOperazioni[descContratto].Sum(x => (x.operazione.stDettaglioContratto.stDettaglioLinea[0].impAggiuntivo * x.operazione.percOperazione / 100) + x.operazione.rataProgrammata * x.operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPpv * x.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPpv),
                    null
                    );
                }


                
                
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    var rata = Helper.FormatCurrency(posOper.operazione.rataProgrammata + "");
                    impAggiuntivo = posOper.operazione.stDettaglioContratto.impAggiuntivo > 0 ? posOper.operazione.stDettaglioContratto.impAggiuntivo : posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].impAggiuntivo;
                    ds.Tables["operazioniFVI"].Rows.Add(
                      "",
                      posOper.posizione.prodotto.nomeProdotto,
                      posOper.posizione.prodotto.codSottoprodottoFE,
                      //posOper.operazione.stDettaglioContratto.impAggiuntivo * posOper.operazione.percOperazione / 100,
                      impAggiuntivo * posOper.operazione.percOperazione / 100,
                      rata + "<br>"+ getFrequenza(posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPpv),
                      posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPpv,
                      //(posOper.operazione.stDettaglioContratto.impAggiuntivo * posOper.operazione.percOperazione / 100) + (posOper.operazione.rataProgrammata * posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPpv * posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPpv),
                      (impAggiuntivo * posOper.operazione.percOperazione / 100) + (posOper.operazione.rataProgrammata * posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].frequenzaPpv * posOper.operazione.stDettaglioContratto.stDettaglioLinea[0].durataPpv),
                      posOper.operazione.rischioMercato
                     );

                }
                if (ds.Tables["operazioniFVI"].Rows.Count > 0)
                {
                    ds.Tables["operazioniFVIFooter"].Rows.Add(
                      "Totale operazioni",
                      ds.Tables["operazioniFVI"].AsEnumerable().Where(x => x.Field<string>("id") != "$").Sum(x => x.Field<decimal>("PremioUnicoAggiuntivo")),
                      "-",
                      "-",
                      ds.Tables["operazioniFVI"].AsEnumerable().Where(x => x.Field<string>("id") != "$").Sum(x => x.Field<decimal>("PianoVersamenti")),
                      "-"
                     );
                }

            }


            #endregion

            #region Fondo pensione
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("SavingMap", typeof(string)));
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("ContributiversatiAdesione", typeof(decimal)));
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("ContrAderenteDatorePerc", typeof(decimal)));
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("ContrAderenteDatore", typeof(decimal)));
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("TFR", typeof(decimal)));
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("Altraformapensione", typeof(decimal)));
            ds.Tables["operazioniFondoPensione"].Columns.Add(new DataColumn("Var", typeof(string)));
            
            ds.Tables["operazioniFondoPensionefooter"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioniFondoPensionefooter"].Columns.Add(new DataColumn("ContributiversatiAdesione", typeof(decimal)));
            ds.Tables["operazioniFondoPensionefooter"].Columns.Add(new DataColumn("ContrAderenteDatorePerc", typeof(decimal)));
            ds.Tables["operazioniFondoPensionefooter"].Columns.Add(new DataColumn("ContrAderenteDatore", typeof(decimal)));
            ds.Tables["operazioniFondoPensionefooter"].Columns.Add(new DataColumn("TFR", typeof(decimal)));
            ds.Tables["operazioniFondoPensionefooter"].Columns.Add(new DataColumn("Altraformapensione", typeof(decimal)));
            ds.Tables["operazioniFondoPensionefooter"].Columns.Add(new DataColumn("Var", typeof(string)));


            codInterno = new string[] { "90" };
            codTipoOperazione = new string[] { "NS" };
            mapPosizioneOperazioni = new Dictionary<string, List<posizioneOperazione>>();
            var fondoPensione = new DataServices.fideuram.data.service.stFondoPensioneBean();

            foreach (var item in from p in posizioni
                                 join d in dettaglioOperazioni on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }
                                 where codInterno.Contains(p.prodotto.codInterno)
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {

                var operazioni = from l in item.dettaglioOperazione.listaOperzioni
                                 where codTipoOperazione.Contains(l.codTipoOperazione)
                                 select l;

                if (operazioni.Count() != 1)
                    continue;

                var operazione = operazioni.LastOrDefault();

                fondoPensione = operazione.stDettaglioContratto.stFondoPensione;
                if (fondoPensione != null)
                {

                    string key = item.posizione.prodotto.nomeContratto + " - " + item.posizione.codContratto;
                    if (!mapPosizioneOperazioni.ContainsKey(key))
                    {
                        mapPosizioneOperazioni[key] = new List<posizioneOperazione>();
                    }
                    posizioneOperazione obj = new posizioneOperazione();
                    obj.posizione = item.posizione;
                    obj.operazione = operazione;

                    mapPosizioneOperazioni[key].Add(obj);

                    listaopnormali.Remove(item.posizione);
                }
            }
           
            
            foreach (var descContratto in mapPosizioneOperazioni.Keys)
            {
                ds.Tables["operazioniFondoPensione"].Rows.Add("$", descContratto, null, null, null, null, null, "");
                foreach (var posOper in mapPosizioneOperazioni[descContratto])
                {
                    fondoPensione = posOper.operazione.stDettaglioContratto.stFondoPensione;

                    var percAderenteDatore = posOper.operazione.percAderenteDatore;
                    var contributoAderenteDatore = (fondoPensione.caImportoAdesione + fondoPensione.caImportoAggiuntivoAdesione) * percAderenteDatore / 100;
                    var contributoAdesione = (fondoPensione.caImportoAnnuo + fondoPensione.cdImportoAnnuo) * percAderenteDatore / 100;
                    ds.Tables["operazioniFondoPensione"].Rows.Add(
                        "",
                        posOper.posizione.prodotto.nomeProdotto,
                        contributoAderenteDatore,
                        percAderenteDatore,
                        contributoAdesione,
                        posOper.operazione.percTFR,
                        posOper.operazione.percAltraFormaPensionistica,
                        posOper.operazione.rischioMercato
                        );

                }

            }

            
          
            if (ds.Tables["operazioniFondoPensione"].Rows.Count > 0)
            {
                ds.Tables["operazioniFondoPensioneFooter"].Rows.Add(
               "Totale",
               ds.Tables["operazioniFondoPensione"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("ContributiversatiAdesione")),
               ds.Tables["operazioniFondoPensione"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("ContrAderenteDatorePerc")),
               ds.Tables["operazioniFondoPensione"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("ContrAderenteDatore")),
               ds.Tables["operazioniFondoPensione"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("TFR")),
               ds.Tables["operazioniFondoPensione"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("Altraformapensione")),
               "-"
               );
            }
                 
            #endregion

            #region operazioni
            ds.Tables["operazioni"].Columns.Add(new DataColumn("SavingMap", typeof(string)));
            ds.Tables["operazioni"].Columns.Add(new DataColumn("codContratto", typeof(string)));
            ds.Tables["operazioni"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazioni"].Columns.Add(new DataColumn("codInterno", typeof(string)));
            ds.Tables["operazioni"].Columns.Add(new DataColumn("Controvaloreattuale", typeof(decimal)));
            ds.Tables["operazioni"].Columns.Add(new DataColumn("ApportiDisinvest", typeof(decimal)));
            ds.Tables["operazioni"].Columns.Add(new DataColumn("Controvaloreproposto", typeof(decimal)));
            ds.Tables["operazioni"].Columns.Add(new DataColumn("VaR", typeof(string)));
          
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("SavingMap", typeof(string)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("codContratto", typeof(string)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("codInterno", typeof(string)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("Controvaloreattuale", typeof(decimal)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("ApportiDisinvest", typeof(decimal)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("Controvaloreproposto", typeof(decimal)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("VaR", typeof(string)));
            ds.Tables["DToperazioni"].Columns.Add(new DataColumn("ordinamento", typeof(int)));

            ds.Tables["operazionifooter"].Columns.Add(new DataColumn("Prodotto", typeof(string)));
            ds.Tables["operazionifooter"].Columns.Add(new DataColumn("Controvaloreattuale", typeof(decimal)));
            ds.Tables["operazionifooter"].Columns.Add(new DataColumn("ApportiDisinvest", typeof(decimal)));
            ds.Tables["operazionifooter"].Columns.Add(new DataColumn("Controvaloreproposto", typeof(decimal)));
            ds.Tables["operazionifooter"].Columns.Add(new DataColumn("VaR", typeof(string)));
          
            codInterno = new string[] { "RS", "RM", "KS", "KE", "90" };
            codTipoOperazione = new string[] { "NS", "TR" };
            tipoContratto = new string[] { "PPR", "PPI" };
            var map = new Dictionary<string, itemObject>();
            string stDurataPPI = "";

            foreach (var item in from p in listaopnormali
                                 join d in dettaglioOperazioni.ToList() on new { p.chiaveAggregazione, p.posizionePro } equals new { d.chiaveAggregazione, d.posizionePro }// on  p.chiaveAggregazione equals d.chiaveAggregazione && d.posizionePro == p.
                                 orderby p.ctvPro descending
                                 select new { posizione = p, dettaglioOperazione = d })
            {

                var operazioni = item.dettaglioOperazione.listaOperzioni.FirstOrDefault();// && !(codTipoOperazione.Contains(item.posizione.tipoOperazione) && tipoContratto.Contains(l.stDettaglioContratto.tipoContratto)));

                if (operazioni != null)
                {
                    stDurataPPI = "";
                    if (operazioni.stDettaglioContratto.stDettaglioLinea != null)
                    {
                        stDurataPPI = operazioni.stDettaglioContratto.stDettaglioLinea[0].durataPPI == null ? "" : operazioni.stDettaglioContratto.stDettaglioLinea[0].durataPPI;
                    }
                         
                    // identifico se è stato aperto un Piani periodici Conversione Skandia
                    if (operazioni.stDettaglioContratto != null && operazioni.stDettaglioContratto.stDettaglioLinea != null && stDurataPPI != "" && operazioni.codTipoOperazione == "RL")
                    {
                        if (!map.ContainsKey("Disinvestimenti"))
                        {
                            map.Add("Disinvestimenti", new itemObject { ctvAttuale = new decimal(0), ctvProposto = new decimal(0), movimenti = new decimal(0), posizioni = new List<posizioneOperazione>(), codOrdinamento = 3});
                        }
                        map["Disinvestimenti"].ctvAttuale = map["Disinvestimenti"].ctvAttuale + item.posizione.ctvAttuale;
                        map["Disinvestimenti"].ctvProposto = map["Disinvestimenti"].ctvProposto + 0;
                        map["Disinvestimenti"].movimenti = map["Disinvestimenti"].movimenti + (-1) * item.posizione.ctvAttuale; ;
                        map["Disinvestimenti"].codOrdinamento = 3;
                        posizioneOperazione obj = new posizioneOperazione();
                        obj.posizione = item.posizione;
                        obj.operazione = operazioni;
                        obj.posizione.disinvesti = (-1) * obj.posizione.ctvAttuale;
                        obj.posizione.ctvPro = 0;
                        map["Disinvestimenti"].posizioni.Add(obj);
                    }
                    else
                    {

                        if (operazioni.codTipoOperazione.Equals("NS"))
                        {
                            if (!map.ContainsKey("Nuove sottoscrizioni"))
                            {
                                map.Add("Nuove sottoscrizioni", new itemObject { ctvAttuale = new decimal(0), ctvProposto = new decimal(0), movimenti = new decimal(0), posizioni = new List<posizioneOperazione>(), codOrdinamento = 1 });
                            }

                            map["Nuove sottoscrizioni"].ctvAttuale = map["Nuove sottoscrizioni"].ctvAttuale + item.posizione.ctvAttuale;
                            map["Nuove sottoscrizioni"].ctvProposto = map["Nuove sottoscrizioni"].ctvProposto + item.posizione.ctvPro;
                            map["Nuove sottoscrizioni"].movimenti = map["Nuove sottoscrizioni"].movimenti + item.posizione.investi - item.posizione.disinvesti; ;
                            map["Nuove sottoscrizioni"].codOrdinamento = 1;
                            posizioneOperazione obj = new posizioneOperazione();
                            obj.posizione = item.posizione;
                            obj.operazione = operazioni;
                            map["Nuove sottoscrizioni"].posizioni.Add(obj);

                        }
                        else if (operazioni.investi > 0)
                        {
                            if (!map.ContainsKey("Investimenti aggiuntivi"))
                            {
                                map.Add("Investimenti aggiuntivi", new itemObject { ctvAttuale = new decimal(0), ctvProposto = new decimal(0), movimenti = new decimal(0), posizioni = new List<posizioneOperazione>(), codOrdinamento = 2 });
                            }
                            map["Investimenti aggiuntivi"].ctvAttuale = map["Investimenti aggiuntivi"].ctvAttuale + item.posizione.ctvAttuale;
                            map["Investimenti aggiuntivi"].ctvProposto = map["Investimenti aggiuntivi"].ctvProposto + item.posizione.ctvPro;
                            map["Investimenti aggiuntivi"].movimenti = map["Investimenti aggiuntivi"].movimenti + item.posizione.investi - item.posizione.disinvesti; ;
                            map["Investimenti aggiuntivi"].codOrdinamento = 2;
                            posizioneOperazione obj = new posizioneOperazione();
                            obj.posizione = item.posizione;
                            obj.operazione = operazioni;
                            map["Investimenti aggiuntivi"].posizioni.Add(obj);
                        }
                        else
                        {
                            if (!map.ContainsKey("Disinvestimenti"))
                            {
                                map.Add("Disinvestimenti", new itemObject { ctvAttuale = new decimal(0), ctvProposto = new decimal(0), movimenti = new decimal(0), posizioni = new List<posizioneOperazione>(), codOrdinamento = 3 });
                            }
                            map["Disinvestimenti"].ctvAttuale = map["Disinvestimenti"].ctvAttuale + item.posizione.ctvAttuale;
                            map["Disinvestimenti"].ctvProposto = map["Disinvestimenti"].ctvProposto + item.posizione.ctvPro;
                            map["Disinvestimenti"].movimenti = map["Disinvestimenti"].movimenti + item.posizione.investi - item.posizione.disinvesti; ;
                            map["Disinvestimenti"].codOrdinamento = 3;
                            posizioneOperazione obj = new posizioneOperazione();
                            obj.posizione = item.posizione;
                            obj.operazione = operazioni;
                            map["Disinvestimenti"].posizioni.Add(obj);
                        }

                    }
                }
            }


            foreach(var liquidita in listaLiquiditaKEKSPV)
            {
                
                if (!map.ContainsKey("Investimenti aggiuntivi"))
                {
                    map.Add("Investimenti aggiuntivi", new itemObject { ctvAttuale = new decimal(0), ctvProposto = new decimal(0), movimenti = new decimal(0), posizioni = new List<posizioneOperazione>(), codOrdinamento = 2 });
                }
                map["Investimenti aggiuntivi"].ctvAttuale = map["Investimenti aggiuntivi"].ctvAttuale + liquidita.posizione.ctvAttuale;
                map["Investimenti aggiuntivi"].ctvProposto = map["Investimenti aggiuntivi"].ctvProposto + liquidita.posizione.ctvPro;
                map["Investimenti aggiuntivi"].movimenti = map["Investimenti aggiuntivi"].movimenti + liquidita.posizione.investi ; ;
                map["Investimenti aggiuntivi"].codOrdinamento = 2;
                map["Investimenti aggiuntivi"].posizioni.Add(liquidita);
            }

            
            string sCategoria = "";
            foreach (var key in map.Keys)
            {
                switch (key.ToLower())
                {
                    case "nuove sottoscrizioni":
                        sCategoria = "(A) ";
                        break;
                    case "investimenti aggiuntivi":
                        sCategoria = "(B) ";
                        break;
                    case "disinvestimenti":
                        sCategoria = "(C) ";
                        break;
                }

                ds.Tables["DToperazioni"].Rows.Add(
                "$",
                "<font color=#FF0000>" + sCategoria + "</font>" + key,
                "",
                "",
                map[key].ctvAttuale,
                map[key].movimenti,
                map[key].ctvProposto,
                "-",
                map[key].codOrdinamento
                );



                foreach (var posOper in map[key].posizioni)
                {
                    var posizione = posOper.posizione;
                    var operazione = posOper.operazione;
                    string sSaving = "";
                    if (posizione.savingMap)
                        sSaving = "SavingMap.png";

                    ds.Tables["DToperazioni"].Rows.Add(
                            sSaving,
                            posizione.codContratto,
                            posizione.prodotto.nomeProdotto,
                            posizione.prodotto.codSottoprodottoFE,
                            posizione.ctvAttuale,
                            posizione.investi - posizione.disinvesti,
                            posizione.ctvPro,
                            posizione.prodotto.varProDec,
                            map[key].codOrdinamento);
                }

            }

            foreach (DataRow dr in from contact in ds.Tables["DToperazioni"].AsEnumerable()
                                   orderby contact.Field<int>("ordinamento") ascending
                                   select contact)
            {

                ds.Tables["operazioni"].Rows.Add(
                        dr["SavingMap"].ToString(),
                        dr["codContratto"].ToString(),
                        dr["Prodotto"].ToString(),
                        dr["codInterno"].ToString(),
                        dr["Controvaloreattuale"].ToString(),
                        dr["ApportiDisinvest"].ToString(),
                        dr["Controvaloreproposto"].ToString(),
                        dr["VaR"].ToString());

            }


            ds.Tables["operazionifooter"].Rows.Add(
                "Totale",
                ds.Tables["operazioni"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("Controvaloreattuale")),
                ds.Tables["operazioni"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("ApportiDisinvest")),
                ds.Tables["operazioni"].AsEnumerable().Where(x => x.Field<string>("SavingMap") != "$").Sum(x => x.Field<decimal>("Controvaloreproposto")),
                //"",
                ""
            );
            #endregion                                    

            return ds;
        }

        public virtual string getTesto1()
        {
            bool isAdeguato = datiSeiUnico.flagAdeguatezzaPro();
            string nota = isAdeguato ?
                "In questa scheda è riportato il riepilogo delle operazioni effettuate all'interno della presente proposta." :
                "In questa scheda è riportato il riepilogo delle operazioni da lei richieste al suo private banker.";
            return nota;

        }

        private  string decodeDurataPPI(string durataPPI)
        {
            string durata = "-";
            switch (durataPPI)
            {
                case "M1":
                    durata = "1 Mese";
                    break;
                case "M6":
                    durata = "6 Mesi";
                    break;
                case "M12":
                    durata = "12 Mesi";
                    break;
                case "M24":
                    durata = "24 Mesi";
                    break;
                default:
                    break;
            }
            return durata;
        }
        private string decodeFrequenza(string freq)
        {
            string dec = "-";
            if (freq != null) {
                switch (freq) {
			case "M":
				dec = "Mensile";
                    break;
			case "B":
				dec = "Bimestrale";
                    break;
			case "T":
				dec = "Trimestrale";
                    break;
			case "Q":
				dec = "Quadrimestrale";
                    break;
			case "S":
				dec = "Semestrale";
                    break;
			case "A":
				dec = "Annuale";
                    break;
                    default:
				break;
                }
            }
            return dec;
        }

        //private string decodeDurata(string freq, decimal durata)
        //{
        //    string dec = "-";
        //    if (freq != null)
        //    {
        //        switch (freq)
        //        {
        //            case "M":

        //                dec = durata > 1 ? "RATE":"RATA";
        //                break;
        //            case "B":
        //                dec = "Bimestrale";
        //                break;
        //            case "T":
        //                dec = "Trimestrale";
        //                break;
        //            case "Q":
        //                dec = "Quadrimestrale";
        //                break;
        //            case "S":
        //                dec = "Semestrale";
        //                break;
        //            case "A":
        //                dec = "Annuale";
        //                break;
        //            default:
        //                break;
        //        }
        //    }
        //    return dec;
        //}


        private partial class posizioneOperazione
        {
            private DataServices.fideuram.data.service.rsSTPosizione posizioneField;
            private DataServices.fideuram.data.service.stDettaglioOperazioneBean operazioneField;

            public DataServices.fideuram.data.service.rsSTPosizione posizione
            {
                get
                {
                    return this.posizioneField;
                }
                set
                {
                    this.posizioneField = value;
                }
            }

            public DataServices.fideuram.data.service.stDettaglioOperazioneBean operazione
            {
                get
                {
                    return this.operazioneField;
                }
                set
                {
                    this.operazioneField = value;
                }
            }


        }

        private partial class itemObject
        {
            private decimal ctvAttualeField;
            private decimal ctvPropostoField;
            private decimal movimentiField;
            private int codOrdinamentoField;
            private List<posizioneOperazione> posizioniField;

            public List<posizioneOperazione> posizioni
            {
                get
                {
                    return this.posizioniField;
                }
                set
                {
                    this.posizioniField = value;
                }
            }
            public decimal ctvAttuale
            {
                get
                {
                    return this.ctvAttualeField;
                }
                set
                {
                    this.ctvAttualeField = value;
                }
            }
            public decimal movimenti
            {
                get
                {
                    return this.movimentiField;
                }
                set
                {
                    this.movimentiField = value;
                }
            }

            public decimal ctvProposto
            {
                get
                {
                    return this.ctvPropostoField;
                }
                set
                {
                    this.ctvPropostoField = value;
                }
            }

            public int codOrdinamento
            {
                get
                {
                    return this.codOrdinamentoField;
                }
                set
                {
                    this.codOrdinamentoField = value;
                }
            }

        }
               
        public virtual string getFrequenza(int frequenza)
        {
            string freq = "";
            switch (frequenza)
            {
                case 1:
                    freq = "Annuale";
                    break;
                case 2:
                    freq = "Semestrale";
                    break;
                case 4:
                    freq = "Trimestrale";
                    break;
                case 12:
                    freq = "Mensile";
                    break;
                case 52:
                    freq = "Settimanale";
                    break;
            }
            return freq;
        }
    }

   
}
