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