private bool insert(UnitaImmobiliareDTO dto, out UnitaImmobiliare item)
		{
			var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);

		    try
			{
				if(dto.CodiceTipo == 0)
				{
					dto.CodiceTipo = 1;
					_log.WarnFormat("Tentativo di inserire una unità immobiliare con TIPO non definito - {0} - id:{1}", Utility.GetMethodDescription(), dto.ID);
				}

                // Se non viene trovato il tipo per default: Abitazione bugid#3727
			    var tipoUnitaImmobiliare = daoFactory.GetTipoUnitaImmobiliareDao().Find(dto.CodiceTipo, false) ?? daoFactory.GetTipoUnitaImmobiliareDao().GetById(1, false);
			    item = new UnitaImmobiliare(tipoUnitaImmobiliare, dto.IdAzienda);
	  
				if (dto.GruppoStabileRiferimento != null)
					item.GruppoStabileRiferimento = daoFactory.GetGruppoStabileDao().GetById(dto.GruppoStabileRiferimento.ID, false);
				item.Descrizione = dto.Descrizione;
				item.EstensioneInterno = dto.EstensioneInterno;
				item.FoglioCatastale = dto.FoglioCatastale;
				item.Interno = dto.Interno;
				item.Mappale = dto.Mappale;
				item.Note = dto.Note;
				item.Piano = dto.Piano;
				item.NumeroResidenti = dto.NumeroResidenti.GetValueOrDefault();
				item.Subalterno = dto.Subalterno;
				item.Ordine = dto.Ordine;
				item.ValoreMillesimo = dto.ValoreMillesimo;
				item.ValoreMillesimoStabile = dto.ValoreMillesimoStabile;
			    item.EsclusaAddebitoQuotaFissa = dto.EsclusaAddebitoQuotaFissa;
                item.CodiceImportazione = dto.CodiceImportazione;
				item.ValoreMillesimoScala = dto.ValoreMillesimoScala;
                
                if (string.IsNullOrEmpty(dto.Descrizione))
			    {
                    item.Descrizione = daoFactory.GetUnitaImmobiliareDao().GetUnitaImmobiliareDescrizione(item);
                    item.DescrizioneUnitaImmobiliareAutomatica = true;
			    }

                if (item.GruppoStabileRiferimento != null)
                {
				    if (item.FoglioCatastale == null)
					    item.FoglioCatastale = item.GruppoStabileRiferimento.PalazzinaRiferimento.CondominioRiferimento.FoglioCatastale;
				    if (item.Mappale == null)
					    item.Mappale = item.GruppoStabileRiferimento.PalazzinaRiferimento.CondominioRiferimento.MappaleCatastale;
                }

				daoFactory.GetUnitaImmobiliareDao().SaveOrUpdate(item);

				//Lista Soggetti
				item.Soggetti.Clear();
				foreach (var t in dto.Soggetti)
				{
				    t.IdUnitaImmobiliare = item.ID;
				    _id = t.ID;
				    if ((t.Stato == "U") || (t.Stato == "I"))
				        _id = getSoggettoRepository().ManageDomainEntity(t);

				    var soggDomain = daoFactory.GetSoggettoCondominioDao().Find(_id.GetValueOrDefault(), false);
                    if (soggDomain != null)
                    {
                        soggDomain.UnitaImmobiliare = item;
                        item.Soggetti.Add(soggDomain);
                    }
				}

                // Condizioni Sicurezza Impianto
                updateCondizioniSicurezzaImpianto(dto.CondizioniSicurezzaImpianto, item, daoFactory);

                // Dettaglio
                item.Dettaglio.Clear();
                foreach (var unitaImmobiliareDettaglioDTO in dto.Dettaglio)
                {
                    // Se non viene trovato il tipo per default: Abitazione bugid#3727
                    var tipo = daoFactory.GetTipoUnitaImmobiliareDao().Find(unitaImmobiliareDettaglioDTO.IdTipoUnita, false) ?? daoFactory.GetTipoUnitaImmobiliareDao().GetById(1, false);
                    UnitaImmobiliareDettaglio itemDettaglio = null;
                    if (unitaImmobiliareDettaglioDTO.ID > 0)
                        itemDettaglio = daoFactory.GetUnitaImmobiliareDettaglioDao().Find(unitaImmobiliareDettaglioDTO.ID, false);
                    if (itemDettaglio == null)
                        itemDettaglio = new UnitaImmobiliareDettaglio(item, tipo, unitaImmobiliareDettaglioDTO.Numero);

                    itemDettaglio.TipoUnita = tipo;
                    itemDettaglio.Numero = unitaImmobiliareDettaglioDTO.Numero;
                    itemDettaglio.Subalterno = unitaImmobiliareDettaglioDTO.Subalterno;
                    itemDettaglio.Unita = item;
                }
			}
			catch (Exception ex)
			{
				_log.ErrorFormat("Errore nel salvataggio delle Unita Immobiliari -  {0} - id:{1}", ex, Utility.GetMethodDescription(), dto.ID);
				throw;
			}
			return true;
		}
		private bool update(UnitaImmobiliareDTO dto, out UnitaImmobiliare item)
		{
			var result = false;
			item = null;
			var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);

			try
			{
				item = daoFactory.GetUnitaImmobiliareDao().Find(dto.ID, false);

                if (item != null)
                {
                    // Condizione necessare per il controllo del fatto che sul DB ho una versione uguale o più vecchia
                    // Per ora non viene eseguito il controllo
                    if (dto.Version == item.Version || true)
                    {
                        if (dto.IdAzienda > 0)
                            item.AziendaID = dto.IdAzienda;
                        item.EstensioneInterno = dto.EstensioneInterno;
                        item.FoglioCatastale = dto.FoglioCatastale;
                        item.Interno = dto.Interno;
                        item.Mappale = dto.Mappale;
                        item.Note = dto.Note;
                        item.Subalterno = dto.Subalterno;
                        item.Piano = dto.Piano;
                        item.Ordine = dto.Ordine;
                        item.NumeroResidenti = dto.NumeroResidenti.GetValueOrDefault();
                        item.ValoreMillesimo = dto.ValoreMillesimo;
                        item.ValoreMillesimoStabile = dto.ValoreMillesimoStabile;
                        item.ValoreMillesimoScala = dto.ValoreMillesimoScala;
                        item.EsclusaAddebitoQuotaFissa = dto.EsclusaAddebitoQuotaFissa;
                        item.CodiceImportazione = dto.CodiceImportazione;

                        if (string.IsNullOrEmpty(dto.Descrizione))
                        {
                            item.Descrizione = daoFactory.GetUnitaImmobiliareDao().GetUnitaImmobiliareDescrizione(item);
                            item.DescrizioneUnitaImmobiliareAutomatica = true;
                        }
                        else if(item.Descrizione != dto.Descrizione)
                        {
                            item.Descrizione = dto.Descrizione;
                            item.DescrizioneUnitaImmobiliareAutomatica = false;
                        }

                        if (dto.CodiceTipo > 0)
                        {
                            var tipo = daoFactory.GetTipoUnitaImmobiliareDao().Find(dto.CodiceTipo, false);
                            if (tipo != null)
                                item.TipoUnitaImmobiliare = tipo;
                        }

                        if (dto.GruppoStabileRiferimento != null)
                        {
                            _id = dto.GruppoStabileRiferimento.ID;
                            if ((dto.GruppoStabileRiferimento.Stato == "U") || (dto.GruppoStabileRiferimento.Stato == "I"))
                                _id = getGruppoStabileRepository().ManageDomainEntity(dto.GruppoStabileRiferimento);

                            item.GruppoStabileRiferimento = daoFactory.GetGruppoStabileDao().GetById(_id.GetValueOrDefault(), false);
                        }

                        //Lista Soggetti
                        item.Soggetti.Clear();
                        foreach (var t in dto.Soggetti)
                        {
                            _id = t.ID;
                            if ((t.Stato == "U") || (t.Stato == "I") || (t.Stato == "D"))
                                _id = getSoggettoRepository().ManageDomainEntity(t);

                            if (_id != null)
                            {
                                var soggDomain = daoFactory.GetSoggettoCondominioDao().Find(_id.Value, false);
                                if (soggDomain != null)
                                {
                                    soggDomain.UnitaImmobiliare = item;
                                    item.Soggetti.Add(soggDomain);
                                }
                            }
                        }

                        // Descrizione Unità Immobiliare
                        item.Descrizione = daoFactory.GetUnitaImmobiliareDao().GetUnitaImmobiliareDescrizione(item);

                        // Condizioni Sicurezza Impianto
                        updateCondizioniSicurezzaImpianto(dto.CondizioniSicurezzaImpianto, item, daoFactory);

                        // Dettaglio
                        item.Dettaglio.Clear();
                        foreach (var unitaImmobiliareDettaglioDTO in dto.Dettaglio)
                        {
                            // Se non viene trovato il tipo per default: Abitazione bugid#3727
                            var tipo = daoFactory.GetTipoUnitaImmobiliareDao().Find(unitaImmobiliareDettaglioDTO.IdTipoUnita, false) ?? daoFactory.GetTipoUnitaImmobiliareDao().GetById(1, false);
                            UnitaImmobiliareDettaglio itemDettaglio = null;
                            if (unitaImmobiliareDettaglioDTO.ID > 0)
                                itemDettaglio = daoFactory.GetUnitaImmobiliareDettaglioDao().Find(unitaImmobiliareDettaglioDTO.ID, false);
                            if (itemDettaglio == null)
                                itemDettaglio = new UnitaImmobiliareDettaglio(item, tipo, unitaImmobiliareDettaglioDTO.Numero);

                            itemDettaglio.TipoUnita = tipo;
                            itemDettaglio.Subalterno = unitaImmobiliareDettaglioDTO.Subalterno;
                            itemDettaglio.Numero = unitaImmobiliareDettaglioDTO.Numero;
                            itemDettaglio.Unita = item;
                            item.Dettaglio.Add(itemDettaglio);
                        }

                        result = true;
                    }
                    else
                    {
                        // Eccezione: Sul db c'è qualche cosa di più nuovo.
                        
                        _log.Error("Errore nel salvataggio dell'unità immobiliare: id:" + dto.ID + " - il dato sul db è più recente di quello che si vuole salvare");
                    }
                }
			}
			catch (Exception ex)
			{
				_log.ErrorFormat("Errore nel salvataggio dell'unita immobiliare - {0} - id:{1}", ex, Utility.GetMethodDescription(), dto.ID);
				throw;
			}

			return result;
		}