示例#1
0
        public IEnumerable<ReportBilancioDTO> GetDataSourceBilancioConsuntivoConto(int idEsercizio)
        {
            var lista = new Dictionary<string, ReportBilancioDTO>();
            var esercizio = _daoFactory.GetEsercizioDao().GetById(idEsercizio, false);

            // Valorizzo con i movimenti contabili registrati
            foreach (var testata in esercizio.TestateContabili)
            {
                foreach (var movimento in testata.Movimenti)
                {
                    if (movimento.IsEconomico() && movimento.ContoRiferimento.PresenteBilancio)
                    {
                        var key = movimento.ContoRiferimento.ID.ToString(CultureInfo.InvariantCulture);

                        ReportBilancioDTO item;
                        if (lista.ContainsKey(key))
                            item = lista[key];
                        else
                        {
                            item = new ReportBilancioDTO();
                            lista.Add(key, item);
                            item.IdConto = movimento.ContoRiferimento.ID;
                            item.CodiceConto = movimento.ContoRiferimento.Codice;
                            item.DescrizioneConto = movimento.ContoRiferimento.Descrizione;
                            item.OrdineConto = movimento.ContoRiferimento.Ordine;
                            item.IsDirettoConto = true;
                        }

                        if (movimento.GetImportoConSegno(false) != null)
                            item.ImportoConto += movimento.GetImportoConSegno(false).GetValueOrDefault();
                    }

                }
            }

            return lista.Values;
        }
示例#2
0
        public IList<ReportBilancioDTO> GetDataSourceBilancioPreventivo_SottoConto(int idEsercizio, int? idStabile, int? idScala, bool addebitiCondominio, bool preventivoPrecedente, bool consuntivoPrecedente, bool addebitiDirettiStabileScala)
        {
            // Trovo il rendiconto preventivo provvisorio e l'eventuale definitivo
            var rendicontoDaUsare = getRendicontoPreventivoCorrente(idEsercizio);

            // Creo il DTO per il dettaglio dei conti
            if (rendicontoDaUsare != null)
            {
                var esercizio = _daoFactory.GetEsercizioDao().GetById(idEsercizio, false);

                // Se richiesto il consuntivo precedente
                IEnumerable<ReportBilancioDTO> listaConsuntivoPrecedente = new List<ReportBilancioDTO>();
                IList<ReportRipartizioneBilancioDTO> ripartoConsuntivoPrecedente = new List<ReportRipartizioneBilancioDTO>();
                if (esercizio != null && esercizio.Gestione == GestioneEsercizioEnum.Ordinario)
                {
                    var esercizioPrecedente = esercizio.GetEsercizioPrecedente();
                    if (esercizioPrecedente != null)
                    {
                        if(consuntivoPrecedente)
                            listaConsuntivoPrecedente = GetDataSourceBilancioConsuntivo_Movimenti(esercizioPrecedente.ID, esercizio.CondominioRiferimento.ID, idStabile, idScala, null, null, null, null, null, null, false, false, false, LimitePagamenti.Undefined, false, addebitiCondominio, false);
                        ripartoConsuntivoPrecedente = GetDataSourceRipartizioneBilancioConsuntivo(esercizioPrecedente.ID, null, null, null, null, idStabile, idScala, false, false, TipoAccorpamentoRateEnum.Nessuno, false, false, addebitiCondominio, addebitiDirettiStabileScala, null).ToList();
                    }
                }

                // Se richiesto il preventivo precedente
                IEnumerable<ReportBilancioDTO> listaPreventivoPrecedente = new List<ReportBilancioDTO>();
                if (esercizio != null && esercizio.Gestione == GestioneEsercizioEnum.Ordinario && preventivoPrecedente)
                {
                    var esercizioPrecedente = esercizio.GetEsercizioPrecedente();
                    if (esercizioPrecedente != null)
                    {
                        listaPreventivoPrecedente = GetDataSourceBilancioPreventivo_SottoConto(esercizioPrecedente.ID, idStabile, idScala, addebitiCondominio, false, false, addebitiDirettiStabileScala);
                    }
                }

                var millesimiConto = new Dictionary<string, IList<MillesimoDTO>>();
                var reportItems = new List<ReportBilancioDTO>(rendicontoDaUsare.Conti.Count);
                foreach (var dettaglioConto in rendicontoDaUsare.Conti)
                {
                    var importo = dettaglioConto.Importo.GetValueOrDefault();
                    if (addebitiDirettiStabileScala)
                    {
                        if (idStabile != null)
                        {
                            if (dettaglioConto.Stabile != null && dettaglioConto.Stabile.ID != idStabile.Value)
                                continue;
                            else if (dettaglioConto.GruppoStabile != null)
                            {
                                if(dettaglioConto.GruppoStabile.PalazzinaRiferimento.ID != idStabile.Value)
                                    continue;
                            }
                        }
                        else if (idScala != null)
                        {
                            if (dettaglioConto.GruppoStabile != null && dettaglioConto.GruppoStabile.ID != idScala.Value)
                                continue;
                            else if (dettaglioConto.Stabile != null)
                            {
                                if(!dettaglioConto.Stabile.GruppiStabile.Select(item => item.ID).Contains(idScala.Value))
                                    continue;
                            }
                        } 
                        
                        if(dettaglioConto.Stabile == null && dettaglioConto.GruppoStabile == null && (idStabile != null || idScala != null))
                            continue;
                    }
                    else if (addebitiCondominio)
                    {
                        if (dettaglioConto.Stabile != null || dettaglioConto.GruppoStabile != null)
                            continue;
                    }
                    else
                    {
                        importo = getImporto(dettaglioConto, idStabile, idScala, millesimiConto, ripartoConsuntivoPrecedente, esercizio);
                        if (importo == 0)
                            continue;
                    }

                    if ((dettaglioConto.ContoRiferimento == null || dettaglioConto.ContoRiferimento.Deleted != "Y") && (dettaglioConto.SottoContoRiferimento == null || dettaglioConto.SottoContoRiferimento.ContoRiferimento.Deleted != "Y"))
                    {
                        if (importo != 0)
                        {
                            var reportItem = new ReportBilancioDTO();

                            if (dettaglioConto.GruppoStabile != null)
                            {
                                reportItem.IdGruppoStabile = 30000 + dettaglioConto.GruppoStabile.ID;
                                reportItem.DescrizioneGruppoStabile = "Scala: " + dettaglioConto.GruppoStabile.Descrizione;
                                reportItem.OrdineStabile = 30000 + dettaglioConto.GruppoStabile.Ordine;
                            }
                            else if (dettaglioConto.Stabile != null)
                            {
                                reportItem.IdGruppoStabile = 20000 + dettaglioConto.Stabile.ID;
                                reportItem.DescrizioneGruppoStabile = "Stabile: " + dettaglioConto.Stabile.Descrizione;
                                reportItem.OrdineStabile = 20000 + dettaglioConto.Stabile.Ordine;
                            }
                            else
                            {
                                reportItem.IdGruppoStabile = -1;
                                reportItem.DescrizioneGruppoStabile = "Condominio";
                                reportItem.OrdineStabile = 10000;
                            }
                                    
                            if (dettaglioConto.SottoContoRiferimento != null)
                            {
                                reportItem.IdConto = dettaglioConto.SottoContoRiferimento.ContoRiferimento.ID;
                                reportItem.IdSottoConto = dettaglioConto.SottoContoRiferimento.ID;
                                reportItem.OrdineConto = dettaglioConto.SottoContoRiferimento.ContoRiferimento.Ordine;
                                reportItem.CodiceConto = dettaglioConto.SottoContoRiferimento.ContoRiferimento.Codice;
                                reportItem.DescrizioneConto = dettaglioConto.SottoContoRiferimento.ContoRiferimento.Descrizione;
                                reportItem.CodiceSottoConto = dettaglioConto.SottoContoRiferimento.Codice;
                                reportItem.DescrizioneSottoConto = dettaglioConto.SottoContoRiferimento.GetDescrizione(rendicontoDaUsare.Esercizio, null, null);
                                reportItem.IsDirettoConto = false;

                                // Consuntivo e Preventivo precedente
                                reportItem.ImportoSottoContoConsuntivoPrecedente = listaConsuntivoPrecedente.Where(mov => mov.IdSottoConto == reportItem.IdSottoConto && mov.IdStabile == reportItem.IdStabile && mov.IdGruppoStabile == reportItem.IdGruppoStabile).Sum(mov => mov.ImportoMovimentoProprieta + mov.ImportoMovimentoConduttore);
                                if(listaPreventivoPrecedente != null)
                                    reportItem.ImportoSottoContoPreventivoPrecedente = listaPreventivoPrecedente.Where(mov => mov.IdSottoConto == reportItem.IdSottoConto && mov.IdStabile == reportItem.IdStabile && mov.IdGruppoStabile == reportItem.IdGruppoStabile).Sum(mov => mov.ImportoSottoContoProprieta + mov.ImportoSottoContoConduttore);

                                if (importo != 0)
                                    reportItem.ImportoSottoContoProprieta += _ripartizioneService.GetImportoCompetenza(importo, dettaglioConto.SottoContoRiferimento.ContoRiferimento, dettaglioConto.SottoContoRiferimento, TipoSoggetto.Proprietario);
                            }
                            else if (dettaglioConto.ContoRiferimento != null)
                            {
                                reportItem.IdConto = dettaglioConto.ContoRiferimento.ID;
                                reportItem.OrdineConto = dettaglioConto.ContoRiferimento.Ordine;
                                reportItem.CodiceConto = dettaglioConto.ContoRiferimento.Codice;
                                reportItem.DescrizioneConto = dettaglioConto.ContoRiferimento.Descrizione;
                                reportItem.CodiceSottoConto = reportItem.CodiceConto;
                                reportItem.DescrizioneSottoConto = reportItem.DescrizioneConto;
                                reportItem.IsDirettoConto = true;

                                if (importo != 0)
                                    reportItem.ImportoSottoContoProprieta += importo * dettaglioConto.ContoRiferimento.PercentualeProprieta;

                                // Consuntivo e Preventivo precedente
                                reportItem.ImportoContoConsuntivoPrecedente = listaConsuntivoPrecedente.Where(mov => mov.IdConto == reportItem.IdConto && mov.IdStabile == reportItem.IdStabile && mov.IdGruppoStabile == reportItem.IdGruppoStabile).Sum(mov => mov.ImportoMovimentoProprieta + mov.ImportoMovimentoConduttore);
                                if (listaPreventivoPrecedente != null)
                                    reportItem.ImportoContoPreventivoPrecedente = listaPreventivoPrecedente.Where(mov => mov.IdConto == reportItem.IdConto && mov.IdStabile == reportItem.IdStabile && mov.IdGruppoStabile == reportItem.IdGruppoStabile).Sum(mov => mov.ImportoSottoContoProprieta + mov.ImportoSottoContoConduttore);

                                if (reportItem.ImportoSottoContoConsuntivoPrecedente == 0)
                                    reportItem.ImportoSottoContoConsuntivoPrecedente = listaConsuntivoPrecedente.Where(mov => mov.IdConto == reportItem.IdConto && mov.IdSottoConto == 0).Sum(mov => mov.ImportoMovimentoProprieta + mov.ImportoMovimentoConduttore);
                                if (reportItem.ImportoSottoContoPreventivoPrecedente == 0 && listaPreventivoPrecedente != null)
                                    reportItem.ImportoSottoContoPreventivoPrecedente = listaPreventivoPrecedente.Where(mov => mov.IdConto == reportItem.IdConto && mov.IdSottoConto == 0).Sum(mov => mov.ImportoSottoContoProprieta + mov.ImportoSottoContoConduttore);
                            }

                            if (importo != 0)
                                reportItem.ImportoSottoContoConduttore += importo - reportItem.ImportoSottoContoProprieta;

                            // ==================================================================================
                            //  Se conto di spese personali elaboro i dettagli per unità immobiliare
                            // ==================================================================================
                            if ((dettaglioConto.ContoRiferimento != null && !dettaglioConto.ContoRiferimento.IsSpesePersonali) || (dettaglioConto.SottoContoRiferimento != null && !dettaglioConto.SottoContoRiferimento.ContoRiferimento.IsSpesePersonali))
                                reportItems.Add(reportItem);
                            else
                            {
                                // Se sono presenti importi di consuntivo o preventivo precedente aggiungo la riga bugid#8603
                                if (reportItem.ImportoContoConsuntivoPrecedente != 0 ||
                                    reportItem.ImportoContoPreventivoPrecedente != 0 ||
                                    reportItem.ImportoSottoContoConsuntivoPrecedente != 0 ||
                                    reportItem.ImportoContoPreventivoPrecedente != 0)
                                {
                                    reportItem.ImportoConto = 0;
                                    reportItem.ImportoSottoContoProprieta = 0;
                                    reportItem.ImportoSottoContoConduttore = 0;
                                    reportItem.ImportoMovimentoProprieta = 0;
                                    reportItem.ImportoMovimentoConduttore = 0;
                                    reportItems.Add(reportItem);
                                }

                                var percentualeProprieta = 0m;
                                if (dettaglioConto.ContoRiferimento != null)
                                    percentualeProprieta = dettaglioConto.ContoRiferimento.PercentualeProprieta;
                                if (dettaglioConto.SottoContoRiferimento != null)
                                {
                                    percentualeProprieta = dettaglioConto.SottoContoRiferimento.ContoRiferimento.PercentualeProprieta;
                                    if (dettaglioConto.SottoContoRiferimento.PercentualeProprieta != null)
                                        percentualeProprieta = dettaglioConto.SottoContoRiferimento.PercentualeProprieta.GetValueOrDefault();
                                }

                                foreach (var rendicontoAnnualeUnita in dettaglioConto.DettagliUnita)
                                {
                                    if (rendicontoAnnualeUnita.Importo != null)
                                    {
                                        if (!isAddebitatoScalaStabile(rendicontoAnnualeUnita, idStabile, idScala))
                                            continue;

                                        var reportItemUnita = (ReportBilancioDTO)reportItem.Clone();
                                        reportItemUnita.IsSpesaPersonale = true;
                                        reportItemUnita.ImportoConto = rendicontoAnnualeUnita.Importo.GetValueOrDefault();
                                        reportItemUnita.ImportoSottoContoProprieta = reportItemUnita.ImportoConto * percentualeProprieta;
                                        reportItemUnita.ImportoSottoContoConduttore = reportItemUnita.ImportoConto - reportItemUnita.ImportoSottoContoProprieta;

                                        // ------------------------------------
                                        // Nominativo per spesa personale
                                        // ------------------------------------
                                        var data = rendicontoDaUsare.Esercizio.DataChiusura;
                                        var nominativo = rendicontoAnnualeUnita.Unita.Descrizione;
                                        var soggettiAttivi = _daoFactory.GetSoggettoCondominioDao().GetAttiviByEsercizioUnita(rendicontoAnnualeUnita.Unita.ID, rendicontoDaUsare.Esercizio);

                                        var conduttore = rendicontoAnnualeUnita.Unita.GetConduttorePrincipale(data);
                                        if (percentualeProprieta == 1 || conduttore == null)
                                        {
                                            nominativo = string.Empty;
                                            var proprietari = soggettiAttivi.Where(sogg => sogg.Tipo == TipoSoggetto.Proprietario && sogg.PercentualeRiferimento != null);
                                            foreach (var soggetto in proprietari)
                                            {
                                                if (!string.IsNullOrEmpty(nominativo))
                                                    nominativo += "/";
                                                nominativo += soggetto.DisplayName;
                                            }
                                        }
                                        else if (percentualeProprieta == 0)
                                        {
                                            nominativo = string.Empty;
                                            var conduttori = soggettiAttivi.Where(sogg => sogg.Tipo == TipoSoggetto.Conduttore && sogg.PercentualeRiferimento != null);
                                            foreach (var soggetto in conduttori)
                                            {
                                                if (!string.IsNullOrEmpty(nominativo))
                                                    nominativo += "/";
                                                nominativo += soggetto.DisplayName;
                                            }
                                        }

                                        reportItemUnita.DescrizioneSottoConto = reportItemUnita.DescrizioneSottoConto + " (" + nominativo + ")";
                                        reportItems.Add(reportItemUnita);
                                    }

                                }
                            }
                        }
                    }

                }

                // ==================================================================================
                // Se richiesto confronto con anno precedente aggiungo i sottoconti mancanti
                // ==================================================================================
                reportItems.AddRange(getItemsSottocontiMancanti(reportItems, listaConsuntivoPrecedente, listaPreventivoPrecedente, consuntivoPrecedente, preventivoPrecedente));

                return reportItems;
            }
            
            _log.WarnFormat("Non trovato alcuna apertura di rendiconto preventivo - {0} - esercizio:{1}", Utility.GetMethodDescription(), idEsercizio);
            return null;
        }
示例#3
0
        public IEnumerable<ReportBilancioDTO> GetDataSourceBilancioConsuntivo_Movimenti(int? idEsercizio, int? idCondominio, int? idStabile, int? idScala, DateTime? dataRegistrazioneIniziale, DateTime? dataRegistrazioneFinale, string datiFatturaNumeroRegistrazione, int? anno, int? detrazione, IList<int> idSpese, bool dettaglioConto, bool preventivoPrecedente, bool consuntivoPrecedente, LimitePagamenti limitePagamenti, bool dettaglioPersonali, bool addebitiCondominio, bool addebitiDirettiStabileScala)
        {
            try
            {
                var lista = new Dictionary<string, ReportBilancioDTO>();
                var listaMovimentiPersonali = new Dictionary<string, ReportBilancioDTO>();

                Esercizio esercizio = null;
                if(idEsercizio != null)
                    esercizio = _daoFactory.GetEsercizioDao().GetById(idEsercizio.Value, false);

                var dataLimite = DateTime.Today;
                if (limitePagamenti == LimitePagamenti.DataChiusura)
                {
                    dataLimite = esercizio?.DataChiusura.GetValueOrDefault() ?? dataRegistrazioneFinale.GetValueOrDefault();
                }

                // Se richiesto il consuntivo precedente
                IEnumerable<ReportBilancioDTO> listaConsuntivoPrecedente = new List<ReportBilancioDTO>();
                if (esercizio != null && esercizio.Gestione == GestioneEsercizioEnum.Ordinario && consuntivoPrecedente)
                {
                    var esercizioPrecedente = esercizio.GetEsercizioPrecedente();
                    if (esercizioPrecedente != null)
                    {
                        listaConsuntivoPrecedente = GetDataSourceBilancioConsuntivo_Movimenti(esercizioPrecedente.ID, idCondominio, idStabile, idScala, null, null, datiFatturaNumeroRegistrazione, null, null, null, false, false, false, LimitePagamenti.Undefined, false, addebitiCondominio, addebitiDirettiStabileScala);
                    }
                }

                // Se richiesto il preventivo precedente
                IEnumerable<ReportBilancioDTO> listaPreventivoPrecedente = new List<ReportBilancioDTO>();
                if (esercizio != null && esercizio.Gestione == GestioneEsercizioEnum.Ordinario && preventivoPrecedente)
                {
                    listaPreventivoPrecedente = GetDataSourceBilancioPreventivo_SottoConto(esercizio.ID, null, null, addebitiCondominio, false, false, addebitiDirettiStabileScala);
                }

                //============================================================================================================================
                // Ricalcolo per tutte le spese la ripartizione (Solo se l'esercizio è aperto) e solo se non è la ripartizione per detrazione
                //============================================================================================================================
                // BUGID#2159 - COMMENTATO: Perchè con la nuova funzione di riparto aggregato non deve più servire
                //============================================================================================================================
                //if (idEsercizio != null && esercizio.Stato == StatoEsercizioEnum.Aperto)
                //    _spesaService.ReloadRipartizioneByEsercizio(idEsercizio.Value);
                //============================================================================================================================

                Condominio condominio = null;
                if (idCondominio != null)
                    condominio = _daoFactory.GetCondominioDao().GetById(idCondominio.Value, false);

                IList<Conto> contiChiusuraStraordinario = new List<Conto>();
                if (esercizio != null)
                    contiChiusuraStraordinario = getContiEconomiciChiusuraStraordinario(esercizio.CondominioRiferimento.ID);
                else if (condominio != null)
                    contiChiusuraStraordinario = getContiEconomiciChiusuraStraordinario(condominio.ID);

                var sottoContiTemporanei = new Dictionary<string, int>();
                var idSottoContoTemporaneo = -1;

                // Valorizzo con i movimenti contabili registrati
                var detrazioneRicerca = _ripartizioneService.GetDetrazioneRicerca(detrazione.GetValueOrDefault());
                var whereSpese = string.Empty;
                var parameters = new List<QueryParam>
                {
                    new QueryParam("condominio", condominio),
                    new QueryParam("anno", anno),
                    new QueryParam("detrazione", detrazioneRicerca),
                };

                if (idEsercizio != null)
                    parameters.Add(new QueryParam("tipo", Conversione.ToHQLParameter(TipoContoEconomicoEnum.Economico)));

                if (dataRegistrazioneIniziale == null)
                    dataRegistrazioneIniziale = Conversione.SqlDateTimeMinValue;
                if (dataRegistrazioneFinale == null)
                    dataRegistrazioneFinale = Conversione.SqlDateTimeMaxValue;

                if (idSpese != null && idSpese.Count > 0)
                {
                    whereSpese += " AND SPE in(:spese) ";
                    parameters.Add(new QueryParam("spese", idSpese));
                }
                IList<IRipartizioneSpesa> movimenti = esercizio != null ? 
                    _daoFactory.GetMovimentoContabileDao().GetByQuery("FROM MovimentoContabile MOV LEFT JOIN FETCH MOV.Testata TES LEFT JOIN FETCH MOV.CondominoRiferimento SOGGCOND LEFT JOIN FETCH SOGGCOND.Persona PERSCOND LEFT JOIN FETCH MOV.ContoRiferimento CON LEFT JOIN FETCH MOV.DettaglioRiferimento DETT LEFT JOIN FETCH DETT.SpesaRiferimento SPE LEFT JOIN FETCH SPE.FornitoreRiferimento FOR LEFT JOIN FETCH MOV.Spesa BOLL LEFT JOIN FETCH BOLL.FornitoreRiferimento BOLL_FOR LEFT JOIN FETCH BOLL.Scadenze BOLL_SCA LEFT JOIN FETCH BOLL_SCA.Pagamenti BOLL_PAG LEFT JOIN FETCH MOV.DettaglioRipartizione SPE_UNI LEFT JOIN FETCH SPE_UNI.SoggettoCondominio SOGG_SPE_UNI LEFT JOIN FETCH SOGG_SPE_UNI.Persona PERS_SPE_UNI LEFT JOIN FETCH SPE.Scadenze SCA LEFT JOIN FETCH SCA.Pagamenti PAG LEFT JOIN FETCH SPE_UNI.UnitaRiferimento UNI_SPE_UNI LEFT JOIN FETCH PAG.RitenutaAcconto.TestataRiferimento PAGRIT WHERE MOV.Causale.Codice <> 'OC' AND MOV.Causale.Codice <> 'C1' AND MOV.Causale.Codice <> 'C2' AND MOV.Causale.Codice <> 'A2' AND MOV.Testata.EsercizioRiferimento = :esercizio AND TES.DataRegistrazione >= :dataRegistrazioneIniziale AND TES.DataRegistrazione <= :dataRegistrazioneFinale AND CON.PresenteBilancio = 1 AND CON.Tipo = :tipo", new QueryParam("esercizio", esercizio), new QueryParam("dataRegistrazioneIniziale", dataRegistrazioneIniziale), new QueryParam("dataRegistrazioneFinale", dataRegistrazioneFinale), new QueryParam("tipo", Conversione.ToHQLParameter(TipoContoEconomicoEnum.Economico))).Cast<IRipartizioneSpesa>().ToList() :
                    _daoFactory.GetMovimentoContabileDao().GetByQuery($"FROM MovimentoContabile MOV LEFT JOIN FETCH MOV.ContoRiferimento CON LEFT JOIN FETCH CON.Millesimi MILL JOIN FETCH MOV.DettaglioRiferimento DETT JOIN FETCH DETT.SpesaRiferimento SPE LEFT JOIN FETCH SPE.RipartizioneSpesa RIPSPE LEFT JOIN FETCH SPE.Scadenze SCA LEFT JOIN FETCH SCA.Pagamenti PAG LEFT JOIN FETCH SPE.Riscossioni RISC LEFT JOIN FETCH RISC.MovimentoContabile MOVRISC LEFT JOIN FETCH MOVRISC.Testata TESRISC WHERE MOV.DettaglioRiferimento is not null AND MOV.Causale.Codice <> 'OC' AND MOV.Causale.Codice <> 'C1' AND MOV.Testata.EsercizioRiferimento.CondominioRiferimento = :condominio AND RIPSPE IS NULL AND SPE.Detrazione = :detrazione AND (year(PAG.Data) = :anno OR year(TESRISC.DataRegistrazione) = :anno) {whereSpese}", parameters.ToArray()).Cast<IRipartizioneSpesa>().ToList();
                movimenti = movimenti.Where(item => item.Causale.Codice != "ST" || contiChiusuraStraordinario.Contains(item.ContoRiferimento)).ToList();

                // Se è richiesta la stampa per detrazione aggiungo eventuali ripartizioni per le spese inserite fiscalmente
                if (detrazione != null)
                {
                    IList<IRipartizioneSpesa> ripartizioni = _daoFactory.GetRipartizioneSpesaDao().GetByQuery($"FROM RipartizioneSpesa RIPSPE LEFT JOIN FETCH RIPSPE.ContoRiferimento CON LEFT JOIN FETCH CON.Millesimi MILL JOIN FETCH RIPSPE.Spesa SPE LEFT JOIN FETCH SPE.Scadenze SCA LEFT JOIN FETCH SCA.Pagamenti PAG WHERE SPE.EsercizioRiferimento.CondominioRiferimento = :condominio AND SPE.Detrazione = :detrazione AND year(PAG.Data) = :anno {whereSpese} ", parameters.ToArray()).Cast<IRipartizioneSpesa>().ToList();
                    foreach (var ripartizioneSpesa in ripartizioni)
                    {
                        movimenti.Add(ripartizioneSpesa);
                    }
                }

                var millesimiConto = new Dictionary<string, IList<MillesimoDTO>>();
                foreach (var movimento in movimenti)
                {
                    var importo = movimento.GetImportoConSegno(detrazione != null).GetValueOrDefault();
 
                    if (!movimento.ContoRiferimento.IsSpesePersonali)
                    {
                        if (addebitiDirettiStabileScala)
                        {
                            if (idStabile != null && !isAddebitatoStabile(movimento, idStabile.Value))
                                continue;

                            if (idScala != null && !isAddebitatoScala(movimento, idScala.Value))
                                continue;
                        }
                        else if (addebitiCondominio)
                        {
                            if (!string.IsNullOrEmpty(movimento.StabiliAddebito) || !string.IsNullOrEmpty(movimento.GruppiAddebito))
                                continue;
                        }
                        else
                        {
                            importo = getImporto(movimento, idStabile, idScala, millesimiConto, esercizio, detrazione);
                            if (importo == 0)
                                continue;
                        }
                    }

                    var spesaRiferimento = movimento.GetSpesaRiferimento();
                    if (movimento.DettaglioRiferimento == null || !movimento.DettaglioRiferimento.SpesaRiferimento.EsclusaRendiconto)
                    {
                        var contoRiferimento = movimento.GetContoRiferimento(detrazione != null);
                        var sottoContoRiferimento = movimento.SottoContoRiferimento;

                        var nominativoFornitore = string.Empty;
                        if (movimento.FornitoreRiferimento != null)
                            nominativoFornitore = movimento.FornitoreRiferimento.DisplayName;

                        if (string.IsNullOrEmpty(nominativoFornitore))
                        {
                            if (spesaRiferimento?.FornitoreRiferimento != null)
                                nominativoFornitore = spesaRiferimento.FornitoreRiferimento.DisplayName;
                        }


                        // ===================================================================================
                        //  Conto NON di spese personali
                        // ===================================================================================
                        if (!contoRiferimento.IsSpesePersonali || !dettaglioPersonali)
                        {
                            int idSottoConto;

                            // ----------------------------------------------------------
                            //  Compongo la descrizione
                            // ----------------------------------------------------------
                            var descrizione = movimento.GetDescrizione(detrazione != null);
                            if (string.IsNullOrEmpty(descrizione))
                            {
                                descrizione = sottoContoRiferimento != null ? sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento) : movimento.GetDescrizioneTestata();

                                // Se il movimento ha la descrizione vuota, NON ha sottoconto e non è una bolletta emetto un warning
                                if (sottoContoRiferimento == null && movimento.Spesa == null)
                                {
                                    _log.WarnFormat("Trovato movimento con descrizione vuota - {0} - movimento:{1}", Utility.GetMethodDescription(), movimento.ID);
                                }
                            }
                            if (descrizione == null)
                                descrizione = string.Empty;

                            if (sottoContiTemporanei.ContainsKey(descrizione.Trim().ToUpper()))
                                idSottoConto = sottoContiTemporanei[descrizione.Trim().ToUpper()];
                            else
                            {
                                idSottoContoTemporaneo--;
                                idSottoConto = idSottoContoTemporaneo;
                                sottoContiTemporanei.Add(descrizione.Trim().ToUpper(), idSottoContoTemporaneo);
                            }

                            // ====================================================================
                            //  Lettura Movimenti
                            // ====================================================================

                            // ------------------------------------------------------------------
                            //  Individuo gli stabili e le scale di effettivo addebito - bugid#7195
                            // ------------------------------------------------------------------
                            var idStabili = new List<int>();
                            var idGruppi = new List<int>();
                            if (!string.IsNullOrEmpty(movimento.StabiliAddebito))
                            {
                                var idStabiliStr = movimento.StabiliAddebito.Split('&');
                                foreach (var s in idStabiliStr)
                                {
                                    if (idStabile == null && idScala == null)
                                        idStabili.Add(int.Parse(s));
                                    else if(idStabile != null)
                                    {
                                        if (int.Parse(s) == idStabile.Value)
                                        {
                                            idStabili.Add(idStabile.Value);
                                        }
                                    }
                                    else if (idScala != null)
                                    {
                                        var stabile = _daoFactory.GetPalazzinaDao().Find(int.Parse(s), false);
                                        foreach (var gruppoStabile in stabile.GruppiStabile)
                                        {
                                            if(gruppoStabile.ID == idScala.Value)
                                                idGruppi.Add(idScala.Value);
                                        }
                                    }                                        
                                }
                            }
                            else if (!string.IsNullOrEmpty(movimento.GruppiAddebito))
                            {
                                var idScaleStr = movimento.GruppiAddebito.Split('&');
                                foreach (var s in idScaleStr)
                                {
                                    if(idStabile == null && idScala == null)
                                        idGruppi.Add(int.Parse(s));
                                    else if (idStabile != null)
                                    {
                                        var scala = _daoFactory.GetGruppoStabileDao().Find(int.Parse(s), false);
                                        if(scala.PalazzinaRiferimento.ID == idStabile.Value)
                                            idGruppi.Add(int.Parse(s));
                                    }
                                    else if (idScala != null)
                                    {
                                        if (int.Parse(s) == idScala.Value)
                                        {
                                            idGruppi.Add(idScala.Value);
                                        }
                                    }
                                }
                            }

                            // ------------------------------------------------------------------
                            //  Se è presente un addebito specifico per Stabile .......
                            // ------------------------------------------------------------------
                            if (idStabili.Count > 0)
                            {
                                var i = 0;
                                do
                                {
                                    var stabile = _daoFactory.GetPalazzinaDao().GetById(idStabili[i], false);

                                    var importoMovimentoProprieta = _ripartizioneService.GetImportoCompetenza(importo, stabile, movimento, idStabili, idGruppi, TipoSoggetto.Proprietario, anno, detrazione);
                                    var importoMovimentoConduzione = _ripartizioneService.GetImportoCompetenza(importo, stabile, movimento, idStabili, idGruppi, TipoSoggetto.Conduttore, anno, detrazione);

                                    if (importoMovimentoProprieta != 0 || importoMovimentoConduzione != 0)
                                    {
                                        ReportBilancioDTO item;
                                        var key = getBilancioMovimentoKey(movimento);
                                        if (lista.ContainsKey(key))
                                            item = lista[key];
                                        else
                                        {
                                            item = new ReportBilancioDTO();
                                            lista.Add(key, item);
                                            item.Fornitore = nominativoFornitore;
                                            item.IdConto = contoRiferimento.ID;
                                            item.CodiceConto = contoRiferimento.Codice;
                                            item.DescrizioneConto = contoRiferimento.Descrizione;
                                            item.OrdineConto = contoRiferimento.Ordine;
                                            item.DettaglioMovimentiContabili = contoRiferimento.DettaglioMovimentiContabili;
                                            item.NumeroRegistrazioneMovimento = movimento.GetNumeroRegistrazioneArchiviazione();
                                            item.IdMovimento = movimento.ID;

                                            // Consuntivo e Preventivo precedente
                                            item.ImportoContoConsuntivoPrecedente = listaConsuntivoPrecedente.Where(mov => mov.IdConto == item.IdConto).Sum(mov => mov.ImportoMovimentoProprieta + mov.ImportoMovimentoConduttore);
                                            if(listaPreventivoPrecedente != null)
                                                item.ImportoContoPreventivoPrecedente = listaPreventivoPrecedente.Where(mov => mov.IdConto == item.IdConto).Sum(mov => mov.ImportoSottoContoProprieta + mov.ImportoSottoContoConduttore);

                                            if (sottoContoRiferimento == null)
                                            {
                                                item.IdSottoConto = idSottoConto;
                                                item.IsDirettoConto = false;
                                                item.DescrizioneSottoConto = descrizione;
                                            }
                                            else
                                            {
                                                item.IdSottoConto = sottoContoRiferimento.ID;
                                                item.CodiceSottoConto = sottoContoRiferimento.Codice;
                                                item.DescrizioneSottoConto = sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento);
                                                if (sottoContoRiferimento.DettaglioMovimentiContabili != null)
                                                    item.DettaglioMovimentiContabili = sottoContoRiferimento.DettaglioMovimentiContabili.GetValueOrDefault();

                                                item.IsDirettoConto = false;

                                                // Consuntivo e Preventivo precedente
                                                item.ImportoSottoContoConsuntivoPrecedente = listaConsuntivoPrecedente.Where(mov => mov.IdSottoConto == item.IdSottoConto).Sum(mov => mov.ImportoMovimentoProprieta + mov.ImportoMovimentoConduttore);
                                                if (listaPreventivoPrecedente != null)
                                                    item.ImportoSottoContoPreventivoPrecedente = listaPreventivoPrecedente.Where(mov => mov.IdSottoConto == item.IdSottoConto).Sum(mov => mov.ImportoSottoContoProprieta + mov.ImportoSottoContoConduttore);
                                            }
                                            item.DescrizioneMovimento = descrizione;

                                            item.IdGruppoStabile = 20000 + stabile.ID;
                                            item.DescrizioneGruppoStabile = stabile.Descrizione;
                                            item.OrdineGruppoStabile = 20000 + stabile.Ordine;

                                            // -------------------------------------------------------------------------
                                            // Dati Fattura
                                            // -------------------------------------------------------------------------
                                            if (spesaRiferimento != null)
                                            {
                                                if (spesaRiferimento != null)
                                                {
                                                    item.DataFattura = spesaRiferimento.DataDocumento.GetValueOrDefault();
                                                    item.NumeroFattura = spesaRiferimento.NumeroDocumento;
                                                    item.DataPagamentoFattura = spesaRiferimento.GetPrimaDataPagamento(dataLimite);
                                                    item.DataPagamentoRitenuta = spesaRiferimento.GetPrimaDataVersamentoRitenuta(dataLimite);
                                            }
                                            }
                                            else
                                                item.DataFattura = movimento.GetDataRegistrazione().GetValueOrDefault();
                                        }

                                        item.ImportoMovimentoProprieta += importoMovimentoProprieta;
                                        item.ImportoMovimentoConduttore += importoMovimentoConduzione;
                                    }

                                    i++;
                                } while (i < idStabili.Count);
                            }
                            else
                            {
                                var i = 0;
                                do
                                {
                                    GruppoStabile gruppo = null;
                                    if (!string.IsNullOrEmpty(movimento.GruppiAddebito) && idGruppi.Count > 0)
                                        gruppo = _daoFactory.GetGruppoStabileDao().Find(idGruppi[i], false);

                                    var importoMovimentoProprieta = _ripartizioneService.GetImportoCompetenza(importo, gruppo, movimento, idStabili, idGruppi, TipoSoggetto.Proprietario, anno, detrazione);
                                    var importoMovimentoConduzione = _ripartizioneService.GetImportoCompetenza(importo, gruppo, movimento, idStabili, idGruppi, TipoSoggetto.Conduttore, anno, detrazione);
                                    if (importoMovimentoProprieta != 0 || importoMovimentoConduzione != 0)
                                    {
                                        ReportBilancioDTO item;
                                        var key = getBilancioMovimentoKey(movimento);
                                        if(lista.ContainsKey(key))
                                            item = lista[key];
                                        else
                                        {
                                            item = new ReportBilancioDTO();
                                            lista.Add(key, item);
                                            item.Fornitore = nominativoFornitore;
                                            item.IdConto = contoRiferimento.ID;
                                            item.CodiceConto = contoRiferimento.Codice;
                                            item.DescrizioneConto = contoRiferimento.Descrizione;
                                            item.OrdineConto = contoRiferimento.Ordine;
                                            item.DettaglioMovimentiContabili = contoRiferimento.DettaglioMovimentiContabili;
                                            item.NumeroRegistrazioneMovimento = movimento.GetNumeroRegistrazioneArchiviazione();
                                            item.IdMovimento = movimento.ID;

                                            if (sottoContoRiferimento == null)
                                            {
                                                item.IdSottoConto = idSottoConto;
                                                item.IsDirettoConto = false;
                                                item.DescrizioneSottoConto = descrizione;

                                            }
                                            else
                                            {
                                                item.IdSottoConto = sottoContoRiferimento.ID;
                                                item.CodiceSottoConto = sottoContoRiferimento.Codice;
                                                item.DescrizioneSottoConto = sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento);
                                                if (sottoContoRiferimento.DettaglioMovimentiContabili != null)
                                                    item.DettaglioMovimentiContabili = sottoContoRiferimento.DettaglioMovimentiContabili.GetValueOrDefault();
                                                item.IsDirettoConto = false;

                                                // Consuntivo e Preventivo precedente
                                                item.ImportoSottoContoConsuntivoPrecedente = listaConsuntivoPrecedente.Where(mov => mov != null && mov.IdSottoConto == item.IdSottoConto).Sum(mov => mov.ImportoMovimentoProprieta + mov.ImportoMovimentoConduttore);
                                                if(listaPreventivoPrecedente != null)
                                                    item.ImportoSottoContoPreventivoPrecedente = listaPreventivoPrecedente.Where(mov => mov != null && mov.IdSottoConto == item.IdSottoConto).Sum(mov => mov.ImportoSottoContoProprieta + mov.ImportoSottoContoConduttore);
                                            }
                                            item.DescrizioneMovimento = descrizione;

                                            // -------------------------------------------------------------------------
                                            // Solo se la spesa ha subito un riparto pesonalizzato per scala o stabile
                                            // -------------------------------------------------------------------------
                                            if (!string.IsNullOrEmpty(movimento.GruppiAddebito) && gruppo != null)
                                            {
                                                item.IdGruppoStabile = 30000 + gruppo.ID;
                                                item.DescrizioneGruppoStabile = gruppo.Descrizione;
                                                item.OrdineStabile = gruppo.PalazzinaRiferimento.Ordine;
                                                item.OrdineGruppoStabile = 30000 + gruppo.Ordine;
                                            }
                                            else
                                            {
                                                item.IdGruppoStabile = -1;
                                                item.DescrizioneGruppoStabile = "Condominio";
                                                item.OrdineStabile = 0;
                                                item.OrdineGruppoStabile = 10000;
                                            }

                                            // -------------------------------------------------------------------------
                                            // Dati Fattura
                                            // -------------------------------------------------------------------------
                                            if (spesaRiferimento != null)
                                            {
                                                item.DataFattura = spesaRiferimento.DataDocumento.GetValueOrDefault();
                                                item.NumeroFattura = spesaRiferimento.NumeroDocumento;
                                                item.DataPagamentoFattura = spesaRiferimento.GetPrimaDataPagamento(dataLimite);
                                                item.DataPagamentoRitenuta = spesaRiferimento.GetPrimaDataVersamentoRitenuta(dataLimite);
                                            }
                                            else
                                                item.DataFattura = movimento.GetDataRegistrazione().GetValueOrDefault();                                            
                                        }

                                        item.ImportoMovimentoProprieta += importoMovimentoProprieta;
                                        item.ImportoMovimentoConduttore += importoMovimentoConduzione;

                                        // Consuntivo e Preventivo precedente
                                        item.ImportoContoConsuntivoPrecedente = listaConsuntivoPrecedente.Where(mov => mov.IdConto == item.IdConto).Sum(mov => mov.ImportoMovimentoProprieta + mov.ImportoMovimentoConduttore);
                                        if (listaPreventivoPrecedente != null)
                                            item.ImportoContoPreventivoPrecedente = listaPreventivoPrecedente.Where(mov => mov.IdConto == item.IdConto).Sum(mov => mov.ImportoSottoContoProprieta + mov.ImportoSottoContoConduttore);

                                    }

                                    i++;
                                } while (i < idGruppi.Count);
                            }
                        }

                        // ===================================================================================
                        //  Conto di spese personali
                        // ===================================================================================
                        if (contoRiferimento.IsSpesePersonali && dettaglioPersonali)
                        {
                            var descrizione = movimento.GetDescrizione(detrazione != null);
                            if (string.IsNullOrEmpty(descrizione))
                                descrizione = sottoContoRiferimento != null
                                                  ? sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento)
                                                  : movimento.GetDescrizioneTestata();

                            var spese = movimento.DettaglioRipartizione.Where(item => item.GetImporto() != 0);

                            var descrizioneSottoConto = descrizione;
                            descrizioneSottoConto = !string.IsNullOrEmpty(descrizioneSottoConto) ? descrizioneSottoConto.Trim().ToUpper() : "<DESCRIZIONE NON TROVATA>";

                            int idSottoConto;
                            if (sottoContiTemporanei.ContainsKey(descrizioneSottoConto))
                                idSottoConto = sottoContiTemporanei[descrizioneSottoConto];
                            else
                            {
                                idSottoContoTemporaneo--;
                                idSottoConto = idSottoContoTemporaneo;
                                sottoContiTemporanei.Add(descrizioneSottoConto, idSottoContoTemporaneo);
                            }
                            if(sottoContoRiferimento != null)
                                idSottoConto = sottoContoRiferimento.ID;

                            var groupBySottoconto = dettaglioConto && !contoRiferimento.DettaglioMovimentiContabili && (sottoContoRiferimento == null || !sottoContoRiferimento.DettaglioMovimentiContabili.GetValueOrDefault());
                            foreach (var spesa in spese)
                            {
                                if(!isAddebitatoScalaStabile(spesa, idStabile, idScala))
                                    continue;

                                ReportBilancioDTO item = null;
                                var key = string.Empty;
                                if (spesa.UnitaRiferimento != null)
                                    key = idSottoConto.ToString(CultureInfo.InvariantCulture).PadLeft(5, '0') + "&" + spesa.UnitaRiferimento.ID.ToString(CultureInfo.InvariantCulture).PadLeft(10, '0') + "&UNI";
                                else if (spesa.SoggettoCondominio != null)
                                    key = idSottoConto.ToString(CultureInfo.InvariantCulture).PadLeft(5, '0') + "&" + spesa.SoggettoCondominio.ID.ToString(CultureInfo.InvariantCulture).PadLeft(10, '0') + "&SOG";

                                if (groupBySottoconto && listaMovimentiPersonali.ContainsKey(key))
                                    item = listaMovimentiPersonali[key];

                                if (item == null)
                                {
                                    item = new ReportBilancioDTO
                                    {
                                        IsSpesaPersonale = true,
                                        IdConto = contoRiferimento.ID,
                                        CodiceConto = contoRiferimento.Codice,
                                        DescrizioneConto = contoRiferimento.Descrizione,
                                        OrdineConto = contoRiferimento.Ordine,
                                        DettaglioMovimentiContabili = contoRiferimento.DettaglioMovimentiContabili || (sottoContoRiferimento != null && sottoContoRiferimento.DettaglioMovimentiContabili.GetValueOrDefault()) || dettaglioConto,
                                        NumeroRegistrazioneMovimento = movimento.GetNumeroRegistrazioneArchiviazione(),
                                        IdMovimento = movimento.ID,
                                        IdSottoConto = idSottoConto,
                                        DescrizioneSottoConto = descrizione.Trim(),
                                        CodiceSottoConto = idSottoConto.ToString(CultureInfo.InvariantCulture).PadLeft(3, '0'),
                                        NoStampaDatiFattura = groupBySottoconto,
                                        Fornitore = nominativoFornitore
                                    };

                                    if (sottoContoRiferimento != null)
                                    {
                                        item.IdSottoConto = sottoContoRiferimento.ID;
                                        item.CodiceSottoConto = sottoContoRiferimento.Codice;
                                        item.DescrizioneSottoConto = sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento);
                                        item.IsDirettoConto = false;
                                    }

                                    // -------------------------------------------------------------------------
                                    // Dati Fattura
                                    // -------------------------------------------------------------------------
                                    if (!groupBySottoconto)
                                    {
                                        if (spesaRiferimento != null)
                                        {
                                            item.DataFattura = spesaRiferimento.DataDocumento.GetValueOrDefault();
                                            item.NumeroFattura = spesaRiferimento.NumeroDocumento;
                                            item.DataPagamentoFattura = spesaRiferimento.GetPrimaDataPagamento(dataLimite);
                                            item.DataPagamentoRitenuta = spesaRiferimento.GetPrimaDataVersamentoRitenuta(dataLimite);
                                        }
                                        else
                                            item.DataFattura = movimento.GetDataRegistrazione().GetValueOrDefault();
                                    }

                                    // ------------------------------------
                                    // Nominativo per spesa personale
                                    // ------------------------------------
                                    var data = esercizio != null ? esercizio.DataChiusura : new DateTime(anno.Value, 12, 31);

                                    var nominativo = string.Empty;
                                    if (spesa.SoggettoCondominio != null)
                                        nominativo = spesa.SoggettoCondominio.DisplayName;
                                    else if (spesa.UnitaRiferimento != null)
                                    {
                                        nominativo = spesa.UnitaRiferimento.Descrizione;
                                        var soggettiAttivi = esercizio != null ? _daoFactory.GetSoggettoCondominioDao().GetAttiviByEsercizioUnita(spesa.UnitaRiferimento.ID, esercizio) : _daoFactory.GetSoggettoCondominioDao().GetAttiviByAnnoUnita(spesa.UnitaRiferimento.ID, anno.GetValueOrDefault());

                                        var conduttore = spesa.UnitaRiferimento.GetConduttorePrincipale(data);
                                        if (movimento.PercentualeProprieta == 1 || (movimento.PercentualeProprieta == null && contoRiferimento.PercentualeProprieta == 1) || conduttore == null)
                                        {
                                            nominativo = string.Empty;
                                            var proprietari = from sogg in soggettiAttivi
                                                              where sogg.Tipo == TipoSoggetto.Proprietario
                                                              select sogg;
                                            foreach (var soggetto in proprietari)
                                            {
                                                if (!string.IsNullOrEmpty(nominativo))
                                                    nominativo += "/";
                                                nominativo += soggetto.DisplayName;
                                            }
                                        }
                                        else if ((movimento.PercentualeProprieta == 0 || contoRiferimento.PercentualeProprieta == 0) && conduttore != null)
                                        {
                                            nominativo = string.Empty;
                                            var conduttori = from sogg in soggettiAttivi
                                                             where sogg.Tipo == TipoSoggetto.Conduttore
                                                             select sogg;
                                            foreach (var soggetto in conduttori)
                                            {
                                                if (!string.IsNullOrEmpty(nominativo))
                                                    nominativo += "/";
                                                nominativo += soggetto.DisplayName;
                                            }
                                        }
                                    }

                                    item.DescrizioneMovimento = descrizione + " (" + nominativo + ")";
                                    item.IsDirettoConto = false;

                                    if(groupBySottoconto)
                                        listaMovimentiPersonali.Add(key, item);
                                    
                                    lista.Add(getBilancioMovimentoKey(movimento), item);
                                }
                                
                                // ------------------------------------
                                // Importi
                                // ------------------------------------
                                var importoMovimentoProprieta = _ripartizioneService.GetImportoCompetenza(spesa, TipoSoggetto.Proprietario, anno, detrazione);
                                item.ImportoMovimentoProprieta += importoMovimentoProprieta;
                                item.ImportoMovimentoConduttore += _ripartizioneService.GetImportoCompetenza(spesa, TipoSoggetto.Conduttore, anno, detrazione);
                            }
                        }
                    }
                }

                // ========================================================================
                //  Rielaborazione degli elementi
                // ========================================================================
                // accorpamento dei movimenti con stesso numero di registrazione e stesso conto, sottoconto, stabile e scala
                // Solitamente questi movimenti sono separati perchè derivano da registrazioni multiiva
                // ----------------------------------------------------------------------------------------------------------
                var result = new Dictionary<string, ReportBilancioDTO>(lista.Count);
                foreach (var dto in lista.Values)
                {
                    var key = getReportBilancioKey(dto);
                    if (result.ContainsKey(key))
                    {
                        var item = result[key];
                        item.ImportoConto += dto.ImportoConto;
                        item.ImportoMovimentoConduttore += dto.ImportoMovimentoConduttore;
                        item.ImportoMovimentoProprieta += dto.ImportoMovimentoProprieta;
                        item.ImportoSottoContoConduttore += dto.ImportoSottoContoConduttore;
                        item.ImportoSottoContoProprieta += dto.ImportoSottoContoProprieta;
                    }
                    else
                        result.Add(key, dto);
                }

                var listaFinale = result.Values.ToList();

                // ==================================================================================
                // Se richiesto confronto con anno precedente aggiungo i sottoconti mancanti
                // ==================================================================================
                listaFinale.AddRange(getItemsSottocontiMancanti(listaFinale, listaConsuntivoPrecedente, listaPreventivoPrecedente, consuntivoPrecedente, preventivoPrecedente));

                // ==================================================================================
                // I sottoconti virtuali con un solo movimento devono essere presenti in un unico sottoconto bugid#8937
                // ==================================================================================
                foreach (var itemGroupByConto in listaFinale.Where(item => item.IdSottoConto < 0).GroupBy(item => item.IdConto))
                {
                    foreach (var itemGroupBySottoconto in itemGroupByConto.GroupBy(item => item.IdSottoConto))
                    {
                        if (itemGroupBySottoconto.Count() == 1)
                        {
                            var item = itemGroupBySottoconto.FirstOrDefault();
                            if (item != null)
                            {
                                item.IdSottoConto = item.IdConto * -1;
                                item.IsSottocontoVirtuale = true;
                                item.DescrizioneSottoConto = item.DescrizioneConto;
                                item.DettaglioMovimentiContabili = true;
                            }
                        }
                    }
                }

                return datiFatturaNumeroRegistrazione == "R" ? listaFinale.OrderBy(riga => riga.NumeroRegistrazioneMovimento).ThenBy(riga => riga.IdMovimento) : listaFinale.OrderBy(riga => riga.DataFattura).ThenBy(riga => riga.NumeroFattura).ThenBy(riga => riga.IdMovimento);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la lettura del datasource per il bilancio preventivo per Movimenti - {0} - esercizio:{1} - condominio:{2} - anno:{3} - detrazione:{4}", ex, Utility.GetMethodDescription(), idEsercizio.GetValueOrDefault(), idCondominio.GetValueOrDefault(), anno.GetValueOrDefault(), detrazione.GetValueOrDefault());
                throw;
            }
        }
示例#4
0
        public IEnumerable<ReportBilancioDTO> GetDataSourceBilancioConsuntivo_SottoConto(int? idEsercizio, int? idCondominio, int? anno, int? detrazione, IList<int> idSpese, bool parzialeGruppo, bool parzialeStabile)
        {
            try
            {
                var lista = new Dictionary<string, ReportBilancioDTO>();

                Esercizio esercizio = null;
                if(idEsercizio != null)
                    esercizio = _daoFactory.GetEsercizioDao().GetById(idEsercizio.Value, false);

                //============================================================================================================================
                // Ricalcolo per tutte le spese la ripartizione (Solo se l'esercizio è aperto) e solo se non è la ripartizione per detrazione
                //============================================================================================================================
                // BUGID#2159 - COMMENTATO: Perchè con la nuova funzione di riparto aggregato non deve più servire
                //============================================================================================================================
                //if (idEsercizio != null && esercizio.Stato == StatoEsercizioEnum.Aperto)
                //    _spesaService.ReloadRipartizioneByEsercizio(idEsercizio.Value);
                //============================================================================================================================

                Condominio condominio = null;
                IList<Conto> contiChiusuraStraordinario = new List<Conto>();
                if (idCondominio != null)
                    condominio = _daoFactory.GetCondominioDao().GetById(idCondominio.Value, false);

                if(esercizio != null)
                    contiChiusuraStraordinario = getContiEconomiciChiusuraStraordinario(esercizio.CondominioRiferimento.ID);
                else if(condominio != null)
                    contiChiusuraStraordinario = getContiEconomiciChiusuraStraordinario(condominio.ID);

                var sottoContiTemporanei = new Dictionary<string, int>();
                var idSottoContoTemporaneo = -1;

                // Valorizzo con i movimenti contabili registrati
                var detrazioneRicerca = _ripartizioneService.GetDetrazioneRicerca(detrazione.GetValueOrDefault());
                var whereSpese = string.Empty;
                var parameters = new List<QueryParam>
                {
                    new QueryParam("condominio", condominio),
                    new QueryParam("anno", anno),
                    new QueryParam("detrazione", detrazioneRicerca)
                };

                if(idEsercizio != null)
                    parameters.Add(new QueryParam("tipo", Conversione.ToHQLParameter(TipoContoEconomicoEnum.Economico)));

                if (idSpese != null && idSpese.Count > 0)
                {
                    whereSpese += " AND SPE in(:spese) ";
                    parameters.Add(new QueryParam("spese", idSpese));
                }

                IList<IRipartizioneSpesa> movimenti = idEsercizio != null ? 
                    _daoFactory.GetMovimentoContabileDao().GetByQuery("FROM MovimentoContabile MOV LEFT JOIN FETCH MOV.ContoRiferimento CON LEFT JOIN FETCH MOV.Testata TES LEFT JOIN FETCH MOV.DettaglioRiferimento DETT LEFT JOIN FETCH DETT.SpesaRiferimento SPE LEFT JOIN FETCH MOV.DettaglioRipartizione SPE_UNI LEFT JOIN FETCH SPE_UNI.SoggettoCondominio SOGG_SPE_UNI LEFT JOIN FETCH SOGG_SPE_UNI.Persona PERS_SPE_UNI LEFT JOIN FETCH SPE.Scadenze SCA LEFT JOIN FETCH SCA.Pagamenti PAG LEFT JOIN FETCH SPE_UNI.UnitaRiferimento UNI_SPE_UNI WHERE MOV.Causale.Codice <> 'OC' AND MOV.Causale.Codice <> 'C1' AND MOV.Causale.Codice <> 'C2' AND MOV.Causale.Codice <> 'A2' AND TES.EsercizioRiferimento = :esercizio AND CON.PresenteBilancio = 1 AND CON.Tipo = :tipo", new QueryParam("esercizio", esercizio), new QueryParam("tipo", Conversione.ToHQLParameter(TipoContoEconomicoEnum.Economico))).Cast<IRipartizioneSpesa>().ToList() :
                    _daoFactory.GetMovimentoContabileDao().GetByQuery($"FROM MovimentoContabile MOV LEFT JOIN FETCH MOV.ContoRiferimento CON LEFT JOIN FETCH CON.Millesimi MILL JOIN FETCH MOV.DettaglioRiferimento DETT JOIN FETCH DETT.SpesaRiferimento SPE LEFT JOIN FETCH SPE.RipartizioneSpesa RIPSPE LEFT JOIN FETCH SPE.Scadenze SCA LEFT JOIN FETCH SCA.Pagamenti PAG LEFT JOIN FETCH SPE.Riscossioni RISC LEFT JOIN FETCH RISC.MovimentoContabile MOVRISC LEFT JOIN FETCH MOVRISC.Testata TESRISC WHERE MOV.DettaglioRiferimento is not null AND MOV.Causale.Codice <> 'OC' AND MOV.Causale.Codice <> 'C1' AND MOV.Causale.Codice <> 'C2' AND MOV.Testata.EsercizioRiferimento.CondominioRiferimento = :condominio AND RIPSPE IS NULL AND SPE.Detrazione = :detrazione AND (year(PAG.Data) = :anno OR year(TESRISC.DataRegistrazione) = :anno) {whereSpese} ", parameters.ToArray()).Cast<IRipartizioneSpesa>().ToList();
                movimenti = movimenti.Where(item => item.Causale.Codice != "ST" || contiChiusuraStraordinario.Contains(item.ContoRiferimento)).ToList();

                // Se è richiesta la stampa per detrazione aggiunfo eventuali ripartizioni per le spese inserite fiscalmente
                if (detrazione != null)
                {
                    IList<IRipartizioneSpesa> ripartizioni = _daoFactory.GetRipartizioneSpesaDao().GetByQuery($"FROM RipartizioneSpesa RIPSPE LEFT JOIN FETCH RIPSPE.ContoRiferimento CON LEFT JOIN FETCH CON.Millesimi MILL JOIN FETCH RIPSPE.Spesa SPE LEFT JOIN FETCH SPE.Scadenze SCA LEFT JOIN FETCH SCA.Pagamenti PAG WHERE SPE.EsercizioRiferimento.CondominioRiferimento = :condominio AND SPE.Detrazione = :detrazione AND year(PAG.Data) = :anno {whereSpese} ", parameters.ToArray()).Cast<IRipartizioneSpesa>().ToList();
                    foreach (var ripartizioneSpesa in ripartizioni)
                    {
                        movimenti.Add(ripartizioneSpesa);
                    }
                }

                foreach (var movimento in movimenti)
                {
                    try
                    {
                        var contoRiferimento = movimento.GetContoRiferimento(detrazione != null);
                        var sottoContoRiferimento = movimento.SottoContoRiferimento;

                        if (movimento.DettaglioRiferimento == null || !movimento.DettaglioRiferimento.SpesaRiferimento.EsclusaRendiconto)
                        {
                            // ===================================================================================
                            //  Sottoconto
                            // ===================================================================================
                            int idSottoConto;
                            var key = contoRiferimento.ID.ToString(CultureInfo.InvariantCulture);
                            string descrizione;

                            if (sottoContoRiferimento != null)
                            {
                                descrizione = sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento);
                                idSottoConto = sottoContoRiferimento.ID;
                                key += "&" + idSottoConto;
                            }
                            else
                            {
                                // ----------------------------------------------------------
                                //  Compongo la descrizione per i movimenti senza sottoconto
                                // ----------------------------------------------------------
                                descrizione = movimento.GetDescrizione(detrazione != null);
                                if (string.IsNullOrEmpty(descrizione))
                                    descrizione = movimento.GetDescrizioneTestata();
                                if (descrizione == null)
                                    descrizione = string.Empty;

                                if (sottoContiTemporanei.ContainsKey(descrizione.Trim().ToUpper()))
                                    idSottoConto = sottoContiTemporanei[descrizione.Trim().ToUpper()];
                                else
                                {
                                    idSottoContoTemporaneo--;
                                    idSottoConto = idSottoContoTemporaneo;
                                    sottoContiTemporanei.Add(descrizione.Trim().ToUpper(), idSottoContoTemporaneo);
                                }
                                key += "&" + idSottoConto;
                            }

                            // ===================================================================================
                            //  Conto NON di spese personali
                            // ===================================================================================
                            if (!contoRiferimento.IsSpesePersonali)
                            {
                                // ====================================================================
                                //  Lettura Movimenti
                                // ====================================================================

                                // ------------------------------------------------------------------
                                //  Se è presente un addebito specifico per Stabile .......
                                // ------------------------------------------------------------------
                                if (!string.IsNullOrEmpty(movimento.StabiliAddebito))
                                {
                                    var keyItem = key;
                                    var idStabili = movimento.StabiliAddebito.Split('&');
                                    var i = 0;
                                    do
                                    {
                                        var stabile = _daoFactory.GetPalazzinaDao().GetById(int.Parse(idStabili[i]), false);
                                        keyItem += "&" + stabile.ID;

                                        var importoMovimentoProprieta = _ripartizioneService.GetImportoCompetenza(null, stabile, movimento, null, null, TipoSoggetto.Proprietario, anno, detrazione);
                                        var importoMovimentoConduzione = _ripartizioneService.GetImportoCompetenza(null, stabile, movimento, null, null, TipoSoggetto.Conduttore, anno, detrazione);
                                        if (importoMovimentoProprieta != 0 || importoMovimentoConduzione != 0)
                                        {
                                            ReportBilancioDTO item;
                                            if (lista.ContainsKey(keyItem))
                                                item = lista[keyItem];
                                            else
                                            {
                                                item = new ReportBilancioDTO();
                                                lista.Add(keyItem, item);
                                                item.IdConto = contoRiferimento.ID;
                                                item.CodiceConto = contoRiferimento.Codice;
                                                item.DescrizioneConto = contoRiferimento.Descrizione;
                                                item.OrdineConto = contoRiferimento.Ordine;
                                                if (sottoContoRiferimento == null)
                                                {
                                                    item.IdSottoConto = idSottoConto;
                                                    item.DescrizioneSottoConto = descrizione;
                                                    item.IsDirettoConto = true;
                                                }
                                                else
                                                {
                                                    item.IdSottoConto = sottoContoRiferimento.ID;
                                                    item.CodiceSottoConto = sottoContoRiferimento.Codice;
                                                    item.DescrizioneSottoConto = sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento);
                                                    item.IsDirettoConto = false;
                                                }

                                                item.IdGruppoStabile = 20000 + stabile.ID;
                                                item.DescrizioneGruppoStabile = "Stabile: " + stabile.Descrizione;
                                                item.OrdineGruppoStabile = 20000 + stabile.Ordine;
                                            }

                                            item.ImportoSottoContoProprieta += importoMovimentoProprieta;
                                            item.ImportoSottoContoConduttore += importoMovimentoConduzione;
                                        }

                                        i++;
                                    } while (i < idStabili.Length);
                                }

                                // ------------------------------------------------------------------
                                //  ..... altrimenti considero un addebito per scala
                                // ------------------------------------------------------------------
                                else
                                {
                                    var keyItem = key;
                                    var idGruppi = new string[0];
                                    if (!string.IsNullOrEmpty(movimento.GruppiAddebito))
                                        idGruppi = movimento.GruppiAddebito.Split('&');
                                    var i = 0;
                                    do
                                    {
                                        GruppoStabile gruppo = null;
                                        if (!string.IsNullOrEmpty(movimento.GruppiAddebito) && idGruppi.Length > 0)
                                        {
                                            gruppo = _daoFactory.GetGruppoStabileDao().GetById(int.Parse(idGruppi[i]), false);
                                            keyItem += "&" + gruppo.ID + "&" + gruppo.PalazzinaRiferimento.ID;
                                        }

                                        var importoMovimentoProprieta = _ripartizioneService.GetImportoCompetenza(null, gruppo, movimento, null, null, TipoSoggetto.Proprietario, anno, detrazione);
                                        var importoMovimentoConduzione = _ripartizioneService.GetImportoCompetenza(null, gruppo, movimento, null, null, TipoSoggetto.Conduttore, anno, detrazione);
                                        if (importoMovimentoProprieta != 0 || importoMovimentoConduzione != 0)
                                        {
                                            ReportBilancioDTO item;
                                            if (lista.ContainsKey(keyItem))
                                                item = lista[keyItem];
                                            else
                                            {
                                                item = new ReportBilancioDTO();
                                                lista.Add(keyItem, item);
                                                item.IdConto = contoRiferimento.ID;
                                                item.CodiceConto = contoRiferimento.Codice;
                                                item.DescrizioneConto = contoRiferimento.Descrizione;
                                                item.OrdineConto = contoRiferimento.Ordine;

                                                if (sottoContoRiferimento == null)
                                                {
                                                    item.IdSottoConto = idSottoConto;
                                                    item.DescrizioneSottoConto = descrizione;
                                                    item.IsDirettoConto = true;
                                                }
                                                else
                                                {
                                                    item.IdSottoConto = sottoContoRiferimento.ID;
                                                    item.CodiceSottoConto = sottoContoRiferimento.Codice;
                                                    item.DescrizioneSottoConto = sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento);
                                                    item.IsDirettoConto = false;
                                                }

                                                // -------------------------------------------------------------------------
                                                // Solo se la spesa ha subito un riparto personalizzato per scala o stabile
                                                // -------------------------------------------------------------------------
                                                if (!string.IsNullOrEmpty(movimento.GruppiAddebito) && gruppo != null)
                                                {
                                                    item.IdGruppoStabile = 30000 + gruppo.ID;
                                                    item.DescrizioneGruppoStabile = "Scala: " + gruppo.Descrizione;
                                                    item.OrdineStabile = gruppo.PalazzinaRiferimento.Ordine;
                                                    item.OrdineGruppoStabile = 30000 + gruppo.Ordine;
                                                }
                                                else
                                                {
                                                    item.IdGruppoStabile = -1;
                                                    item.DescrizioneGruppoStabile = "Condominio";
                                                    item.OrdineStabile = 0;
                                                    item.OrdineGruppoStabile = 10000;
                                                }
                                            }

                                            item.ImportoSottoContoProprieta += importoMovimentoProprieta;
                                            item.ImportoSottoContoConduttore += importoMovimentoConduzione;
                                        }

                                        i++;
                                    } while (i < idGruppi.Length);
                                }
                            }

                            // ===================================================================================
                            //  Conto di spese personali
                            // ===================================================================================
                            if (contoRiferimento.IsSpesePersonali)
                            {
                                var spese = movimento.DettaglioRipartizione.Where(item => item.GetImporto() != 0);
                                foreach (var spesa in spese)
                                {
                                    try
                                    {
                                        var keyItem = key;
                                        var data = esercizio != null ? esercizio.DataChiusura : new DateTime(anno.Value, 12, 31);

                                        // ------------------------------------
                                        // Nominativo per spesa personale
                                        // ------------------------------------
                                        var nominativo = string.Empty;
                                        if (spesa.SoggettoCondominio != null)
                                            nominativo = spesa.SoggettoCondominio.DisplayName;
                                        else if (spesa.UnitaRiferimento != null)
                                        {
                                            nominativo = spesa.UnitaRiferimento.Descrizione;
                                            var soggettiAttivi = esercizio != null ? _daoFactory.GetSoggettoCondominioDao().GetAttiviByEsercizioUnita(spesa.UnitaRiferimento.ID, esercizio) : _daoFactory.GetSoggettoCondominioDao().GetAttiviByAnnoUnita(spesa.UnitaRiferimento.ID, anno.Value);

                                            var conduttore = spesa.UnitaRiferimento.GetConduttorePrincipale(data);
                                            if (spesa.MovimentoRiferimento.PercentualeProprieta == 1 || (movimento.PercentualeProprieta == null && contoRiferimento.PercentualeProprieta == 1) || conduttore == null)
                                            {
                                                nominativo = string.Empty;
                                                var proprietari = soggettiAttivi.Where(sogg => sogg.Tipo == TipoSoggetto.Proprietario);
                                                foreach (var soggetto in proprietari)
                                                {
                                                    if (!string.IsNullOrEmpty(nominativo))
                                                        nominativo += "/";
                                                    nominativo += soggetto.DisplayName;
                                                }
                                            }
                                            else if ((movimento.PercentualeProprieta == 0 || contoRiferimento.PercentualeProprieta == 0) && conduttore != null)
                                            {
                                                nominativo = string.Empty;
                                                var conduttori = soggettiAttivi.Where(sogg => sogg.Tipo == TipoSoggetto.Conduttore);
                                                foreach (var soggetto in conduttori)
                                                {
                                                    if (!string.IsNullOrEmpty(nominativo))
                                                        nominativo += "/";
                                                    nominativo += soggetto.DisplayName;
                                                }
                                            }

                                        }

                                        // ------------------------------------
                                        // DTO per riga di bilancio
                                        // ------------------------------------
                                        if(spesa.UnitaRiferimento != null)
                                            keyItem += "&" + spesa.UnitaRiferimento.ID + "&" + nominativo + "&UNI";
                                        else if(spesa.SoggettoCondominio != null)
                                            keyItem += "&" + spesa.SoggettoCondominio.ID + "&" + nominativo + "&SOG";
                                        ReportBilancioDTO item;
                                        if (lista.Keys.Contains(keyItem))
                                            item = lista[keyItem];
                                        else
                                        {
                                            item = new ReportBilancioDTO
                                            {
                                                IsSpesaPersonale = true,
                                                IdConto = contoRiferimento.ID,
                                                CodiceConto = contoRiferimento.Codice,
                                                DescrizioneConto = contoRiferimento.Descrizione,
                                                OrdineConto = contoRiferimento.Ordine,
                                                IdSottoConto = idSottoConto
                                            };

                                            if (sottoContoRiferimento == null)
                                            {
                                                item.DescrizioneSottoConto = descrizione;
                                                item.IsDirettoConto = true;
                                            }
                                            else
                                            {
                                                item.CodiceSottoConto = sottoContoRiferimento.Codice;
                                                item.DescrizioneSottoConto = sottoContoRiferimento.GetDescrizione(movimento.GetEsercizio(), null, movimento);
                                                item.IsDirettoConto = false;
                                            }

                                            item.DescrizioneSottoConto = descrizione + " (" + nominativo + ")";
                                            lista.Add(keyItem, item);
                                        }

                                        // ------------------------------------
                                        // Importi
                                        // ------------------------------------
                                        var importoMovimentoProprieta = _ripartizioneService.GetImportoCompetenza(spesa, TipoSoggetto.Proprietario, anno, detrazione);
                                        item.ImportoSottoContoProprieta += importoMovimentoProprieta;
                                        item.ImportoSottoContoConduttore += _ripartizioneService.GetImportoCompetenza(spesa, TipoSoggetto.Conduttore, anno, detrazione);
                                    }
                                    catch (Exception ex)
                                    {
                                        _log.ErrorFormat("Errore inaspettato durante la lettura del datasource per il bilancio consuntivo per Sotto Conto - SINGOLA SPESA - {0} - spesa:{1} - movimento:{2} - esercizio:{3}", ex, Utility.GetMethodDescription(), spesa.ID, movimento.ID, idEsercizio);
                                        throw;
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante la lettura del datasource per il bilancio consuntivo per Sotto Conto - MOVIMENTO - {0} - movimento:{1} - esercizio:{2}", ex, Utility.GetMethodDescription(), movimento.ID, idEsercizio);
                        throw;
                    }
                }

                return lista.Values.Where(item => item.ImportoSottoConto != 0).OrderBy(riga => riga.OrdineConto);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la lettura del datasource per il bilancio consuntivo per Sotto Conto - {0} - esercizio:{1}", ex, Utility.GetMethodDescription(), idEsercizio);
                throw;
            }
        }
示例#5
0
 private string getReportBilancioKey(ReportBilancioDTO item)
 {
     var key = item.IdConto + "$" + item.IdSottoConto + "$" + item.DescrizioneMovimento + "$" + item.IdStabile + "$" +
               item.IdGruppoStabile + "$" + item.NumeroRegistrazioneMovimento;
     return key;
 }