private SpesaDTO setDto(Spesa spesa, bool includeDettagli, bool includeDettaglioMovimenti, int? anno, int? detrazione) { try { SpesaDTO dto = null; if (spesa != null) { spesa.SetStato(); var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda); dto = new SpesaDTO { ID = spesa.ID, AliquotaRitenuta = spesa.AliquotaRitenuta, IsRitenutaCalcoloImponibile = spesa.IsRitenutaCalcoloImponibile, AltreSpese = spesa.AltreSpese, AltreSpeseEsenti = spesa.AltreSpeseEsenti, SpeseEsentiRitenuta = spesa.SpeseEsentiRitenuta, AliquotaCassaProfessionisti = spesa.AliquotaCassaProfessionisti, CassaProfessionisti = spesa.CassaProfessionisti, DataDocumento = spesa.DataDocumento, DataInizioCompetenza = spesa.DataInizioCompetenza, DataFineCompetenza = spesa.DataFineCompetenza, IsAbilitataArchiviazioneOttica = spesa.IsAbilitataArchiviazioneOttica, IsPrestazioneQualita = spesa.IsPrestazioneQualita, Detrazione = spesa.Detrazione, Contestata = spesa.Contestata, EsclusaRendiconto = spesa.EsclusaRendiconto, IdEsercizio = spesa.EsercizioRiferimento.ID, DescrizioneEsercizio = spesa.EsercizioRiferimento.DisplayName, DescrizioneCondominio = spesa.EsercizioRiferimento.CondominioRiferimento.DisplayName, Sinistro = spesa.Sinistro > 0, Autorizzata = spesa.Autorizzata, EsenteRegimeMinimo = spesa.EsenteRegimeMinimo }; if (spesa.Imponibile != 0) dto.Imponibile = spesa.Imponibile; dto.ImportoIva = spesa.ImportoIva; dto.ImportoLordo = spesa.ImportoBolletta ?? spesa.ImportoLordo + spesa.AltreSpeseEsenti.GetValueOrDefault(); dto.ImportoRitenuta = spesa.ImportoRitenuta; //if (spesa.TipoDocumento == "NOTACC") //{ // dto.ImportoLordo = dto.ImportoLordo*-1; // dto.ImportoRitenuta = dto.ImportoRitenuta*-1; //} if (spesa.FornitoreRiferimento != null) { dto.IdFornitore = spesa.FornitoreRiferimento.ID; dto.DisplayFornitore = spesa.FornitoreRiferimento.DisplayName; } dto.ImportoNettoAPagare = dto.ImportoLordo.GetValueOrDefault() - dto.ImportoRitenuta.GetValueOrDefault(); dto.Note = spesa.Note; dto.NumeroDocumento = spesa.NumeroDocumento; if (!string.IsNullOrEmpty(spesa.NumeroDocumento) && spesa.DataDocumento != null && spesa.NumeroProtocollo != null) dto.IdentificativoArchiviazioneOttica = getArchiviazioneOtticaService().GetIdentificativoArchiviazione(spesa); dto.TipoDocumento = Decodifica.Instance.GetElement("TipoDocumentoContabile", spesa.TipoDocumento).Descrizione; dto.IsMultiIva = spesa.IsMultiIva; dto.StatoSpesa = spesa.Stato; if (spesa.SpesaRiferimento != null) { dto.IdSpesaRiferimento = spesa.SpesaRiferimento.ID; dto.DescrizioneSpesaRiferimento = spesa.SpesaRiferimento.ID.ToString(); if (!string.IsNullOrEmpty(spesa.SpesaRiferimento.NumeroDocumento)) dto.DescrizioneSpesaRiferimento += " - N. " + spesa.SpesaRiferimento.NumeroDocumento; if (spesa.SpesaRiferimento.DataDocumento != null) dto.DescrizioneSpesaRiferimento += " del " + spesa.SpesaRiferimento.DataDocumento.GetValueOrDefault().ToShortDateString(); foreach (var dettaglio in spesa.SpesaRiferimento.Dettagli) { dto.DescrizioneSpesaRiferimento += " - " + dettaglio.GetDescrizione(); break; } } if (spesa.Utenza != null) { var rep = new UtenzaRepository(_info, _windsorRepository); dto.Utenza = rep.GetDisplayName(spesa.Utenza); } dto.Version = spesa.Version; DettaglioSpesa dettaglioPrincipale = null; if (spesa.Dettagli.Count > 0) dettaglioPrincipale = spesa.Dettagli.FirstOrDefault(); if (spesa.TipoDocumento == "BOLLETTA") { if (spesa.TestateMovimenti.Count > 0) { var testata = spesa.TestateMovimenti.FirstOrDefault(); if (testata != null) { dto.DisplayName = testata.GetDescrizione(); dto.IdTestata = testata.ID; } } } else { if (dettaglioPrincipale != null) dto.DisplayName = dettaglioPrincipale.GetDescrizione(); } // ------------------------------------------ // Nominativo Spesa Personale // ------------------------------------------ // Solo per la lista (includeDettagli == false) if (!includeDettagli) { var nominativoSpesaPersonale = string.Empty; var movimentiPersonali = spesa.Dettagli.Where(item => item.Movimenti.Any(mov => mov.ContoRiferimento.IsSpesePersonali)).Select(item => item.Movimenti.ToList()); var personeElaborate = new List<string>(); foreach (var lista in movimentiPersonali) { foreach (var item in lista) { foreach (var spesaUnita in item.DettaglioRipartizione) { if (spesaUnita.Importo.GetValueOrDefault() != 0) { if (!string.IsNullOrEmpty(nominativoSpesaPersonale)) { if (!nominativoSpesaPersonale.Contains("<br/>")) nominativoSpesaPersonale = "<b>" + nominativoSpesaPersonale.Replace('&', 'e') + "</b><br/>"; else if (!nominativoSpesaPersonale.EndsWith("<br/>")) nominativoSpesaPersonale += "<br/>"; } // ------------------------------------------------- // Dettaglio riferito ad una unità immobiliare // ------------------------------------------------- if (spesaUnita.UnitaRiferimento != null) { if (item.ContoRiferimento.PercentualeProprieta == 1) { var nominativo = spesaUnita.UnitaRiferimento.GetProprietarioPrincipale(spesa.EsercizioRiferimento.DataChiusura).DisplayName; if (!personeElaborate.Contains(nominativo)) { nominativoSpesaPersonale += nominativo; personeElaborate.Add(nominativo); } } else { var conduttore = spesaUnita.UnitaRiferimento.GetConduttorePrincipale(spesa.EsercizioRiferimento.DataChiusura); var nominativo = conduttore != null ? conduttore.DisplayName : spesaUnita.UnitaRiferimento.GetProprietarioPrincipale(spesa.EsercizioRiferimento.DataChiusura).DisplayName; if (!string.IsNullOrEmpty(nominativo) && !personeElaborate.Contains(nominativo)) { nominativoSpesaPersonale += nominativo; personeElaborate.Add(nominativo); } } } // ------------------------------------------------- // Dettaglio riferito direttamente ad un condomino // ------------------------------------------------- if (spesaUnita.SoggettoCondominio != null) { var nominativo = spesaUnita.SoggettoCondominio.DisplayName; if (!personeElaborate.Contains(nominativo)) { nominativoSpesaPersonale += nominativo; personeElaborate.Add(nominativo); } } } } } } dto.NominativoSpesaPersonale = nominativoSpesaPersonale; // ------------------------------------------ // Scale Addebito // ------------------------------------------ var scaleElaborate = new List<int>(); if (spesa.TipoDocumento != "BOLLETTA") { var scaleAddebito = string.Empty; var movimenti = (from item in spesa.Dettagli where item.Movimenti.Any(mov => !string.IsNullOrEmpty(mov.GruppiAddebito)) select item.Movimenti.ToList()).ToList(); scaleAddebito = movimenti.Cast<IList<MovimentoContabile>>().Aggregate(scaleAddebito, (current, lista) => current + getScaleAddebito(lista, scaleElaborate, daoFactory)); dto.ScaleAddebito = scaleAddebito; } else { var movimenti = from item in spesa.MovimentiBollette where !string.IsNullOrEmpty(item.GruppiAddebito) select item; dto.ScaleAddebito = getScaleAddebito(movimenti, scaleElaborate, daoFactory); } // ------------------------------------------ // Conti - Sottoconti - Dettaglio Addebito // ------------------------------------------ var descrizioniConti = new List<string>(); var descrizioniSottoConti = new List<string>(); var dettagli = new List<string>(); if (spesa.TipoDocumento != "BOLLETTA") { var contiAddebito = string.Empty; var sottoContiAddebito = string.Empty; var dettagliAddebito = string.Empty; var movimenti = (spesa.Dettagli.Select(item => item.Movimenti.ToList())).ToList(); foreach (IList<MovimentoContabile> lista in movimenti) { var descrizioni = getContiSottocontiDettagliAddebito(lista, descrizioniConti, descrizioniSottoConti, dettagli, false, detrazione != null, spesa.EsercizioRiferimento); contiAddebito += descrizioni[0]; sottoContiAddebito += descrizioni[1]; dettagliAddebito += descrizioni[2]; } dto.DescrizioneBilancio = contiAddebito; dto.DescrizioneSottoconto = sottoContiAddebito; dto.Dettaglio = dettagliAddebito; } else { var movimenti = spesa.MovimentiBollette.Select(item => item); var descrizioni = getContiSottocontiDettagliAddebito(movimenti, descrizioniConti, descrizioniSottoConti, dettagli, false, detrazione != null, spesa.EsercizioRiferimento); dto.DescrizioneBilancio = descrizioni[0]; dto.DescrizioneSottoconto = descrizioni[1]; dto.Dettaglio = descrizioni[2]; } // ------------------------------------------ // Riparto personalizzato // ------------------------------------------ dto.IsRipartoPersonalizzato = spesa.TipoDocumento == "BOLLETTA" ? spesa.IsRipartoPersonalizzato : spesa.Dettagli.Any(item => item.Movimenti.Any(item2 => item2.IsRipartoPersonalizzato)); } // ------------------------------------------ // Dettagli // ------------------------------------------ if (includeDettagli || includeDettaglioMovimenti) { var indexDettaglio = 0; dto.Dettagli = new DettaglioSpesaDTO[spesa.Dettagli.Count]; foreach (var dettaglio in spesa.Dettagli) { var dettDto = setDettaglioDto(dettaglio, includeDettaglioMovimenti, detrazione != null); dto.Dettagli[indexDettaglio] = dettDto; indexDettaglio++; } // ------------------------------------------ // Scadenze // ------------------------------------------ if (includeDettagli) { var indexScadenze = 0; dto.Scadenze = new ScadenzaFatturaDTO[spesa.Scadenze.Count]; foreach (var scadenza in spesa.Scadenze) { var scadDto = getScadenzaRepository().GetByDomainEntity(scadenza); dto.Scadenze[indexScadenze] = scadDto; indexScadenze++; } var statoSpesa = spesa.Stato; if (spesa.Scadenze.Any(item => item.Stato == StatoSpesaEnum.Stornata)) statoSpesa = StatoSpesaEnum.Stornata; dto.StatoSpesa = statoSpesa; } } // ------------------------------------------ // Testata Contabile // ------------------------------------------ if (dettaglioPrincipale != null && dettaglioPrincipale.Movimenti.Count > 0) { var movimentoEconomico = IesiGenericCollections<MovimentoContabile>.GetByIndex(dettaglioPrincipale.Movimenti, 0); if (movimentoEconomico != null) { if (movimentoEconomico.Testata != null) dto.IdTestata = movimentoEconomico.Testata.ID; else { _log.ErrorFormat("Trovato movimento economico senza testata - {0} - movimento:{1} - spesa:{2}", Utility.GetMethodDescription(), movimentoEconomico.ID, spesa.ID); } } else { _log.WarnFormat("Trovato dettagli spesa senza movimenti associati - {0} - id:{1}", Utility.GetMethodDescription(), spesa.ID); } } // ------------------------------------------ // Data Registrazione // ------------------------------------------ if (spesa.Dettagli.Count > 0 && IesiGenericCollections<DettaglioSpesa>.GetByIndex(spesa.Dettagli, 0).Movimenti.Count > 0) { var dettaglio = IesiGenericCollections<DettaglioSpesa>.GetByIndex(spesa.Dettagli, 0); var movimento = IesiGenericCollections<MovimentoContabile>.GetByIndex(dettaglio.Movimenti, 0); if (movimento.Testata != null) dto.DataRegistrazione = movimento.Testata.DataRegistrazione.GetValueOrDefault(); } else if (spesa.TestateMovimenti != null) { var testata = spesa.TestateMovimenti.FirstOrDefault(); if(testata != null) dto.DataRegistrazione = testata.DataRegistrazione.GetValueOrDefault(); } // ------------------------------------------ // Importo Pagato (PER REPORT DETRAZIONI) // ------------------------------------------ if (anno != null && detrazione != null) { if (spesa.Pagamenti.Any()) dto.ImportoPagato = spesa.GetImportoPagato(anno.GetValueOrDefault(), detrazione.GetValueOrDefault()); // Se non sono presenti pagamenti ma solo riscossioni (nota accredito) deve essere considerato l'intero importo bugid#6618 else if (spesa.Riscossioni.Count > 0) { dto.ImportoPagato = spesa.ImportoLordo; } } } return dto; } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato nella creazione dell'istanza DTO per una spesa - {0} - id:{1}", ex, Utility.GetMethodDescription(), spesa.ID); throw; } }