Exemplo n.º 1
0
        /// <summary>
        /// Crea una rata di pagamento condomino valida.
        /// </summary>
        public RataSoggetto(PianoRatealeDettaglio pianoRatealeDettaglio, SoggettoCondominio soggetto, DateTime dataScadenza, decimal importo, LogTransazione logTransazione)
        {
            PianoRatealeDettaglio = pianoRatealeDettaglio;
            Esercizio = PianoRatealeDettaglio.PianoRatealeRiferimento.Esercizio;
            Soggetto = soggetto;
            DataScadenza = dataScadenza;
            Importo = importo;
            _stato = StatoRataEnum.Inserita;

            if (Soggetto != null)
                Soggetto.Rate.Add(this);

            if (PianoRatealeDettaglio != null)
                PianoRatealeDettaglio.RateSoggetti.Add(this);

            LogTransazione = logTransazione;
            if (LogTransazione != null)
                LogTransazione.Rate.Add(this);

        }
Exemplo n.º 2
0
 private void deleteImpostazioniReportDettaglioPiano(PianoRatealeDettaglio dettaglio)
 {
     var impostazioniDettaglioReport = _daoFactory.GetImpostazioniReportDettaglioDao().GetByDettaglioPiano(dettaglio.ID);
     foreach (var impostazioniReportDettaglio in impostazioniDettaglioReport)
         _daoFactory.GetImpostazioniReportDettaglioDao().Delete(impostazioniReportDettaglio);
 }
Exemplo n.º 3
0
        private DettaglioEmissioneRateDTO ToEmissioneDTO(SoggettoCondominio soggetto, PianoRatealeDettaglio pianoRatealeDettaglio, decimal importo)
        {
            var dettaglio = new DettaglioEmissioneRateDTO
            {
                DataScadenza = pianoRatealeDettaglio.DataScadenza,
                DescrizioneSoggettoCondominio = soggetto.DisplayName,
                VersamentoMav = soggetto.VersamentoMav,
                IdEsercizio = pianoRatealeDettaglio.PianoRatealeRiferimento.Esercizio.ID,
                IdSoggettoCondominio = soggetto.ID,
                Importo = importo,
                IdUnitaImmobiliare = soggetto.UnitaImmobiliare.ID,
                DescrizioneUnitaImmobiliare = soggetto.UnitaImmobiliare.Descrizione,
                TipoUnitaImmobiliare = soggetto.UnitaImmobiliare.TipoUnitaImmobiliare.Descrizione,
                Rate = new List<DettaglioRataEmissioneRateDTO>(),
            };

            return dettaglio;
        }
Exemplo n.º 4
0
        public string CopiaRate(IList<PianoRatealeDettaglioDTO> dettaglioRate, int idEsercizio, TipoAccorpamentoRateEnum tipoAccorpamento, LogTransazione logTransazione)
        {
            try
            {
                var message = string.Empty;
                LogTransazione logTransazioneDettaglio = null;

                var esercizio = _daoFactory.GetEsercizioDao().GetById(idEsercizio, false);
                PianoRateale pianoRateale;
                if (GetPianoRatealeByEsercizio(idEsercizio) != null)
                {
                    pianoRateale = GetPianoRatealeByEsercizio(idEsercizio);
                    logTransazioneDettaglio = logTransazione;
                }
                else 
                    pianoRateale = new PianoRateale(esercizio, tipoAccorpamento, logTransazione);

                int progressivo = 0;
                if(pianoRateale.Rate.Count > 0)
                    progressivo = pianoRateale.Rate.Max(item => item.Progressivo);

                foreach (var dettaglioDto in dettaglioRate)
                {
                    progressivo++;
                    var dettaglio = _daoFactory.GetPianoRatealeDettaglioDao().GetById(dettaglioDto.ID, false);

                    var dettaglioNew = new PianoRatealeDettaglio(pianoRateale, dettaglioDto.DataScadenza, null, progressivo, false, logTransazioneDettaglio)
                    {
                        Descrizione = dettaglioDto.Descrizione,
                        IsAcconto = dettaglioDto.IsAcconto
                    };

                    foreach (var rata in dettaglio.RateSoggetti.Where(item => !item.DaRichiamare))
                    {
                        var rataNew = new RataSoggetto(esercizio, _soggettoService.GetSoggettoAttuale(rata.Soggetto, esercizio, esercizio.DataApertura.GetValueOrDefault()), dettaglioDto.DataScadenza, rata.Importo, null) {PianoRatealeDettaglio = dettaglioNew};
                        dettaglioNew.RateSoggetti.Add(rataNew);
                    }

                }

                return message;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella copia delle rate - {0} - esercizio:{1}", ex, Utility.GetMethodDescription(), idEsercizio);
                throw;
            }
        }
Exemplo n.º 5
0
        public string CreazioneRateFuoriPreventivo(Esercizio esercizio, Dictionary<DateTime, Dictionary<int, RataSoggettoDTO>> listaRate, bool daSubentro, string descrizione, LogTransazione logTransazione)
        {
            var message = string.Empty;

            var pianoCorrente = _daoFactory.GetPianoRatealeDao().GetByEsercizio(esercizio);
            if (pianoCorrente == null)
            {
                pianoCorrente = new PianoRateale(esercizio, TipoAccorpamentoRateEnum.Nessuno, logTransazione);
                _daoFactory.GetPianoRatealeDao().SaveOrUpdate(pianoCorrente);
            }

            foreach (var kvp in listaRate)
            {
                LogTransazione logTransazioneDettaglio = null;
                if (pianoCorrente.ID > 0)
                    logTransazioneDettaglio = logTransazione;

                var dettaglio = new PianoRatealeDettaglio(pianoCorrente, kvp.Key, null, 0, daSubentro, logTransazioneDettaglio) { Importo = kvp.Value.Sum(rata => rata.Value.Importo) };
                if (pianoCorrente.ID == 0)
                    dettaglio.IsAcconto = true;

                if (!string.IsNullOrEmpty(descrizione) && descrizione.Length > 50)
                    descrizione = descrizione.Substring(0, 50);
                dettaglio.Descrizione = descrizione;
                _daoFactory.GetPianoRatealeDettaglioDao().SaveOrUpdate(dettaglio);
                var progressivo = 0;
                foreach (var kvpDett in kvp.Value)
                {
                    progressivo++;
                    var rata = new RataSoggetto(dettaglio, _daoFactory.GetSoggettoCondominioDao().GetById(kvpDett.Value.IdSoggettoCondominio, false), kvp.Key, kvpDett.Value.Importo.GetValueOrDefault(), logTransazione) { Progressivo = progressivo };
                    _daoFactory.GetRataSoggettoDao().SaveOrUpdate(rata);
                }
            }

            return message;
        }
Exemplo n.º 6
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;
        }
Exemplo n.º 7
0
        public void SalvaPianoRateale(PianoRatealeSoggetti pianoRatealeSoggetti, LogTransazione logTransazione)
        {
                       
/* Vecchio Codice per rimozione rendiconti

            // --------------------------------------------------
            //  Rimozione rendiconti preesistenti
            // --------------------------------------------------
            Esercizio esercizio =_daoFactory.GetEsercizioDao().GetById(pianoRatealeSoggetti.PianoRateale.IdEsercizio, false);
            foreach (RendicontoAnnuale rendiconto in esercizio.Rendiconti)
            {
                foreach (PianoRateale piano in rendiconto.PianiRateali)
                {
                   _daoFactory.GetPianoRatealeDao().Delete(piano);
                    piano.Rendiconto = null;
                    foreach (PianoRatealeDettaglio dettaglio in piano.Rate)
                        dettaglio.PianoRatealeRiferimento = null;
                }
                rendiconto.PianiRateali.Clear();
            }

            //List<RataSoggetto> rate = new List<RataSoggetto>(esercizio.Rate.Count);
            foreach (RataSoggetto rata in esercizio.Rate)
            {
                rata.Soggetto.Rate.Clear();
                if (rata.PianoRatealeDettaglio != null)
                {
                    rata.PianoRatealeDettaglio.RateSoggetti.Remove(rata);
                    rata.PianoRatealeDettaglio = null;
                    rata.Soggetto.Rate.Clear();
                    rata.Soggetto = null;
                }
               _daoFactory.GetRataSoggettoDao().Delete(rata);
                rate.Add(rata);
            }
            esercizio.Rate.Clear();
            foreach (RataSoggetto rata in rate)
            {
                esercizio.Rate.Remove(rata);
                rata.Esercizio = null;
            } 
 */
            try
            {

                // ====================================================================================================
                //  Rimozione piani rateali preesistenti (solo se non è una rata di acconto)
                // ====================================================================================================
                var esercizio = _daoFactory.GetEsercizioDao().Find(pianoRatealeSoggetti.PianoRateale.IdEsercizio, false);

                // leggo ora le rate da richiamare per evitare successivi problemi di cascade
                var rateDaRichiamare = _daoFactory.GetRataSoggettoDao().GetDaRichiamareByEsercizio(esercizio);
                var pianiEliminati = new List<PianoRateale>();

                if (esercizio != null)
                {
                    // ----------------------------------------------------------------------
                    //  Rimozione piani da rendiconti
                    // ----------------------------------------------------------------------
                    try
                    {
                        foreach (var rendiconto in esercizio.Rendiconti)
                        {
                            var pianiDaRimuovere = rendiconto.PianiRateali.ToList();
                            foreach (var piano in pianiDaRimuovere)
                            {
                                try
                                {
                                    var listaDettaglioRate = piano.Rate.ToList();
                                    foreach (var dettaglioPiano in listaDettaglioRate)
                                    {
                                        try
                                        {
                                            if (!dettaglioPiano.IsAcconto)
                                            {
                                                // Elimino impostazioni report dettaglio
                                                deleteImpostazioniReportDettaglioPiano(dettaglioPiano);

                                                piano.Rate.Remove(dettaglioPiano);
                                                dettaglioPiano.PianoRatealeRiferimento = null;

                                                if (dettaglioPiano.LogTransazione != null)
                                                {
                                                    dettaglioPiano.LogTransazione.PianoRateale.Remove(piano);
                                                    dettaglioPiano.LogTransazione = null;
                                                }
                                            }

                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato durante la rimozione dei piani rateali precedenti - SINGOLO DETTAGLIO PIANO - {0} - dettaglio piano:{1}", ex, Utility.GetMethodDescription(), dettaglioPiano.ID);
                                            throw;
                                        }
                                    }

                                }
                                catch (Exception ex)
                                {
                                    _log.ErrorFormat("Errore inaspettato durante la rimozione dei piani rateali precedenti - SINGOlO PIANO - {0} - piano:{1}", ex, Utility.GetMethodDescription(), piano.ID);
                                    throw;
                                }

                                if (piano.Rate.Count == 0)
                                {
                                    pianiEliminati.Add(piano);
                                    rendiconto.PianiRateali.Remove(piano);
                                    piano.Rendiconto = null;

                                    if (piano.LogTransazione != null)
                                    {
                                        piano.LogTransazione.PianoRateale.Remove(piano);
                                        piano.LogTransazione = null;
                                    }
                                }
                            }
                        }

                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante la rimozione dei piani rateali precedenti - RIMOZIONE PIANI RATEALI DA RENDICONTI - {0} - esercizio:{1}", ex, Utility.GetMethodDescription(), esercizio.ID);
                        throw;
                    }

                    // ----------------------------------------------------------------------
                    //  Rimozione singole rate
                    // ----------------------------------------------------------------------
                    var rateToDelete = new List<PianoRatealeDettaglio>();
                    var ratePresenti = esercizio.Rate.ToList();
                    ratePresenti.AddRange(rateDaRichiamare);
                    try
                    {
                        foreach (var rata in ratePresenti)
                        {
                            try
                            {
                                if (rata.PianoRatealeDettaglio != null && !rata.PianoRatealeDettaglio.IsAcconto)
                                {
                                    if (!rateToDelete.Contains(rata.PianoRatealeDettaglio))
                                        rateToDelete.Add(rata.PianoRatealeDettaglio);

                                    rata.Esercizio?.Rate.Remove(rata);
                                    rata.PianoRatealeDettaglio.RateSoggetti.Remove(rata);
                                    rata.Esercizio = null;
                                    rata.PianoRatealeDettaglio = null;
                                    
                                    if (rata.Soggetto != null)
                                    {
                                        rata.Soggetto.Rate.Remove(rata);
                                        rata.Soggetto = null;
                                    }

                                    if (rata.SoggettoEmissione != null)
                                    {
                                        rata.SoggettoEmissione.Rate.Remove(rata);
                                        rata.SoggettoEmissione = null;
                                    }

                                    if (rata.LogTransazione != null)
                                    {
                                        rata.LogTransazione.Rate.Remove(rata);
                                        rata.LogTransazione = null;
                                    }

                                    //_daoFactory.GetRataSoggettoDao().Delete(rata);
                                }
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore inaspettato durante il salvataggio del piano rateale - SINGOlA RATA - {0} - rata:{1}", ex, Utility.GetMethodDescription(), rata.ID);
                                throw;

                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante la rimozione dei piani rateali precedenti - RIMOZIONE SINGOLE RATE SOGGETTI - {0} - rataesercizio:{1}", ex, Utility.GetMethodDescription(), esercizio.ID);
                        throw;
                    }

                    // ----------------------------------------------------------------------
                    //  Rimozione singoli dettaglio rate
                    // ----------------------------------------------------------------------
                    try
                    {
                        foreach (var dettaglio in rateToDelete)
                        {
                            try
                            {
                                if (dettaglio.PianoRatealeRiferimento != null)
                                {
                                    dettaglio.PianoRatealeRiferimento.Rate.Remove(dettaglio);
                                    dettaglio.PianoRatealeRiferimento = null;
                                }
                                dettaglio.RateSoggetti.Clear();
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore inaspettato durante la rimozione dei piani rateali precedenti - SINGOLO DETTAGLIO - {0} - dettaglio:{1}", ex, Utility.GetMethodDescription(), dettaglio.ID);
                                throw;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante la rimozione dei piani rateali precedenti - RIMOZIONE DETTAGLI - {0} - esercizio:{1}", ex, Utility.GetMethodDescription(), esercizio.ID);
                        throw;
                    }

                    // ====================================================================================================
                    //  Creazione nuovo piano rateale
                    // ====================================================================================================

                    // ----------------------------------------------------------------------
                    //  Oggetto PianoRateale
                    // ----------------------------------------------------------------------
                    LogTransazione logTransazioneDettaglio = null;
                    PianoRateale pianoRateale = null;
                    try
                    {
                        // Non devo considerare piani rateali eliminati nelle elaborazioni precedenti
                        if (pianiEliminati.All(item => item.ID != pianoRatealeSoggetti.PianoRateale.ID))
                            pianoRateale = _daoFactory.GetPianoRatealeDao().Find(pianoRatealeSoggetti.PianoRateale.ID, false);
                        if (pianoRateale == null)
                        {
                            pianoRateale = new PianoRateale(_daoFactory.GetRendicontoAnnualeDao().GetById(pianoRatealeSoggetti.PianoRateale.IdRendiconto.GetValueOrDefault(), false), pianoRatealeSoggetti.PianoRateale.Tipo, logTransazione);
                        }
                        else
                        {
                            pianoRateale.Rendiconto = _daoFactory.GetRendicontoAnnualeDao().GetById(pianoRatealeSoggetti.PianoRateale.IdRendiconto.GetValueOrDefault(), false);
                            logTransazioneDettaglio = logTransazione;
                        }

                        pianoRateale.Tipo = pianoRatealeSoggetti.PianoRateale.Tipo;
                        pianoRateale.ArrotondamentoImporti = pianoRatealeSoggetti.PianoRateale.ArrontondamentoImporti;

                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante il salvataggio del piano rateale - CREAZIONE O AGGIORNAMENTO OGGETTO PianoRateale - {0} - esercizio:{1}", ex, Utility.GetMethodDescription(), esercizio.ID);
                        throw;
                    }

                    // ----------------------------------------------------------------------
                    //  Dettagli del piano rateale
                    // ----------------------------------------------------------------------
                    try
                    {
                        foreach (var dettaglioDto in pianoRatealeSoggetti.PianoRateale.Rate)
                        {
                            if (dettaglioDto.ID == 0)
                            {
                                try
                                {
                                    if (Conversione.IsSqlSmallDateTime(dettaglioDto.DataScadenza))
                                    {
                                        var dettaglio = new PianoRatealeDettaglio(pianoRateale, dettaglioDto.DataScadenza, dettaglioDto.PercentualeRiparto, dettaglioDto.Progressivo, false, logTransazioneDettaglio)
                                        {
                                            Descrizione = dettaglioDto.Descrizione,
                                            Importo = dettaglioDto.Importo,
                                            PercentualeSaldoEsercizioPrecedente = dettaglioDto.PercentualeRipartoSaldo
                                        };
                                    }
                                    else
                                    {
                                        _log.ErrorFormat("Tentativo di salvare rata con data di scadenza errata - {0} - data:{1} - esercizio:{2}", Utility.GetMethodDescription(), dettaglioDto.DataScadenza, esercizio.ID);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    _log.ErrorFormat("Errore inaspettato durante il salvataggio del piano rateale - SINGOLO DETTAGLIO DTO - {0} - dettaglio:{1} - esercizio:{2} ", ex, Utility.GetMethodDescription(), dettaglioDto.ID, esercizio.ID);
                                    throw;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante il salvataggio del piano rateale - ELABORAZIONE DETTAGLI - {0} - esercizio:{1} ", ex, Utility.GetMethodDescription(), esercizio.ID);
                        throw;
                    }

                    // ----------------------------------------------------------------------
                    //  Singole rate
                    // ----------------------------------------------------------------------
                    try
                    {
                        foreach (var rataSoggettoDto in pianoRatealeSoggetti.RateSoggetti)
                        {
                            try
                            {
                                if (rataSoggettoDto.ID == 0)
                                {
                                    var rata = new RataSoggetto(pianoRateale.Esercizio, _daoFactory.GetSoggettoCondominioDao().GetById(rataSoggettoDto.IdSoggettoCondominio, false), rataSoggettoDto.DataScadenza.GetValueOrDefault(), rataSoggettoDto.Importo.GetValueOrDefault(), null) { Progressivo = rataSoggettoDto.Progressivo };
                                    if (rataSoggettoDto.Progressivo > 0)
                                    {
                                        PianoRatealeDettaglio dettaglio = null;
                                        var dto = rataSoggettoDto;
                                        var dettagli = (pianoRateale.Rate.Where(dett => dett.Progressivo == dto.Progressivo)).ToList();

                                        if (dettagli.Any())
                                        {
                                            if (dettagli.Count > 1)
                                                _log.DebugFormat("Trovata più di una rata con lo stesso progressivo - SINGOLO SOGGETTO - Valorizzazione progressivo - {0} - rata:{1} - soggetto:{2} - esercizio:{3}", Utility.GetMethodDescription(), rataSoggettoDto.ID, rataSoggettoDto.IdSoggettoCondominio, esercizio.ID);
                                            dettaglio = dettagli.First();
                                        }

                                        if (dettaglio == null)
                                        {
                                            _log.ErrorFormat("Non trovata la rata di dettaglio - Valorizzazione progressivo - {0} - rata:{1} - soggetto:{2} - esercizio:{3}", Utility.GetMethodDescription(), rataSoggettoDto.ID, rataSoggettoDto.IdSoggettoCondominio, esercizio.ID);
                                        }
                                        else
                                            dettaglio.RateSoggetti.Add(rata);

                                        rata.PianoRatealeDettaglio = dettaglio;
                                    }

                                    if (rata.PianoRatealeDettaglio == null || rata.PianoRatealeDettaglio.ID > 0)
                                        rata.LogTransazione = logTransazione;
                                }
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore inaspettato durante il salvataggio del piano rateale - Valorizzazione progressivo - {0} - rata:{1} - soggetto:{2} - esercizio:{3}", ex, Utility.GetMethodDescription(), rataSoggettoDto.ID, rataSoggettoDto.IdSoggettoCondominio, esercizio.ID);
                                throw;
                            }
                        }

                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante il salvataggio del piano rateale - ELABORAZIONE DETTAGLIO SOGGETTO - {0} - esercizio:{1}", ex, Utility.GetMethodDescription(), esercizio.ID);
                        throw;
                    }

                    var rateArrotondamenti = pianoRateale.Rate.Where(dettaglio => dettaglio.Progressivo == pianoRatealeSoggetti.PianoRateale.IdRataArrotondamenti).ToList();
                    if(rateArrotondamenti.Count > 1)
                        throw new InvalidDataException(string.Format("Errore nel salvataggio del piano rateale.{0}Il valore di progressivo non è corretto.{0}Si prega di contattare l'assistenza.", Environment.NewLine));

                    pianoRateale.RataArrotondamenti = rateArrotondamenti.SingleOrDefault();
                }
                else
                {
                    _log.WarnFormat("Esercizio non trovato nel salvataggio del piano rateale - {0} - esercizio:{1}", Utility.GetMethodDescription(), pianoRatealeSoggetti.PianoRateale.IdEsercizio);
                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante il salvataggio del piano rateale - {0} - pianoRatealeSoggetti:{1}", ex, Utility.GetMethodDescription(), pianoRatealeSoggetti.PianoRateale.ID);
                throw;
            }
        }
Exemplo n.º 8
0
        private VersamentiRate setRataVersamentoDopoChiusura(VersamentoSoggetto versamento, Esercizio esercizio, LogTransazione logTransazione)
        {
            VersamentiRate rataVersamento = null;
            LogTransazione logTransazioneRata = null;
            if (esercizio.Gestione == GestioneEsercizioEnum.Ordinario && esercizio.Stato == StatoEsercizioEnum.Aperto && versamento.TipoVersamentoDopoChiusura == TipoVersamentoDopoChiusuraEnum.RicEsSucc)
            {
                var pianoRatealeDettaglio = _daoFactory.GetPianoRatealeDettaglioDao().GetRataVersamentoDopoChiusura(esercizio);
                if (pianoRatealeDettaglio == null)
                {
                    var pianoRateale = _daoFactory.GetPianoRatealeDao().GetByEsercizio(esercizio);
                    LogTransazione logTransazioneDettaglio = null;
                    if (pianoRateale == null)
                        pianoRateale = new PianoRateale(esercizio, TipoAccorpamentoRateEnum.Nessuno, logTransazione);
                    else
                        logTransazioneDettaglio = logTransazione;
                    pianoRatealeDettaglio = new PianoRatealeDettaglio(pianoRateale, esercizio.DataApertura, null, 0, false, logTransazioneDettaglio)
                    {
                        Descrizione = "Versamenti eseguiti dopo la chiusura",
                        IsAcconto = true,
                        VersamentiDopoChiusura = true
                    };
                }
                else
                    logTransazioneRata = logTransazione;

                var rataSoggetto = new RataSoggetto(pianoRatealeDettaglio, versamento.Soggetto, versamento.Data, versamento.Importo, logTransazioneRata);
                rataVersamento = new VersamentiRate(versamento, rataSoggetto, versamento.Importo);
                rataSoggetto.SetStato();
            }

            return rataVersamento;
        }