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; } }
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; } }