using DevExpress.Export;
using DevExpress.Spreadsheet;
using DevExpress.SpreadsheetSource.Implementation;
using DevExpress.Web;
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting;
using DevExpress.XtraPrintingLinks;
using MySqlConnector;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace OlympiaIntranet
{
    public partial class AUMPage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated == false)
            {
                Response.Redirect("~/SignIn.aspx");
            }
        }

        protected void ASPxRibbon1_CommandExecuted(object source, DevExpress.Web.RibbonCommandExecutedEventArgs e)
        {
            // Selezionato pulsante Refresh
            if (e.Item.Name == "loadGrid")
            {
                RibbonTemplateItem template = (RibbonTemplateItem)ASPxRibbon1.Tabs[0].Groups[0].Items.FindByName("ribbonTemplate");
                ASPxDateEdit deDataInizio = template.FindControl("dataInizio") as ASPxDateEdit;
                if (String.IsNullOrEmpty(deDataInizio.Text))
                {
                    CommonClass.MessageBox(this, "Inserire data inizio!");
                    return;
                }

                ASPxDateEdit deDataFine = template.FindControl("dataFine") as ASPxDateEdit;
                if (String.IsNullOrEmpty(deDataFine.Text))
                {
                    CommonClass.MessageBox(this, "Inserire data fine!");
                    return;
                }

                // recupero il valore del ribbondateedit dataInizio
                //DateTime dataInizio = Convert.ToDateTime(ribDataInizio.Value);
                Session["data_inizio"] = deDataInizio.Date;
                               
                // recupero il valore del ribbondateedit dataFine
                //DateTime dataFine = Convert.ToDateTime(ribDataFine.Value);
                Session["data_fine"] = deDataFine.Date;
               

                // Verifica che dataInizio sia minore di dataFine
                if (deDataInizio.Date > deDataFine.Date)
                {
                    CommonClass.MessageBox(this, "Data inizio deve essere minore di Data fine!");
                    return;
                }

                // Se i controlli sono passati allora linka datasource a grdiview...
                //gvGestioniPatrimoniali.DataSourceID = "SqlDSGestioniPatrimoniali";
                //gvGestioniPatrimoniali.KeyFieldName = "PORTAFOGLIO";
                //gvGestioniPatrimoniali.DataBind();

                gvGPMConsuntivo.DataSourceID = "SqlDSGPMConsuntivo";
                gvGPMConsuntivo.KeyFieldName = "PORTAFOGLIO";
                gvGPMConsuntivo.DataBind();

                gvGPMForecast.DataSourceID = "SqlDSGPMForecast";
                gvGPMForecast.KeyFieldName = "PORTAFOGLIO";
                gvGPMForecast.DataBind();

                gvFondi.DataSourceID = "SqlDSFondi";
                gvFondi.DataBind();

                gvDettaglioFondi.DataSourceID = "SqlDSDettaglioFondi";
                gvDettaglioFondi.DataBind();

            }
            // Selezionato pulsante Export in Excel
            if (e.Item.Name == "exportExcel")
            {
                // Ref link: https://www.devexpress.com/Support/Center/Question/Details/T327338/aspxgridview-export-multiple-grids-to-the-same-excel-file
                PrintingSystem ps = new PrintingSystem();

                // Esporta griglia GPMForecast
                PrintableComponentLink link0 = new PrintableComponentLink(ps);
                ExporterGPMForecast.ExportSelectedRowsOnly = false;
                string reportHeader0 = string.Format(@"Estrazione GPM Forecast dal {0} al {1} \par Tot. AUM Iniziale: {2:n2} \par Tot. AUM Finale: {3:n2} \par", Convert.ToDateTime(Session["data_inizio"]).ToString("dd/MM/yyyy"), Convert.ToDateTime(Session["data_fine"]).ToString("dd/MM/yyyy"), Convert.ToDouble(tbTotAumInizialePtf_GPMForecast.Text), Convert.ToDouble(tbTotAumFinalePtf_GPMForecast.Text));
                ExporterGPMForecast.ReportHeader = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fnil\fcharset0 Times New Roman;}}\viewkind4\uc1\pard\b\f0\fs28 " + reportHeader0 + @"\b0\f1\fs20\par}";
                link0.Component = ExporterGPMForecast;

                // Esporta griglia GPMConsuntivo
                PrintableComponentLink link1 = new PrintableComponentLink(ps);
                ExporterGPMConsuntivo.ExportSelectedRowsOnly = false;
                string reportHeader1 = string.Format(@"Estrazione GPM Consuntivo dal {0} al {1} \par Tot. AUM Iniziale: {2:n2} \par Tot. AUM Finale: {3:n2} \par", Convert.ToDateTime(Session["data_inizio"]).ToString("dd/MM/yyyy"), Convert.ToDateTime(Session["data_fine"]).ToString("dd/MM/yyyy"), Convert.ToDouble(tbTotAumInizialePtf_GPMConsuntivo.Text), Convert.ToDouble(tbTotAumFinalePtf_GPMConsuntivo.Text));
                ExporterGPMConsuntivo.ReportHeader = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fnil\fcharset0 Times New Roman;}}\viewkind4\uc1\pard\b\f0\fs28 " + reportHeader1 + @"\b0\f1\fs20\par}";
                link1.Component = ExporterGPMConsuntivo;

                // Esporta griglia Fondi
                PrintableComponentLink link2 = new PrintableComponentLink(ps);
                ExporterFondi.ExportSelectedRowsOnly = false;
                string reportHeader2 = string.Format(@"Estrazione Fondi dal {0} al {1} \par Tot. AUM Iniziale: {2:n2} \par Tot. AUM Finale: {3:n2} \par Delta: {4:n2} \par Raccolta Netta: {5:n2} \par", 
                                                     Convert.ToDateTime(Session["data_inizio"]).ToString("dd/MM/yyyy"), 
                                                     Convert.ToDateTime(Session["data_fine"]).ToString("dd/MM/yyyy"), 
                                                     Convert.ToDouble(tbTotAumInizialeFondi.Text), 
                                                     Convert.ToDouble(tbTotAumFinaleFondi.Text), 
                                                     Convert.ToDouble(tbDelta.Text),
                                                     Convert.ToDouble(tbRaccoltaNetta.Text)
                                                     );            
                ExporterFondi.ReportHeader = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fnil\fcharset0 Times New Roman;}}\viewkind4\uc1\pard\b\f0\fs28 " + reportHeader2 + @"\b0\f1\fs20\par}";
                link2.Component = ExporterFondi;

                // Esporta griglia Dettaglio Fondi
                PrintableComponentLink link3 = new PrintableComponentLink(ps);
                ExporterDettaglioFondi.ExportSelectedRowsOnly = false;
                link3.Component = ExporterDettaglioFondi;

                CompositeLink compositeLink = new CompositeLink(ps);
                compositeLink.Links.AddRange(new object[] { link0, link1, link2, link3 });
                compositeLink.CreatePageForEachLink();

                string fileName = string.Format("{0}_{1}", DateTime.Now.ToString("yyyyMMdd_HHmm"), "AUM.xlsx");
                using (MemoryStream stream = new MemoryStream())
                {
                    XlsxExportOptionsEx options = new XlsxExportOptionsEx();
                    options.ExportMode = XlsxExportMode.SingleFilePageByPage;
                    options.ExportType = ExportType.WYSIWYG;
                    compositeLink.PrintingSystemBase.ExportToXlsx(stream, options);
                    Response.Clear();
                    Response.Buffer = false;
                    Response.AppendHeader("Content-Type", "application/xlsx");
                    Response.AppendHeader("Content-Transfer-Encoding", "binary");
                    Response.AppendHeader("Content-Disposition", $"attachment; filename={fileName}");
                    stream.Position = 0;

                    Workbook workbook = new Workbook();
                    workbook.LoadDocument(stream,DevExpress.Spreadsheet.DocumentFormat.OpenXml);
                    DevExpress.Spreadsheet.WorksheetCollection worksheets = workbook.Worksheets;
                    workbook.Worksheets[0].Name = "GPM Forecast";
                    workbook.Worksheets[1].Name = "GPM Consuntivo";
                    workbook.Worksheets[2].Name = "Fondi";
                    workbook.Worksheets[3].Name = "Dettaglio Fondi";
                    using (MemoryStream outputStream = new MemoryStream())
                    {
                        workbook.SaveDocument(outputStream, DevExpress.Spreadsheet.DocumentFormat.OpenXml);
                        Response.BinaryWrite(outputStream.ToArray());
                        Response.End();
                    }
                }
                ps.Dispose();
            }
        }

        void WriteToResponse(string fileName, bool saveAsFile, string fileFormat, MemoryStream stream)
        {
            if (Page == null || Page.Response == null)
                return;

            string disposition = saveAsFile ? "attachment" : "inline";
            Page.Response.Clear();
            Page.Response.Buffer = false;
            Page.Response.AppendHeader("Content-Type", string.Format("application/{0}", fileFormat));
            Page.Response.AppendHeader("Content-Transfer-Encoding", "binary");
            Page.Response.AppendHeader("Content-Disposition", string.Format("{0}; filename={1}", disposition, fileName));
            Page.Response.BinaryWrite(stream.ToArray());
            Page.Response.End();
        }


        #region DATABOUND
        //protected void gvAnagraficaFondi_DataBound(object sender, EventArgs e)
        //{
        //    ASPxGridView gridview = sender as ASPxGridView;
        //    foreach (GridViewColumn column in gridview.Columns)
        //    {
        //        if (column is GridViewDataColumn)
        //            column.Caption = ((GridViewDataColumn)column).FieldName;
        //    }
        //}

        protected void gvDettaglioFondi_DataBound(object sender, EventArgs e)
        {
            // ref : https://www.devexpress.com/Support/Center/Question/Details/Q585537/aspxgridview-autogeneratecolumns-true-field-name-start-with-lower-case-letter-insert-a
            // Evita che a runtime le colonne con maiuscole nella query vengono scritte con lo spazio (ad esempio codiceIsin -> codice Isin) 
            // questo poi crea un problema andando a esportare l'excel dove serve che le colonne siano le stesse della query.
            ASPxGridView gridview = sender as ASPxGridView;
            foreach (GridViewColumn column in gridview.Columns)
            {
                if (column is GridViewDataColumn)
                    column.Caption = ((GridViewDataColumn)column).FieldName;
            }

            // Effettua formattazione colonne a runtime..
            if (gridview.Columns.Count > 0)
            {
                foreach (GridViewDataColumn dataCol in gridview.DataColumns)
                {
                    List<string> listHeader = new List<string>(); // Contiene tutte le colonne che non sono pivot dalla query
                    listHeader.Add("PORTAFOGLIO");
                    listHeader.Add("TITOLO");
                    listHeader.Add("NOME");
                    listHeader.Add("DIVISA");
                    listHeader.Add("DEPOSITARIA");
                    listHeader.Add("GESTORE");
                    listHeader.Add("CONSULENTE");
                    listHeader.Add("ADVISOR");                   

                    bool IsColPivot = !listHeader.Any(s => dataCol.Caption.Contains(s));       // Se la colonna è pivot...
                    if (IsColPivot == true) dataCol.PropertiesEdit.DisplayFormatString = "N2"; // .. allora viene formattata con decimali e migliaia
                }
            }
        }

        protected void gvGestioniPatrimoniali_DataBound(object sender, EventArgs e)
        {
            // ref : https://www.devexpress.com/Support/Center/Question/Details/Q585537/aspxgridview-autogeneratecolumns-true-field-name-start-with-lower-case-letter-insert-a
            // Evita che a runtime le colonne con maiuscole nella query vengono scritte con lo spazio (ad esempio codiceIsin -> codice Isin) 
            // questo poi crea un problema andando a esportare l'excel dove serve che le colonne siano le stesse della query.
            //ASPxGridView gridview = sender as ASPxGridView;
            //foreach (GridViewColumn column in gridview.Columns)
            //{
            //    if (column is GridViewDataColumn)
            //        column.Caption = ((GridViewDataColumn)column).FieldName;
            //}

            //// Effettua formattazione colonne a runtime..
            //if (gridview.Columns.Count > 0)
            //{
            //    gridview.DataColumns["DATA APERTURA"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
            //    gridview.DataColumns["DATA CHIUSURA"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
            //    gridview.DataColumns["AUM INIZIALE"].PropertiesEdit.DisplayFormatString = "N2";
            //    gridview.DataColumns["AUM FINALE"].PropertiesEdit.DisplayFormatString = "N2";
            //    gridview.DataColumns["AUM MEDIO"].PropertiesEdit.DisplayFormatString = "N2";
            //    gridview.DataColumns["COMM DI GESTIONE"].PropertiesEdit.DisplayFormatString = "P2";
            //    gridview.DataColumns["COMM PERFORMANCE"].PropertiesEdit.DisplayFormatString = "P2";

            //    // Calcola Totali AUM INIZIALE e AUM FINALE ma non li mostra nel footer
            //    gridview.TotalSummary.Clear();
            //    gridview.Settings.ShowFooter = false;
            //    ASPxSummaryItem totPatrimonioPrec = new ASPxSummaryItem();
            //    totPatrimonioPrec.FieldName = "AUM INIZIALE";
            //    totPatrimonioPrec.SummaryType = DevExpress.Data.SummaryItemType.Sum;
            //    gridview.TotalSummary.Add(totPatrimonioPrec);
            //    tbTotAumInizialePtf_GPM.DisplayFormatString = "n2";
            //    tbTotAumInizialePtf_GPM.Text = gridview.GetTotalSummaryValue(totPatrimonioPrec).ToString();

            //    ASPxSummaryItem totPatrimonioOggi = new ASPxSummaryItem();
            //    totPatrimonioOggi.FieldName = "AUM FINALE";
            //    totPatrimonioOggi.SummaryType = DevExpress.Data.SummaryItemType.Sum;
            //    gridview.TotalSummary.Add(totPatrimonioOggi);
            //    tbTotAumFinalePtf_GPM.DisplayFormatString = "n2";
            //    tbTotAumFinalePtf_GPM.Text = gridview.GetTotalSummaryValue(totPatrimonioOggi).ToString();
            //}
        }

        protected void gvFondi_DataBound(object sender, EventArgs e)
        {
            // ref : https://www.devexpress.com/Support/Center/Question/Details/Q585537/aspxgridview-autogeneratecolumns-true-field-name-start-with-lower-case-letter-insert-a
            // Evita che a runtime le colonne con maiuscole nella query vengono scritte con lo spazio (ad esempio codiceIsin -> codice Isin) 
            // questo poi crea un problema andando a esportare l'excel dove serve che le colonne siano le stesse della query.
            ASPxGridView gridview = sender as ASPxGridView;
            foreach (GridViewColumn column in gridview.Columns)
            {
                if (column is GridViewDataColumn)
                    column.Caption = ((GridViewDataColumn)column).FieldName;
            }

            // Effettua formattazione colonne a runtime..
            if (gridview.Columns.Count > 0)
            {
                gridview.DataColumns["AUM INIZIALE"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["AUM FINALE"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["SUBQUOTES"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["REDQUOTES"].PropertiesEdit.DisplayFormatString = "N2";

                // Cancella totali e non li disabilita sulla griglia
                gridview.TotalSummary.Clear();
                gridview.Settings.ShowFooter = false;

                // Calcolo Totale AUM Iniziale
                ASPxSummaryItem totPatrimonioPrec = new ASPxSummaryItem();
                totPatrimonioPrec.FieldName = "AUM INIZIALE";
                totPatrimonioPrec.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totPatrimonioPrec);
                tbTotAumInizialeFondi.DisplayFormatString = "n2";
                tbTotAumInizialeFondi.Text = gridview.GetTotalSummaryValue(totPatrimonioPrec).ToString();

                // Calcolo Totale AUM Finale
                ASPxSummaryItem totPatrimonioOggi = new ASPxSummaryItem();
                totPatrimonioOggi.FieldName = "AUM FINALE";
                totPatrimonioOggi.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totPatrimonioOggi);
                tbTotAumFinaleFondi.DisplayFormatString = "n2";
                tbTotAumFinaleFondi.Text = gridview.GetTotalSummaryValue(totPatrimonioOggi).ToString();

                // Calcolo Delta
                tbDelta.DisplayFormatString = "n2";
                //tbDelta.Text = (Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioPrec)) - Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioOggi))).ToString();
                tbDelta.Text = (Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioOggi)) - Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioPrec))).ToString();

                // Calcolo Totale Subquotes (per calcolare Raccolta Netta)
                ASPxSummaryItem totSubquotes = new ASPxSummaryItem();
                totSubquotes.FieldName = "SUBQUOTES";
                totSubquotes.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totSubquotes);


                // Calcolo Totale Redquotes (per calcolare Raccolta Netta)
                ASPxSummaryItem totRedquotes = new ASPxSummaryItem();
                totRedquotes.FieldName = "REDQUOTES";
                totRedquotes.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totRedquotes);

                // Calcolo Raccolta Netta
                tbRaccoltaNetta.DisplayFormatString = "n2";
                tbRaccoltaNetta.Text = (Convert.ToDouble(gridview.GetTotalSummaryValue(totSubquotes)) + Convert.ToDouble(gridview.GetTotalSummaryValue(totRedquotes))).ToString();
            }

        }

        protected void gvGPMForecast_DataBound(object sender, EventArgs e)
        {
            // ref : https://www.devexpress.com/Support/Center/Question/Details/Q585537/aspxgridview-autogeneratecolumns-true-field-name-start-with-lower-case-letter-insert-a
            // Evita che a runtime le colonne con maiuscole nella query vengono scritte con lo spazio (ad esempio codiceIsin -> codice Isin) 
            // questo poi crea un problema andando a esportare l'excel dove serve che le colonne siano le stesse della query.
            ASPxGridView gridview = sender as ASPxGridView;
            foreach (GridViewColumn column in gridview.Columns)
            {
                if (column is GridViewDataColumn)
                    column.Caption = ((GridViewDataColumn)column).FieldName;
            }

            // Effettua formattazione colonne a runtime..
            if (gridview.Columns.Count > 0)
            {
                gridview.DataColumns["DATA APERTURA"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
                gridview.DataColumns["DATA CHIUSURA"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
                gridview.DataColumns["DATA FINE CALCOLO PERFORMANCE"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
                gridview.DataColumns["AUM INIZIALE"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["AUM FINALE"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["AUM MEDIO"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["COMM DI GESTIONE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["COMM PERFORMANCE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO GESTORE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO ADVISOR"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO CONSULENTE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO TOTALE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["QUOTA IN ANNUA"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["QUOTA OUT ANNUA"].PropertiesEdit.DisplayFormatString = "N2";

                // Calcola Totali AUM INIZIALE e AUM FINALE ma non li mostra nel footer
                gridview.TotalSummary.Clear();
                gridview.Settings.ShowFooter = false;
                ASPxSummaryItem totPatrimonioPrec = new ASPxSummaryItem();
                totPatrimonioPrec.FieldName = "AUM INIZIALE";
                totPatrimonioPrec.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totPatrimonioPrec);
                tbTotAumInizialePtf_GPMForecast.DisplayFormatString = "n2";
                tbTotAumInizialePtf_GPMForecast.Text = gridview.GetTotalSummaryValue(totPatrimonioPrec).ToString();

                ASPxSummaryItem totPatrimonioOggi = new ASPxSummaryItem();
                totPatrimonioOggi.FieldName = "AUM FINALE";
                totPatrimonioOggi.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totPatrimonioOggi);
                tbTotAumFinalePtf_GPMForecast.DisplayFormatString = "n2";
                tbTotAumFinalePtf_GPMForecast.Text = gridview.GetTotalSummaryValue(totPatrimonioOggi).ToString();

                // Calcola Totale Aum Finale per OLYMPIA (ITA)
                decimal totAumFinaleITA = CalcolaSommaSocieta(gridview, "OLYMPIAITA");
                tbTotAumFinaleITA_GPMForecast.Text = $"{totAumFinaleITA:n2}";

                // Calcola Totale Aum Finale per OLYMPIA (UK)
                decimal totAumFinaleUK = CalcolaSommaSocieta(gridview, "OLYMPIA");
                tbTotAumFinaleUK_GPMForecast.Text = $"{totAumFinaleUK:n2}";

                // Calcolo Delta
                tbDelta_GPMForecast.DisplayFormatString = "n2";
                //tbDelta_GPMForecast.Text = (Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioPrec)) - Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioOggi))).ToString();
                tbDelta_GPMForecast.Text = (Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioOggi)) - Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioPrec))).ToString();

                // Calcolo Totale CASHIN (per calcolare Raccolta Netta)
                ASPxSummaryItem TotCashIN = CreaSummaryItem("CASH IN");
                gridview.TotalSummary.Add(TotCashIN);
                double CashIN = Convert.ToDouble(gridview.GetTotalSummaryValue(TotCashIN));

                // Calcolo Totale TRANSFERIN (per calcolare Raccolta Netta)
                ASPxSummaryItem TotTransferIN = CreaSummaryItem("TRANSFER IN");
                gridview.TotalSummary.Add(TotTransferIN);
                double TransferIN = Convert.ToDouble(gridview.GetTotalSummaryValue(TotTransferIN));

                // Calcolo Totale WITHDRAWAL (per calcolare Raccolta Netta)
                ASPxSummaryItem TotWithdrawal = CreaSummaryItem("WITHDRAWAL");
                gridview.TotalSummary.Add(TotWithdrawal);
                double Withdrawal = Convert.ToDouble(gridview.GetTotalSummaryValue(TotWithdrawal));

                // Calcolo Totale TRANSFEROUT (per calcolare Raccolta Netta)
                ASPxSummaryItem TotTransferOUT = CreaSummaryItem("TRANSFER OUT");
                gridview.TotalSummary.Add(TotTransferOUT);
                double TransferOUT = Convert.ToDouble(gridview.GetTotalSummaryValue(TotTransferOUT));

                // Calcolo Raccolta Netta
                tbRaccoltaNetta_GPMForecast.DisplayFormatString = "n2";
                tbRaccoltaNetta_GPMForecast.Text = $"{CashIN + TransferIN + Withdrawal + TransferOUT}";

                // Carica Commissioni Performance in maturazione
                //string query = CommonClass.ExecSql("GDN_CommissioniPerformanceEuro");  // Rileva testo query per poi eseguirla in db MySql 
                string CommPerformance = CommonClass.ExecSql("[os_GDN_ID568_A]");
                //DataTable dt = CommonClass.execQuery_Datatable_MySql(query, Properties.Settings.Default.mySqlConnection);

                tbCommPerfInMaturazione.DisplayFormatString = "n2";
                //tbCommPerfInMaturazione.Text = $"{dt.Rows[0][0].ToString()}";
                tbCommPerfInMaturazione.Text = $"{CommPerformance}";

            }
        }

        protected void gvGPMConsuntivo_DataBound(object sender, EventArgs e)
        {
            // ref : https://www.devexpress.com/Support/Center/Question/Details/Q585537/aspxgridview-autogeneratecolumns-true-field-name-start-with-lower-case-letter-insert-a
            // Evita che a runtime le colonne con maiuscole nella query vengono scritte con lo spazio (ad esempio codiceIsin -> codice Isin) 
            // questo poi crea un problema andando a esportare l'excel dove serve che le colonne siano le stesse della query.
            ASPxGridView gridview = sender as ASPxGridView;
            foreach (GridViewColumn column in gridview.Columns)
            {
                if (column is GridViewDataColumn)
                    column.Caption = ((GridViewDataColumn)column).FieldName;
            }

            // Effettua formattazione colonne a runtime..
            if (gridview.Columns.Count > 0)
            {
                gridview.DataColumns["DATA APERTURA"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
                gridview.DataColumns["DATA CHIUSURA"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
                gridview.DataColumns["DATA FINE CALCOLO PERFORMANCE"].PropertiesEdit.DisplayFormatString = "dd/MM/yyyy";
                gridview.DataColumns["AUM INIZIALE"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["AUM FINALE"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["AUM MEDIO TRIM PREC"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["COMM DI GESTIONE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["COMM PERFORMANCE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO GESTORE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO ADVISOR"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO CONSULENTE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["RETRO TOTALE"].PropertiesEdit.DisplayFormatString = "P2";
                gridview.DataColumns["QUOTA IN TRIM PREC"].PropertiesEdit.DisplayFormatString = "N2";
                gridview.DataColumns["QUOTA OUT TRIM PREC"].PropertiesEdit.DisplayFormatString = "N2";

                // Calcola Totali AUM INIZIALE e AUM FINALE ma non li mostra nel footer
                gridview.TotalSummary.Clear();
                gridview.Settings.ShowFooter = false;
                ASPxSummaryItem totPatrimonioPrec = new ASPxSummaryItem();
                totPatrimonioPrec.FieldName = "AUM INIZIALE";
                totPatrimonioPrec.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totPatrimonioPrec);
                tbTotAumInizialePtf_GPMConsuntivo.DisplayFormatString = "n2";
                tbTotAumInizialePtf_GPMConsuntivo.Text = gridview.GetTotalSummaryValue(totPatrimonioPrec).ToString();

                ASPxSummaryItem totPatrimonioOggi = new ASPxSummaryItem();
                totPatrimonioOggi.FieldName = "AUM FINALE";
                totPatrimonioOggi.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                gridview.TotalSummary.Add(totPatrimonioOggi);
                tbTotAumFinalePtf_GPMConsuntivo.DisplayFormatString = "n2";
                tbTotAumFinalePtf_GPMConsuntivo.Text = gridview.GetTotalSummaryValue(totPatrimonioOggi).ToString();

                // Calcola Totale Aum Finale per OLYMPIA (ITA)
                decimal totAumFinaleITA = CalcolaSommaSocieta(gridview, "OLYMPIAITA");
                tbTotAumFinaleITA_GPMConsuntivo.Text = $"{totAumFinaleITA:n2}";

                // Calcola Totale Aum Finale per OLYMPIA (UK)
                decimal totAumFinaleUK = CalcolaSommaSocieta(gridview, "OLYMPIA");
                tbTotAumFinaleUK_GPMConsuntivo.Text = $"{totAumFinaleUK:n2}";

                // Calcolo Delta
                tbDelta_GPMConsuntivo.DisplayFormatString = "n2";
                //tbDelta_GPMConsuntivo.Text = (Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioPrec)) - Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioOggi))).ToString();
                tbDelta_GPMConsuntivo.Text = (Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioOggi)) - Convert.ToDouble(gridview.GetTotalSummaryValue(totPatrimonioPrec))).ToString();


                // Calcolo Totale CASHIN (per calcolare Raccolta Netta)
                ASPxSummaryItem TotCashIN = CreaSummaryItem("CASH IN");
                gridview.TotalSummary.Add(TotCashIN);
                double CashIN = Convert.ToDouble(gridview.GetTotalSummaryValue(TotCashIN));

                // Calcolo Totale TRANSFERIN (per calcolare Raccolta Netta)
                ASPxSummaryItem TotTransferIN = CreaSummaryItem("TRANSFER IN");
                gridview.TotalSummary.Add(TotTransferIN);
                double TransferIN = Convert.ToDouble(gridview.GetTotalSummaryValue(TotTransferIN));

                // Calcolo Totale WITHDRAWAL (per calcolare Raccolta Netta)
                ASPxSummaryItem TotWithdrawal = CreaSummaryItem("WITHDRAWAL");
                gridview.TotalSummary.Add(TotWithdrawal);
                double Withdrawal = Convert.ToDouble(gridview.GetTotalSummaryValue(TotWithdrawal));

                // Calcolo Totale TRANSFEROUT (per calcolare Raccolta Netta)
                ASPxSummaryItem TotTransferOUT = CreaSummaryItem("TRANSFER OUT");
                gridview.TotalSummary.Add(TotTransferOUT);
                double TransferOUT = Convert.ToDouble(gridview.GetTotalSummaryValue(TotTransferOUT));

                // Calcolo Raccolta Netta
                tbRaccoltaNetta_GPMConsuntivo.DisplayFormatString = "n2";
                tbRaccoltaNetta_GPMConsuntivo.Text = $"{CashIN + TransferIN + Withdrawal + TransferOUT}";
            }
        }

        private ASPxSummaryItem CreaSummaryItem(string FieldName)
        {
            ASPxSummaryItem summaryItem = new ASPxSummaryItem();
            summaryItem.FieldName = FieldName;
            summaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum;
            return summaryItem;
        }

        private decimal CalcolaSommaSocieta(ASPxGridView gridView, string Societa)
        {
            decimal sommaAum = 0;

            for (int i = 0; i < gridView.VisibleRowCount; i++)
            {
                object societaObj = gridView.GetRowValues(i, "SOCIETA");
                object aumFinaleObj = gridView.GetRowValues(i, "AUM FINALE");

                if (societaObj != null && aumFinaleObj != null)
                {
                    string societaGridView = societaObj.ToString();

                    if (societaGridView == Societa)
                    {
                        if (decimal.TryParse(aumFinaleObj.ToString(), out decimal aumFinale))
                        {
                            sommaAum += aumFinale;
                        }
                    }
                }
            }

            return sommaAum;

        }

        #endregion

        #region SELECTING
        protected void SqlDSGestioniPatrimoniali_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {
            e.Command.CommandTimeout = 0; // disabilita timeout , aspetta finchè non finisce elaborazione
        }

        protected void SqlDSFondi_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {
            e.Command.CommandTimeout = 0; // disabilita timeout , aspetta finchè non finisce elaborazione
        }

        protected void SqlDSDettaglioFondi_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {
            e.Command.CommandTimeout = 0; // disabilita timeout , aspetta finchè non finisce elaborazione
        }

        protected void SqlDSGPMConsuntivo_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {
            e.Command.CommandTimeout = 0; // disabilita timeout , aspetta finchè non finisce elaborazione
        }

        protected void SqlDSGPMForecast_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {
            e.Command.CommandTimeout = 0; // disabilita timeout , aspetta finchè non finisce elaborazione
        }
        #endregion

        protected void ASPxRibbon1_Init(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // Trovo il Group "Filtri"
                RibbonGroup gruppoFiltri = ASPxRibbon1.Tabs[0].Groups.FindByName("Filtri");

                if (gruppoFiltri != null)
                {
                    // Trovo il TemplateItem
                    RibbonTemplateItem template = gruppoFiltri.Items.FindByName("ribbonTemplate") as RibbonTemplateItem;

                    if (template != null)
                    {
                        ASPxDateEdit dataInizio = template.FindControl("dataInizio") as ASPxDateEdit;
                        ASPxDateEdit dataFine = template.FindControl("dataFine") as ASPxDateEdit;

                        if (dataInizio != null)
                            dataInizio.Date = new DateTime(DateTime.Now.Year, 1, 1);

                        if (dataFine != null)
                            dataFine.Date = CommonClass.AddBusinessDays(DateTime.Today,-1);
                    }
                }
            }
        }
    }
}