public string StornoPagamento(int idPagamento, int? idMovimentoBancario, decimal importo, DateTime dataRegistrazione)
        {
            var message = string.Empty;

            try
            {
                var pagamento = _daoFactory.GetPagamentoDao().GetById(idPagamento, false);
                pagamento.Stato = StatoSpesaEnum.Annullata;
                pagamento.ScadenzaRiferimento.Stato = StatoSpesaEnum.Autorizzata;
                pagamento.ScadenzaRiferimento.ImportoAutorizzato = pagamento.Importo;

                if (pagamento.RitenutaAcconto != null)
                    pagamento.RitenutaAcconto.Stato = StatoRitenutaEnum.Stornata;

                var movimentoPatrimoniale = _movimentiContabilitaService.SetMovimentiStornoPagamento(pagamento, importo, dataRegistrazione);

                // Evado il movimento contabile
                if (idMovimentoBancario != null)
                {
                    var movimentoBancario = _daoFactory.GetMovimentoBancarioDao().GetById(idMovimentoBancario.Value, false);
                    movimentoPatrimoniale.Stato = StatoMovimentoContabileEnum.Evaso;
                    movimentoBancario.Stato = StatoMovimentoBancarioEnum.Contabilizzato;

                    var evasione = new EvasioneBancaria(movimentoPatrimoniale.GetDescrizione(), null);
                    movimentoPatrimoniale.EvasioneBancaria = evasione;
                    movimentoBancario.EvasioneBancaria = evasione;
                    _daoFactory.GetEvasioneBancariaDao().SaveOrUpdate(evasione);
                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nell'aggiornamento dei pagamenti - {0} - pagamento:{1} - importo:{2:c} - dataRegistrazione:{3:d}", ex, Utility.GetMethodDescription(), idPagamento, importo, dataRegistrazione);
                throw;
            }

            return message;
        }
        public AuthorizationMessages EvadiMovimento(string descrizione, IList<MovimentoContabile> movimentiContabili, IList<int> idMovimentiBancari, DateTime? dataRegistrazione, LogTransazione logTransazione)
        {
            var fatalMessage = string.Empty;
            var warnMessage = string.Empty;

            try
            {
                MovimentoBancario movimentoBancarioSingolo = null;
                var aggiornaDataRegistrazione = true;

                if (idMovimentiBancari.Count == 1)
                {
                    movimentoBancarioSingolo = _daoFactory.GetMovimentoBancarioDao().GetById(idMovimentiBancari[0], false);
                    if (dataRegistrazione == null)
                        dataRegistrazione = movimentoBancarioSingolo.DataContabile;

                    // =================================================================
                    // Controllo data registrazione
                    // =================================================================
                    foreach (var movimentoContabile in movimentiContabili)
                    {
                        try
                        {
                            if (movimentoContabile != null)
                            {
                                var message = IsAllowDataRegistrazione(new List<int> { movimentoContabile.Testata.EsercizioRiferimento.CondominioRiferimento.ID }, movimentoContabile.Testata.EsercizioRiferimento, dataRegistrazione.GetValueOrDefault());
                                if (message.Count > 0)
                                {
                                    aggiornaDataRegistrazione = false;
                                    _log.DebugFormat("Data di registrazione non valida - {0} - data:{1} - movimentoContabile:{2} - movimentoBancario:{3} - esercizio:{4}", Utility.GetMethodDescription(), movimentoBancarioSingolo.DataContabile.GetValueOrDefault(), movimentoContabile.ID, movimentoBancarioSingolo.ID, movimentoContabile.Testata.EsercizioRiferimento.ID);
                                    warnMessage += string.Format("La data di registrazione del movimento contabile non è stata aggiornata con la data del movimento bancario perchè la data {0:d} non è valida per l'esercizio {1}{2}", movimentoBancarioSingolo.DataContabile.GetValueOrDefault(), movimentoContabile.Testata.EsercizioRiferimento.DisplayName, Environment.NewLine);
                                    //warnMessage = message.Aggregate(fatalMessage, (current, mess) => current + (mess + Environment.NewLine));
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            _log.ErrorFormat("Errore inaspettato durante il controllo della data di registrazione - {0} - descrizione:{1} - movimento:{2}", ex, Utility.GetMethodDescription(), descrizione, movimentoContabile.ID);
                            fatalMessage = "Errore inaspettato durante la conferma del movimento contabile.";
                        }
                    }

                    if (!string.IsNullOrEmpty(fatalMessage))
                        return new AuthorizationMessages(fatalMessage, warnMessage);
                }

                // =================================================================
                // Nuovo oggetto Evasione Bancaria
                // =================================================================
                var evasione = new EvasioneBancaria(descrizione, logTransazione);
                if (logTransazione == null)
                    _daoFactory.GetEvasioneBancariaDao().SaveOrUpdate(evasione);

                // =================================================================
                // Evasione di tutti i movimenti contabili
                // =================================================================
                foreach (var movimentoContabile in movimentiContabili)
                {
                    try
                    {
                        if (movimentoContabile != null)
                        {
                            movimentoContabile.EvasioneBancaria = evasione;
                            if (movimentoBancarioSingolo != null)
                            {
                                if (aggiornaDataRegistrazione)
                                {
                                    movimentoContabile.Testata.DataRegistrazione = dataRegistrazione;    

                                    if (movimentoContabile.ID > 0)
                                    {
                                        // Se è associato un pagamento al movimento aggiorno la data di pagamento
                                        var pagamento = _daoFactory.GetPagamentoDao().GetByMovimentoContabile(movimentoContabile);
                                        if (pagamento != null)
                                            pagamento.Data = movimentoContabile.Testata.DataRegistrazione;

                                        // Se è associato un versamento condomino al movimento aggiorno la data di versamento
                                        var versamento = _daoFactory.GetVersamentoSoggettoDao().GetByMovimentoContabile(movimentoContabile);
                                        if (versamento != null)
                                            versamento.Data = movimentoContabile.Testata.DataRegistrazione.GetValueOrDefault();
                                    }
                                }
                            }

                            movimentoContabile.Stato = StatoMovimentoContabileEnum.Evaso;
                            if (movimentoContabile.ID > 0)
                            {

                                var pag = _daoFactory.GetPagamentoDao().GetByMovimentoContabile(movimentoContabile);
                                if (pag != null)
                                {
                                    if (pag.TipoCodiceConfermaBonifico == TipoCodiceEsitoDisposizioneBonifico.Undefined)
                                        pag.TipoCodiceConfermaBonifico =
                                            TipoCodiceEsitoDisposizioneBonifico.MovimentoBancario;
                                    pag.Stato = StatoSpesaEnum.Evasa;
                                }
                            }
                        }
                        else
                        {
                            _log.ErrorFormat("Errore inaspettato durante la conferma del movimento contabile. Non è stato trovato il movimento - {0} - descrizione:{1} - movimento:{2}", Utility.GetMethodDescription(), descrizione, movimentoContabile.ID);
                            fatalMessage = "Non è stato trovato il movimento contabile con id: " + movimentoContabile.ID + "." + Environment.NewLine + "Probabilmente è stato eliminato dall'utente in un'altra maschera.";
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante la conferma del movimento contabile - SINGOLO MOVIMENTO CONTABILE - {0} - descrizione:{1} - movimento:{2}", ex, Utility.GetMethodDescription(), descrizione, movimentoContabile.ID);
                        fatalMessage = "Errore inaspettato durante la conferma del movimento contabile.";
                    }
                }

                // =================================================================
                // Evasione di tutti i movimenti bancari
                // =================================================================
                foreach (var idMovimento in idMovimentiBancari)
                {
                    try
                    {
                        var movimentoBancario = _daoFactory.GetMovimentoBancarioDao().Find(idMovimento, false);
                        if (movimentoBancario != null)
                        {
                            movimentoBancario.EvasioneBancaria = evasione;
                            movimentoBancario.Stato = StatoMovimentoBancarioEnum.Contabilizzato;
                        }
                        else
                        {
                            _log.ErrorFormat("Errore inaspettato durante la conferma del movimento bancario. Non è stato trovato il movimento - {0} - descrizione:{1} - movimento:{2}", Utility.GetMethodDescription(), descrizione, idMovimento);
                            fatalMessage = "Non è stato trovato il movimento bancario con id: " + idMovimento;
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante la conferma del movimento Bancario - SINGOLO MOVIMENTO BANCARIO - {0} - descrizione:{1} - movimento:{2}", ex, Utility.GetMethodDescription(), descrizione, idMovimento);
                        fatalMessage = "Errore inaspettato durante la conferma del movimento contabile.";
                    }
                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la conferma della evasione bancaria - {0} - descrizione:{1} - movimento:{2}", ex, Utility.GetMethodDescription(), descrizione);
                fatalMessage = "Errore inaspettato durante la conferma della evasione bancaria.";
            }

            return new AuthorizationMessages(fatalMessage, warnMessage);
        }
        public MovimentiBancariDTO SetContabilizzato(MovimentiBancariDTO movimentoDto, int? idMovimentoContabile)
        {
            try
            {
                var movimento = _daoFactory.GetMovimentoBancarioDao().GetById(movimentoDto.ID, false);
                movimento.Stato = StatoMovimentoBancarioEnum.Contabilizzato;
                movimentoDto.StatoMovimento = movimento.Stato;

                if (idMovimentoContabile != null)
                {
                    var movimentoPatrimoniale = _daoFactory.GetMovimentoContabileDao().GetById(idMovimentoContabile.Value, false);
                    movimentoPatrimoniale.Stato = StatoMovimentoContabileEnum.Evaso;

                    var evasione = new EvasioneBancaria($"Evasione automatica del {DateTime.Today:d}", null);
                    _daoFactory.GetEvasioneBancariaDao().SaveOrUpdate(evasione);

                    movimentoPatrimoniale.EvasioneBancaria = evasione;
                    movimento.EvasioneBancaria = evasione;
                }

                return movimentoDto;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la contabilizzazione di un singolo movimento bancario - {0} - movimentoBnacario:{1} - movimentoContabile:{2}", ex, Utility.GetMethodDescription(), movimentoDto != null ? movimentoDto.ID.ToString(CultureInfo.InvariantCulture) : "<NULL>", idMovimentoContabile);
                throw;
            }
        }