Esempio n. 1
0
 public EsitoSubentroDomain(EsitoSubentro esitoSubentro, Subentro subentro)
 {
     EsitoSubentro = esitoSubentro;
     Subentro = subentro;
 }
Esempio n. 2
0
        /// <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;
            }
        }
Esempio n. 3
0
		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;
		}