Example #1
0
        /// <summary>
        /// Crea un Pagamento valido
        /// </summary>
        public Pagamento(ScadenzaFattura scadenza, Disposizione disposizione, decimal? importo, DateTime? dataPagamento, TipoPagamentoFatturaEnum tipo)
        {
            ScadenzaRiferimento = scadenza;
            DisposizioneRiferimento = disposizione;
            Importo = importo;
            Data = dataPagamento;
            Tipo = tipo;

            if (scadenza != null)
                scadenza.Pagamenti.Add(this);

            if (disposizione != null)
                disposizione.Pagamenti.Add(this);
        }
        /*
                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);
        }
        private void createPagamenti(Disposizione disposizione, IList<DisposizionePagamentoDTO> lista, StatoSpesaEnum stato, DataPagamentoEnum tipoDataPagamento, TipoPagamentoFatturaEnum tipo, IList<ScadenzaFattura> scadenze)
        {
            try
            {
                var index = 0;
                foreach (var disposizionePagamento in lista)
                {
                    DateTime? dataPagamento = null;
                    try
                    {
                        if (disposizionePagamento.ImportoPagamento > 0 || disposizionePagamento.ImportoAutorizzato > 0)
                        {
                            var scadenza = _daoFactory.GetScadenzaFatturaDao().Find(disposizionePagamento.IdScadenza.Value, false);
                            if (scadenza == null && scadenze != null && lista.Count == scadenze.Count)
                                scadenza = scadenze[index];

                            scadenza.ImportoAutorizzato = disposizionePagamento.ImportoAutorizzato;
                            if (disposizionePagamento.PagamentoCompletoRitenuta)
                                scadenza.PagamentoCompletoRitenuta = true;
                            var importoRitenutaResiduo = scadenza.GetImportoRitenutaResiduo();

                            // Calcolo la data di pagamento
                            switch (tipoDataPagamento)
                            {
                                case DataPagamentoEnum.Today:
                                    dataPagamento = DateTime.Today;
                                    break;
                                case DataPagamentoEnum.Scadenza:
                                    dataPagamento = disposizionePagamento.DataScadenza;
                                    break;
                                case DataPagamentoEnum.Custom:
                                    dataPagamento = disposizionePagamento.DataPagamento;
                                    break;
                                case DataPagamentoEnum.Undefined:
                                    dataPagamento = null;
                                    break;
                                default:
                                    dataPagamento = DateTime.Today;
                                    break;
                            }

                            var pag = _daoFactory.GetPagamentoDao().Find(disposizionePagamento.IdPagamento.GetValueOrDefault(), false) ?? new Pagamento(scadenza, disposizione, disposizionePagamento.ImportoAutorizzato, dataPagamento, tipo);

                            // ==============================================================================================
                            //  Se non viene pagato completamente l'importo autorizzato creo un nuovo pagamento e sottraggo
                            //  dell'importo del pagamento originale l'importo pagato
                            // ==============================================================================================
                            Pagamento pagToUpdate;
                            if (tipo != TipoPagamentoFatturaEnum.Undefined && tipo != TipoPagamentoFatturaEnum.Immediato && pag.Importo > disposizionePagamento.ImportoPagamento)
                            {
                                pag.Importo = pag.Importo - disposizionePagamento.ImportoPagamento;
                                pagToUpdate = new Pagamento(scadenza, disposizione, disposizionePagamento.ImportoPagamento, dataPagamento, tipo);
                            }
                            else
                                pagToUpdate = pag;

                            pagToUpdate.Tipo = tipo;
                            pagToUpdate.Data = dataPagamento;
                            if (disposizione != null)
                            {
                                disposizione.Pagamenti.Add(pagToUpdate);
                                pagToUpdate.DisposizioneRiferimento = disposizione;
                            }

                            pagToUpdate.Stato = stato;
                            pagToUpdate.Valuta = disposizionePagamento.Valuta;

                            // La ritenuta solo se NON di tratta di una spesa con detrazione
                            decimal? importoRitenuta = 0;
                            if (scadenza.SpesaRiferimento.Detrazione.GetValueOrDefault() == 0)
                            {
                                // L'importo della ritenuta se richiesto dall'utente corrisponde all'intero importo se è il primo pagamento
                                if (!scadenza.PagamentoCompletoRitenuta)
                                    importoRitenuta = Common.ContabilitaHelper.GetImportoRitenuta(scadenza.SpesaRiferimento, disposizionePagamento.ImportoPagamento);
                                else
                                    importoRitenuta = scadenza.Pagamenti.Count == 1 ? scadenza.ImportoRitenuta : importoRitenutaResiduo;
                            }
                            pagToUpdate.RitenutaAcconto = new Ritenuta(importoRitenuta);

                            pagToUpdate.NumeroAssegno = disposizionePagamento.NumeroAssegno;

                            if (disposizionePagamento.IdModalitaPagamento > 0)
                                pagToUpdate.ModalitaPagamento = _daoFactory.GetModalitaPagamentoDao().GetById(disposizionePagamento.IdModalitaPagamento.Value, false);

                            if (disposizionePagamento.IdConto != null)
                            {
                                var conto = _daoFactory.GetContoDao().Find(disposizionePagamento.IdConto.Value, false);
                                if (conto != null)
                                    pagToUpdate.Conto = conto;
                                else
                                {
                                    _log.WarnFormat("ATTENZIONE: Non trovato conto corrente bancario - {0} - conto:{1}", Utility.GetMethodDescription(), disposizionePagamento.IdConto.GetValueOrDefault());
                                    pagToUpdate.Conto = getDefaultContoPagamento(scadenza.SpesaRiferimento.EsercizioRiferimento);
                                }
                            }
                            if (disposizionePagamento.IdSottoConto != null)
                            {
                                if (disposizionePagamento.IdSottoConto > 0)
                                {
                                    var sottoconto = _daoFactory.GetSottoContoDao().Find(disposizionePagamento.IdSottoConto.Value, false);
                                    if (sottoconto != null)
                                    {
                                        _log.WarnFormat("ATTENZIONE: Non trovato conto corrente bancario - {0} - sottoconto:{1}", Utility.GetMethodDescription(), disposizionePagamento.IdSottoConto.GetValueOrDefault());
                                        pagToUpdate.SottoConto = sottoconto;
                                    }
                                }
                                else if (disposizionePagamento.IdSottoConto < 0)
                                {
                                    var contocorrente = _daoFactory.GetDatiBancariCondominiDao().Find(disposizionePagamento.IdSottoConto.Value * -1, false);
                                    if (contocorrente != null)
                                        pagToUpdate.ContoCorrenteBancario = contocorrente;
                                    else
                                    {
                                        _log.WarnFormat("ATTENZIONE: Non trovato conto corrente bancario - {0} - idContoCorrente:{1}", Utility.GetMethodDescription(), disposizionePagamento.IdSottoConto.GetValueOrDefault());
                                        pagToUpdate.ContoCorrenteBancario = scadenza.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.DatiBancariPrincipale;
                                    }
                                }
                            }

                            // Aggiorno dati scadenza
                            scadenza.Stato = stato;
                            if (stato == StatoSpesaEnum.Pagata)
                            {
                                scadenza.ImportoAutorizzato -= disposizionePagamento.ImportoPagamento;
                                pagToUpdate.Importo = disposizionePagamento.ImportoPagamento;
                                if (scadenza.Importo > scadenza.ImportoPagato)
                                    scadenza.Stato = StatoSpesaEnum.ParzialmentePagata;
                            }
                            scadenza.SpesaRiferimento.SetStato();

                            // Eseguo il pagamento anche della ritenuta
                            var contoRitenuta = _daoFactory.GetContoDao().GetByCodice(scadenza.SpesaRiferimento.EsercizioRiferimento.ID, scadenza.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoBancario());
                            if (disposizionePagamento.DataPagamentoRitenuta != null && pagToUpdate.RitenutaAcconto != null && pagToUpdate.RitenutaAcconto.Importo != 0)
                            {
                                int? idSottoconto = null;
                                if (pagToUpdate.ContoCorrenteBancario != null)
                                    idSottoconto = pagToUpdate.ContoCorrenteBancario.ID * -1;
                                if (Conversione.IsSqlSmallDateTime(disposizionePagamento.DataPagamentoRitenuta.GetValueOrDefault()))
                                    _ritenutaAccontoService.PagamentoRitenuta(pagToUpdate, disposizionePagamento.DataPagamentoRitenuta.Value, contoRitenuta, idSottoconto, disposizione.Descrizione, null, null, null);
                                else
                                {
                                    _log.WarnFormat("La data di pagamento della ritenuta non è corretta - {0} - dataPagamento:{1:d} - conto:{2} - dataPagamentoRitenuta:{3:d} - descrizione:{4}", Utility.GetMethodDescription(), disposizionePagamento.DataPagamentoRitenuta, contoRitenuta.ID, dataPagamento, disposizione.Descrizione);
                                }
                            }
                        }

                        index++;
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore nella creazione dei pagamenti immediati - SINGOLA DISPOSIZIONE - {0} - condominio:{1} - dataPagamento:{2} - tipoDataPagamento:{3} - data:{4:d} - documento:{5} - dataDocumento:{6:d}", ex, Utility.GetMethodDescription(), disposizionePagamento.Condominio, dataPagamento, tipoDataPagamento, disposizionePagamento.DataScadenza, disposizionePagamento.NumeroDocumento, disposizionePagamento.DataDocumento);
                        throw;
                    }

                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella creazione dei pagamenti immediati - {0} - disposizione:{1} - data:{2:d} - descrizione:{3} - azienda:{4}", ex, Utility.GetMethodDescription(), disposizione.ID, disposizione.Data, disposizione.Descrizione, disposizione.Azienda.ID);
                throw;
            }
        }