private void inizializza()
        {
            Inizializza(_impostazioneReportDTO, null);

            if (_reportDataSource.Count > 0)
            {
                _detailBand.MultiColumn.Mode = MultiColumnMode.UseColumnCount;
                _detailBand.MultiColumn.ColumnCount = _reportDataSource.Count;
                _detailBand.MultiColumn.Layout = ColumnLayout.DownThenAcross;
            }

            var location = 0.01f;
            var columnBreak = true;
            var index = 0;

            var totaleRicavi = _reportDataSource[0].Sum(item => item.Importo);
            var totaleCosti = _reportDataSource[1].Sum(item => item.Importo);

            var utileEsercizio = 0m;
            var perditaEsercizio = 0m;
            if (totaleCosti > totaleRicavi)
                perditaEsercizio = totaleCosti - totaleRicavi;
            else
                utileEsercizio = totaleRicavi - totaleCosti;

            foreach (var columnDataSource in _reportDataSource)
            {
                index++;
                if (index == _reportDataSource.Count)
                    columnBreak = false;

                var caption = string.Empty;
                ReportRiepilogoContoEconomicoDTO reportRiepilogoContoEconomicoDTO = null;
                if (index == 1)
                {
                    if(perditaEsercizio > 0)
                        reportRiepilogoContoEconomicoDTO = new ReportRiepilogoContoEconomicoDTO { Importo =  perditaEsercizio, Descrizione = "Perdita di Gestione", Tipo = TipoRiepilogoEconomico.Undefined};
                    caption = "Ricavi";
                }
                else if (index > 1)
                {
                    if (utileEsercizio > 0)
                        reportRiepilogoContoEconomicoDTO = new ReportRiepilogoContoEconomicoDTO { Importo = utileEsercizio, Descrizione = "Utile di Gestione", Tipo = TipoRiepilogoEconomico.Undefined };
                    caption = "Costi";
                }

                location = addSubReport(columnDataSource, reportRiepilogoContoEconomicoDTO, caption, location, columnBreak);
            }
        }
        private float addSubReport(IList<ReportRiepilogoContoEconomicoDTO> dataSource, ReportRiepilogoContoEconomicoDTO risultatoEsercizio, string caption, float location, bool columnBreak)
        {
            var reportDare = new RiepilogoContoEconomico(dataSource, risultatoEsercizio, _condominio, _esercizio, _dataIniziale, _dataFinale, _impostazioneReportDTO, caption, true, _reportKey);

            var subreport = new XRSubreport
            {
                ReportSource = reportDare.GetReport(),
                LocationF = new PointF(0, location + .01f)
            };
            _detailBand.Controls.Add(subreport);

            location += reportDare.GetTotalHeight();

            if (columnBreak)
            {
                location = location + .01f;
                var pageBreak = new XRPageBreak();
                _detailBand.Controls.Add(pageBreak);
                pageBreak.LocationF = new PointF(0, location);
            }

            return location;
        }
        public IList<ReportRiepilogoContoEconomicoDTO> GetRiepilogoContoEconomico(int idEsercizio, DateTime dataIniziale, DateTime dataFinale)
        {
            try
            {
                var result = new List<ReportRiepilogoContoEconomicoDTO>();

                var esercizio = _daoFactory.GetEsercizioDao().GetById(idEsercizio, false);

                // -------------------------------------------------------------------
                //  Risultato di esercizio
                // -------------------------------------------------------------------
                var movimentiEconomici = _daoFactory.GetMovimentoContabileDao().GetByQuery("FROM MovimentoContabile MOV LEFT JOIN FETCH MOV.Testata TES LEFT JOIN FETCH MOV.ContoRiferimento CON WHERE MOV.Causale.Codice <> 'OC' AND MOV.Causale.Codice <> 'C1' AND MOV.Causale.Codice <> 'C2' AND MOV.Causale.Codice <> 'A2' AND TES.EsercizioRiferimento.CondominioRiferimento = :condominio AND TES.DataRegistrazione >= :dataRegistrazioneIniziale AND TES.DataRegistrazione <= :dataRegistrazioneFinale AND CON.PresenteBilancio = 1 AND CON.Tipo = :tipo", new QueryParam("condominio", esercizio.CondominioRiferimento.ID), new QueryParam("dataRegistrazioneIniziale", dataIniziale), new QueryParam("dataRegistrazioneFinale", dataFinale), new QueryParam("tipo", Conversione.ToHQLParameter(TipoContoEconomicoEnum.Economico))).Cast<IRipartizioneSpesa>().ToList();
                var risultatoEconomicoCosto = movimentiEconomici.Sum(item => item.Importo.GetValueOrDefault());

                // -------------------------------------------------------------------
                //  Debiti v/condomini (Quanto hanno effettivamente versato)
                // -------------------------------------------------------------------
                var contiCondomini = _daoFactory.GetContoDao().GetAllByCodice(esercizio.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoVersamentiCondomini());

                var idContiCondomini = new List<int>();
                idContiCondomini.AddRange(contiCondomini.Select(conto => conto.ID));

                var movimentiCondomini = _movimentoContabileService.GetMovimentiByContiData(esercizio.CondominioRiferimento.ID, dataIniziale, dataFinale, idContiCondomini).Where(item => item.Causale.Codice != "AC" && item.Causale.Codice != "OC" && item.Causale.Codice != "C1" && item.Causale.Codice != "C2" && item.Causale.Codice != "A2");
                var importoVersamentiCondomini = movimentiCondomini.Sum(item => item.GetImportoConSegno());

                // ---------------------------------------------
                //  Saldo iniziale
                // ---------------------------------------------
                var importoSaldoIniziale = _saldiCondominiService.GetSaldiSoggetti(esercizio.CondominioRiferimento.ID, null, null, TipoAccorpamentoRateEnum.Nessuno).Sum(item => item.Importo);
                var itemSaldoIniziale = new ReportRiepilogoContoEconomicoDTO
                {
                    Importo = importoSaldoIniziale,
                    Tipo = TipoRiepilogoEconomico.SaldoIniziale,
                    Descrizione = TipoRiepilogoEconomico.SpeseGestione.Description(),
                    Segno = importoSaldoIniziale > 0 ? "A" : "D"
                };

                var importoPreventivato = 0m;
                var bilancioPreventivo = _bilancioService.GetPreventivoCorrente(idEsercizio);
                if(bilancioPreventivo != null)
                    importoPreventivato = bilancioPreventivo.Conti.Sum(item => item.Importo.GetValueOrDefault()) +
                                          bilancioPreventivo.Riparto.Sum(item => item.Importo.GetValueOrDefault());

                // ---------------------------------------------
                //  Costi
                // ---------------------------------------------
                var itemSpeseGestione = new ReportRiepilogoContoEconomicoDTO
                {
                    Importo = risultatoEconomicoCosto,
                    Tipo = TipoRiepilogoEconomico.SpeseGestione,
                    Descrizione = $"{TipoRiepilogoEconomico.SpeseGestione.Description()} (importo preventivato: {importoPreventivato:C})",
                    Segno = "A"
                };

                // ---------------------------------------------
                //  Ricavi
                // ---------------------------------------------
                var itemVersamentiCondomini = new ReportRiepilogoContoEconomicoDTO
                {
                    Importo = importoVersamentiCondomini.GetValueOrDefault(),
                    Tipo = TipoRiepilogoEconomico.VersamentiCondomini,
                    Descrizione = TipoRiepilogoEconomico.VersamentiCondomini.Description(),
                    Segno = "D"
                };

                result.Add(itemSaldoIniziale);
                result.Add(itemVersamentiCondomini);
                result.Add(itemSpeseGestione);

                return result;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato nella redazione del riepilogo del conto economico - {0} - esercizio:{1} - dataIniziale:{2:d} - dataRiferimento:{3:d}", ex, Utility.GetMethodDescription(), idEsercizio, dataIniziale, dataFinale);
                throw;
            }
        }