/*
                private decimal getImportoDataPagare(ScadenzaFattura scadenza)
                {
                    decimal importo = scadenza.SpesaRiferimento.ImportoLordo - scadenza.SpesaRiferimento.ImportoRitenuta.GetValueOrDefault() + scadenza.SpesaRiferimento.AltreSpeseEsenti.GetValueOrDefault();
                    return scadenza.Pagamenti.Aggregate(importo, (current, pagamento) => current - pagamento.Importo.GetValueOrDefault());
                }
        */

        public ResultPagamento CreatePagamenti(IList<DisposizionePagamentoDTO> lista, string descrizione, TipoPagamentoFatturaEnum tipo, bool invio, string tipoConto, int? idModello, bool testataPerCondominio, bool mittenteCondominio, int idAzienda)
        {
            // ================================
            // Controllo Pagamenti
            // ================================
            var message = string.Empty;
            foreach (var dto in lista)
            {
                var scadenza = _daoFactory.GetScadenzaFatturaDao().Find(dto.IdScadenza.GetValueOrDefault(), false);
                if (scadenza != null)
                {
                    decimal importoRitenutaDaPagare = 0;
                    if (scadenza.SpesaRiferimento.Detrazione > 0)
                        importoRitenutaDaPagare = scadenza.ImportoRitenuta.GetValueOrDefault();
                    if (dto.ImportoPagamento > (scadenza.Importo.GetValueOrDefault() + importoRitenutaDaPagare) - scadenza.ImportoPagato)
                        message += string.Format("Per la spesa: {0} l'importo del pagamento è superiore al residuo da pagare", _archiviazioneOtticaService.GetIdentificativoArchiviazione(scadenza.SpesaRiferimento));
                }
            }

            // ================================
            // Esecuzione Pagamenti
            // ================================
            if (string.IsNullOrEmpty(message))
            {
                DateTime? dataDisposizione = DateTime.Today;
                var tipoDataPagamento = DataPagamentoEnum.Today;
                if (tipo == TipoPagamentoFatturaEnum.Manuale)
                {
                    tipoDataPagamento = DataPagamentoEnum.Custom;
                    if (lista.Count > 0)
                        dataDisposizione = lista[0].DataPagamento;
                }

                var disposizione = new Disposizione(descrizione, dataDisposizione, _daoFactory.GetAziendaDao().GetById(idAzienda, false), null);
                _daoFactory.GetDisposizioneDao().SaveOrUpdate(disposizione);

                createPagamenti(disposizione, lista, StatoSpesaEnum.Pagata, tipoDataPagamento, tipo, null);

                var result = new ResultPagamento(null, new DocumentInfo(), null);
                if (invio)
                    result = _esecuzionePagamento.EsecuzionePagamenti(disposizione, false, idModello, testataPerCondominio, mittenteCondominio);

                if ((result.DocumentInfo.Body != null && string.IsNullOrEmpty(result.Message)) || !_esecuzionePagamento.IsNecessaryFile || !invio)
                {
                    _movimentiContabilitaService.SetMovimentiPagamenti(disposizione, tipoConto, null);
                    return result;
                }
                _persistenceContext.RollbackAndCloseSession(Security.Login.Instance.CurrentLogin().LoginName);
                _persistenceContext.BeginTransaction(Security.Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);
                return new ResultPagamento(result.Message, new DocumentInfo(), null);
            }
            _persistenceContext.RollbackAndCloseSession(Security.Login.Instance.CurrentLogin().LoginName);
            _persistenceContext.BeginTransaction(Security.Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);
            return new ResultPagamento(message, new DocumentInfo(), null);
        }
Exemple #2
0
		public ResultPagamento CreatePagamenti(BindingList<DisposizionePagamentoDTO> pagamenti, string descrizione, TipoBonificoEnum tipoBonifico, bool invio, string tipoConto, int? idModello, bool testataPerCondominio, bool mittenteCondominio, UserInfo userinfo)
		{
            var retryCount = 5;
            var success = false;
            var windsorRep = new WindsorConfigRepository();
            var item = new ResultPagamento();
            while (retryCount >= 0 && !success)
            {
                try
                {
                    windsorRep.BeginTransaction(userinfo);
                    IPagamentoService pagamentoService = null;
                    TipoPagamentoFatturaEnum tipo = TipoPagamentoFatturaEnum.Undefined;
                    if (tipoBonifico == TipoBonificoEnum.CBI)
                    {
                        pagamentoService = windsorRep.GetContainer(userinfo.Azienda).Resolve<IPagamentoService>("pagamentoService.CBI");
                        tipo = TipoPagamentoFatturaEnum.CBI;
                        tipoConto = "B";
                        invio = true;
                    }
                    else if (tipoBonifico == TipoBonificoEnum.SEPA)
                    {
                        pagamentoService = windsorRep.GetContainer(userinfo.Azienda).Resolve<IPagamentoService>("pagamentoService.SEPA");
                        tipo = TipoPagamentoFatturaEnum.SEPA;
                        tipoConto = "B";
                        invio = true;
                    }
                    else if (tipoBonifico == TipoBonificoEnum.Manuale)
                    {
                        pagamentoService = windsorRep.GetContainer(userinfo.Azienda).Resolve<IPagamentoService>("pagamentoService.Manuale");
                        tipo = TipoPagamentoFatturaEnum.Manuale;
                    }

                    if (pagamentoService != null)
                    {
                        item = pagamentoService.CreatePagamenti(pagamenti, descrizione, tipo, invio, tipoConto, idModello, testataPerCondominio, mittenteCondominio, userinfo.Azienda);
                        windsorRep.Commit();
                    }

                    success = true;
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nella creazione dei pagamenti - TENTATIVO:{0} - {1} - descrizione:{2} - azienda:{3}", ex, (6 - retryCount), Utility.GetMethodDescription(), descrizione, userinfo.Azienda + " - number:" + getExceptionId(ex), ex);

                    windsorRep.Rollback();
                    if (!isRetryException(ex))
                        throw;

                    // Add delay here if you wish. 
                    System.Threading.Thread.Sleep(1000 * (6 - retryCount));
                    retryCount--;
                    _log.InfoFormat("Creazione dei pagamenti - INIZIO TENTATIVO:{0} - {1} - descrizione:{2} - azienda:{3}", (6 - retryCount), Utility.GetMethodDescription(), descrizione, userinfo.Azienda);
                }
            }

            if (!success)
                windsorRep.Rollback();

            return item;
		}