Example #1
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;
            }
        }
Example #2
0
        private void btnAggiungiClick(object sender, EventArgs e)
        {
            if (nuovaData.Value != null && listaRateSoggetti.DataSource is DataTable)
            {
                if (!Conversione.IsSqlSmallDateTime(nuovaData.DateTime))
                {
                    CommonMessages.DisplayWarning($"La data {nuovaData.DateTime.ToShortDateString()} non è corretta");
                    return;
                }


                if (Conversione.IsSqlSmallDateTime(nuovaData.DateTime))
                {
                    var messageAuth = getRateCondominiService().IsAllowUpdateDataPianoRateale(_pianoRateale, null, nuovaData.DateTime);

                    if (!string.IsNullOrEmpty(messageAuth.FatalMessage))
                        CommonMessages.DisplayWarning("Non è ammesso l'aggiornamento del piano rateale:" + Environment.NewLine +
                                                      messageAuth.FatalMessage);
                    else
                    {
                        var result = DialogResult.Yes;
                        if (!string.IsNullOrEmpty(messageAuth.WarnMessage))
                            result = CommonMessages.DisplayConfirm("Avvertimenti per l'aggiornamento della rata:" +
                                                                   Environment.NewLine + messageAuth.WarnMessage +
                                                                   Environment.NewLine +
                                                                   "Vuoi confermare l'aggiornamento?");

                        if (result == DialogResult.Yes)
                        {
                            ContoDTO conto = null;
                            if (contiOrigine.SelectedItem != null)
                                conto = (ContoDTO)contiOrigine.SelectedItem.ListObject;
                            var tbDati = getRateCondominiService().AddDataToPivot(_esercizio, (DataTable)listaRateSoggetti.DataSource, _rateSoggetti, nuovaData.DateTime, importoRata.Value, conto, _soggetti, _tipo);
                            listaRateSoggetti.DataSource = tbDati;
                            setRowsLayout();

                            // Rate da aggiornare
                            foreach (DataRow row in tbDati.Rows)
                            {
                                var rata = new RataSoggettoAggiornamentoDTO
                                {
                                    DataScadenza = nuovaData.DateTime,
                                    IdEsercizio = _esercizio.ID,
                                    IdSoggettoCondominio = (int)row["IdSoggetto"],
                                    Importo = (decimal)row["Decimal_Data_" + nuovaData.DateTime.ToShortDateString()]
                                };

                                _rateDaAggiornare.Add(rata);
                            }

                            listaRateSoggetti.DisplayLayout.Bands[0].Summaries.Clear();
                            foreach (var column in listaRateSoggetti.DisplayLayout.Bands[0].Columns)
                            {
                                if (column.DataType == typeof(decimal))
                                    DataGridHelper.AddSummary(listaRateSoggetti.DisplayLayout.Bands[0], column.Key, "c");
                            }

                            setGridLayout(TipoListaRate.Pivot);
                        }
                    }
                }
                else
                    CommonMessages.DisplayWarning($"La data {nuovaData.DateTime.ToShortDateString()} non è corretta");
            }
        }
Example #3
0
        private void listaRateSoggettiAfterCellUpdate(object sender, CellEventArgs e)
        {
            if (e.Cell.Row.IsDataRow && e.Cell.Band.Index == 0)
            {
                try
                {
                    if (e.Cell.Column.Key != "DeleteColumn")
                    {
                        if (e.Cell.Column.Key == "IdSoggettoCondominio")
                        {
                            var idSoggetto = (int)e.Cell.Value;
                            var soggettoSelezionato = (from soggetto in _soggetti
                                                       where soggetto.ID == idSoggetto
                                                       select soggetto).SingleOrDefault();
                            if (soggettoSelezionato != null)
                                e.Cell.Row.Cells["DescrizioneUnitaImmobiliare"].Value = soggettoSelezionato.DescrizioneUnitaImmobiliare;
                        }

                        if (e.Cell.Column.Key.StartsWith("Decimal_Data_"))
                        {
                            var data = DateTime.Parse(e.Cell.Column.Key.Split('_')[2]);
                            if (Conversione.IsSqlSmallDateTime(data))
                            {
                                var idSoggetto = int.Parse(e.Cell.Row.Cells["IdSoggetto"].Value.ToString());
                                decimal? importo = null;
                                if (e.Cell.Value != DBNull.Value && Utility.IsDecimal(e.Cell.Value.ToString()))
                                    importo = decimal.Parse(e.Cell.Value.ToString().Replace('.', ','));

                                var rata = (_rateDaAggiornare.Where(item => item.IdSoggettoCondominio == idSoggetto && item.DataScadenza == data)).FirstOrDefault();
                                if (rata == null)
                                {
                                    // Se la rata è stata richiamata e l'importo è 0 non può essere aggiornata
                                    var rataSoggetto = getRataFromPivot(data, e.Cell.Row);
                                    if (rataSoggetto != null && (rataSoggetto.StatoRata != StatoRataEnum.Richiamata || importo.GetValueOrDefault() > 0))
                                    {
                                        rata = new RataSoggettoAggiornamentoDTO
                                        {
                                            DataScadenza = data,
                                            IdEsercizio = _esercizio.ID,
                                            IdSoggettoCondominio = idSoggetto,
                                            Importo = importo
                                        };
                                        _rateDaAggiornare.Add(rata);

                                        if (!_isCreazione)
                                            btnConferma.Visible = true;
                                    }
                                }
                                else
                                    rata.Importo = importo;

                                calcolaTotale(e.Cell.Row);
                            }

                        }

                        var dto = e.Cell.Row.ListObject as RataSoggettoDTO;
                        if (dto != null)
                        {
                            var rata = dto;
                            if (!_rateDaAggiornareEditabile.Contains(rata))
                            {
                                rata.IdEsercizio = _esercizio.ID;
                                _rateDaAggiornareEditabile.Add(rata);
                                if (!_isCreazione)
                                    btnConferma.Visible = true;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.WarnFormat("Errore inaspettato durante l'aggiornamento di una cell - {0} - cellkey:{1} - cellvalue:{2} - celltext:{3} - condominio:{4} - esercizio:{5}", ex, Utility.GetMethodDescription(), e.Cell.Column.Key, e.Cell.Value, e.Cell.Text, _condominio.ID, _esercizio.ID);
                    throw;
                }
            }
        }
Example #4
0
        private PianoRatealeDettaglio getPianoRatealeDettaglio(Dictionary<DateTime, PianoRatealeDettaglio> dettagliPianoRateale, PianoRateale pianoRateale, Esercizio esercizio, RataSoggettoAggiornamentoDTO rata, bool rateAcconto, TipoAccorpamentoRateEnum tipo, LogTransazione logTransazione, LogTransazione logTransazioneDettaglio, string message)
        {
            if (dettagliPianoRateale.ContainsKey(rata.DataScadenza))
                return dettagliPianoRateale[rata.DataScadenza];

            var listaPianoRateale = _daoFactory.GetPianoRatealeDettaglioDao().GetByDataEsercizio(esercizio, rata.DataScadenza).Where(item => !item.DaSubentro).ToList();
            if (listaPianoRateale.Count > 1)
                message += $"E' stato trovato più di un piano rateale per la data: {rata.DataScadenza:d} e il soggetto: {rata.IdSoggettoCondominio}{Environment.NewLine}";
            else if (listaPianoRateale.Count == 1)
                return listaPianoRateale[0];
            else if (listaPianoRateale.Count == 0)
            {
                if (pianoRateale == null)
                {
                    pianoRateale = _daoFactory.GetPianoRatealeDao().GetByEsercizio(esercizio);
                    if (pianoRateale == null)
                        pianoRateale = new PianoRateale(esercizio, tipo, logTransazione);
                    else
                        logTransazioneDettaglio = logTransazione;
                }

                if(pianoRateale.LogTransazione == null || pianoRateale.LogTransazione.Identificativo != logTransazione.Identificativo)
                    logTransazioneDettaglio = logTransazione;

                var pianoDettaglio = new PianoRatealeDettaglio(pianoRateale, rata.DataScadenza, null, pianoRateale.Rate.Count + 1, false, logTransazioneDettaglio);
                dettagliPianoRateale.Add(rata.DataScadenza, pianoDettaglio);

                var descrizione = "Rata manuale del ";
                if (rateAcconto)
                    descrizione = "Rata di acconto del ";
                pianoDettaglio.Descrizione = descrizione + rata.DataScadenza.ToShortDateString();
                pianoDettaglio.IsAcconto = rateAcconto;
                return pianoDettaglio;
            }

            return null;
        }