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; }
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; } }
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; } }