/// <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; } }
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"); } }
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; } } }
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; }