示例#1
0
        public List<ReportBilancioDTO> GetConsuntivoMovimenti(int idEsercizio, int? idStabile, int? idScala, DateTime? dataInizialeRegistrazione, DateTime? dataFinaleRegistrazione, string datiFatturaNumeroRegistrazione, TipoDettaglioReportBilancio tipoDettaglio, bool preventivoPrecedente, bool consuntivoPrecedente, LimitePagamenti limitePagamenti, bool dettaglioPersonali, bool addebitiCondominio, bool addebitiDirettiStabileScala)
        {
            var retryCount = 5;
            var success = false;
            List<ReportBilancioDTO> result = null;
            while (retryCount >= 0 && !success)
            {
                try
                {
                    var info = GetUserInfo();
                    info.Tentativo = 6 - retryCount;
                    result = GetServiceClient().GetBilancioConsuntivoMovimenti(idEsercizio, idStabile, idScala, dataInizialeRegistrazione, dataFinaleRegistrazione, datiFatturaNumeroRegistrazione, tipoDettaglio == TipoDettaglioReportBilancio.Personalizzato, preventivoPrecedente, consuntivoPrecedente, limitePagamenti, dettaglioPersonali, addebitiCondominio, addebitiDirettiStabileScala, info);
                    CloseService();
                    success = true;
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nella lettura del bilancio per movimenti - TENTATIVO:{0} - {1} - esercizio:{2} - datiFatturaNumeroRegistrazione:{3} - tipoDettaglio:{4} - azienda:{5}", ex, (6 - retryCount), Utility.GetMethodDescription(), idEsercizio, datiFatturaNumeroRegistrazione, tipoDettaglio, Login.Instance.CurrentLogin().Azienda);
                    retryCount--;
                    _log.InfoFormat("Esecuzione della funzione - INIZIO TENTATIVO:{0} - {1} - esercizio:{2} - datiFatturaNumeroRegistrazione:{3} - tipoDettaglio:{4} - azienda:{5}", (6 - retryCount), Utility.GetMethodDescription(), idEsercizio, datiFatturaNumeroRegistrazione, tipoDettaglio, Login.Instance.CurrentLogin().Azienda);
                }
            }

            return result;
        }
示例#2
0
        public void GetBilancioAnnualeAsync(int idEsercizio, DateTime? dataInizialeRegistrazione, DateTime? dataFinaleRegistrazione, int? idStabile, int? idScala, bool onlyCondominio, bool preventivoPrecedente, bool consuntivoPrecedente, LimitePagamenti limitePagamenti, bool dettaglioPersonali, bool addebitiCondominio, bool addebitiDirettiStabileScala, BilancioConsuntivoReportParameters parameters, INotifier notifier, Image image)
        {
            var id = Guid.NewGuid().ToString();
            _cacheService.AddStampaBatchToCache(new StampaBatchDTO { Id = id, Key = "BilancioAnnuale", IdEsercizio = idEsercizio, DataInizioEsecuzione = DateTime.Now });

            if (parameters.TipoDettaglio != TipoDettaglioReportBilancio.Undefined && parameters.TipoDettaglio != TipoDettaglioReportBilancio.Sottoconto)
            {
                GetServiceClient().GetBilancioConsuntivoMovimentiCompleted += bilancioWCFServiceGetBilancioConsuntivoMovimentiCompleted;
                GetServiceClient().GetBilancioConsuntivoMovimentiAsync(idEsercizio, idStabile, idScala, dataInizialeRegistrazione, dataFinaleRegistrazione, parameters.DatiFatturaNumeroRegistrazione, parameters.TipoDettaglio == TipoDettaglioReportBilancio.Personalizzato, preventivoPrecedente, consuntivoPrecedente, limitePagamenti, dettaglioPersonali, addebitiCondominio, addebitiDirettiStabileScala, GetUserInfo(), new StampaBatchParameters(id, parameters, notifier, image));
            }
            else
            {
                switch (parameters.TipoRendiconto)
                {
                    case TipoRendiconto.Consuntivo:
                        GetServiceClient().GetBilancioConsuntivoSottoContoCompleted += bilancioWCFServiceGetBilancioConsuntivoSottoContoCompleted;
                        GetServiceClient().GetBilancioConsuntivoSottoContoAsync(idEsercizio, parameters.ParzialeGruppo, parameters.ParzialeStabile, GetUserInfo(), new StampaBatchParameters(id, parameters, notifier, image));
                        break;
                    case TipoRendiconto.Preventivo:
                        GetServiceClient().GetBilancioPreventivoSottoContoCompleted += bilancioWCFServiceGetBilancioPreventivoSottoContoCompleted;
                        GetServiceClient().GetBilancioPreventivoSottoContoAsync(idEsercizio, idStabile, idScala, onlyCondominio, preventivoPrecedente, consuntivoPrecedente, addebitiDirettiStabileScala, GetUserInfo(), new StampaBatchParameters(id, parameters, notifier, image));
                        break;
                }
            }
        }
示例#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> GetBilancioConsuntivoMovimenti(int idEsercizio, int? idStabile, int? idScala, DateTime? dataRegistrazioneIniziale, DateTime? dataRegistrazioneFinale, string datiFatturaNumeroRegistrazione, bool dettaglioConto, bool preventivoPrecedente, bool consuntivoPrecedente, LimitePagamenti limitePagamenti, bool dettaglioPersonali, bool addebitiCondominio, bool addebitiDirettiStabileScala, UserInfo userinfo)
		{
            _log.InfoFormat("Esecuzione della funzione - {0} - tentativo:{1} - esercizio:{2} - azienda:{3}", Utility.GetMethodDescription(), userinfo.Tentativo, idEsercizio, userinfo.Azienda);

            var retryCount = 10;
            var success = false;
            var windsorRep = new WindsorConfigRepository();
            IEnumerable<ReportBilancioDTO> item = null;
            while (retryCount >= 0 && !success)
            {
                try
                {
                    windsorRep.BeginTransaction(userinfo);
                    var bilancioService = windsorRep.GetContainer(userinfo.Azienda).Resolve<IBilancioService>();
                    item = bilancioService.GetDataSourceBilancioConsuntivo_Movimenti(idEsercizio, null, idStabile, idScala, dataRegistrazioneIniziale, dataRegistrazioneFinale, datiFatturaNumeroRegistrazione, null, null, null, dettaglioConto, preventivoPrecedente, consuntivoPrecedente, limitePagamenti, dettaglioPersonali, addebitiCondominio, addebitiDirettiStabileScala);
                    windsorRep.Commit();
                    success = true;
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nella esecuzione della funzione - TENTATIVO:{0} - {1} - esercizio:{2} - azienda:{3} - number:{4}", ex, (11 - retryCount), Utility.GetMethodDescription(), idEsercizio, userinfo.Azienda, getExceptionId(ex));

                    windsorRep.Rollback();
                    if (!isRetryException(ex))
                        throw;

                    // Add delay here if you wish. 
                    System.Threading.Thread.Sleep(1000 * (11 - retryCount));
                    retryCount--;
                    _log.InfoFormat("Esecuzione della funzione - INIZIO TENTATIVO:{0} - {1} - esercizio:{2} - azienda:{3}", (11 - retryCount), Utility.GetMethodDescription(), idEsercizio, userinfo.Azienda);
                }
            }

            if (!success)
                windsorRep.Rollback();

            return item;
		}