public void SetMovimentiPagamenti(Disposizione disposizione, string tipoConto, LogTransazione logTransazione) { try { var causale = _daoFactory.GetCausaleContabileDao().GetByCodice("PF"); var lista = new Dictionary<Esercizio, TestataMovimentoContabile>(disposizione.Pagamenti.Count); foreach (var pag in disposizione.Pagamenti) { try { var numeroRiga = 0; var esercizioRiferimento = getEsercizioCompetenza(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento, pag.Data.GetValueOrDefault()); if (esercizioRiferimento == null) { var ex = new InvalidDataException(string.Format("Non trovato nessun esercizio attivo")); _log.FatalFormat("Non trovato nessun esercizio attivo - {0} - condominio:{1} - disposizione:{2} - tipoConto:{3}", ex, Utility.GetMethodDescription(), pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, disposizione.ID, tipoConto); throw ex; } var message = IsAllowDataRegistrazione(new List<int> { esercizioRiferimento.CondominioRiferimento.ID }, esercizioRiferimento, pag.Data.GetValueOrDefault()); if (message.Count == 0) { // ================================================ // Testata // ================================================ TestataMovimentoContabile testata; if (lista.ContainsKey(esercizioRiferimento)) testata = lista[esercizioRiferimento]; else { testata = new TestataMovimentoContabile(esercizioRiferimento, pag.Data, TipoTestataMovimentoContabileEnum.Automatica, logTransazione); if(logTransazione == null) _daoFactory.GetTestataMovimentoContabileDao().SaveOrUpdate(testata); // Per ora ritengo opportuno avere una testata di movimento contabile distinta per ogni pagamento. // Per avere un testata che accorpi diversi pagamenti è sufficiente scommentare la riga successiva. //lista.Add(esercizioRiferimento, testata); } // ================================================ // Debiti VS Fornitori // ------------------------------------------------ // Se è già presente un movimento contabile legato alla ritenute // vuol dire che il pagamento stato annullato. // In questo caso il movimento di ritenuta non deve essere generato // ================================================ numeroRiga++; var importoFornitori = pag.Importo.GetValueOrDefault(); if (pag.RitenutaAcconto != null && pag.RitenutaAcconto.MovimentoContabileCreazione == null) importoFornitori += pag.RitenutaAcconto.Importo.GetValueOrDefault(); var movimentoPatrimoniale = new MovimentoContabile(testata, pag.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento, causale, numeroRiga, _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoFornitori()), importoFornitori, "D") { Descrizione = string.Format("Pagamento Fatt. n.{0} del {1:d}", pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento, pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.GetValueOrDefault()) }; if(logTransazione == null) _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoPatrimoniale); // ================================================ // Ritenuta // ================================================ decimal importoRitenuta = 0; if (pag.ScadenzaRiferimento.SpesaRiferimento.Detrazione.GetValueOrDefault() == 0 && pag.RitenutaAcconto != null && pag.RitenutaAcconto.MovimentoContabileCreazione == null && pag.RitenutaAcconto.Importo != null && pag.RitenutaAcconto.Importo.GetValueOrDefault() != 0) { numeroRiga++; var segnoRitenuta = "A"; importoRitenuta = pag.RitenutaAcconto.Importo.GetValueOrDefault(); if (pag.RitenutaAcconto.Importo.GetValueOrDefault() < 0) { segnoRitenuta = "D"; importoRitenuta = importoRitenuta * -1; } var movimentoRitenuta = new MovimentoContabile(testata, causale, numeroRiga, _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoRitenuta()), importoRitenuta, segnoRitenuta) { FornitoreRiferimento = movimentoPatrimoniale.FornitoreRiferimento }; if (!string.IsNullOrEmpty(pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento) && pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento != null) movimentoRitenuta.Descrizione = "Ritenuta Fatt. n." + pag.ScadenzaRiferimento.SpesaRiferimento.NumeroDocumento + " del " + pag.ScadenzaRiferimento.SpesaRiferimento.DataDocumento.Value.ToShortDateString(); pag.RitenutaAcconto.MovimentoContabileCreazione = movimentoRitenuta; if(logTransazione == null) _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoRitenuta); } // ================================================ // Conto Patrimoniale // ================================================ numeroRiga++; if (pag.Conto == null) { switch (tipoConto) { case "B": pag.Conto = _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, _pianoContiService.GetCodiceContoBancario()); break; case "C": pag.Conto = _daoFactory.GetContoDao().GetByCodice(pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.ID, pag.ScadenzaRiferimento.SpesaRiferimento.EsercizioRiferimento.CondominioRiferimento.ID, "903"); break; } } var segnoPagamento = "A"; var importoPagamento = importoFornitori - importoRitenuta; if (importoPagamento < 0) { segnoPagamento = "D"; importoPagamento = importoPagamento * -1; // Inverto segno e importo anche per il movimento di Debiti v/Fornitori movimentoPatrimoniale.Segno = invertiSegno("D"); movimentoPatrimoniale.Importo = importoFornitori * -1; } var movimentoBancario = new MovimentoContabile(testata, causale, numeroRiga, pag.Conto, importoPagamento, segnoPagamento) { Descrizione = movimentoPatrimoniale.GetDescrizione(), NumeroAssegno = pag.NumeroAssegno, FornitoreRiferimento = pag.ScadenzaRiferimento.SpesaRiferimento. FornitoreRiferimento, SottoContoRiferimento = pag.SottoConto, ContoCorrenteBancario = pag.ContoCorrenteBancario }; pag.MovimentoContabile = movimentoBancario; if (logTransazione == null) _daoFactory.GetMovimentoContabileDao().SaveOrUpdate(movimentoBancario); } else { var ex = new InvalidDataException(string.Format("La data di registrazione {0} non è valida", pag.Data.GetValueOrDefault())); _log.FatalFormat("Data di registrazione non valida - {0} - data:{1} - pagamento:{2} - disposizione:{3} - tipoConto:{4} - esercizio:{5}", ex, Utility.GetMethodDescription(), pag.Data.GetValueOrDefault(), pag.ID, disposizione.ID, tipoConto, esercizioRiferimento.ID); throw ex; } } catch (Exception ex) { _log.FatalFormat("Errore inaspettato durante la scrittura dei movimenti per pagamenti - (SINGOLO PAGAMENTO) - {0} - pagamento:{1} - disposizione:{2}", ex, Utility.GetMethodDescription(), pag.ID, disposizione.ID); throw; } } } catch (Exception ex) { _log.FatalFormat("Errore inaspettato durante la scrittura dei movimenti per pagamenti - {0} - disposizione:{1}", ex, Utility.GetMethodDescription(), disposizione.ID); throw; } }
private string getDescrizioneMovimento(MovimentoContabile movimento, Esercizio esercizio, bool detrazione) { if (movimento.SottoContoRiferimento != null) return movimento.SottoContoRiferimento.GetDescrizione(esercizio, null, movimento); if (!string.IsNullOrEmpty(movimento.GetDescrizione(detrazione))) return movimento.GetDescrizione(); return string.Empty; }
private MovimentoContabileListaDTO setListaDto(MovimentoContabile item, bool importiNegativi, IArchiviazioneOtticaService archiviazioneService) { try { var dto = new MovimentoContabileListaDTO { ID = item.ID, IdTestata = item.Testata.ID, Data = item.Testata.DataRegistrazione.GetValueOrDefault(), Causale = item.Causale.DescrizioneCompleta, IdCondominio = item.Testata.EsercizioRiferimento.CondominioRiferimento.ID, Condominio = item.Testata.EsercizioRiferimento.CondominioRiferimento.DisplayName, IdEsercizio = item.Testata.EsercizioRiferimento.ID, Esercizio = item.Testata.EsercizioRiferimento.DisplayName, IdConto = item.ContoRiferimento.ID, Conto = item.ContoRiferimento.Descrizione, TipoConto = item.ContoRiferimento.Tipo.ToString(), Descrizione = item.GetDescrizione(), Importo = !importiNegativi ? item.GetImportoSenzaSegno() : item.GetImportoConSegno(), ImportoResiduoEvasione = item.GetImportoSenzaSegno(), Stato = item.Stato }; if(item.ImportoEvasioneTransitorio != null) dto.ImportoResiduoEvasione -= item.ImportoEvasioneTransitorio; dto.Segno = item.Segno; dto.Note = item.Note; dto.NumeroRegistrazione = item.NumeroRegistrazione; dto.NumeroAssegno = item.NumeroAssegno; dto.NumeroRiga = item.NumeroRiga; if (item.EvasioneBancaria != null) dto.IdEvasioneBancaria = item.EvasioneBancaria.ID; if (item.FornitoreRiferimento != null) { dto.IdFornitore = item.FornitoreRiferimento.ID; dto.Nominativo = item.FornitoreRiferimento.DisplayName; } if (item.CondominoRiferimento != null) { dto.IdCondomino = item.CondominoRiferimento.ID; dto.Nominativo = item.CondominoRiferimento.Persona.DisplayName; } if(item.DettaglioRiferimento != null) dto.IdDettaglio = item.DettaglioRiferimento.ID; if (item.SottoContoRiferimento != null) { dto.IdSottoConto = item.SottoContoRiferimento.ID; dto.SottoConto = item.SottoContoRiferimento.GetDescrizione(item.Testata.EsercizioRiferimento, null, item); } else if (item.ContoRiferimento.Codice == getPianoContiService().GetCodiceContoBancario() && item.ContoCorrenteBancario != null) { dto.IdSottoConto = item.ContoCorrenteBancario.ID * -1; dto.SottoConto = item.ContoCorrenteBancario.DisplayName; } else if (item.ContoRiferimento.Codice == getPianoContiService().GetCodiceContoFornitori() && item.FornitoreRiferimento != null) { dto.IdSottoConto = item.FornitoreRiferimento.ID * -1; dto.SottoConto = item.FornitoreRiferimento.DisplayName; } var spesaRiferimento = item.Testata.SpesaRiferimento; if (spesaRiferimento == null && item.DettaglioRiferimento != null) spesaRiferimento = item.DettaglioRiferimento.SpesaRiferimento; // ============================================================================================= // Commentato rendeva troppo lenta la ricerca dei movimenti - bugid#2967 // ============================================================================================= //if(spesaRiferimento == null) //{ // Pagamento pagamento = null; // if(pagamenti == null) // pagamento = daoFactory.GetPagamentoDao().GetByMovimentoContabile(item); // else // pagamento = pagamenti.FirstOrDefault(itemPagamento => itemPagamento.MovimentoContabile != null && itemPagamento.MovimentoContabile.ID == item.ID); // if (pagamento != null) // spesaRiferimento = pagamento.ScadenzaRiferimento.SpesaRiferimento; //} // ============================================================================================= if (spesaRiferimento != null) { dto.IdSpesa = spesaRiferimento.ID; dto.NumeroProtocollo = spesaRiferimento.NumeroProtocollo; dto.IdentificativoArchiviazioneOttica = archiviazioneService.GetIdentificativoArchiviazione(spesaRiferimento, true); dto.StatoSpesa = spesaRiferimento.Stato; dto.TipoDocumentoSpesa = spesaRiferimento.TipoDocumento; } else { dto.NumeroProtocollo = item.Testata.NumeroProtocollo; if (dto.NumeroProtocollo > 0) dto.IdentificativoArchiviazioneOttica = archiviazioneService.GetIdentificativoArchiviazione(item.Testata); else if (item.DettaglioRiferimento != null && item.DettaglioRiferimento.SpesaRiferimento != null) dto.IdentificativoArchiviazioneOttica = archiviazioneService.GetIdentificativoArchiviazione(item.DettaglioRiferimento.SpesaRiferimento, true); } dto.IsAllowOpenDettaglio = item.Testata.NumeroProtocollo > 0 || dto.IdSpesa > 0; return dto; } catch (Exception ex) { if (item != null) { _log.Error("Errore nel caricamento del Movimento Contabile: " + Utility.GetMethodDescription() + " - id:" + item.ID, ex); } else { _log.Error("Errore nel caricamento del Movimento Contabile: " + Utility.GetMethodDescription() + " - Movimento --> null", ex); } throw; } }