Esempio n. 1
0
        public string TrasferimentoSaldiNuovoEsercizio(int idEsercizioNuovo, IBilancioService bilancioService, bool calcoloPerSubentro)
        {
            var result = string.Empty;

            try
            {
                var esercizioNuovo = _daoFactory.GetEsercizioDao().GetById(idEsercizioNuovo, false);

                if (!esercizioNuovo.BloccoSaldi && esercizioNuovo.GetEsercizioPrecedente() != null)
                {
                    // Rimuovo gli eventuali saldi presenti nell'esercizio
                    foreach (var saldo in esercizioNuovo.Saldi)
                    {
                        saldo.Soggetto?.Saldi.Remove(saldo);
                        saldo.Esercizio = null;
                        _daoFactory.GetSaldoSoggettoDao().Delete(saldo);
                    }
                    esercizioNuovo.Saldi.Clear();

                    var saldi = new Dictionary<int, SaldoSoggetto>();
                    var items = bilancioService.GetDataSourceRipartizioneBilancioConsuntivo(esercizioNuovo.GetEsercizioPrecedente().ID, null, null, null, null, null, null, false, false, TipoAccorpamentoRateEnum.Nessuno, false, calcoloPerSubentro, false, false, null);
                    var riparto = items.Where(item => item.IdUnitaImmobiliare > 0 && (item.OrdineConto == 9993 || item.OrdineConto == 9994));

                    var soggettiAttivi = _daoFactory.GetSoggettoCondominioDao().GetAttiviByEsercizio(esercizioNuovo, esercizioNuovo.DataChiusura);
                    
                    foreach (var itemRiparto in riparto)
                    {
                        var importo = itemRiparto.Importo.GetValueOrDefault();

                        SaldoSoggetto saldo;
                        var soggetto = soggettiAttivi.FirstOrDefault(item => item.ID == itemRiparto.IdPartecipante) ??
                                       _soggettoService.GetSoggettoAttuale(_daoFactory.GetSoggettoCondominioDao().GetById(itemRiparto.IdPartecipante, false), esercizioNuovo, esercizioNuovo.DataApertura.GetValueOrDefault());

                        if (saldi.ContainsKey(soggetto.ID))
                        {
                            saldo = saldi[soggetto.ID];
                            saldo.Importo += importo;
                        }
                        else
                        {
                            saldo = new SaldoSoggetto(soggetto, esercizioNuovo, importo);
                            _daoFactory.GetSaldoSoggettoDao().SaveOrUpdate(saldo);
                            saldi.Add(soggetto.ID, saldo);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante il trasferimento saldi a nuovo esercizio - {0} - esercizio: {1}", ex, Library.Utility.GetMethodDescription(), idEsercizioNuovo);
                throw;
            }

            return result;
        }
Esempio n. 2
0
        public TestataMovimentoContabile TrasferimentoSaldiStraordinarioInOrdinario(int idEsercizioStraordinario, int idEsercizioOrdinario, string nomeContoOrdinario, int ordineConto, IBilancioService bilancioService, DateTime? dataChiusura, bool chiusuraTemporanea)
        {
            try
            {
                var esercizioStraordinario = _daoFactory.GetEsercizioDao().GetById(idEsercizioStraordinario, false);
                var esercizioOrdinario = _daoFactory.GetEsercizioDao().GetById(idEsercizioOrdinario, false);
                if (!chiusuraTemporanea)
                {
                    var messagesDataRegistrazione = _movimentiContabiliService.IsAllowDataRegistrazione(new List<int> {esercizioStraordinario.CondominioRiferimento.ID}, esercizioOrdinario, dataChiusura.GetValueOrDefault());
                    if (messagesDataRegistrazione.Count > 0)
                    {
                        var messageDataRegistrazione = messagesDataRegistrazione.Aggregate(string.Empty, (current, mess) => current + (mess + Environment.NewLine));
                        var ex = new InvalidDataException($"La data di registrazione {dataChiusura.GetValueOrDefault()} non è valida" + Environment.NewLine + messageDataRegistrazione);
                        _log.Fatal(ex.Message, ex);
                        throw ex;
                    }

                    var contoOrdinario = new Conto(esercizioOrdinario.CondominioRiferimento, TipoContoEconomicoEnum.Economico, TipoPeriodoCompetenzaContabile.Esercizio, nomeContoOrdinario, false, false, false)
                    {
                        PresenteBilancio = true,
                        CustomField = false,
                        EsercizioRiferimento = esercizioOrdinario,
                        Ordine = ordineConto,
                        Codice = ordineConto.ToString(CultureInfo.InvariantCulture).PadLeft(3, '0'),
                        PercentualeProprieta = 1,
                        IsSpesePersonali = true,
                        TrasferimentoSaldiStraordinario = true
                    };

                    var contoArrotondamenti = _pianoContiService.GetContoArrotondamenti(esercizioOrdinario);
                    _daoFactory.GetContoDao().SaveOrUpdate(contoArrotondamenti);

                    var sottocontoOrdinario = new SottoConto(contoOrdinario, nomeContoOrdinario);

                    esercizioStraordinario.ContoEconomicoOrdinarioChiusuraStraordinario = contoOrdinario;

                    var items = bilancioService.GetDataSourceRipartizioneBilancioConsuntivo(esercizioStraordinario.ID, null, null, null, null, null, null, false, false, TipoAccorpamentoRateEnum.Nessuno, false, false, false, false, null).ToList();
                    var ripartoEconomici = items.Where(item => item.OrdineConto < 9900).ToList();

                    var testata = new TestataMovimentoContabile(esercizioOrdinario, dataChiusura, TipoTestataMovimentoContabileEnum.Automatica, null);
                    _daoFactory.GetTestataMovimentoContabileDao().SaveOrUpdate(testata);

                    esercizioStraordinario.TestataContabileChiusura = testata;
                    var causale = _daoFactory.GetCausaleContabileDao().GetByCodice("ST");

                    // ===========================================================================
                    // Movimenti Chiusura/Apertura conti economici
                    // ---------------------------------------------------------------------------
                    // Chiusura di tutti i conti economici della gestione starordianaria (in avere), 
                    // aprendo un conto economico "<CONTO ECONOMICO SALDI STRAORDINARIA>" nella gestione ordinaria (in dare), per il totale della spesa. 
                    // La spesa deve essere ripartita sulla base dei conti utilizzati nella gestione straordinaria.  
                    // I conti devono essere addebitati per soggetto.
                    // ===========================================================================
                    var numeroRiga = 0;
                    foreach (var itemRiparto in ripartoEconomici)
                    {
                        // Gli arrotondamenti hanno IdPartecipante == 0, queste righe devono essere usate per registrare i movimenti di arrotondamento.
                        if (itemRiparto.IdPartecipante > 0)
                        {
                            var importo = itemRiparto.Importo.GetValueOrDefault();
                            if (importo != 0)
                            {
                                try
                                {
                                    var soggetto = _daoFactory.GetSoggettoCondominioDao().GetById(itemRiparto.IdPartecipante, false);

                                    // ---------------------------------------------
                                    // Apertura conto economico nell'ordinario
                                    // ---------------------------------------------
                                    numeroRiga++;
                                    var movimentoAperturaOrdinario = new MovimentoContabile(testata, causale, 1, contoOrdinario, numeroRiga, "D")
                                    {
                                        Descrizione = $"Saldo Gestione Straordinaria '{esercizioStraordinario.Descrizione}' - {soggetto.DisplayName}",
                                        CondominoRiferimento = soggetto,
                                        SottoContoRiferimento = sottocontoOrdinario
                                    };

                                    // Calcolo del segno
                                    var segnoEconomico = "D";
                                    if (importo < 0)
                                    {
                                        segnoEconomico = "A";
                                        importo = importo * -1;
                                    }
                                    movimentoAperturaOrdinario.Segno = segnoEconomico;
                                    movimentoAperturaOrdinario.Importo = importo;

                                    // ---------------------------------------------
                                    // Chiusura conto economico nello straordinario
                                    // ---------------------------------------------
                                    numeroRiga++;
                                    var movimentoChiusuraStraordinario = new MovimentoContabile(testata, causale, numeroRiga, _daoFactory.GetContoDao().GetById(itemRiparto.IdConto, false), importo, invertiSegno(segnoEconomico)) { Descrizione = string.Format("Chiusura conto {0}: '{1}' - {2}", itemRiparto.DescrizioneConto, esercizioStraordinario.Descrizione, soggetto.DisplayName), CondominoRiferimento = movimentoAperturaOrdinario.CondominoRiferimento };

                                    // ---------------------------------------------
                                    // Dettaglio spesa unità
                                    // ---------------------------------------------
                                    var spesaUnita = new SpeseUnita(itemRiparto.Importo, null, soggetto, movimentoAperturaOrdinario);
                                }
                                catch (Exception ex)
                                {
                                    _log.ErrorFormat("Errore inaspettato durante il trasferimento saldi dell'esercizio straordinario all'ordinario - MOVIMENTO CONTO ECONOMICO - {0} - importo:{1} - idEsercizioStraordinario:{2} - idEsercizioOrdinario:{3} - nomeContoOrdinario:{4} - ordineConto:{5}", ex, Library.Utility.GetMethodDescription(), importo, idEsercizioStraordinario, idEsercizioOrdinario, nomeContoOrdinario, ordineConto);
                                    throw;
                                }
                            }
                        }
                        else
                        {
                            // ---------------------------------------------
                            // Apertura conto economico nell'ordinario
                            // ---------------------------------------------
                            var importo = itemRiparto.Importo;
                            numeroRiga++;
                            var movimentoAperturaOrdinario = new MovimentoContabile(testata, causale, 1, contoArrotondamenti, numeroRiga, "D") { Descrizione = $"Saldo Gestione Straordinaria '{esercizioStraordinario.Descrizione}'" };

                            // Calcolo del segno
                            var segnoEconomico = "D";
                            if (importo < 0)
                            {
                                segnoEconomico = "A";
                                importo = importo * -1;
                            }
                            movimentoAperturaOrdinario.Segno = segnoEconomico;
                            movimentoAperturaOrdinario.Importo = importo;

                            // ---------------------------------------------
                            // Chiusura conto economico nello straordinario
                            // ---------------------------------------------
                            numeroRiga++;
                            var movimentoChiusuraStraordinario = new MovimentoContabile(testata, causale, numeroRiga, _daoFactory.GetContoDao().GetById(itemRiparto.IdConto, false), importo, invertiSegno(segnoEconomico)) { Descrizione = $"Arrondamento chiusura conto {itemRiparto.DescrizioneConto}: '{esercizioStraordinario.Descrizione}'"
                            };
                        }
                    }

                    // ===========================================================================
                    // Movimenti Chiusura/Apertura crediti v/condomini gestione straordinaria
                    // ---------------------------------------------------------------------------
                    // Chiusura del conto Crediti v/condomini della "<GESTIONE STRAORDINARIA>" 
                    // per i versamenti effettuati nella gestione straordinaria, sul conto "<CONTO ECONOMICO SALDI STRAORDINARIA>", 
                    // accreditando i singoli soggetti.
                    // ===========================================================================
                    var ripartoVersamenti = items.Where(item => item.OrdineConto == 9992).ToList();

                    // Aggiungo soggetti con saldo inziale ma senza versamenti
                    var saldiIniziali = items.Where(item => item.OrdineConto == 9991).ToList();
                    var ripartoSaldiIniziali = new List<ReportRipartizioneBilancioDTO>(saldiIniziali.Count);
                    foreach (var reportRipartizioneBilancioDTO in saldiIniziali)
                    {
                        if (ripartoVersamenti.All(item => item.IdPartecipante != reportRipartizioneBilancioDTO.IdPartecipante))
                        {
                            reportRipartizioneBilancioDTO.Importo = reportRipartizioneBilancioDTO.Importo.GetValueOrDefault()*-1;
                            ripartoVersamenti.Add(reportRipartizioneBilancioDTO);
                        }
                        else
                            ripartoSaldiIniziali.Add(reportRipartizioneBilancioDTO);
                    }

                    var contoVersamentiEsercizioStraordinario = _daoFactory.GetContoDao().GetByCodice(esercizioStraordinario.ID, esercizioStraordinario.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoVersamentiCondomini());

                    foreach (var itemRiparto in ripartoVersamenti)
                    {
                        var importo = itemRiparto.Importo.GetValueOrDefault();

                        // aggiungo eventuale saldo iniziale
                        var itemSaldoIniziale = ripartoSaldiIniziali.FirstOrDefault(item => item.IdPartecipante == itemRiparto.IdPartecipante);
                        var importoSaldoIniziale = 0m;
                        if (itemSaldoIniziale != null)
                            importoSaldoIniziale = itemSaldoIniziale.Importo.GetValueOrDefault();
                        importo -= importoSaldoIniziale;

                        try
                        {
                            // Gli arrotondamenti hanno IdPartecipante == 0, escludo queste righe.
                            if (itemRiparto.IdPartecipante > 0)
                            {
                                var soggetto = _daoFactory.GetSoggettoCondominioDao().GetById(itemRiparto.IdPartecipante, false);

                                // ---------------------------------------------
                                // Apetura conto economico nell'ordinario
                                // ---------------------------------------------
                                numeroRiga++;
                                var movimentoAperturaOrdinario = new MovimentoContabile(testata, causale, numeroRiga, contoOrdinario, 0, "D")
                                {
                                    Descrizione = $"Saldo Gestione Straordinaria '{esercizioStraordinario.Descrizione}' - {soggetto.DisplayName}",
                                    CondominoRiferimento = soggetto,
                                    SottoContoRiferimento = sottocontoOrdinario
                                };

                                // Calcolo del segno
                                var segnoEconomico = "A";
                                if (importo < 0)
                                {
                                    segnoEconomico = "D";
                                    importo = importo * -1;
                                }
                                movimentoAperturaOrdinario.Segno = segnoEconomico;
                                movimentoAperturaOrdinario.Importo = importo;

                                // ---------------------------------------------
                                // Chiusura conto crediti v/condomini nello straordinario
                                // ---------------------------------------------
                                numeroRiga++;
                                var movimentoChiusuraStraordinario = new MovimentoContabile(testata, causale, numeroRiga, contoVersamentiEsercizioStraordinario, importo, invertiSegno(segnoEconomico)) { Descrizione = string.Format("Chiusura conto {0}: '{1}' - {2}", contoVersamentiEsercizioStraordinario.Descrizione, esercizioStraordinario.Descrizione, soggetto.DisplayName), CondominoRiferimento = movimentoAperturaOrdinario.CondominoRiferimento };

                                // ---------------------------------------------
                                // Dettaglio spesa unità
                                // ---------------------------------------------
                                var spesaUnita = new SpeseUnita((itemRiparto.Importo.GetValueOrDefault() - importoSaldoIniziale) * -1, null, soggetto, movimentoAperturaOrdinario);
                            }
                        }
                        catch (Exception ex)
                        {
                            _log.FatalFormat("Errore inaspettato durante il trasferimento saldi dell'esercizio straordinario all'ordinario - MOVIMENTO VERSAMENTI - {0} - importo:{1} - idEsercizioStraordinario:{2} - idEsercizioOrdinario:{3} - nomeContoOrdinario:{4} - ordineConto:{5}", ex, Library.Utility.GetMethodDescription(), importo, idEsercizioStraordinario, idEsercizioOrdinario, nomeContoOrdinario, ordineConto);
                            throw;
                        }
                    }

                    return testata;
                }
                else
                {
                    // ====================================================================
                    //  Chiusura temporanea dei conti
                    // ====================================================================
                    var movimentiEconomici = _daoFactory.GetMovimentoContabileDao().GetByEsercizioEconomici(esercizioStraordinario, esercizioOrdinario.DataApertura, esercizioOrdinario.DataChiusura);
                    var contoPatrimoniale = _pianoContiService.GetContoChiusuraStraordinario(esercizioStraordinario);
                    var testataChiusura = new TestataMovimentoContabile(esercizioStraordinario, dataChiusura, TipoTestataMovimentoContabileEnum.Automatica, null)
                    {
                        EsercizioOrdinarioChiusura = esercizioOrdinario,
                        Descrizione = $"Chiusura esercizio straordinario: '{esercizioStraordinario.DisplayName}' per chiusura dell'ordinario: '{esercizioOrdinario.DisplayName}'"
                    };

                    var causaleChiusura = _daoFactory.GetCausaleContabileDao().GetByCodice("C2");
                    var index = 0;

                    // =================================================
                    // Calcolo tutti i saldi dei conti
                    // =================================================
                    var saldiContoSottoconto = new Dictionary<string, MovimentoContabile>();
                    foreach (var movimentoContabile in movimentiEconomici)
                    {
                        var key = _movimentiContabiliService.GetKeyContoSottoconto(movimentoContabile);
                        if (saldiContoSottoconto.ContainsKey(key))
                        {
                            var movimentoChiusura = saldiContoSottoconto[key];
                            movimentoChiusura.Importo += movimentoContabile.GetImportoConSegno();
                        }
                        else
                        {
                            index++;
                            var movimentoChiusura = new MovimentoContabile(testataChiusura, causaleChiusura, index, movimentoContabile.ContoRiferimento, movimentoContabile.GetImportoConSegno(), string.Empty)
                            {
                                Descrizione = $"Chiusura esercizio straordinario: '{esercizioStraordinario.DisplayName}' per chiusura dell'ordinario: '{esercizioOrdinario.DisplayName}'",
                                CondominoRiferimento = movimentoContabile.CondominoRiferimento,
                                FornitoreRiferimento = movimentoContabile.FornitoreRiferimento,
                                ContoCorrenteBancario = movimentoContabile.ContoCorrenteBancario
                            };

                            saldiContoSottoconto.Add(key, movimentoChiusura);
                        }
                    }

                    // =================================================
                    // Elaboro i segni e creo le contropartite
                    // =================================================
                    foreach (var kvp in saldiContoSottoconto)
                    {
                        var movimentoContabile = kvp.Value;
                        if (movimentoContabile.ContoRiferimento.Tipo == TipoContoEconomicoEnum.Economico)
                        {
                            movimentoContabile.Segno = "A";
                            if (movimentoContabile.Importo < 0)
                            {
                                movimentoContabile.Segno = "D";
                                movimentoContabile.Importo = movimentoContabile.Importo*-1;
                            }
                        }
                        else if (movimentoContabile.ContoRiferimento.Tipo == TipoContoEconomicoEnum.Patrimoniale)
                        {
                            movimentoContabile.Segno = "D";
                            if (movimentoContabile.Importo < 0)
                            {
                                movimentoContabile.Segno = "A";
                                movimentoContabile.Importo = movimentoContabile.Importo * -1;
                            }
                        }

                        var movimentoPatrimoniale = new MovimentoContabile(testataChiusura, causaleChiusura, index, contoPatrimoniale, movimentoContabile.Importo, invertiSegno(movimentoContabile.Segno))
                        {
                            Descrizione = $"Chiusura conto '{kvp.Value.ContoRiferimento.Descrizione}' esercizio straordinario: '{esercizioStraordinario.DisplayName}' per chiusura dell'ordinario: '{esercizioOrdinario.DisplayName}'"
                        };
                    }

                    return testataChiusura;
                }
            }
            catch (Exception ex)
            {
                _log.FatalFormat("Errore inaspettato durante il trasferimento saldi dell'esercizio straordinario all'ordinario - {0} - idEsercizioStraordinario:{1} - idEsercizioOrdinario:{2} - nomeContoOrdinario:{3} - ordineConto:{4} - dataChiusura:{5:d}", ex, Library.Utility.GetMethodDescription(), idEsercizioStraordinario, idEsercizioOrdinario, nomeContoOrdinario, ordineConto, dataChiusura.GetValueOrDefault());
                throw;
            }
        }
Esempio n. 3
0
        public TestataMovimentoContabile TrasferimentoSaldiStraordinarioInStraordinario(Esercizio esercizioStraordinario, Esercizio esercizioStraordinarioNuovo, Conto contoVersamentiCondomini, IBilancioService bilancioService, DateTime? dataChiusura)
        {
            try
            {
                //var messagesDataRegistrazione = _movimentiContabiliService.IsAllowDataRegistrazione(new List<int> { esercizioStraordinario.CondominioRiferimento.ID }, esercizioStraordinarioNuovo, dataChiusura.GetValueOrDefault());
                //if (messagesDataRegistrazione.Count > 0)
                //{
                //    var messageDataRegistrazione = messagesDataRegistrazione.Aggregate(string.Empty, (current, mess) => current + (mess + Environment.NewLine));
                //    var ex = new InvalidDataException(string.Format("La data di registrazione {0} non è valida", dataChiusura.GetValueOrDefault()) + Environment.NewLine + messageDataRegistrazione);
                //    _log.Fatal(ex.Message, ex);
                //    throw ex;
                //}

                var contoArrotondamenti = _pianoContiService.GetContoArrotondamenti(esercizioStraordinario.AnnoGestionale.EsercizioOrdinario);
                var contoVersamentiEsercizioStraordinario = _daoFactory.GetContoDao().GetByCodice(esercizioStraordinario.ID, esercizioStraordinario.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoVersamentiCondomini());
                var causale = _daoFactory.GetCausaleContabileDao().GetByCodice("ST");
                var soggettiAttivi = _daoFactory.GetSoggettoCondominioDao().GetAttiviByEsercizio(esercizioStraordinarioNuovo, esercizioStraordinarioNuovo.DataChiusura);

                var items = bilancioService.GetDataSourceRipartizioneBilancioConsuntivo(esercizioStraordinario.ID, null, null, null, null, null, null, false, false, TipoAccorpamentoRateEnum.Nessuno, false, false, false, false, null).ToList();
                var ripartoEconomici = items.Where(item => item.OrdineConto < 9900).ToList();

                var testata = new TestataMovimentoContabile(esercizioStraordinarioNuovo, dataChiusura, TipoTestataMovimentoContabileEnum.Automatica, null);

                esercizioStraordinario.TestataContabileChiusura = testata;

                // ===========================================================================
                // Movimenti Chiusura/Apertura conti economici
                // ---------------------------------------------------------------------------
                // Chiusura di tutti i conti economici della gestione starordianaria (in avere), 
                // aprendo un conto economico "<CONTO ECONOMICO SALDI STRAORDINARIA>" nella gestione ordinaria (in dare), per il totale della spesa. 
                // La spesa deve essere ripartita sulla base dei conti utilizzati nella gestione straordinaria.  
                // I conti devono essere addebitati per soggetto.
                // ===========================================================================
                var numeroRiga = 0;
                foreach (var itemRiparto in ripartoEconomici)
                {
                    // Gli arrotondamenti hanno IdPartecipante == 0, queste righe devono essere usate per registrare i movimenti di arrotondamento.
                    if (itemRiparto.IdPartecipante > 0)
                    {
                        var importo = itemRiparto.Importo.GetValueOrDefault();

                        try
                        {
                            var soggetto = _daoFactory.GetSoggettoCondominioDao().GetById(itemRiparto.IdPartecipante, false);

                            // ---------------------------------------------
                            // Contropartita crediti v/condomini nuovo straordinario
                            // ---------------------------------------------
                            numeroRiga++;
                            var movimentoContropartitaVersamenti = new MovimentoContabile(testata, causale, 1, contoVersamentiCondomini, numeroRiga, "D") { Descrizione = $"Saldo Gestione Straordinaria '{esercizioStraordinario.Descrizione}' - {soggetto.DisplayName}", CondominoRiferimento = soggetto };

                            // Calcolo del segno
                            var segnoEconomico = "D";
                            if (importo < 0)
                            {
                                segnoEconomico = "A";
                                importo = importo * -1;
                            }
                            movimentoContropartitaVersamenti.Segno = segnoEconomico;
                            movimentoContropartitaVersamenti.Importo = importo;

                            // ---------------------------------------------
                            // Chiusura conto economico nello straordinario
                            // ---------------------------------------------
                            numeroRiga++;
                            var movimentoChiusuraStraordinario = new MovimentoContabile(testata, causale, numeroRiga, _daoFactory.GetContoDao().GetById(itemRiparto.IdConto, false), importo, invertiSegno(segnoEconomico)) { Descrizione = string.Format("Chiusura conto {0}: '{1}' - {2}", itemRiparto.DescrizioneConto, esercizioStraordinario.Descrizione, soggetto.DisplayName), CondominoRiferimento = movimentoContropartitaVersamenti.CondominoRiferimento };
                        }
                        catch (Exception ex)
                        {
                            _log.FatalFormat("Errore inaspettato durante il trasferimento saldi dell'esercizio straordinario al nuovo straordinario - MOVIMENTO CHIUSURA ECONOMICO - {0} - importo:{1} - esercizio straordinario:{2} - nuovo esercizio straordinario:{3} - contoVersamentiCondomini:{4}", ex, Library.Utility.GetMethodDescription(), importo, esercizioStraordinario.ID, esercizioStraordinarioNuovo.ID, contoVersamentiCondomini.ID);
                            throw;
                        }

                    }
                    else
                    {
                        // ---------------------------------------------
                        // Contropartita Arrotondamento
                        // ---------------------------------------------
                        var importo = itemRiparto.Importo;
                        numeroRiga++;
                        var movimentoContropartitaArrotondamento = new MovimentoContabile(testata, causale, 1, contoArrotondamenti, numeroRiga, "D") { Descrizione = $"Saldo Gestione Straordinaria '{esercizioStraordinario.Descrizione}'"
                        };

                        // Calcolo del segno
                        var segnoEconomico = "D";
                        if (importo < 0)
                        {
                            segnoEconomico = "A";
                            importo = importo * -1;
                        }
                        movimentoContropartitaArrotondamento.Segno = segnoEconomico;
                        movimentoContropartitaArrotondamento.Importo = importo;

                        // ---------------------------------------------
                        // Registrazione Arrotondamento
                        // ---------------------------------------------
                        numeroRiga++;
                        var movimentoArrotondamento = new MovimentoContabile(testata, causale, numeroRiga, _daoFactory.GetContoDao().GetById(itemRiparto.IdConto, false), importo, invertiSegno(segnoEconomico)) { Descrizione = string.Format("Arrondamento chiusura conto {0}: '{1}'", itemRiparto.DescrizioneConto, esercizioStraordinario.Descrizione) };
                    }
                }

                // ===========================================================================
                // Movimenti Chiusura/Apertura crediti v/condomini gestione straordinaria
                // ---------------------------------------------------------------------------
                // Chiusura del conto Crediti v/condomini della "<GESTIONE STRAORDINARIA>" 
                // per i versamenti effettuati nella gestione straordinaria, sul conto "<CONTO ECONOMICO SALDI STRAORDINARIA>", 
                // accreditando i singoli soggetti.
                // ===========================================================================
                var ripartoVersamenti = items.Where(item => item.OrdineConto == 9992).ToList();

                foreach (var itemRiparto in ripartoVersamenti)
                {
                    var importo = itemRiparto.Importo.GetValueOrDefault();

                    try
                    {
                        // Gli arrotondamenti hanno IdPartecipante == 0, escludo queste righe.
                        if (itemRiparto.IdPartecipante > 0)
                        {
                            var soggetto = _daoFactory.GetSoggettoCondominioDao().GetById(itemRiparto.IdPartecipante, false);

                            // ---------------------------------------------
                            // Contropartita crediti v/condomini nuovo straordinario
                            // ---------------------------------------------
                            numeroRiga++;
                            var movimentoContropartitaVersamenti = new MovimentoContabile(testata, causale, numeroRiga, contoVersamentiCondomini, 0, "D") { Descrizione = $"Saldo Gestione Straordinaria '{esercizioStraordinario.Descrizione}' - {soggetto.DisplayName}", CondominoRiferimento = soggetto };

                            // Calcolo del segno
                            var segnoEconomico = "A";
                            if (importo < 0)
                            {
                                segnoEconomico = "D";
                                importo = importo * -1;
                            }
                            movimentoContropartitaVersamenti.Segno = segnoEconomico;
                            movimentoContropartitaVersamenti.Importo = importo;

                            // ---------------------------------------------
                            // Chiusura conto crediti v/condomini nello straordinario
                            // ---------------------------------------------
                            numeroRiga++;
                            var movimentoChiusuraStraordinario = new MovimentoContabile(testata, causale, numeroRiga, contoVersamentiEsercizioStraordinario, importo, invertiSegno(segnoEconomico)) { Descrizione = string.Format("Chiusura conto {0}: '{1}' - {2}", contoVersamentiEsercizioStraordinario.Descrizione, esercizioStraordinario.Descrizione, soggetto.DisplayName), CondominoRiferimento = movimentoContropartitaVersamenti.CondominoRiferimento };
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.FatalFormat("Errore inaspettato durante il trasferimento saldi dell'esercizio straordinario al nuovo straordinario - MOVIMENTO CHIUSURA VERSAMENTI - {0} - importo:{1} - esercizio straordinario:{2} - nuovo esercizio straordinario:{3} - contoVersamentiCondomini:{4}", ex, Library.Utility.GetMethodDescription(), importo, esercizioStraordinario.ID, esercizioStraordinarioNuovo.ID, contoVersamentiCondomini.ID);
                        throw;
                    }
                }

                // ===========================================================================
                // Saldi inizio esercizio
                // ===========================================================================
                // Rimuovo gli eventuali saldi presenti nell'esercizio
                foreach (var saldo in esercizioStraordinarioNuovo.Saldi)
                    saldo.Esercizio = null;
                esercizioStraordinarioNuovo.Saldi.Clear();

                var saldi = new Dictionary<int, SaldoSoggetto>();
                var riparto = items.Where(item => item.IdUnitaImmobiliare > 0 && (item.OrdineConto == 9993 || item.OrdineConto == 9994));

                foreach (var itemRiparto in riparto)
                {
                    var importo = itemRiparto.Importo.GetValueOrDefault();

                    SaldoSoggetto saldo;
                    var soggetto = soggettiAttivi.FirstOrDefault(item => item.ID == itemRiparto.IdPartecipante);
                    if(soggetto == null)
                        throw new InvalidDataException($"Non è possibile completare l'esecuzione perchè non è stato trovato il condomino '{itemRiparto.Nominativo}' per l'unità immobiliare {itemRiparto.OrdineUnitaImmobiliare}.{Environment.NewLine}Verificare che sia stato correttamente eseguito l'eventuale subentro");

                    if (saldi.ContainsKey(soggetto.ID))
                    {
                        saldo = saldi[soggetto.ID];
                        saldo.Importo += importo;
                    }
                    else
                    {
                        saldo = new SaldoSoggetto(soggetto, esercizioStraordinarioNuovo, importo);
                        saldi.Add(soggetto.ID, saldo);
                    }
                }

                return testata;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante il trasferimento saldi dell'esercizio straordinario all nuovo straordinario - {0} - esercizio straordinario:{1} - nuovo esercizio straordinario:{2} - contoVersamentiCondomini:{3} - dataChiusura:{4:d}", ex, Library.Utility.GetMethodDescription(), esercizioStraordinario.ID, esercizioStraordinarioNuovo.ID, contoVersamentiCondomini.ID, dataChiusura.GetValueOrDefault());
                throw;
            }
        }