public object Clone()
        {
            var newItem = new RipartizioneBollettaDTO();

            // Lotti
            var newLotti = new List<BusinessInstanceSelectedDTO>(Lotti.Count);
            Lotti.ForEach(item => newLotti.Add((BusinessInstanceSelectedDTO)item.Clone()));
            newItem.Gruppi = newLotti;

            // Gruppi
            var newGruppi = new List<BusinessInstanceSelectedDTO>(Gruppi.Count);
            Gruppi.ForEach(item => newGruppi.Add((BusinessInstanceSelectedDTO)item.Clone()));
            newItem.Gruppi = newGruppi;

            // Stabili
            var newStabili = new List<BusinessInstanceSelectedDTO>(Stabili.Count);
            Stabili.ForEach(item => newStabili.Add((BusinessInstanceSelectedDTO)item.Clone()));
            newItem.Stabili = newStabili;

            // Unità Immobiliari
            var newUnita = new List<UnitaImmobiliareSelectedDTO>(UnitaImmobiliari.Count);
            UnitaImmobiliari.ForEach(item => newUnita.Add((UnitaImmobiliareSelectedDTO)item.Clone()));
            newItem.UnitaImmobiliari = newUnita;

            return newItem;
        }
        public AuthorizationMessages ReloadRipartizioneByModelloEsercizio(int idModello, int? idEsercizio, RipartizioneBollettaDTO ripartizioneCondominio, int idUtente, LogTransazione logTransazione)
        {
            try
            {
                var fatalMessage = string.Empty;
                var warnMessage = string.Empty;

                // Modelli collegati al dettaglio spesa
                var dettagli = _daoFactory.GetDettaglioSpesaDao().GetAperteByModelloEsercizio(idModello, idEsercizio);
                foreach (var dettaglio in dettagli)
                {
                    var tipo = Sfera.Enums.TipoMovimentoEnum.Spesa;
                    if (dettaglio.SpesaRiferimento.TipoDocumento == "NOTACC")
                        tipo = Sfera.Enums.TipoMovimentoEnum.Accredito;
                    _ripartizioneSpeseService.ApplyModello(dettaglio, idModello, tipo);

                    // ========================================================================================
                    // BUGID#2159 - COMMENTATO: Con la nuova funzione di riparto aggregato NON devono
                    //  più essere usati gli oggetti SpeseUnita.
                    //  Quindi il singolo movimento NON deve essere più ripartito, a meno che, non si tratta di 
                    //  una ripartizione personalizzata a livello di modello
                    //  movimento
                    //foreach (var mov in dettaglio.Movimenti)
                    //    _ripartizioneSpeseService.SalvaRipartizione(mov, dettaglio.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, false);
                    foreach (var mov in dettaglio.Movimenti.Where(item => item.IsRipartoPersonalizzato))
                    {
                        _ripartizioneSpeseService.SalvaRipartizione(mov, dettaglio.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, false);
                        
                        // Movimento di spese personali, una sola riga di riparto addebitiamo l'intero importo
                        if (mov.ContoRiferimento.IsSpesePersonali)
                        {
                            if (mov.DettaglioRipartizione.Count == 1)
                            {
                                var spesaUnita = mov.DettaglioRipartizione.SingleOrDefault();
                                if(spesaUnita != null)
                                    spesaUnita.Importo = mov.Importo;
                            }
                        }
                    }
                    // ===========================================================================================
                }

                // Modelli collegati alle utenze (bollette)
                var utenze = _daoFactory.GetUtenzaDao().GetByModello(idModello);
                foreach (var utenza in utenze)
                {
                    var riparto = _ripartizioneSpeseService.GetRipartizioneByUtenza(utenza.ID, ripartizioneCondominio, false);
                    var spese = _daoFactory.GetSpesaDao().GetAperteByUtenza(utenza.ID);
                    if (idEsercizio != null)
                        spese = spese.Where(item => item.EsercizioRiferimento.ID == idEsercizio).ToList();
                    foreach (var spesa in spese)
                    {
                        if (spesa.Utenza != null)
                        {
                            // Se non ho personalizzato il riparto ricalcolo tutto ...
                            //---------------------------------------------------------
                            if (!spesa.IsRipartoPersonalizzato)
                            {
                                var bolletta = _utenzaService.GetBollettaById(spesa.ID);

                                // Elimino i vecchi movimenti
                                foreach (var movimento in spesa.MovimentiBollette)
                                {
                                    if (movimento.Testata != null) 
                                        movimento.Testata.Movimenti.Remove(movimento);
                                    movimento.Testata = null;
                                    movimento.Spesa = null;
                                }
                                spesa.MovimentiBollette.Clear();

                                // Clone della lista
                                var totalePercentuale = riparto.Sum(item => item.PercentualeRiparto);
                                var newList = new List<MovimentoContabileBollettaDTO>(riparto.Count);
                                riparto.ToList().ForEach(item =>
                                {
                                    var itemMovimento = (MovimentoContabileBollettaDTO)item.Clone();
                                    itemMovimento.Importo = spesa.ImportoBolletta * (itemMovimento.PercentualeRiparto/totalePercentuale);
                                    newList.Add(itemMovimento);
                                });
                                bolletta.Movimenti = newList;

                                bolletta.IdUtente = idUtente;
                                var resultBolletta = _utenzaService.SalvaBolletta(bolletta, false, null, logTransazione);
                                if (!string.IsNullOrEmpty(resultBolletta.Message))
                                {
                                    // Se non è possibile ricalcolare la bolletta deve essere annullata l'intera operazione di ricalcolo
                                    _persistenceContext.RollbackAndCloseSession("system");
                                    return new AuthorizationMessages(string.Format("Non è stato possibile effettuare il ricalcolo della bolletta n.{0} del {1:d}:{2}.{3}", bolletta.NumeroDocumento, bolletta.DataDocumento, resultBolletta.Message, Environment.NewLine), null);
                                }
                            }
                            else
                            // ... altrimenti ricalcolo solo gli importi
                            //------------------------------------------------------
                            {
                                foreach (var testata in spesa.TestateMovimenti)
                                {
                                    foreach (var movimento in testata.Movimenti)
                                        _ripartizioneSpeseService.RicalcoloRipartizioneByMovimento(movimento);
                                }
                            }
                        }
                    }
                }

                return new AuthorizationMessages(fatalMessage, warnMessage);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante il ricalcolo della ripartizione per modello - {0} - modello:{1}", ex, Library.Utility.GetMethodDescription(), idModello);
                throw;
            }
        }
        public IList<MovimentoContabileBollettaDTO> GetRipartizioneByUtenza(int idUtenza, RipartizioneBollettaDTO ripartizioneCondominio, bool decodificaDescrizione)
        {
            try
            {
                var utenza = _daoFactory.GetUtenzaDao().Find(idUtenza, false);

                var movimenti = new List<MovimentoContabileBollettaDTO>();

                // ================================
                // Ripartizione Movimenti
                // ================================
                if (utenza?.ModelloRegistrazione != null)
                {
                    foreach (var conto in utenza.ModelloRegistrazione.Conti)
                    {
                        try
                        {
                            if(conto.ContoRiferimento != null)
                            {
                                var ripartizioneModello = conto.Unita.Where(item => item.UnitaRiferimento != null || item.LottoRiferimento != null || item.PalazzinaRiferimento != null || item.GruppoStabileRiferimento != null).ToList();

                                var movimento = new MovimentoContabileBollettaDTO
                                {
                                    ID = 0,
                                    IdConto = conto.ContoRiferimento.ID,
                                    PercentualeRiparto = conto.PercentualeRipartizione,
                                    MovimentoEconomico = true
                                };

                                if (conto.SottoContoRiferimento != null)
                                    movimento.IdSottoConto = conto.SottoContoRiferimento.ID;

                                // ----------------------------------------------------------
                                // Ripartizione Lotti, Stabili, Gruppi e Unità Immobiliari
                                // ----------------------------------------------------------
                                RipartizioneBollettaDTO ripartizione;
                                if (ripartizioneCondominio != null)
                                    ripartizione = (RipartizioneBollettaDTO)ripartizioneCondominio.Clone();
                                else
                                    ripartizione = GetRipartizioneByCondominio(utenza.Condominio, DateTime.Today, false);

                                // Inizializzo il flag di selezione
                                // --------------------------------
                                // Lotti
                                movimento.RipartoAggiornato = "U";
                                foreach (var item in ripartizione.Lotti)
                                {
                                    item.Selezionato = getSelezionatoLotto(_daoFactory.GetLottoDao().GetById(item.ID, false), ripartizioneModello);
                                    if (item.Selezionato)
                                        movimento.RipartoAggiornato = "L";
                                }

                                // Stabili
                                foreach (var item in ripartizione.Stabili)
                                {
                                    item.Selezionato = getSelezionatoStabile(_daoFactory.GetPalazzinaDao().GetById(item.ID, false), ripartizioneModello);
                                    if (item.Selezionato)
                                        movimento.RipartoAggiornato = "S";
                                }

                                // Scale
                                foreach (var item in ripartizione.Gruppi)
                                {
                                    item.Selezionato = getSelezionatoScala(_daoFactory.GetGruppoStabileDao().GetById(item.ID, false), ripartizioneModello);
                                    if (item.Selezionato)
                                        movimento.RipartoAggiornato = "G";
                                }

                                // Unità Immobiliari
                                foreach (var item in ripartizione.UnitaImmobiliari)
                                    item.Selezionato = getSelezionatoUnita(_daoFactory.GetUnitaImmobiliareDao().GetById(item.ID, false), ripartizioneModello);

                                movimento.Ripartizione = ripartizione;
                                movimenti.Add(movimento);                                
                            }
                            else
                            {
                                _log.WarnFormat("ATTENZIONE Modello con riga di riparto senza conto definito - {0} - conto:{1} - utenza:{2}", Utility.GetMethodDescription(), conto.ID, idUtenza);
                            }
                        }
                        catch (Exception ex)
                        {
                            _log.ErrorFormat("Errore durante la lettura di una ripartizione per utenza - Conto - {0} - conto:{1} - utenza:{2}", ex, Utility.GetMethodDescription(), conto.ID, idUtenza);
                            throw;
                        }
                    }
                }

                return movimenti;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore durante la lettura di una ripartizione per utenza - {0} - idUtenza:{1}", ex, Utility.GetMethodDescription(), idUtenza);
                throw;
            }
        }
        public RipartizioneBollettaDTO GetRipartizioneByCondominio(Condominio condominio, DateTime dataRiferimento, bool spesePersonali)
        {
            try
            {
                var ripartizione = new RipartizioneBollettaDTO {Lotti = new List<BusinessInstanceSelectedDTO>()};

                // Lotti
                foreach (var lotto in condominio.Lotti)
                {
                    ripartizione.Lotti.Add(new BusinessInstanceSelectedDTO
                    {
                        ID = lotto.ID,
                        Descrizione = lotto.Descrizione,
                        Selezionato = false
                    });
                }

                // Stabili
                ripartizione.Stabili = new List<BusinessInstanceSelectedDTO>();
                foreach (var stabile in condominio.Palazzine)
                {
                    var item = new BusinessInstanceSelectedDTO
                    {
                        ID = stabile.ID,
                        Descrizione = stabile.Descrizione,
                        Selezionato = false
                    };

                    if(stabile.LottoRiferimento != null)
                    {
                        item.ParentId = stabile.LottoRiferimento.ID;
                        item.ParentName = stabile.LottoRiferimento.Descrizione;
                    }

                    ripartizione.Stabili.Add(item);
                }

                // Scale
                ripartizione.Gruppi = new List<BusinessInstanceSelectedDTO>();
                foreach (var stabile in condominio.Palazzine)
                {
                    foreach (var scala in stabile.GruppiStabile)
                    {
                        ripartizione.Gruppi.Add(new BusinessInstanceSelectedDTO
                        {
                            ID = scala.ID,
                            Descrizione = scala.Descrizione,
                            ParentId = stabile.ID,
                            ParentName = stabile.Descrizione,
                            Selezionato = false
                        });
                    }
                }

                // Unità Immobiliari/Soggetto condominio
                ripartizione.UnitaImmobiliari = new List<UnitaImmobiliareSelectedDTO>();
                if (!spesePersonali)
                {
                    foreach (var stabile in condominio.Palazzine)
                    {
                        foreach (var scala in stabile.GruppiStabile)
                        {
                            foreach (var unitaImmobiliare in scala.UnitaImmobiliari)
                            {
                                ripartizione.UnitaImmobiliari.Add(new UnitaImmobiliareSelectedDTO
                                {
                                    ID = unitaImmobiliare.ID,
                                    Descrizione = unitaImmobiliare.Descrizione,
                                    Selezionato = false,
                                    Interno = unitaImmobiliare.InternoCompleto,
                                    Ordine = unitaImmobiliare.Ordine,
                                    TipoUnita = unitaImmobiliare.TipoUnitaImmobiliare.Descrizione,
                                    ParentId = scala.ID,
                                    ParentName = scala.Descrizione
                                });
                            }
                        }
                    }
                }
                else
                {
                    var soggetti = _daoFactory.GetSoggettoCondominioDao().GetAttiviByCondominioData(condominio.ID, null, null, dataRiferimento);
                    foreach (var soggettoCondominio in soggetti)
                    {
                        ripartizione.UnitaImmobiliari.Add(new UnitaImmobiliareSelectedDTO
                        {
                            ID = soggettoCondominio.UnitaImmobiliare.ID,
                            IdSoggettoCondominio = soggettoCondominio.ID,
                            Descrizione = soggettoCondominio.DisplayName,
                            Selezionato = false,
                            Interno = soggettoCondominio.UnitaImmobiliare.InternoCompleto,
                            Ordine = soggettoCondominio.UnitaImmobiliare.Ordine,
                            TipoUnita = soggettoCondominio.UnitaImmobiliare.TipoUnitaImmobiliare.Descrizione,
                            ParentId = soggettoCondominio.UnitaImmobiliare.GruppoStabileRiferimento.ID,
                            ParentName = soggettoCondominio.UnitaImmobiliare.GruppoStabileRiferimento.Descrizione,
                            TipoCondomino = soggettoCondominio.Tipo.ToString()
                        });
                    }
                }

                return ripartizione;
            }
            catch (Exception ex)
            {
                
                _log.Error("Errore durante la generazione della ripartizione - " + Utility.GetMethodDescription() + " - condominio:" + condominio.ID, ex);
                throw;
            }
        }
Example #5
0
        public RipartizioneBollettaDTO SetRipartizione(string tipo, BusinessInstanceSelectedDTO item, RipartizioneBollettaDTO ripartizione, MovimentoContabileBollettaDTO dto)
        {
            try
            {
                if (ripartizione != null)
                {
                    dto.RipartoAggiornato = tipo;
                    if (tipo != "L")
                    {
                        foreach (BusinessInstanceSelectedDTO lotto in ripartizione.Lotti)
                            lotto.Selezionato = false;
                    }
                    if (tipo != "S")
                    {
                        foreach (BusinessInstanceSelectedDTO stabile in ripartizione.Stabili)
                            stabile.Selezionato = false;
                    }
                    if (tipo != "G")
                    {
                        foreach (BusinessInstanceSelectedDTO scala in ripartizione.Gruppi)
                            scala.Selezionato = false;
                    }
                }
                else
                {
                    var log = LogManager.GetLogger("Sfera");
                    log.Fatal("ATTENZIONE: Ripartizione a null - " + Utility.GetMethodDescription() + " - tipo: " + tipo);
                }

                return ripartizione;
            }
            catch (Exception ex)
            { 
                var log = LogManager.GetLogger("Sfera");
                log.Fatal("Errore inaspettato durante il set della ripartizione per una bolletta - " + Utility.GetMethodDescription() + " - tipo: " + tipo, ex);
                throw;
            }
        }