Exemplo n.º 1
0
        public static UnitaImmobiliare GetCondominioMonoScalaMonoProprietario()
        {
            var azienda = new Azienda("TEST", "Azienda di Test") { ID = 1 };
            var condominio = new Condominio("Test", 31, 12, 2014, azienda);
            var stabile = new Palazzina(condominio, "Stabile A - TEST");
            var scala = new GruppoStabile(stabile, "Scala A - TEST");
            var tipo = new TipoUnitaImmobiliare("Abitazione");
            var unitaImmobiliare = new UnitaImmobiliare(scala, tipo);

            // Esercizio
            var annoGestionale = new AnnoGestionale(condominio, 2013, 2014);
            var esercizio = new Esercizio(condominio, new DateTime(2014, 1, 1), new DateTime(2014, 12, 31), annoGestionale, GestioneEsercizioEnum.Ordinario);
            condominio.Esercizi.Add(esercizio);

            // Proprietario
            var persona = new Persona(TipoPersonaEnum.Fisica, "Pinco", "Pallo", azienda.ID, true);
            var proprietario = new Proprietario(unitaImmobiliare, persona)
            {
                PercentualeRiferimento = 100,
                Principale = true
            };
            unitaImmobiliare.Soggetti.Add(proprietario);

            return unitaImmobiliare;
        }
Exemplo n.º 2
0
        protected void SetUp()
        {
            var mocks = new MockRepository();

            var azienda = new Azienda("PROV", "Azienda di prova");
            var condominio = new Condominio("Condominio di prova", 31, 12, 2012, azienda);

            var stabile = new Palazzina(condominio, "Stabile di prova", false);
            condominio.Palazzine.Add(stabile);

            var scala = new GruppoStabile(stabile, "Scala di prova");
            var tipoUnitaImmobiliare = new TipoUnitaImmobiliare("Abitazione");
            var unitaImmobiliare = new UnitaImmobiliare(scala, tipoUnitaImmobiliare);
            var annoGestionale = new AnnoGestionale(condominio, 2012, 2012);
            _esercizio = new Esercizio(condominio, new DateTime(2012, 1, 1), new DateTime(2012, 12, 31), annoGestionale, GestioneEsercizioEnum.Ordinario);

            _subentroRepository = mocks.Stub<ISubentroUnitaImmobiliareDao>();

            var subentro1 = mocks.Stub<SubentroUnitaImmobiliare>();
            subentro1.SoggettoEntrante = new SoggettoCondominio(unitaImmobiliare, new Persona(TipoPersonaEnum.Fisica, "Giorgio", "Parmeggiani", 1, true));
            subentro1.SoggettoUscente = new SoggettoCondominio(unitaImmobiliare, new Persona(TipoPersonaEnum.Fisica, "Daniele", "Vaccari", 1, true));

            var subentro2 = mocks.Stub<SubentroUnitaImmobiliare>();
            subentro1.SoggettoEntrante = new SoggettoCondominio(unitaImmobiliare, subentro1.SoggettoUscente.Persona);
            subentro1.SoggettoUscente = new SoggettoCondominio(unitaImmobiliare, new Persona(TipoPersonaEnum.Fisica, "Luigi", "Cacciatori", 1, true));

            using (mocks.Record())
            {
                SetupResult.For(_subentroRepository.GetByDataCondominio(_esercizio.CondominioRiferimento.ID, _esercizio.DataApertura.GetValueOrDefault(), _esercizio.DataChiusura.GetValueOrDefault(), false)).Return(new List<SubentroUnitaImmobiliare> { subentro1, subentro2 });
            }

        }
Exemplo n.º 3
0
        public void SetUp()
        {
            _documentService = MockRepository.GenerateStub<IDocumentService>();
            _fileSystem = MockRepository.GenerateStub<IFileSystem>();

            const string str = "Documento Bolletta di Prova";
            _documentoSpesa = new byte[str.Length * sizeof(char)];
            Buffer.BlockCopy(str.ToCharArray(), 0, _documentoSpesa, 0, _documentoSpesa.Length);

            _fileSystem = MockRepository.GenerateStub<IFileSystem>();
            _fileSystem.Stub(x => x.ReadAllBytes(Arg<string>.Is.Anything)).Return(_documentoSpesa);

            IList<Spesa> listaSpese = new List<Spesa>();
            _utente = new Utente("PP");
            _logTransazione = new LogTransazione(AzioneUtente.TransazioneContabile, _utente, Guid.NewGuid().ToString());

            _azienda = new Azienda("PROV", "Prova") { ID = 1 };
            _condominio1 = new Condominio("Condominio 1", 31, 12, 2014, _azienda) { CodiceFiscale = "91138030373" };
            _annoGestionaleCondominio1 = new AnnoGestionale(_condominio1, 2014, 2014);
            _esercizioCondominio1 = new Esercizio(_condominio1, new DateTime(2014, 1, 1), new DateTime(2014, 12, 31), _annoGestionaleCondominio1, GestioneEsercizioEnum.Ordinario);

            _condominio2 = new Condominio("Condominio 2", 31, 12, 2014, _azienda) { CodiceFiscale = "90036640374" };
            _annoGestionaleCondominio2 = new AnnoGestionale(_condominio2, 2014, 2014);
            _esercizioCondominio2 = new Esercizio(_condominio2, new DateTime(2014, 1, 1), new DateTime(2014, 12, 31), _annoGestionaleCondominio2, GestioneEsercizioEnum.Ordinario);

            _persona = new Persona(TipoPersonaEnum.Fisica, "Mario", "Rossi", _azienda.ID, true);
            _fornitore = new Fornitore(_persona, _azienda.ID);

            _documentiBolletteDTO = buildDocumentoBolletteDTO();
            foreach (var documentoBollettaDTO in _documentiBolletteDTO)
            {
                var esercizio = _esercizioCondominio1;
                if (documentoBollettaDTO.CodiceFiscaleCliente == _condominio2.CodiceFiscale)
                    esercizio = _esercizioCondominio2;

                listaSpese.Add(new Spesa(_fornitore, esercizio, _logTransazione) { ID = documentoBollettaDTO.IdSpesa, NumeroDocumento = documentoBollettaDTO.NumeroDocumento, DataDocumento = documentoBollettaDTO.DataDocumento });
            }

            _daoFactory = MockRepository.GenerateStub<IDaoFactory>();

            _daoFactory.Stub(x => x.GetCondominioDao().GetByCodiceFiscale(_condominio1.CodiceFiscale)).Return(_condominio1);
            _daoFactory.Stub(x => x.GetCondominioDao().GetByCodiceFiscale(_condominio2.CodiceFiscale)).Return(_condominio2);

            _spesaDao = MockRepository.GenerateStub<ISpesaDao>();
            _documentoDao = MockRepository.GenerateStub<IDocumentoDao>();

            _daoFactory.Stub(x => x.GetSpesaDao()).Return(_spesaDao);
            _daoFactory.Stub(x => x.GetDocumentoDao()).Return(_documentoDao);

            foreach (var spesa in listaSpese)
                _spesaDao.Stub(x => x.Find(spesa.ID, false)).Return(spesa);

            _utenzaDocumentoService = MockRepository.GenerateMock<UtenzaDocumentoService>(_daoFactory, _documentService, _fileSystem);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Crea uno Esercizio Ordinario valido
        /// </summary>
        public Esercizio(Condominio condominio, DateTime? dataApertura, DateTime? dataChiusura, AnnoGestionale annoGestionale, GestioneEsercizioEnum gestione)
        {
            ProgressivoRegistrazioneContabile = 1;
            CondominioRiferimento = condominio;
            DataApertura = dataApertura;
            DataChiusura = dataChiusura;
            AnnoGestionale = annoGestionale;
            Gestione = gestione;
            Stato = StatoEsercizioEnum.Aperto;
            BloccoSaldi = false;

            if(CondominioRiferimento != null)
                CondominioRiferimento.Esercizi.Add(this);
            if (AnnoGestionale != null)
                AnnoGestionale.Esercizi.Add(this);
        }
Exemplo n.º 5
0
        private void addDefault(Condominio item, bool loadContiStudio)
        {
            var annoGestionale = new AnnoGestionale(item, item.AnnoInizio, item.AnnoInizio);
            _daoFactory.GetAnnoGestionaleDao().SaveOrUpdate(annoGestionale);
            var dataChiusuraEsercizio = new DateTime(item.AnnoInizio, item.MeseChiusuraEsercizioOrdinario, item.GiornoChiusuraEsercizioOrdinario);
            var dataAperturaEsercizio = dataChiusuraEsercizio.AddDays(1).AddYears(-1);
            var esercizio = new Esercizio(item, dataAperturaEsercizio, dataChiusuraEsercizio, annoGestionale, GestioneEsercizioEnum.Ordinario);
            annoGestionale.AnnoFinale = esercizio.DataChiusura.GetValueOrDefault().Year;
            _daoFactory.GetEsercizioDao().SaveOrUpdate(esercizio);
            item.Esercizi.Add(esercizio);

            IList<PianoConti> conti = _daoFactory.GetPianoContiDao().GetByAzienda(item.Azienda.ID);
            foreach (PianoConti pianoConto in conti)
            {
                if(pianoConto.IsRequired || loadContiStudio)
                    pianoConto.ConvertToConto(item);
            }
        }
Exemplo n.º 6
0
        public string LoadCondominioOLD(byte[] database, string codiceCondominio, TipoSaldi tipoSaldi, int idAzienda, string password)
        {
            string message = string.Empty;

            try
            {

                // -----------------------------------------------------------------------------------------------------------
                //  Decompressione del database
                // -----------------------------------------------------------------------------------------------------------
                const string databasePath = @"C:\temp\y.mdb";
                var fsOut = new FileStream(databasePath, FileMode.Create, FileAccess.Write, FileShare.None);
                var gZipStream = new GZipStream(new MemoryStream(database), CompressionMode.Decompress);

                const int bufferSize = 4096;
                var b = new byte[bufferSize];
                
                while (true)
                {
                    int n = gZipStream.Read(b, 0, b.Length);
                    if (n > 0)
                        fsOut.Write(b, 0, n);
                    else
                        break;
                }
                fsOut.Close();
                fsOut.Dispose();

                // ===========================================================================================================
                //  Lettura Tabelle
                // ===========================================================================================================

                // ----------------------------------------------------------------------------------
                //  Condomini
                // ----------------------------------------------------------------------------------
                var conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; User Id=; Jet OLEDB:Database Password="******"; Data Source=" + databasePath);
                var condominioAdapter = new OleDbDataAdapter("SELECT * FROM Stabili WHERE S_COD_STA=" + codiceCondominio, conn);

                var azienda = _daoFactory.GetAziendaDao().GetById(idAzienda, false);

                var dsCondomini = new DataSet("Condomini");
                condominioAdapter.Fill(dsCondomini, "Stabili");

                var rowCondominio = dsCondomini.Tables["Stabili"].Rows[0];
                var dataFineEsercizio = (DateTime)rowCondominio["S_FIN_ESE"];

                var condominio = _daoFactory.GetCondominioDao().GetByCodice(codiceCondominio.PadLeft(3, '0'), azienda.ID);
                if (condominio == null)
                {
                    condominio = new Condominio(rowCondominio["S_NOME"].ToString(), dataFineEsercizio.Day, dataFineEsercizio.Month, dataFineEsercizio.Year + 1, azienda)
                    {
                        Codice = codiceCondominio.PadLeft(3, '0'),
                        Indirizzo =
                            new Address
                                {
                                    Indirizzo = rowCondominio["S_VIA"].ToString(),
                                    Cap = rowCondominio["S_CAP"].ToString()
                                }
                    };

                    // Indirizzo
                    if (rowCondominio["S_LOCALITA"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_LOCALITA"].ToString()))
                    {
                        var comuni = _daoFactory.GetComuneDao().GetByDescrizione(rowCondominio["S_LOCALITA"].ToString().Trim());
                        if (comuni.Count == 1)
                            condominio.Indirizzo.Comune = comuni[0];
                        else
                            condominio.Indirizzo.Localita = rowCondominio["S_LOCALITA"].ToString();
                    }

                    _daoFactory.GetCondominioDao().SaveOrUpdate(condominio);

                    addDefault(condominio, true);
                }
                else
                { 
                    // Eliminazione vecchi dati
                    foreach(var unita in _daoFactory.GetUnitaImmobiliareDao().GetByCondominio(condominio.ID))
                    {
                        foreach (var mill in unita.Millesimi)
                        {
                            mill.ContoRiferimento.Millesimi.Remove(mill);
                            _daoFactory.GetMillesimoDao().Delete(mill);
                        }
                        unita.Millesimi.Clear();
                        unita.GruppoStabileRiferimento.UnitaImmobiliari.Remove(unita);
                        _daoFactory.GetUnitaImmobiliareDao().Delete(unita);
                    }

                    foreach (var stabileDelete in condominio.Palazzine)
                    {
                        foreach (var gruppo in stabileDelete.GruppiStabile)
                        {
                            _daoFactory.GetGruppoStabileDao().Delete(gruppo);
                        }
                        _daoFactory.GetPalazzinaDao().Delete(stabileDelete);
                    }
                    condominio.Palazzine.Clear();

                    var stabileFirst = new Palazzina(condominio, "Stabile A");
                    _daoFactory.GetPalazzinaDao().SaveOrUpdate(stabileFirst);

                    // Dati Bancari
                    foreach (var banca in condominio.DatiBancari)
                    {
                        foreach (var mov in banca.MovimentiBancari)
                            _daoFactory.GetMovimentoBancarioDao().Delete(mov);

                        _daoFactory.GetDatiBancariCondominiDao().Delete(banca);
                    }
                    condominio.DatiBancari.Clear();

                    // Piano Conti
                    foreach (var contoDelete in condominio.Conti)
                        _daoFactory.GetContoDao().Delete(contoDelete);
                    condominio.Conti.Clear();

                    // Esercizi
                    foreach(var esercizioDelete in condominio.Esercizi)
                    {
                        esercizioDelete.AnnoGestionale.Esercizi.Remove(esercizioDelete);
                        _daoFactory.GetEsercizioDao().Delete(esercizioDelete);
                    }
                    condominio.Esercizi.Clear();

                    // Anno Gestionale
                    foreach(var anno in condominio.AnniGestionali)
                        _daoFactory.GetAnnoGestionaleDao().Delete(anno);
                    condominio.AnniGestionali.Clear();

                    // -------------------------------------
                    //  Default del condominio
                    // -------------------------------------

                    // Conti comuni del Piano dei conti
                    var conti = _daoFactory.GetPianoContiDao().GetByAzienda(idAzienda);
                    foreach (var pianoConto in conti)
                        pianoConto.ConvertToConto(condominio);

                    // Nuovo esercizio
                    var inizioEsercizioOld = (DateTime)rowCondominio["S_INI_ESE"];
                    var fineEsercizioOld = (DateTime)rowCondominio["S_FIN_ESE"];
                    var annoNew = new AnnoGestionale(condominio, inizioEsercizioOld.AddYears(1).Year, fineEsercizioOld.AddYears(1).Year);
                    _daoFactory.GetAnnoGestionaleDao().SaveOrUpdate(annoNew);
                    var esercizioNew = new Esercizio(condominio, inizioEsercizioOld.AddYears(1), fineEsercizioOld.AddYears(1), annoNew, GestioneEsercizioEnum.Ordinario);
                    _daoFactory.GetEsercizioDao().SaveOrUpdate(esercizioNew);
                }

                if (rowCondominio["S_NOTE"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_NOTE"].ToString()))
                    condominio.Note = rowCondominio["S_NOTE"].ToString();

                if (rowCondominio["S_COD_SIA"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_COD_SIA"].ToString()))
                    condominio.CodiceSIA = rowCondominio["S_COD_SIA"].ToString().Trim();

                if (rowCondominio["S_COD_FISCALE"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_COD_FISCALE"].ToString()))
                    condominio.CodiceFiscale = rowCondominio["S_COD_FISCALE"].ToString().Trim();

                if (rowCondominio["S_IBAN_COMPLETO"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_IBAN_COMPLETO"].ToString()))
                {
                    var datiBancari = new DatiBancariCondomini(rowCondominio["S_IBAN_COMPLETO"].ToString().Trim(), condominio);
                    condominio.DatiBancari.Add(datiBancari);
                }
                else if (rowCondominio["S_ABI"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_ABI"].ToString()) && rowCondominio["S_CAB"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_CAB"].ToString()) && rowCondominio["S_NR_CC"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_NR_CC"].ToString()))
                {
                    var coor = new CoordinateBancarie
                    {
                        Abi = rowCondominio["S_ABI"].ToString().Trim().PadLeft(5, '0'),
                        Cab = rowCondominio["S_CAB"].ToString().Trim().PadLeft(5, '0'),
                        ContoCorrente = rowCondominio["S_NR_CC"].ToString().Trim().PadLeft(12, '0')
                    };

                    var datiBancari = new DatiBancariCondomini(coor.CalcolaIBAN(), condominio);
                    condominio.DatiBancari.Add(datiBancari);
                }

                // Scale
                var stabile = Library.IesiGenericCollections<Palazzina>.GetByIndex(condominio.Palazzine, 0);
                var scala = Library.IesiGenericCollections<GruppoStabile>.GetByIndex(stabile.GruppiStabile, 0);
                var firstScala = true;

                for(int i=1; i<=52; i++)
                {
                    if (rowCondominio["S_DES_CIV" + i.ToString().PadLeft(2, '0')] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["S_DES_CIV" + i.ToString().PadLeft(2, '0')].ToString()))
                    {
                        if(firstScala && scala != null)
                        {
                            scala.Descrizione = rowCondominio["S_DES_CIV" + i.ToString().PadLeft(2, '0')].ToString();
                            scala.Indirizzo = new Address {Indirizzo = condominio.Indirizzo.Indirizzo};
                            firstScala = false;
                        }
                        else
                        {
                            var scalaNew = new GruppoStabile(stabile, rowCondominio["S_DES_CIV" + i.ToString().PadLeft(2, '0')].ToString()) {Indirizzo = {Indirizzo = condominio.Indirizzo.Indirizzo}};
                            stabile.GruppiStabile.Add(scalaNew);
                            _daoFactory.GetGruppoStabileDao().SaveOrUpdate(scalaNew);
                        }
                    }
                }
                if (firstScala && scala != null)
                {
                    scala.Indirizzo = new Address {Indirizzo = condominio.Indirizzo.Indirizzo};
                }
                
                // ----------------------------------------------------------------------------------
                //  Piano dei conti
                // ----------------------------------------------------------------------------------
                var pianoContiAdapter = new OleDbDataAdapter("SELECT * FROM PiaContS WHERE PS_COD_STA=" + codiceCondominio, conn);
                pianoContiAdapter.Fill(dsCondomini, "PianoConti");

                var loadedConti = new Dictionary<int, Conto>();
                var tbPianoConti = dsCondomini.Tables["PianoConti"];
                Conto conto = null;
                var indexConto = 0;
                foreach (DataRow row in tbPianoConti.Rows)
                {
                    try
                    {
                        conto = loadContoSottoconto(row, condominio, conto, loadedConti, string.Empty, ref indexConto);
                    }
                    catch (Exception ex)
                    {
                        
                        _log.Error("Errore inaspettato nell'importazione di un condominio da YStabili - (Piano dei conti) - " + Library.Utility.GetMethodDescription() + " - PS_CONTO:" + row["PS_CONTO"] + " - PS_SOTTOC:" + row["PS_SOTTOC"], ex);

                        throw;
                    }
                }

                // ----------------------------------------------------------------------------------
                //  Anagrafiche
                // ----------------------------------------------------------------------------------
                var unitaAdapter = new OleDbDataAdapter("SELECT * FROM Unita WHERE U_COD_STA=" + codiceCondominio, conn);
                var soggettiAdapter = new OleDbDataAdapter("SELECT * FROM Condomini WHERE C_COD_STA=" + codiceCondominio, conn);
                unitaAdapter.Fill(dsCondomini, "Unita");
                soggettiAdapter.Fill(dsCondomini, "Condomini");

                var tbUnita = dsCondomini.Tables["Unita"];
                var tbAnagrafiche = dsCondomini.Tables["Condomini"];

                // Unità Immobiliari
                UnitaImmobiliare lastUnita = null;
                int ordineUnita = 0;
                foreach (DataRow row in tbUnita.Rows)
                {
                    try
                    {
                        var soggetti = tbAnagrafiche.Select("C_COD_STA = " + row["U_COD_STA"] + " AND C_COD_UNITA = " + row["U_COD_UNITA"]);
                        UnitaImmobiliare unitaCorrente;
                        if (soggetti.Length == 1 && isConduttore(soggetti[0]))
                            unitaCorrente = lastUnita;
                        else
                        {
                            var indexScala = 0;
                            if (row["U_NR_CIVICO"] != DBNull.Value && !string.IsNullOrEmpty(row["U_NR_CIVICO"].ToString()))
                                indexScala = int.Parse(row["U_NR_CIVICO"].ToString()) - 1;
                            var scalaCorrente = Library.IesiGenericCollections<GruppoStabile>.GetByIndex(stabile.GruppiStabile, indexScala);
                            ordineUnita++;
                            unitaCorrente = new UnitaImmobiliare(scalaCorrente, _daoFactory.GetTipoUnitaImmobiliareDao().GetById(1, false))
                            {
                                Ordine = ordineUnita,
                                Descrizione = row["U_DESC_UNITA"].ToString(),
                                AziendaID = idAzienda,
                                CodiceImportazione = row["U_COD_STA"] + "&" + row["U_COD_UNITA"]
                            };
                            lastUnita = unitaCorrente;
                            _daoFactory.GetUnitaImmobiliareDao().SaveOrUpdate(unitaCorrente);
                        }

                        var soggettiCondominio = setSoggettiUnita(unitaCorrente, soggetti);

                        if (soggettiCondominio.Count > 0)
                        {
                            // Saldi inizio esercizio
                            setSaldiInizioEsercizio(row, soggettiCondominio, tipoSaldi);

                            // Millesimi
                            setMillesimi(row, unitaCorrente, loadedConti);
                        }
                    }
                    catch(Exception ex)
                    {
                        
                        _log.Error("Errore inaspettato nell'importazione di un condominio da YStabili - (Unità Immobiliare) - " + Library.Utility.GetMethodDescription() + " - U_COD_STA:" + row["U_COD_STA"] + " - U_COD_UNITA:" + row["U_COD_UNITA"], ex);

                        throw;
                    }
                }
            }
            catch (OleDbException ex)
            {
                message = ex.Message;
                
                _log.Error("Errore inaspettato nell'importazione di un condominio da YStabili: " + Library.Utility.GetMethodDescription() + " - message: " + message, ex);
            }
            catch (Exception ex)
            {
                message = ex.Message;
                
                _log.Error("Errore inaspettato nell'importazione di un condominio da YStabili: " + Library.Utility.GetMethodDescription() + " - message: " + message, ex);
            }

            return message;
        }
Exemplo n.º 7
0
 public AperturaEsercizio(AnnoGestionale annoGestionale, Esercizio esercizio, Conto contoVersamentoCondomini)
 {
     AnnoGestionale = annoGestionale;
     Esercizio = esercizio;
     ContoVersamentoCondomini = contoVersamentoCondomini;
 }
Exemplo n.º 8
0
        private AnnoGestionaleDTO setAnnoGestionaleDto(AnnoGestionale item)
        {
            var dto = new AnnoGestionaleDTO
            {
                ID = item.ID,
                AnnoFinale = item.AnnoFinale.GetValueOrDefault(),
                AnnoIniziale = item.AnnoIniziale.GetValueOrDefault(),
                IdEsercizioOrdinario = item.EsercizioOrdinario.ID,
                DisplayName = item.EsercizioOrdinario.DisplayName
            };

            return dto;
        }
Exemplo n.º 9
0
        private bool insert(CondominioDTO dto, out Condominio item)
        {
            var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
            bool result;
            try
            {
                try
                {
                    if (!dto.IsSupercondominio)
                    {
                        var azienda = daoFactory.GetAziendaDao().GetById(dto.AziendaID, false);
                        item = new Condominio(dto.Descrizione, dto.GiornoChiusuraEsercizioOrdinario, dto.MeseChiusuraEsercizioOrdinario, dto.AnnoInizio, azienda);
                        daoFactory.GetCondominioDao().SaveOrUpdate(item);

                        item.TipoVersamentoDopoChiusura = dto.TipoVersamentoDopoChiusura;
                        item.TipoVersamentoPrimaApertura = dto.TipoVersamentoPrimaApertura;

                        // Piano Conti di default
                        var conti = daoFactory.GetPianoContiDao().GetByAzienda(dto.AziendaID);
                        foreach (var pianoConto in conti)
                            pianoConto.ConvertToConto(item);

                        // Esercizio di default
                        var annoGestionale = new AnnoGestionale(item, item.AnnoInizio, item.AnnoInizio);
                        daoFactory.GetAnnoGestionaleDao().SaveOrUpdate(annoGestionale);

                        // Data chiusura esercizio
                        if (item.AnnoInizio > 0 && item.MeseChiusuraEsercizioOrdinario > 0 && item.GiornoChiusuraEsercizioOrdinario > 0)
                        {
                            try
                            {
                                var dataChiusuraEsercizio = new DateTime(item.AnnoInizio, item.MeseChiusuraEsercizioOrdinario, item.GiornoChiusuraEsercizioOrdinario);
                                var dataAperturaEsercizio = dataChiusuraEsercizio.AddDays(1).AddYears(-1);
                                var esercizio = new Esercizio(item, dataAperturaEsercizio, dataChiusuraEsercizio, annoGestionale, GestioneEsercizioEnum.Ordinario);
                                annoGestionale.AnnoFinale = esercizio.DataChiusura.GetValueOrDefault().Year;
                                daoFactory.GetEsercizioDao().SaveOrUpdate(esercizio);
                                item.Esercizi.Add(esercizio);
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore nell'inserimento del condominio - La data di chiusura NON è valida - DATA CHIUSURA - {0} - anno:{1} - mese:{2} - giorno:{3} - id:{4} - azienda:{5}", ex, Utility.GetMethodDescription(), item.AnnoInizio, item.MeseChiusuraEsercizioOrdinario, item.GiornoChiusuraEsercizioOrdinario, dto.ID, dto.AziendaID);
                                throw;
                            }
                        }
                        else
                        {
                            _log.WarnFormat("Errore nell'inserimento del condominio - La data di chiusura NON è valida - DATA CHIUSURA - {0} - anno:{1} - mese:{2} - giorno:{3} - id:{4} - azienda:{5}", Utility.GetMethodDescription(), item.AnnoInizio, item.MeseChiusuraEsercizioOrdinario, item.GiornoChiusuraEsercizioOrdinario, dto.ID, dto.AziendaID);
                        }

                        // Descrizione Automatica Spesa
                        var impostazioniAzienda = daoFactory.GetImpostazioniAziendaDao().GetByAzienda(azienda.ID);
                        if (impostazioniAzienda != null)
                            item.DescrizioneSpeseAutomatica = impostazioniAzienda.DescrizioneSpeseAutomatica;
                    }
                    else
                    {
                        item = new SuperCondominio(dto.Descrizione, dto.GiornoChiusuraEsercizioOrdinario, dto.MeseChiusuraEsercizioOrdinario, dto.AnnoInizio, daoFactory.GetAziendaDao().GetById(dto.AziendaID, false));
                        daoFactory.GetSuperCondominioDao().SaveOrUpdate((SuperCondominio)item);
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nell'inserimento del condominio - {0} - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), dto.ID, dto.AziendaID);
                    throw;
                }

                // ------------------------------------------------------
                // Soggetto che presenta la parte della dichiarazione relativa ai contributi del dipendente
                // ------------------------------------------------------
                if (dto.IdFornitoreDichiarazione770 > 0)
                    item.FornitoreDichiarazione770 = daoFactory.GetFornitoreDao().GetById(dto.IdFornitoreDichiarazione770.GetValueOrDefault(), false);

                item.Codice = dto.Codice;
                item.CodiceFiscale = dto.CodiceFiscale;
                item.FormatoDescrizioneSpesa = dto.FormatoDescrizioneSpesa;
                item.FormatoDescrizioneMovimento = dto.FormatoDescrizioneMovimento;
                item.DescrizioneSpeseAutomatica = dto.DescrizioneSpeseAutomatica;
                item.IsAbilitataArchiviazioneOtticaPassivi = dto.IsAbilitataArchiviazioneOtticaPassivi;
                item.IsAbilitataArchiviazioneOtticaContratti = dto.IsAbilitataArchiviazioneOtticaContratti;
                item.IsSupercondominio = dto.IsSupercondominio;
                item.CodiceImportazione = dto.CodiceImportazione;
                item.CodiceCalcoloTariffaAcqua = dto.CodiceCalcoloTariffaAcqua;
                item.TemplateDescrizioneUnitaImmobiliare = dto.TemplateDescrizioneUnitaImmobiliare;

                if (string.IsNullOrEmpty(item.TemplateDescrizioneUnitaImmobiliare))
                {
                    var impostazioni = item.Azienda.Impostazioni.FirstOrDefault();
                    if (impostazioni != null)
                        item.TemplateDescrizioneUnitaImmobiliare = impostazioni.TemplateDescrizioneUnitaImmobiliare;
                }

                item.Note = dto.Note ?? string.Empty;

                #region Indirizzo

                try
                {
                    var civico = dto.Indirizzo.Civico;
                    if (!string.IsNullOrEmpty(civico) && civico.Length > 200)
                        civico = civico.Substring(0, 200);

                    item.Indirizzo = new Address
                                         {
                                             Indirizzo = dto.Indirizzo.Indirizzo,
                                             Civico = civico,
                                             Cap = dto.Indirizzo.Cap,
                                             Localita = dto.Indirizzo.Localita
                                         };

                    if (dto.Indirizzo.CodiceComune != null)
                        item.Indirizzo.Comune = daoFactory.GetComuneDao().GetById(dto.Indirizzo.CodiceComune, false);

                    // Georeferenziazione - Solo se è cambiato l'indirizzo per la georeferenziazione
                    string geoAddress = item.Indirizzo.GetGeoLocationAddress();
                    if (!string.IsNullOrEmpty(geoAddress))
                    {
                        var geoLocationService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IGeoLocationService>();
                        GeoCoordinate? latLong = geoLocationService.GetLatLong(geoAddress);
                        if (latLong != null)
                        {
                            if (item.GeoReferenziazione == null)
                                item.GeoReferenziazione = new GeoReference();
                            item.GeoReferenziazione.AddedDate = DateTime.Now;
                            item.GeoReferenziazione.AddressUsed = geoAddress;
                            item.GeoReferenziazione.Latitude = latLong.Value.Latitude;
                            item.GeoReferenziazione.Longitude = latLong.Value.Longitude;
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nell'inserimento del condominio - INDIRIZZO - {0} - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), dto.ID, dto.AziendaID);
                    throw;
                }

                #endregion Indirizzo

                #region Dati Catastali

                try
                {
                    item.MappaleCatastale = dto.MappaleCatastale;

                    if (dto.FoglioCatastale != null)
                        item.FoglioCatastale = dto.FoglioCatastale;
                    if (dto.GiornoAssemblea != null)
                        item.GiornoAssemblea = dto.GiornoAssemblea;
                    if (dto.MeseAssemblea != null)
                        item.MeseAssemblea = dto.MeseAssemblea;
                    item.LuogoAssemblea = dto.LuogoAssemblea;
                    item.NumeroUnitaImmobiliari = dto.UnitaImmobiliari;
                }
                catch (Exception ex)
                {
                    
                    _log.Error("Errore nell'inserimento del condominio - " + Utility.GetMethodDescription() + " - Dati Catastali - id:" + dto.ID.ToString() + " - Azienda: " + dto.AziendaID.ToString(), ex);
                    throw;
                }

                #endregion Dati Catastali

                #region Dati Esercizio

                item.GiornoChiusuraEsercizioOrdinario = dto.GiornoChiusuraEsercizioOrdinario;
                item.MeseChiusuraEsercizioOrdinario = dto.MeseChiusuraEsercizioOrdinario;
                item.AnnoInizio = dto.AnnoInizio;

                #endregion Dati Esercizio

                #region CBI

                item.CodiceSIA = dto.CodiceSIA;
                item.CodiceCUC = dto.CodiceCUC;

                #endregion CBI

                // ------------------------------------------------------
                // Responsabile
                // ------------------------------------------------------
                try
                {
                    if (dto.IdResponsabile > 0)
                        item.Responsabile = daoFactory.GetReferenteDao().GetById(dto.IdResponsabile.GetValueOrDefault(), false);
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nell'inserimento del condominio - {0} - Responsabile - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), dto.ID, dto.AziendaID);
                    throw;
                }

                // ------------------------------------------------------
                // Responsabile Contabilita
                // ------------------------------------------------------
                try
                {
                    if (dto.IdResponsabileContabilita > 0)
                        item.ResponsabileContabilita = daoFactory.GetReferenteDao().GetById(dto.IdResponsabileContabilita.GetValueOrDefault(), false);
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nell'inserimento del condominio - {0} - Responsabili Contabilità - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), dto.ID, dto.AziendaID);
                    throw;
                }

                // ------------------------------------------------------
                // Responsabili Assemblea
                // ------------------------------------------------------
                try
                {
                    foreach (var t in dto.IdResponsabiliAssemblea)
                    {
                        try
                        {
                            var respCondominio = daoFactory.GetReferenteDao().Find(t, false);
                            if (respCondominio != null)
                                item.ResponsabiliAssemblea.Add(respCondominio);
                        }
                        catch (Exception ex)
                        {
                            _log.ErrorFormat("Errore nell'inserimento del condominio - {0} - SINGOLO RESPONSABILE ASSEMBLEA - idResponsabile:{1} - id:{2} - azienda:{3}", ex, Utility.GetMethodDescription(), t, dto.ID, dto.AziendaID);
                            throw;
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nell'inserimento del condominio - {0} - Responsabili Assemblea - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), dto.ID, dto.AziendaID);
                    throw;
                }

                // ------------------------------------------------------
                // Dati Bancari
                // ------------------------------------------------------
                try
                {
                    foreach (var t in dto.DatiBancari)
                    {
                        t.IdCondominio = item.ID;
                        DatiBancariCondomini dbc = null;
                        if ((t.Stato == "U") || (t.Stato == "I"))
                            dbc = getDatiBancariRepository().ManageDomainEntity(t);

                        if (dbc != null)
                        {
                            item.DatiBancari.Add(dbc);
                            dbc.CondominioRiferimento = item;
                        }
                    }
                }
                catch (Exception ex)
                {
                    
                    _log.Error("Errore nell'inserimento del condominio - " + Utility.GetMethodDescription() + " - Dati Bancari - id:" + dto.ID + " - Azienda: " + dto.AziendaID, ex);
                    throw;
                }

                result = true;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nell'inserimento del condominio - {0} - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), dto.ID, dto.AziendaID);
                throw;
            }
            return result;
        }
Exemplo n.º 10
0
        public Esercizio NuovoEsercizio(int idCondominio, int? annoGestionale, GestioneEsercizioEnum gestione, DateTime dataApertura, DateTime dataChiusura, string descrizione, string note)
        {
            AnnoGestionale anno;
            if (annoGestionale != null)
                anno = _daoFactory.GetAnnoGestionaleDao().GetById(annoGestionale.Value, false);
            else
            {
                anno = new AnnoGestionale(_daoFactory.GetCondominioDao().GetById(idCondominio, false), dataApertura.Year, dataChiusura.Year);
                _daoFactory.GetAnnoGestionaleDao().SaveOrUpdate(anno);
            }
            var esercizio = new Esercizio(anno.CondominioRiferimento, dataApertura, dataChiusura, anno, gestione) {NoteApertura = note};
            _daoFactory.GetEsercizioDao().SaveOrUpdate(esercizio);

            return esercizio;
        }
Exemplo n.º 11
0
        private string loadCondominio(string codiceCondominio, Azienda azienda, OleDbConnection conn)
        {
            string message = string.Empty;

            // ===========================================================================================================
            //  Lettura Tabelle
            // ===========================================================================================================

            // ----------------------------------------------------------------------------------
            //  Condomini
            // ----------------------------------------------------------------------------------
            var condominioAdapter = new OleDbDataAdapter("SELECT * FROM TabCondomìni WHERE TabCondomìni.Codice = '" + codiceCondominio + "'", conn);

            var dsCondomini = new DataSet("Condomini");
            condominioAdapter.Fill(dsCondomini, "TabCondomìni");

            if (dsCondomini.Tables["TabCondomìni"].Rows.Count > 0)
            {
                var rowCondominio = dsCondomini.Tables["TabCondomìni"].Rows[0];

                var esercizioAdapter = new OleDbDataAdapter("SELECT * FROM TabEsercizi WHERE idCondominio = " + rowCondominio["id"] + " AND TabEsercizi.Attivo = True AND TabEsercizi.Straordinario = False AND (TabEsercizi.Nome LIKE 'ORDINARIO%' OR TabEsercizi.Nome LIKE '0RDINARIO%') ORDER BY DataF DESC", conn);
                esercizioAdapter.Fill(dsCondomini, "TabEsercizi");

                if (dsCondomini.Tables["TabEsercizi"].Rows.Count > 0)
                {
                    var rowEsercizio = dsCondomini.Tables["TabEsercizi"].Rows[0];

                    var dataInizioEsercizio = (DateTime)rowEsercizio["DataI"];
                    var dataFineEsercizio = (DateTime)rowEsercizio["DataF"];

                    Condominio condominio = _daoFactory.GetCondominioDao().GetByCodice(codiceCondominio.PadLeft(3, '0'), azienda.ID);
                    if (condominio == null)
                    {
                        condominio = new Condominio(rowCondominio["Nome"].ToString(), dataFineEsercizio.Day, dataFineEsercizio.Month, dataFineEsercizio.Year + 1, azienda) {Codice = codiceCondominio.PadLeft(3, '0')};
                        _daoFactory.GetCondominioDao().SaveOrUpdate(condominio);
                        addDefault(condominio);
                    }
                    else
                    {
                        // ======================================================================================
                        // Eliminazione vecchi dati
                        // ======================================================================================
                        foreach (UnitaImmobiliare unita in _daoFactory.GetUnitaImmobiliareDao().GetByCondominio(condominio.ID))
                        {
                            foreach (Millesimo mill in unita.Millesimi)
                            {
                                mill.UnitaRiferimento = null;
                                mill.ContoRiferimento = null;
                            }
                            unita.Millesimi.Clear();
                            unita.GruppoStabileRiferimento.UnitaImmobiliari.Remove(unita);
                            _daoFactory.GetUnitaImmobiliareDao().Delete(unita);
                        }

                        foreach (Palazzina stabileDelete in condominio.Palazzine)
                        {
                            foreach (GruppoStabile gruppo in stabileDelete.GruppiStabile)
                                gruppo.PalazzinaRiferimento = null;
                            stabileDelete.CondominioRiferimento = null;
                        }
                        condominio.Palazzine.Clear();

                        var stabileFirst = new Palazzina(condominio, "Stabile A");
                        _daoFactory.GetPalazzinaDao().SaveOrUpdate(stabileFirst);

                        // Dati Bancari
                        foreach (DatiBancariCondomini banca in condominio.DatiBancari)
                        {
                            foreach (MovimentoBancario mov in banca.MovimentiBancari)
                            {
                                mov.Condominio = null;
                                mov.Banca = null;
                                mov.Fornitore = null;
                                mov.Esercizio = null;
                                mov.File = null;
                            }

                            banca.CondominioRiferimento = null;
                        }
                        condominio.DatiBancari.Clear();

                        // Piano Conti
                        foreach (Conto contoDelete in condominio.Conti)
                        {
                            contoDelete.CondominioRiferimento = null;
                            contoDelete.Millesimi.Clear();
                        }
                        condominio.Conti.Clear();

                        // Modelli Ripartizione
                        foreach (ModelloRegistrazioneContabile modello in condominio.ModelliRegistrazioneContabile)
                            modello.CondominioRiferimento = null;
                        condominio.ModelliRegistrazioneContabile.Clear();

                        // Esercizi
                        foreach (Esercizio esercizioDelete in condominio.Esercizi)
                        {
                            esercizioDelete.AnnoGestionale.Esercizi.Remove(esercizioDelete);
                            _daoFactory.GetEsercizioDao().Delete(esercizioDelete);
                        }
                        condominio.Esercizi.Clear();

                        // Anno Gestionale
                        foreach (AnnoGestionale anno in condominio.AnniGestionali)
                            _daoFactory.GetAnnoGestionaleDao().Delete(anno);
                        condominio.AnniGestionali.Clear();
                        // ======================================================================================

                        condominio.Descrizione = rowCondominio["Nome"].ToString();

                        // ======================================================================================
                        //  Default del condominio
                        // ======================================================================================

                        // Conti comuni del Piano dei conti
                        IList<PianoConti> conti = _daoFactory.GetPianoContiDao().GetByAzienda(azienda.ID);
                        foreach (PianoConti pianoConto in conti)
                        {
                            if(pianoConto.IsRequired)
                                pianoConto.ConvertToConto(condominio);
                        }

                        // Nuovo esercizio
                        DateTime inizioEsercizioOld = dataInizioEsercizio;
                        DateTime fineEsercizioOld = dataFineEsercizio;
                        var annoNew = new AnnoGestionale(condominio, inizioEsercizioOld.AddYears(1).Year, fineEsercizioOld.AddYears(1).Year);
                        _daoFactory.GetAnnoGestionaleDao().SaveOrUpdate(annoNew);
                        var esercizioNew = new Esercizio(condominio, inizioEsercizioOld.AddYears(1), fineEsercizioOld.AddYears(1), annoNew, Sfera.Enums.GestioneEsercizioEnum.Ordinario);
                        _daoFactory.GetEsercizioDao().SaveOrUpdate(esercizioNew);
                    }

                    condominio.CodiceImportazione = rowCondominio["id"].ToString().Trim();

                    if (rowCondominio["Note"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["Note"].ToString()))
                        condominio.Note = rowCondominio["Note"].ToString();

                    if (rowCondominio["CF"] != DBNull.Value && !string.IsNullOrEmpty(rowCondominio["CF"].ToString()))
                        condominio.CodiceFiscale = rowCondominio["CF"].ToString().Trim();

                    // ----------------------------
                    // Banche
                    // ----------------------------
                    var bancheCondominiAdapter = new OleDbDataAdapter("SELECT * FROM TabBanche INNER JOIN TabBanche_Condomìni ON TabBanche.id = TabBanche_Condomìni.idBanca WHERE TabBanche_Condomìni.idCondominio = " + rowCondominio["id"], conn);
                    bancheCondominiAdapter.Fill(dsCondomini, "Banche");

                    foreach (DataRow rowBanca in dsCondomini.Tables["Banche"].Rows)
                    {
                        try
                        {
                            if (rowBanca["TabBanche_Condomìni.Attivo"] != DBNull.Value && (bool)rowBanca["TabBanche_Condomìni.Attivo"])
                            {
                                DatiBancariCondomini datiBancari = null;
                                if (rowBanca["CodSiaOrdinante"] != DBNull.Value && !string.IsNullOrEmpty(rowBanca["CodSiaOrdinante"].ToString()))
                                    condominio.CodiceSIA = rowBanca["CodSiaOrdinante"].ToString().Trim();

                                if (rowBanca["IBAN"] != DBNull.Value && !string.IsNullOrEmpty(rowBanca["IBAN"].ToString()))
                                {
                                    datiBancari = new DatiBancariCondomini(rowBanca["IBAN"].ToString().Trim().Replace(" ", ""), condominio);
                                    condominio.DatiBancari.Add(datiBancari);
                                    _daoFactory.GetDatiBancariCondominiDao().SaveOrUpdate(datiBancari);
                                }
                                else if (rowBanca["Abi"] != DBNull.Value && !string.IsNullOrEmpty(rowBanca["Abi"].ToString()) && rowBanca["Cab"] != DBNull.Value && !string.IsNullOrEmpty(rowBanca["Cab"].ToString()) && rowBanca["CC"] != DBNull.Value && !string.IsNullOrEmpty(rowBanca["CC"].ToString()))
                                {
                                    var coor = new CoordinateBancarie
                                    {
                                        Abi = rowBanca["Abi"].ToString().Trim().PadLeft(5, '0'),
                                        Cab = rowBanca["Cab"].ToString().Trim().PadLeft(5, '0'),
                                        ContoCorrente = rowBanca["CC"].ToString().Trim().PadLeft(12, '0')
                                    };

                                    datiBancari = new DatiBancariCondomini(coor.CalcolaIBAN(), condominio);
                                    condominio.DatiBancari.Add(datiBancari);
                                    _daoFactory.GetDatiBancariCondominiDao().SaveOrUpdate(datiBancari);
                                }
                                if (datiBancari != null && rowBanca["Predefinito"] != DBNull.Value)
                                {
                                    datiBancari.Principale = (bool)rowBanca["Predefinito"];
                                    datiBancari.CodiceImportazione = rowBanca["TabBanche_Condomìni.id"].ToString().Trim();
                                }
                                if (datiBancari != null)
                                    datiBancari.Note = rowBanca["NomeCC"].ToString().Trim();
                            }
                        }
                        catch (Exception ex)
                        {
                            
                            _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Banche) - banca:" + rowBanca["id"], ex);
                            throw;
                        }
                    }

                    // Se ho una sola coordinata bancaria questa è la principale
                    if (condominio.DatiBancari.Count == 1)
                        Library.IesiGenericCollections<DatiBancariCondomini>.GetByIndex(condominio.DatiBancari, 0).Principale = true;

                    // ----------------------------
                    // Stabili/Scale
                    // ----------------------------
                    var stabiliScaleAdapter = new OleDbDataAdapter("SELECT DISTINCT TabIndirizzi.*, TabEdifici.*, TabIndirizzi_Condomìni.idCondominio, TabCodComune.Nome " +
                        "FROM TabEdifici INNER JOIN " +
                        "((TabCodComune INNER JOIN " +
                        "(TabIndirizzi INNER JOIN " +
                        "TabIndirizzi_Condomìni ON TabIndirizzi.id = TabIndirizzi_Condomìni.idIndirizzo) ON TabCodComune.id = TabIndirizzi.idComune) INNER JOIN TabLocali ON TabIndirizzi_Condomìni.id = TabLocali.idIndirizzoCondominio) ON TabEdifici.id = TabLocali.idEdificio " +
                        "WHERE TabIndirizzi_Condomìni.idCondominio = " + rowCondominio["id"] + " " +
                        "ORDER BY TabIndirizzi_Condomìni.idCondominio, TabIndirizzi.id", conn);
                    stabiliScaleAdapter.Fill(dsCondomini, "StabiliScale");

                    int numeroUnitaImmobiliari = 0;
                    bool first = true;
                    var stabile = Library.IesiGenericCollections<Palazzina>.GetByIndex(condominio.Palazzine, 0);
                    var descrizioneStabile = string.Empty;
                    Address indirizzoStabile = null;

                    IList<NameValueDTO<int, string>> listaPersone = _daoFactory.GetPersonaDao().GetByQueryDTO<NameValueDTO<int, string>>("SELECT new NameValueDTOIntString(PERS.ID, PERS.CodiceImportazione) FROM Persona PERS WHERE PERS.AziendaID = :azienda", new[] { new QueryParam("azienda", azienda.ID) });
                    foreach (DataRow rowStabile in dsCondomini.Tables["StabiliScale"].Rows)
                    {
                        try
                        {
                            GruppoStabile newScala;
                            if (first)
                            {
                                newScala = Library.IesiGenericCollections<GruppoStabile>.GetByIndex(stabile.GruppiStabile, 0);
                                newScala.Descrizione = rowStabile["TabEdifici.Nome"].ToString();
                            }
                            else
                            {
                                newScala = new GruppoStabile(stabile, rowStabile["TabEdifici.Nome"].ToString());
                                _daoFactory.GetGruppoStabileDao().SaveOrUpdate(newScala);
                            }

                            newScala.Descrizione = rowStabile["TabEdifici.Nome"].ToString();
                            newScala.Indirizzo = getIndirizzo(rowStabile);
                            
                            newScala.CodiceImportazione = rowStabile["TabEdifici.id"].ToString().Trim();
                            newScala.Note = rowStabile["TabEdifici.Note"].ToString().Trim() + Environment.NewLine + rowStabile["TabIndirizzi.Note"].ToString().Trim();

                            descrizioneStabile += rowStabile["TabIndirizzi.Nome"].ToString().Trim() + " ";
                            if (indirizzoStabile == null)
                                indirizzoStabile = (Address)newScala.Indirizzo.Clone();

                            // Unità Immobiliari
                            message += loadUnitaImmobiliari((int)rowEsercizio["id"], newScala, (int)rowStabile["TabEdifici.id"], dataInizioEsercizio, listaPersone, conn);
                            numeroUnitaImmobiliari += newScala.UnitaImmobiliari.Count;

                            first = false;
                        }
                        catch (Exception ex)
                        {
                            
                            _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Scale) - indirizzo:" + rowStabile["TabIndirizzi.id"], ex);
                            throw;
                        }
                    }
                    stabile.Descrizione = descrizioneStabile.Trim();
                    stabile.Indirizzo = indirizzoStabile;

                    if (stabile.Indirizzo != null) condominio.Indirizzo = 
                        (Address)stabile.Indirizzo.Clone();
                    condominio.NumeroUnitaImmobiliari = numeroUnitaImmobiliari;

                    // ===================================
                    //  Piano dei conti
                    // ===================================
                    var pianoContiAdapter = new OleDbDataAdapter("SELECT TabCapitoli.*, TabEsercizi.idCondominio " +
                        "FROM TabEsercizi INNER JOIN TabCapitoli ON TabEsercizi.id = TabCapitoli.idEsercizio " +
                        "WHERE TabEsercizi.Attivo = true AND TabEsercizi.Straordinario = false AND TabEsercizi.id = " + rowEsercizio["id"] + " " +
                        "ORDER BY TabCapitoli.Codice", conn);
                    pianoContiAdapter.Fill(dsCondomini, "PianoConti");

                    var loadedConti = new List<Conto>();
                    DataTable tbPianoConti = dsCondomini.Tables["PianoConti"];
                    int ordineConto = 0;
                    foreach (DataRow row in tbPianoConti.Rows)
                    {
                        try
                        {
                            var conto = new Conto(condominio, Sfera.Enums.TipoContoEconomicoEnum.Economico, Sfera.Enums.TipoPeriodoCompetenzaContabile.Esercizio, row["Nome"].ToString(), true, true, false);
                            _daoFactory.GetContoDao().SaveOrUpdate(conto);

                            string codice = row["Codice"].ToString().Trim();
                            if (!string.IsNullOrEmpty(codice))
                            {
                                conto.Codice = codice.Length > 2 ? codice.Substring(0, 2).PadLeft(3, '0') : codice.PadLeft(3, '0');
                            }

                            conto.PresenteBilancio = true;
                            conto.CodiceImportazione = row["id"].ToString();
                            ordineConto++;
                            conto.Ordine = ordineConto;
                            loadedConti.Add(conto);

                            dsCondomini = new DataSet();
                            var sottoContiAdapter = new OleDbDataAdapter("SELECT * FROM TabSottoCapitoli WHERE TabSottoCapitoli.idCapitolo = " + row["id"], conn);
                            sottoContiAdapter.Fill(dsCondomini, "SottoConti");
                            var ordineSottoConto = 0;
                            foreach (DataRow rowSottoConto in dsCondomini.Tables["SottoConti"].Rows)
                            {
                                try
                                {
                                    var sottoConto = new SottoConto(conto, rowSottoConto["Nome"].ToString()) {CodiceImportazione = rowSottoConto["id"].ToString()};
                                    ordineSottoConto++;
                                    sottoConto.Codice = conto.Codice + "." + ordineSottoConto.ToString().PadLeft(3, '0');
                                    _daoFactory.GetSottoContoDao().SaveOrUpdate(sottoConto);
                                }
                                catch (Exception ex)
                                {
                                    
                                    _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Sotto Conti) - sottoconto:" + rowSottoConto["id"], ex);
                                    throw;
                                }

                            }
                        }
                        catch (Exception ex)
                        {
                            
                            _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Piano dei conti) - conto:" + row["id"], ex);
                            throw;
                        }
                    }

                    // ===================================
                    //  Millesimi
                    // ===================================
                    try
                    {
                        var unitaCondominio = _daoFactory.GetUnitaImmobiliareDao().GetByCondominio(condominio.ID);
                        foreach (Conto conto in loadedConti)
                        {
                            try
                            {
                                dsCondomini = new DataSet();
                                var millesimiAdapter = new OleDbDataAdapter("SELECT * " +
                                    "FROM (TabMillesimi INNER JOIN TabMillesimiLocali ON TabMillesimi.id = TabMillesimiLocali.idTabMillesimi) INNER JOIN TabCapitoli ON TabMillesimi.id = TabCapitoli.idTabMillesimi " +
                                    "WHERE TabMillesimi.idEsercizio = " + rowEsercizio["id"].ToString().Trim() + " AND TabCapitoli.id = " + conto.CodiceImportazione.Trim() + ";", conn);
                                millesimiAdapter.Fill(dsCondomini, "Millesimi");

                                foreach (DataRow rowMillesimo in dsCondomini.Tables["Millesimi"].Rows)
                                {
                                    try
                                    {
                                        if ((float)rowMillesimo["PercProp"] > 0)
                                        {
                                            //string hql = "FROM UnitaImmobiliare UNI WHERE UNI.CodiceImportazione = :codice";
                                            //IList<UnitaImmobiliare> listaUnita = _daoFactory.GetUnitaImmobiliareDao().GetByQuery(hql, new QueryParam[] { new QueryParam("codice", rowMillesimo["idLocale"].ToString().Trim()) });
                                            IList<UnitaImmobiliare> listaUnita = (from item in unitaCondominio
                                                                                  where item.CodiceImportazione == rowMillesimo["idLocale"].ToString().Trim()
                                                                                  select item).ToList();
                                            if (listaUnita.Count > 0)
                                            {
                                                var newMillesimo = new Millesimo(conto, listaUnita[0])
                                                {
                                                    Valore = Convert.ToDecimal((float) rowMillesimo["Mill"]),
                                                    CodiceImportazione = rowMillesimo["TabMillesimiLocali.id"].ToString().Trim()
                                                };
                                                _daoFactory.GetMillesimoDao().SaveOrUpdate(newMillesimo);

                                                if (listaUnita[0].GetConduttorePrincipale(dataInizioEsercizio) != null)
                                                {
                                                    var percentualeProp = Convert.ToDecimal((float)rowMillesimo["PercProp"]) / 100m;
                                                    new SoggettoCondominioRipartizione(conto, listaUnita[0].GetProprietarioPrincipale(dataInizioEsercizio), percentualeProp);
                                                    new SoggettoCondominioRipartizione(conto, listaUnita[0].GetConduttorePrincipale(dataInizioEsercizio), 1 - percentualeProp);
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        
                                        _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Millesimi) - millesimo:" + rowMillesimo["TabMillesimiLocali.id"].ToString().Trim(), ex);
                                        throw;
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                
                                _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Millesimi) - conto:" + conto.CodiceImportazione, ex);
                                throw;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        
                        _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Millesimi) - condominio:" + codiceCondominio, ex);
                        throw;
                    }

                    // ===================================
                    //  Regole di ripartizione
                    // ===================================
                    try
                    {
                        var regoleAdapter = new OleDbDataAdapter("SELECT TabRegoleRipartizione.Nome, TabRegoleRipartizione.Note, TabRegoleRipartizione.idEsercizio, TabDettagliRegoleRipartizione.* " +
                            "FROM TabRegoleRipartizione INNER JOIN TabDettagliRegoleRipartizione ON TabRegoleRipartizione.id = TabDettagliRegoleRipartizione.idRegola " +
                            "WHERE TabRegoleRipartizione.idEsercizio = " + rowEsercizio["id"].ToString().Trim() + ";", conn);
                        regoleAdapter.Fill(dsCondomini, "Regole");

                        int lastIdModello = 0;
                        ModelloRegistrazioneContabile lastModello = null;
                        foreach (DataRow rowRegola in dsCondomini.Tables["Regole"].Rows)
                        {
                            try
                            {
                                var hql = "FROM Conto C WHERE C.CodiceImportazione = :codice";
                                var listaConti = _daoFactory.GetContoDao().GetByQuery(hql, new[] { new QueryParam("codice", rowRegola["idCapitolo"].ToString().Trim()) });
                                if (listaConti.Count > 0)
                                {
                                    var hqlSottoConto = "FROM SottoConto S WHERE S.CodiceImportazione = :codice";
                                    var listaSottoConti = _daoFactory.GetSottoContoDao().GetByQuery(hqlSottoConto, new[] { new QueryParam("codice", rowRegola["idSottoCapitolo"].ToString().Trim()) });
                                    if (listaSottoConti.Count > 0)
                                    {
                                        if ((int)rowRegola["idRegola"] != lastIdModello)
                                        {
                                            var modello = new ModelloRegistrazioneContabile(condominio, rowRegola["Nome"].ToString(), null)
                                            {
                                                CodiceImportazione = rowRegola["idRegola"].ToString().Trim()
                                            };
                                            lastIdModello = (int)rowRegola["idRegola"];
                                            lastModello = modello;
                                            _daoFactory.GetModelloRegistrazioneContabileDao().SaveOrUpdate(modello);
                                        }
                                        var contoModello = new ContiModelloRegistrazioneContabile(lastModello, listaConti[0], listaSottoConti[0], Convert.ToDecimal((float)rowRegola["Perc"])/100m, null) {CodiceImportazione = rowRegola["id"].ToString().Trim()};
                                        _daoFactory.GetContiModelloRegistrazioneContabileDao().SaveOrUpdate(contoModello);
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                
                                _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Regole Ripartizione) - regola:" + rowRegola["idRegola"].ToString().Trim(), ex);
                                throw;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        
                        _log.Error("Errore inaspettato nell'importazione di un condominio da GeCo: " + Library.Utility.GetMethodDescription() + " (Regole Ripartizione)", ex);
                        throw;
                    }
                }
                else
                {
                    message = "Non è stato trovato alcun esercizio Ordinario importabile per il condominio: " + codiceCondominio + " - " + rowCondominio["Nome"];
                    
                    _log.Error(message + " - " + Library.Utility.GetMethodDescription());
                }
            }
            else
            {
                message = "Non è stato trovato il condominio: " + codiceCondominio;
                
                _log.Error(message + " - " + Library.Utility.GetMethodDescription());
            }

            return message;
        }