예제 #1
0
        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;
            }
        }