public EsitoSubentroDomain(EsitoSubentro esitoSubentro, Subentro subentro) { EsitoSubentro = esitoSubentro; Subentro = subentro; }
/// <summary> /// Conferma del subentro. /// Se la persona entrante è null si tratta di un subentro di conduzione in cui l'appartamento rimane sfitto /// </summary> /// <param name="idCondominio">Condominio in cui è avvenuto il subentro</param> /// <param name="idUscente">Soggetto Uscente</param> /// <param name="entrante">Soggetto Entrante</param> /// <param name="idUnitaImmobiliarePrincipale">Unità immobiliare principale</param> /// <param name="idUnitaImmobiliari">Unità immobiliari per le quali è avvenuto il subentro</param> /// <param name="data">Data del subentro</param> /// <param name="spese">Spese di competenza tra uscente e entrante</param> /// <param name="rate">Rate eventualmente modficare</param> /// <param name="testoLettera"></param> /// <param name="speseUscente"></param> /// <param name="speseEntrante"></param> /// <param name="tipoSubentro">Tipo di subentro</param> /// <param name="tipoRendiconto">Rendiconto sul quale di basano i calcoli del subentro</param> /// <param name="oggettoLettera">Oggetto della lettera di subentro</param> /// <param name="spostamentoSaldi">Identifica se deve essere eseguito il trasferimento automatico dei saldi e delle rate</param> /// <param name="logTransazione">Log della transazione per permettere il salvataggio tramite cascade</param> /// <returns>Esito del subentro</returns> public EsitoSubentroDomain Conferma(int idCondominio, int idUscente, PersonaDTO entrante, int idUnitaImmobiliarePrincipale, IList<int> idUnitaImmobiliari, DateTime data, IList<CalcoloSubentroDTO> spese, IList<RataSoggettoSubentroDTO> rate, string oggettoLettera, string testoLettera, decimal speseUscente, decimal speseEntrante, TipoSoggetto tipoSubentro, TipoRendiconto tipoRendiconto, bool spostamentoSaldi, LogTransazione logTransazione) { try { var fatalMessage = string.Empty; var warnMessage = string.Empty; var condominio = _daoFactory.GetCondominioDao().GetById(idCondominio, false); var esercizio = _daoFactory.GetEsercizioDao().GetEsercizioCompetenza(condominio, data); if(esercizio == null) return new EsitoSubentroDomain(new EsitoSubentro(null, null, "La data del subentro non è corretta, verificare che sia aperto l'esercizio di competenza", null,null), null); // ========================================================================== // Persone // ========================================================================== Persona personaEntrante = null; if (entrante != null) { // se l'ID è correttamente valorizzato è stata scelta una persona già presente in anagrafica personaEntrante = entrante.ID > 0 ? _daoFactory.GetPersonaDao().GetById(entrante.ID, false) : _personaService.SetNew(entrante); } // ========================================================================== // Subentro // ========================================================================== var subentro = new GestioneCondomini.Domain.Subentro( condominio, data, tipoSubentro, oggettoLettera, testoLettera, speseUscente, speseEntrante, spostamentoSaldi, logTransazione ) { SaldoUscente = _saldiCondominiService.GetSaldoByPersonaUnitaImmobiliari(esercizio.ID, new List<int> { idUscente }, idUnitaImmobiliari, true) }; // ========================================================================== // Registro i nuovi condomini // ========================================================================== SoggettoCondominio soggettoEntrantePrincipale = null; SoggettoCondominio soggettoUscentePrincipale = null; SoggettoCondominio proprietarioPrincipale = null; foreach (var idUnitaImmobiliare in idUnitaImmobiliari) { // ----------------------------- // Soggetto Entrante // ----------------------------- var unita = _daoFactory.GetUnitaImmobiliareDao().GetById(idUnitaImmobiliare, false); var proprietario = unita.GetProprietarioPrincipale(esercizio.DataChiusura); SoggettoCondominio soggettoEntrante = null; ISet<SoggettoCondominio> soggetti = null; switch (tipoSubentro) { case TipoSoggetto.Conduttore: if (personaEntrante != null) soggettoEntrante = new Conduttore(unita, personaEntrante); soggetti = unita.Conduttori; break; case TipoSoggetto.Proprietario: if (personaEntrante != null) soggettoEntrante = new Proprietario(unita, personaEntrante); soggetti = unita.Proprietari; break; case TipoSoggetto.Soggetto: if (personaEntrante != null) soggettoEntrante = new SoggettoCondominio(unita, personaEntrante); soggetti = unita.Soggetti; break; } if (soggettoEntrante != null) soggettoEntrante.IsResidente = _soggettoService.IsResidente(soggettoEntrante); // ----------------------------- // Soggetto Uscente // ----------------------------- // Nel caso di subentro di conduzione se il conduttore non è presente il soggetto // uscente è il proprietario. // ----------------------------- SoggettoCondominio soggettoUscente = null; var soggettiUscenti = soggetti.Where(item => item.Persona.ID == idUscente).ToList(); if (soggettiUscenti.Count > 0) { if (soggettiUscenti.Count > 1) { _log.WarnFormat("Trovati più di un soggetto con la stessa persona anagrafica - PROPRIETARIO - {0} - unità immobiliare:{1} - condominio:{2} - uscente:{3} - entrante:{4}", Utility.GetMethodDescription(), unita?.ID.ToString(CultureInfo.InvariantCulture) ?? "<NULL>", idCondominio, idUscente, entrante != null ? entrante.DisplayName : "<NULL>"); } soggettoUscente = soggettiUscenti.FirstOrDefault(); } if (soggettoUscente != null) soggettoUscente.DataFine = data; else if (tipoSubentro == TipoSoggetto.Conduttore) { soggettiUscenti = unita.Proprietari.Where(item => item.Persona.ID == idUscente).ToList(); if (soggettiUscenti.Count > 0) { if (soggettiUscenti.Count > 1) { _log.WarnFormat("Trovati più di un soggetto con la stessa persona anagrafica - CONDUTTORE - {0} - unità immobiliare:{1} - condominio:{2} - uscente:{3} - entrante:{4}", Utility.GetMethodDescription(), unita?.ID.ToString(CultureInfo.InvariantCulture) ?? "<NULL>", idCondominio, idUscente, entrante != null ? entrante.DisplayName : "<NULL>"); } soggettoUscente = soggettiUscenti.FirstOrDefault(); } } // soggettoEntrante = null l'unità immobiliare è rimasta sfitta if (soggettoEntrante != null) { soggettoEntrante.DataInizio = data; if (soggettoUscente != null) { soggettoEntrante.PercentualeRiferimento = soggettoUscente.PercentualeRiferimento; soggettoEntrante.Principale = soggettoUscente.Principale; } else { soggettoEntrante.PercentualeRiferimento = 1m; soggettoEntrante.Principale = true; } _daoFactory.GetSoggettoCondominioDao().SaveOrUpdate(soggettoEntrante); } else soggettoEntrante = proprietario; // ----------------------------- // Unità Immobiliare // ----------------------------- var subentroUnita = new SubentroUnitaImmobiliare(subentro, unita, soggettoEntrante, soggettoUscente); if (unita.ID == idUnitaImmobiliarePrincipale) { subentroUnita.Principale = true; soggettoUscentePrincipale = soggettoUscente; soggettoEntrantePrincipale = soggettoEntrante; proprietarioPrincipale = proprietario; } //------------------------------------- // Se presenti accorpamenti li annullo //------------------------------------- if (soggettoUscente != null && soggettoUscente.SoggettiCollegati.Count > 0) { warnMessage = string.Format("Il soggetto uscente aveva degli accorpamenti di rate configurati.{0}Gli accorpamenti sono stati eliminati.{0}", Environment.NewLine); foreach (var soggettoCondominio in soggettoUscente.SoggettiCollegati) soggettoCondominio.SoggettoPrincipale = null; soggettoUscente.SoggettiCollegati.Clear(); } unita.Descrizione = _daoFactory.GetUnitaImmobiliareDao().GetUnitaImmobiliareDescrizione(unita); } //-------------------------------- // Dettagli //-------------------------------- foreach(var calcoloSubentro in spese) { // Uscente // ------------- var dettaglioSubentroUscente = new DettaglioSubentro(subentro, _daoFactory.GetContoDao().GetById(calcoloSubentro.IdConto, false), soggettoUscentePrincipale, calcoloSubentro.ImportoSoggettoUscente, calcoloSubentro.GiorniUscente.Value, TipoDettaglioSubentro.Uscente); // Entrante // ------------- var dettaglioSubentroEntrante = new DettaglioSubentro(subentro, _daoFactory.GetContoDao().GetById(calcoloSubentro.IdConto, false), soggettoEntrantePrincipale, calcoloSubentro.ImportoSoggettoEntrante, calcoloSubentro.GiorniEntrante.Value, TipoDettaglioSubentro.Entrante); } // ========================================================================== // Rate // ========================================================================== string descrizione; if(soggettoUscentePrincipale != null) descrizione = "Subentro: " + soggettoUscentePrincipale.DisplayName + " - " + soggettoEntrantePrincipale.DisplayName; else descrizione = "Subentro: " + proprietarioPrincipale.DisplayName + " - " + soggettoEntrantePrincipale.DisplayName; var listaRateDaEmettere = new Dictionary<DateTime, Dictionary<int, RataSoggettoDTO>>(); foreach (var rataSubentro in rate) { var rata = _daoFactory.GetRataSoggettoDao().GetById(rataSubentro.ID, false); // ---------------------------------------------------------- // Cancellazione o richiamo rata originale // ---------------------------------------------------------- if (rataSubentro.Eliminare || rataSubentro.AssegnareAEntrante) fatalMessage += _rateService.EliminazioneRataSoggetto(rata, descrizione); // ---------------------------------------------------------- // Modifica importo rata // ---------------------------------------------------------- else if (rataSubentro.Importo != rata.Importo) { var rataAggiornamento = new RataSoggettoAggiornamentoDTO { DataScadenza = rata.DataScadenza, Id = rata.ID, IdEsercizio = rata.Esercizio.ID, IdSoggettoCondominio = rata.Soggetto.ID, Importo = rataSubentro.Importo }; IList<RataSoggettoAggiornamentoDTO> rateAggiornamento = new List<RataSoggettoAggiornamentoDTO>(1); rateAggiornamento.Add(rataAggiornamento); _rateService.AggiornaImporti(rateAggiornamento, false, TipoAccorpamentoRateEnum.Nessuno, logTransazione); } // ---------------------------------------------------------- // Creazione nuova rata da emettere // ---------------------------------------------------------- if (rataSubentro.AssegnareAEntrante) { Dictionary<int, RataSoggettoDTO> listaRate; if (listaRateDaEmettere.ContainsKey(rata.DataScadenza)) listaRate = listaRateDaEmettere[rata.DataScadenza]; else { listaRate = new Dictionary<int, RataSoggettoDTO>(); listaRateDaEmettere.Add(rata.DataScadenza, listaRate); } if (rataSubentro.AssegnareAEntrante) addRataDaEmettere(soggettoEntrantePrincipale, esercizio, rata, listaRate, rataSubentro.Importo); } } fatalMessage += _rateService.CreazioneRateFuoriPreventivo(esercizio, listaRateDaEmettere, true, descrizione, logTransazione); // ========================================================================== // Spostamento saldi // - Solo se il tipo di subentro corrisponde con con il tipo di soggetto uscente // ========================================================================== if (spostamentoSaldi && soggettoUscentePrincipale.Tipo == tipoSubentro) { var messageSpostamento = SpostamentoSaldi(subentro); if (!string.IsNullOrEmpty(messageSpostamento.FatalMessage)) fatalMessage += messageSpostamento.FatalMessage; if (!string.IsNullOrEmpty(messageSpostamento.WarnMessage)) warnMessage += messageSpostamento.WarnMessage; } int? idPersonaEntrante = null; if (personaEntrante != null) idPersonaEntrante = personaEntrante.ID; // ========================================================================== // Leggo le eventuali ripartizioni personalizzate // ========================================================================== var soggettiRipartizione = _daoFactory.GetSoggettoCondominioRipartizioneDao().GetBySoggetto(soggettoUscentePrincipale.ID); var soggettiRipartizioneDto = new List<SoggettoCondominioRipartizioneDTO>(soggettiRipartizione.Count); soggettiRipartizioneDto.AddRange(soggettiRipartizione.Select(item => new SoggettoCondominioRipartizioneDTO { ID = item.ID, DescrizioneConto = item.Conto.Descrizione, IdConto = item.Conto.ID, DescrizioneSoggetto = item.Soggetto.DisplayName, IdSoggetto = item.Soggetto.ID, IdUnitaImmobiliare = item.Soggetto.UnitaImmobiliare.ID, PercentualeRipartizione = item.PercentualeRipartizione, DirittoReale = (item.Soggetto.DirittoReale != null) ? item.Soggetto.DirittoReale.GetValueOrDefault().ToString() : string.Empty, Tipo = item.Soggetto.Tipo })); var esitoSubentro = new EsitoSubentro(idPersonaEntrante, subentro.ID, fatalMessage, warnMessage, soggettiRipartizioneDto); return new EsitoSubentroDomain(esitoSubentro, subentro); } catch (Exception ex) { _log.ErrorFormat("Errore durante la conferma del subentro - {0} - idCondominio:{1} - idUscente:{2} - entrante:{3}", ex, Utility.GetMethodDescription(), idCondominio, idUscente, entrante != null ? entrante.DisplayName : "<NULL>"); throw; } }
public EsitoSubentro ConfermaSubentro(int idCondominio, int idUscente, PersonaDTO entrante, int idUnitaImmobiliarePrincipale, BindingList<int> idUnitaImmobiliari, DateTime data, BindingList<CalcoloSubentroDTO> spese, BindingList<RataSoggettoSubentroDTO> rate, string oggettoLettera, string testoLettera, decimal speseUscente, decimal speseEntrante, TipoSoggetto tipoSubentro, TipoRendiconto tipoRendiconto, bool spostamentoSaldi, UserInfo userinfo) { var retryCount = 5; var success = false; var windsorRep = new WindsorConfigRepository(); var item = new EsitoSubentro(); while (retryCount >= 0 && !success) { try { var logTransazione = windsorRep.BeginTransaction(userinfo, true, true); var subentroService = windsorRep.GetContainer(userinfo.Azienda).Resolve<ISubentroService>(); var esito = subentroService.Conferma(idCondominio, idUscente, entrante, idUnitaImmobiliarePrincipale, idUnitaImmobiliari, data, spese, rate, oggettoLettera, testoLettera, speseUscente, speseEntrante, tipoSubentro, tipoRendiconto, spostamentoSaldi, logTransazione); windsorRep.Commit(logTransazione); if (esito.Subentro != null) esito.EsitoSubentro.IdSubentro = esito.Subentro.ID; item = esito.EsitoSubentro; success = true; } catch (Exception ex) { _log.ErrorFormat("Errore nella conferma del subentro - TENTATIVO:{0} - {1} - condominio:{2} - azienda:{3} - number:{4}", ex, (6 - retryCount), Utility.GetMethodDescription(), +idCondominio, userinfo.Azienda, getExceptionId(ex)); windsorRep.Rollback(); if (!isRetryException(ex)) throw; // Add delay here if you wish. System.Threading.Thread.Sleep(1000 * (6 - retryCount)); retryCount--; _log.InfoFormat("Conferma del Subentro - INIZIO TENTATIVO:{0} - {1} - condominio:{2} - azienda:{3}", (6 - retryCount), Utility.GetMethodDescription(), idCondominio, userinfo.Azienda); } } // Tutte le modifiche devono subire un rollback perchè è stato creato un subentro temporaneo per semplificare i calcoli windsorRep.Rollback(); return item; }