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;
        }
 private void setSaldiInizioEsercizio(DataRow row, IList<SoggettoCondominio> soggetti, TipoSaldi tipoSaldi)
 {
     if (row["U_SALDO_ES_ATT"] != DBNull.Value && tipoSaldi == TipoSaldi.EsercizioAttuale)
     {
         var esercizio = Library.IesiGenericCollections<Esercizio>.GetByIndex(soggetti[0].UnitaImmobiliare.GruppoStabileRiferimento.PalazzinaRiferimento.CondominioRiferimento.Esercizi, 0);
         var saldo = new SaldoSoggetto(soggetti[0], esercizio, Convert.ToDecimal((double)row["U_SALDO_ES_ATT"]) * -1);
         _daoFactory.GetSaldoSoggettoDao().SaveOrUpdate(saldo);
     }
     else if(row["U_SALDO_ES_PRE"] != DBNull.Value && tipoSaldi == TipoSaldi.EsercizioPrecedente)
     {
         var esercizio = Library.IesiGenericCollections<Esercizio>.GetByIndex(soggetti[0].UnitaImmobiliare.GruppoStabileRiferimento.PalazzinaRiferimento.CondominioRiferimento.Esercizi, 0);
         var saldo = new SaldoSoggetto(soggetti[0], esercizio, Convert.ToDecimal((double)row["U_SALDO_ES_PRE"]) * -1);
         _daoFactory.GetSaldoSoggettoDao().SaveOrUpdate(saldo);
     }
 }
 private SaldoSoggettoDTO setDto(SaldoSoggetto item)
 {
     return new SaldoSoggettoDTO
     {
         IdSoggettoCondominio = item.Soggetto.ID,
         NominativoSoggettoCondominio = item.Soggetto.DisplayName,
         IdUnitaImmobiliare = item.Soggetto.UnitaImmobiliare.ID,
         TipoUnitaImmobiliare = item.Soggetto.UnitaImmobiliare.TipoUnitaImmobiliare.Descrizione,
         DescrizioneUnitaImmobiliare = item.Soggetto.UnitaImmobiliare.Descrizione,
         OrdineUnitaImmobiliare = item.Soggetto.UnitaImmobiliare.Ordine.GetValueOrDefault(),
         InternoUnitaImmobiliare = item.Soggetto.UnitaImmobiliare.InternoCompleto,
         Subalterno = item.Soggetto.UnitaImmobiliare.Subalterno,
         IdScala = item.Soggetto.UnitaImmobiliare.GruppoStabileRiferimento.ID,
         DescrizioneScala = item.Soggetto.UnitaImmobiliare.GruppoStabileRiferimento.Descrizione,
         IdStabile = item.Soggetto.UnitaImmobiliare.GruppoStabileRiferimento.PalazzinaRiferimento.ID,
         DescrizioneStabile = item.Soggetto.UnitaImmobiliare.GruppoStabileRiferimento.PalazzinaRiferimento.Descrizione,
         Importo = item.Importo.GetValueOrDefault(),
         IdEsercizio = item.Esercizio.ID,
         ID = item.ID,
         Tipo = item.Soggetto.Tipo.ToString().Substring(0, 1),
         Version = item.Version
     };
 }
 public SaldoSoggettoDTO GetByDomainEntity(SaldoSoggetto item)
 {
     try
     {
         return setDto(item);
     }
     catch (Exception ex)
     {
         if (item != null)
             _log.ErrorFormat("Errore nel caricamento dei saldi di inizio esercizio - {0} - id:{1}", ex, Library.Utility.GetMethodDescription(), item.ID);
         else
             _log.ErrorFormat("Errore nel caricamento dei saldi di inizio esercizio - {0} - Saldo --> null", ex, Library.Utility.GetMethodDescription());
         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;
            }
        }
        public string SalvaSaldiInizioEsercizio(int idEsercizio, List<ImportoSaldoSoggettoDTO> saldi, bool bloccoSaldi)
        {
            var result = string.Empty;

            try
            {
                var esercizio = _daoFactory.GetEsercizioDao().Find(idEsercizio, false);
                if (esercizio != null)
                {
                    if (esercizio.Stato == StatoEsercizioEnum.Chiuso)
                        return "L'esercizio è chiuso non è possibile modificare i saldi";

                    // =====================================================================
                    //  Elimino tutti i saldi di inizio esercizio
                    // =====================================================================
                    var saldiEsercizio = esercizio.Saldi.ToList();
                    foreach (var saldoSoggetto in saldiEsercizio)
                    {
                        saldoSoggetto.Soggetto?.Saldi.Remove(saldoSoggetto);
                        saldoSoggetto.Esercizio?.Saldi.Remove(saldoSoggetto);

                        saldoSoggetto.Soggetto = null;
                        saldoSoggetto.Esercizio = null;
                    }
                    esercizio.Saldi.Clear();

                    // =====================================================================
                    //  Inserisco tutti i saldi di inizio esercizio
                    // =====================================================================
                    foreach (var saldoDto in saldi)
                    {
                        if (saldoDto.IdSoggettoCondominio > 0)
                        {
                            var soggetto = _daoFactory.GetSoggettoCondominioDao().Find(saldoDto.IdSoggettoCondominio, false);
                            if (soggetto != null)
                            {
                                var saldo = new SaldoSoggetto(soggetto, esercizio, saldoDto.Importo);
                                _daoFactory.GetSaldoSoggettoDao().SaveOrUpdate(saldo);
                            }
                        }
                    }

                    esercizio.BloccoSaldi = bloccoSaldi;
                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la gestione dei saldi di inizio esercizio - {0} - esercizio:{1}", ex, Library.Utility.GetMethodDescription(), idEsercizio);
                throw;
            }

            return result;
        }
Exemple #7
0
        public virtual IUpdatableBusinessEntity Copy()
        {
            SaldoSoggetto saldo = new SaldoSoggetto(Soggetto, Esercizio, Importo);

            return saldo;
        }