private void ReportQ1(int mesi)
        {
            DateTime inizio = _Inizio;
            DateTime fine   = inizio.AddMonths(3).AddDays(-1);

            if (mesi == 3)
            {
                while (inizio.Month != 1 && inizio.Month != 4 && inizio.Month != 7 && inizio.Month != 10)
                {
                    inizio = inizio.AddMonths(-1);
                }
                fine = inizio.AddMonths(3).AddDays(-1);
            }
            else if (mesi == 12)
            {
                inizio = new DateTime(_Inizio.Year, 1, 1);
                fine   = new DateTime(_Inizio.Year, 12, 31);
            }
            else
            {
                throw new Exception("periodo non previsto");
            }

            XPCollection <Versamento> versamenti = new XPCollection <Versamento>(this.unitOfWork1);
            GroupOperator             tipo       =
                new GroupOperator(GroupOperatorType.Or, new CriteriaOperator[] {
                new BinaryOperator("Tipologia", EnumTipologiaVersamento.Incasso_Pos),
                new BinaryOperator("Tipologia", EnumTipologiaVersamento.Incasso_Contanti),
                new BinaryOperator("Tipologia", EnumTipologiaVersamento.FondoCassa_Versamento)
            });

            versamenti.Criteria =
                new GroupOperator(GroupOperatorType.And, new CriteriaOperator[] {
                new BinaryOperator("Struttura.Oid", _Struttura.Oid),
                new BinaryOperator("InizioPeriodo", inizio, BinaryOperatorType.GreaterOrEqual),
                new BinaryOperator("FinePeriodo", fine, BinaryOperatorType.LessOrEqual),
                tipo
            });
            versamenti.Sorting = new SortingCollection(new SortProperty[] { new SortProperty("DataVersamento", DevExpress.Xpo.DB.SortingDirection.Ascending) });

            List <DatiReportQ1> elenco = new List <DatiReportQ1>();

            foreach (Versamento item in versamenti)
            {
                DatiReportQ1Sub dati = new DatiReportQ1Sub();

                dati.Quietanza = item.Quietanza;
                switch (item.Tipologia)
                {
                case EnumTipologiaVersamento.Incasso_Pos:
                    dati.Importo = item.Incassi;
                    break;

                case EnumTipologiaVersamento.Incasso_Contanti:
                    dati.Importo = item.ImportoVersato - item.ContanteAltriEnti;
                    break;

                case EnumTipologiaVersamento.FondoCassa_Versamento:
                    dati.Importo = item.ImportoVersato;
                    break;

                default:
                    throw new Exception(String.Format("Valore (versamento.tipologia) non previsto: {0}", item.Tipologia));
                }

                if (string.IsNullOrEmpty(item.Quietanza))
                {
                    XtraMessageBox.Show("Errore ReportQ1: non sono state inserite tutte le quietanze del periodo considerato.", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                DatiReportQ1 target = null;
                foreach (DatiReportQ1 datiReportQ1 in elenco)
                {
                    if (datiReportQ1.MeseInizio == item.InizioPeriodo.Month)
                    {
                        target = datiReportQ1;
                    }
                }

                if (target == null)
                {
                    target                 = new DatiReportQ1();
                    target.Periodo         = string.Format("{0:MMMM}", item.InizioPeriodo).ToUpper();
                    target.MeseInizio      = item.InizioPeriodo.Month;
                    target.RicevutePeriodo = RicevuteMesePeriodo(item.InizioPeriodo, null);
                    target.ImportoPeriodo  = 0;
                    target.Elenco          = new List <DatiReportQ1Sub>();

                    elenco.Add(target);
                }

                target.Elenco.Add(dati);
                target.CalcolaTotale();
            }

            XtraReportQ1 report = new XtraReportQ1();

            report.Init(elenco, _Struttura, inizio, mesi);

            report.ShowRibbonPreviewDialog();
        }
        private void ReportQ1A(SoggettoEconomico soggetto)
        {
            DateTime inizio = new DateTime(_Inizio.Year, 1, 1);
            DateTime fine   = new DateTime(_Inizio.Year, 12, 31);

            XPCollection <Versamento> versamenti = new XPCollection <Versamento>(this.unitOfWork1);
            GroupOperator             tipo       =
                new GroupOperator(GroupOperatorType.Or, new CriteriaOperator[] {
                new BinaryOperator("Tipologia", EnumTipologiaVersamento.Versamento_AdAltriEnti)
            });

            versamenti.Criteria =
                new GroupOperator(GroupOperatorType.And, new CriteriaOperator[] {
                new BinaryOperator("Struttura.Oid", _Struttura.Oid),
                new BinaryOperator("InizioPeriodo", inizio, BinaryOperatorType.GreaterOrEqual),
                new BinaryOperator("FinePeriodo", fine, BinaryOperatorType.LessOrEqual),
                tipo
            });
            versamenti.Sorting = new SortingCollection(new SortProperty[] { new SortProperty("DataVersamento", DevExpress.Xpo.DB.SortingDirection.Ascending) });

            List <DatiReportQ1> elenco = new List <DatiReportQ1>();

            foreach (Versamento item in versamenti)
            {
                DatiReportQ1Sub dati = new DatiReportQ1Sub();

                dati.Quietanza = item.Quietanza;
                switch (item.Tipologia)
                {
                case EnumTipologiaVersamento.Versamento_AdAltriEnti:
                    dati.Importo = -item.ContanteAltriEnti;
                    break;

                default:
                    throw new Exception(String.Format("Valore (versamento.tipologia) non previsto: {0}", item.Tipologia));
                }

                if (string.IsNullOrEmpty(item.Quietanza))
                {
                    XtraMessageBox.Show("Errore ReportQ1A: non sono state inserite tutte le quietanze del periodo considerato.", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    //return;
                }

                DatiReportQ1 target = null;
                foreach (DatiReportQ1 datiReportQ1 in elenco)
                {
                    if (datiReportQ1.MeseInizio == item.InizioPeriodo.Month)
                    {
                        target = datiReportQ1;
                    }
                }

                if (target == null)
                {
                    target                 = new DatiReportQ1();
                    target.Periodo         = string.Format("{0:MMMM} - {1:MMMM}", item.InizioPeriodo, item.FinePeriodo).ToUpper();
                    target.MeseInizio      = item.InizioPeriodo.Month;
                    target.RicevutePeriodo = string.Format("n. {0} biglietti", RicevutePeriodo(item.InizioPeriodo, item.FinePeriodo, soggetto));
                    target.ImportoPeriodo  = 0;
                    target.Elenco          = new List <DatiReportQ1Sub>();

                    elenco.Add(target);
                }

                target.Elenco.Add(dati);
                target.CalcolaTotale();
            }

            XtraReportQ1A report = new XtraReportQ1A();

            report.Init(elenco, _Struttura, inizio, soggetto);

            report.ShowRibbonPreviewDialog();
        }