public IList<RiepilogoSpesaDTO> GetRiepilogoSpeseQuadroAC(int azienda, int anno)
        {
            try
            {
                decimal importoMinimo = Convert.ToDecimal(Gipasoft.Library.Decodifica.Instance.GetElement("ImportiFissi", "quadroac").ValoreNumerico);

                // =============================================================================================
                // Pagamenti da inserire nel Quadro AC
                // =============================================================================================
                IList<Spesa> spese = _spesaService.GetByAnno(azienda, anno, false);

                // -----------------------------------------------------------------
                // Raggruppamento per condominio e fornitore
                // -----------------------------------------------------------------
                var spesePerCondominioFornitore = from item in spese
                                                  group item by item.EsercizioRiferimento.CondominioRiferimento.ID + "¥" + item.FornitoreRiferimento.ID into itemPerCondominioFornitore
                                                  where itemPerCondominioFornitore.Where(spe => spe.TipoDocumento != "BOLLETTA" && spe.FornitoreRiferimento.QuadroAc).Sum(spe => spe.ImportoLordo) > importoMinimo
                                                  select itemPerCondominioFornitore;

                List<RiepilogoSpesaDTO> riepilogo = new List<RiepilogoSpesaDTO>(spesePerCondominioFornitore.Count());

                foreach (IGrouping<string, Spesa> itemGroup in spesePerCondominioFornitore)
                {
                    string[] keys = itemGroup.Key.Split('¥');

                    Condominio condominio = _daoFactory.GetCondominioDao().GetById(int.Parse(keys[0]), false);
                    Fornitore fornitore = _daoFactory.GetFornitoreDao().GetById(int.Parse(keys[1]), false);

                    RiepilogoSpesaDTO item = new RiepilogoSpesaDTO()
                    {
                        IdCondominio = condominio.ID,
                        Condominio = condominio.DisplayName,
                        IdFornitore = fornitore.ID,
                        Fornitore = fornitore.DisplayName,
                        Importo = itemGroup.Sum(spe => spe.ImportoLordo)
                    };

                    item.Spese = new List<SpesaListaDTO>(itemGroup.Count());
                    foreach (Spesa itemSpesa in itemGroup)
                    {
                        SpesaListaDTO spesaDto = new SpesaListaDTO()
                        {
                            ID = itemSpesa.ID,
                            DataDocumento = itemSpesa.DataDocumento,
                            NumeroDocumento = itemSpesa.NumeroDocumento,
                            ImportoLordo = itemSpesa.ImportoLordo,
                            ImportoIva = itemSpesa.ImportoIva,
                            StatoSpesa = itemSpesa.Stato,
                            AltreSpese = itemSpesa.AltreSpese,
                            CassaProfessionisti = itemSpesa.CassaProfessionisti,
                            Detraibile = (itemSpesa.Detrazione > 0) ? true : false,
                            DisplayFornitore = itemSpesa.FornitoreRiferimento.DisplayName,
                            IdEsercizio = itemSpesa.EsercizioRiferimento.ID,
                            IdFornitore = itemSpesa.FornitoreRiferimento.ID,
                            Imponibile = itemSpesa.Imponibile,
                            IsMultiIva = itemSpesa.IsMultiIva,
                            Note = itemSpesa.Note,
                            Contestata = itemSpesa.Contestata,
                            Sinistro = (itemSpesa.Sinistro > 0) ? true : false,
                            TipoDocumento = Gipasoft.Library.Decodifica.Instance.GetElement("TipoDocumentoContabile", itemSpesa.TipoDocumento).Descrizione,
                            NumeroProtocollo = itemSpesa.NumeroProtocollo,
                            Version = itemSpesa.Version
                        };
                        item.Spese.Add(spesaDto);
                    }

                    riepilogo.Add(item);
                }

                return riepilogo;
            }
            catch (Exception ex)
            {
                log4net.MDC.Set("user", Gipasoft.Security.Login.Instance.CurrentLogin().LoginName);
                _log.Error("Errore inaspettato durante la lettura del riepilogo pagamenti per il Quadro AC -" + Gipasoft.Library.Utility.GetMethodDescription() + " - azienda:" + azienda + " - anno:" + anno, ex);
                throw ex;
            }
        }
        public IList<RiepilogoSpesaDTO> GetRiepilogoSpeseQuadroAC(int azienda, int anno)
        {
            try
            {
                var importoMinimo = Convert.ToDecimal(Library.Decodifica.Instance.GetElement("ImportiFissi", "quadroac").ValoreNumerico);

                // =============================================================================================
                // Pagamenti da inserire nel Quadro AC
                // =============================================================================================
                var spese = _spesaService.GetByAnno(azienda, anno, false);

                // -----------------------------------------------------------------
                // Raggruppamento per condominio e fornitore
                // -----------------------------------------------------------------
                var spesePerCondominioFornitore = (from item in spese
                                                   group item by item.EsercizioRiferimento.CondominioRiferimento.ID + "¥" + item.FornitoreRiferimento.GetFornitore().ID into itemPerCondominioFornitore
                                                   where itemPerCondominioFornitore.Where(spe => spe.TipoDocumento != "BOLLETTA" && spe.FornitoreRiferimento.GetFornitore().QuadroAc).Sum(spe => spe.ImportoLordo) > importoMinimo
                                                   select itemPerCondominioFornitore).ToList();

                var riepilogo = new List<RiepilogoSpesaDTO>(spesePerCondominioFornitore.Count());

                foreach (var itemGroup in spesePerCondominioFornitore)
                {
                    var keys = itemGroup.Key.Split('¥');

                    var condominio = _daoFactory.GetCondominioDao().GetById(int.Parse(keys[0]), false);
                    var fornitore = _daoFactory.GetFornitoreDao().GetById(int.Parse(keys[1]), false);

                    var item = new RiepilogoSpesaDTO
                    {
                        IdCondominio = condominio.ID,
                        Condominio = condominio.DisplayName,
                        IdFornitore = fornitore.ID,
                        Fornitore = fornitore.DisplayName,
                        Importo = itemGroup.Sum(spe => spe.ImportoLordo),
                        Spese = new List<SpesaListaDTO>(itemGroup.Count())
                    };

                    foreach (var itemSpesa in itemGroup)
                    {
                        var spesaDto = new SpesaListaDTO
                        {
                            ID = itemSpesa.ID,
                            DataDocumento = itemSpesa.DataDocumento,
                            NumeroDocumento = itemSpesa.NumeroDocumento,
                            ImportoLordo = itemSpesa.ImportoLordo,
                            ImportoIva = itemSpesa.ImportoIva,
                            StatoSpesa = itemSpesa.Stato,
                            AltreSpese = itemSpesa.AltreSpese,
                            CassaProfessionisti = itemSpesa.CassaProfessionisti,
                            Detraibile = (itemSpesa.Detrazione > 0),
                            DisplayFornitore = itemSpesa.FornitoreRiferimento.GetFornitore().DisplayName,
                            IdEsercizio = itemSpesa.EsercizioRiferimento.ID,
                            IdFornitore = itemSpesa.FornitoreRiferimento.GetFornitore().ID,
                            Imponibile = itemSpesa.Imponibile,
                            IsMultiIva = itemSpesa.IsMultiIva,
                            Note = itemSpesa.Note,
                            Contestata = itemSpesa.Contestata,
                            Sinistro = (itemSpesa.Sinistro > 0),
                            TipoDocumento = Library.Decodifica.Instance.GetElement("TipoDocumentoContabile", itemSpesa.TipoDocumento).Descrizione,
                            NumeroProtocollo = itemSpesa.NumeroProtocollo,
                            EsenteRegimeMinimo = itemSpesa.EsenteRegimeMinimo,
                            Version = itemSpesa.Version
                        };
                        item.Spese.Add(spesaDto);
                    }

                    riepilogo.Add(item);
                }

                return riepilogo;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la lettura del riepilogo pagamenti per il Quadro AC - {0} - azienda:{1} - anno:{2}", ex, Library.Utility.GetMethodDescription(), azienda, anno);
                throw;
            }
        }