public ModelloListaRegistrazioneContabileDTO GetById(int id)
        {
            try
            {
                ModelloListaRegistrazioneContabileDTO dto = null;
                var modello = _daoFactory.GetModelloRegistrazioneContabileDao().Find(id, false);
                if (modello != null)
                {

                    dto = new ModelloListaRegistrazioneContabileDTO
                    {
                        ID = modello.ID,
                        Descrizione = modello.Descrizione,
                        DescrizioneVoceFattura = modello.DescrizioneVoceFattura,
                        IdCondominio = modello.CondominioRiferimento.ID,
                        Version = modello.Version,
                        IsDeleteAllow = modello.IsDeleteAllow(),
                        DisplayName = modello.Descrizione
                    };

                    // ----------------------------------------
                    // Conti
                    // ----------------------------------------
                    foreach (var conto in modello.Conti)
                    {
                        var contoDto = new ContiListaModelloRegistrazioneContabileDTO
                        {
                            ID = conto.ID,
                            IdConto = conto.ContoRiferimento != null ? conto.ContoRiferimento.ID : 0,
                            IdModello = dto.ID,
                            PercentualeRipartizione = conto.PercentualeRipartizione.GetValueOrDefault(),
                            Version = conto.Version,
                            IsDeleteAllow = conto.IsDeleteAllow(),
                            DisplayName = conto.ContoRiferimento != null ? conto.ContoRiferimento.Descrizione : string.Empty
                        };

                        if (conto.SottoContoRiferimento != null)
                        {
                            contoDto.IdSottoConto = conto.SottoContoRiferimento.ID;
                            contoDto.DisplayName += " - " + conto.SottoContoRiferimento.GetDescrizione(null, modello.CondominioRiferimento, null);
                        }

                        // ----------------------------------------
                        // Dettagli / Riparto
                        // ----------------------------------------
                        foreach (var dettaglio in conto.Unita)
                        {
                            var dettaglioDto = new DettaglioListaModelloRegistrazioneContabileDTO
                            {
                                ID = dettaglio.ID,
                                IsDeleteAllow = dettaglio.IsDeleteAllow(),
                            };

                            if (dettaglio.LottoRiferimento != null)
                                dettaglioDto.IdLotto = dettaglio.LottoRiferimento.ID;
                            if (dettaglio.PalazzinaRiferimento != null)
                                dettaglioDto.IdStabile = dettaglio.PalazzinaRiferimento.ID;
                            if (dettaglio.GruppoStabileRiferimento != null)
                                dettaglioDto.IdGruppoStabile = dettaglio.GruppoStabileRiferimento.ID;
                            if (dettaglio.UnitaRiferimento != null)
                                dettaglioDto.IdUnita = dettaglio.UnitaRiferimento.ID;

                            contoDto.Riparto.Add(dettaglioDto);
                        }

                        dto.Conti.Add(contoDto);
                    }

                    // ----------------------------------------
                    // Fornitori
                    // ----------------------------------------
                    foreach (var modelloFornitore in modello.Fornitori)
                    {
                        var dtoFornitore = new ModelloContabileFornitoreDTO
                        {
                            ID = modelloFornitore.ID,
                            IdFornitore = modelloFornitore.Fornitore.ID,
                            IdModello = modello.ID,
                            DisplayName = modelloFornitore.Fornitore.DisplayName,
                            Version = modelloFornitore.Version
                        };

                        dto.Fornitori.Add(dtoFornitore);
                    }
                }

                return dto;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la lettura dei modelli per condominio - {0} - id:{1}", ex, Library.Utility.GetMethodDescription(), id);
                throw;
            }
        }
        public List<ModelloListaRegistrazioneContabileDTO> GetByCondominio(int idCondominio)
        {
            try
            {
                var condominio = _daoFactory.GetCondominioDao().GetById(idCondominio, false);
                var modelli = _daoFactory.GetModelloRegistrazioneContabileDao().GetByCondominio(idCondominio);
                var modelliDto = new List<ModelloListaRegistrazioneContabileDTO>(modelli.Count);

                // ----------------------------------------
                // Modelli
                // ----------------------------------------
                foreach (var modello in modelli)
                {
                    try
                    {
                        var dto = new ModelloListaRegistrazioneContabileDTO
                        {
                            ID = modello.ID,
                            Descrizione = modello.Descrizione,
                            DescrizioneVoceFattura = modello.DescrizioneVoceFattura,
                            IdCondominio = idCondominio,
                            Version = modello.Version,
                            IsDeleteAllow = modello.IsDeleteAllow(),
                            DisplayName = modello.Descrizione
                        };

                        // ----------------------------------------
                        // Conti
                        // ----------------------------------------
                        foreach (var conto in modello.Conti)
                        {
                            try
                            {
                                var contoDto = new ContiListaModelloRegistrazioneContabileDTO
                                {
                                    ID = conto.ID,
                                    IdModello = dto.ID,
                                    PercentualeRipartizione = conto.PercentualeRipartizione.GetValueOrDefault(),
                                    Version = conto.Version,
                                    IsDeleteAllow = conto.IsDeleteAllow()
                                };

                                if(conto.ContoRiferimento != null)
                                {
                                    contoDto.IdConto = conto.ContoRiferimento.ID;
                                    contoDto.DisplayName = conto.ContoRiferimento.Descrizione;

                                    // ----------------------------------------
                                    // Dettagli / Riparto
                                    // ----------------------------------------
                                    foreach (var dettaglio in conto.Unita)
                                    {
                                        try
                                        {
                                            var dettaglioDto = new DettaglioListaModelloRegistrazioneContabileDTO
                                            {
                                                ID = dettaglio.ID,
                                                IsDeleteAllow = dettaglio.IsDeleteAllow(),
                                            };

                                            if (dettaglio.LottoRiferimento != null)
                                                dettaglioDto.IdLotto = dettaglio.LottoRiferimento.ID;
                                            if (dettaglio.PalazzinaRiferimento != null)
                                                dettaglioDto.IdStabile = dettaglio.PalazzinaRiferimento.ID;
                                            if (dettaglio.GruppoStabileRiferimento != null)
                                                dettaglioDto.IdGruppoStabile = dettaglio.GruppoStabileRiferimento.ID;
                                            if (dettaglio.UnitaRiferimento != null)
                                                dettaglioDto.IdUnita = dettaglio.UnitaRiferimento.ID;

                                            contoDto.Riparto.Add(dettaglioDto);
                                        }
                                        catch (Exception ex)
                                        {
                                            _log.ErrorFormat("Errore inaspettato durante la lettura dei modelli per condominio - SINGOLO DETTAGLIO - {0} - idConto:{1} - idDettaglio:{2} - idModello:{3} - idCondominio:{4}", ex, Library.Utility.GetMethodDescription(), conto.ID, dettaglio.ID, modello.ID, idCondominio);
                                            throw;
                                        }
                                    }
                                }
                                else
                                {
                                    _log.WarnFormat("ATTENZIONE Modello con riga di riparto senza conto definito - {0} - idConto:{1} - idModello:{2} - idCondominio:{3}", Library.Utility.GetMethodDescription(), conto.ID, modello.ID, idCondominio);
                                }
                                
                                if (conto.SottoContoRiferimento != null)
                                {
                                    contoDto.IdSottoConto = conto.SottoContoRiferimento.ID;
                                    contoDto.DisplayName += " - " + conto.SottoContoRiferimento.GetDescrizione(null, condominio, null);
                                }

                                dto.Conti.Add(contoDto);
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore inaspettato durante la lettura dei modelli per condominio - SINGOLO CONTO - {0} - idConto:{1} - idModello:{2} - idCondominio:{3}",  ex, Library.Utility.GetMethodDescription(), conto.ID, modello.ID, idCondominio);
                                throw;
                            }
 
                        }

                        // ----------------------------------------
                        // Fornitori
                        // ----------------------------------------
                        foreach (var modelloFornitore in modello.Fornitori)
                        {
                            var dtoFornitore = new ModelloContabileFornitoreDTO
                            {
                                ID = modelloFornitore.ID,
                                IdFornitore = modelloFornitore.Fornitore.ID,
                                IdModello = modello.ID,
                                DisplayName = modelloFornitore.Fornitore.DisplayName,
                                Version = modelloFornitore.Version
                            };

                            dto.Fornitori.Add(dtoFornitore);
                        }

                        modelliDto.Add(dto);
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore inaspettato durante la lettura dei modelli per condominio - SINGOLO MODELLO - {0} - idModello:{1} - idCondominio:{2}", ex, Library.Utility.GetMethodDescription(), modello.ID, idCondominio);
                        throw;
                    }
                }

                return modelliDto;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la lettura dei modelli per condominio - {0} - idCondominio:{1}", ex, Library.Utility.GetMethodDescription(), idCondominio);
                throw;
            }
        }