/// <summary>
        /// Crea il Dettaglio delle unità immobiliari partecipanti ad un modello di ripartizione
        /// </summary>
        public DettaglioModelloRegistrazioneContabile(ContiModelloRegistrazioneContabile contoModello, LogTransazione logTransazione)
        {
            if (contoModello != null)
            {
                _contoModello = contoModello;
                _contoModello.Unita.Add(this);
            }

            if (LogTransazione != null)
                LogTransazione.DettaglioModelliContabili.Add(this);
        }
Ejemplo n.º 2
0
        public AuthorizationMessages SalvaModello(ModelloListaRegistrazioneContabileDTO dto, bool ricalcoloSpeseEsistenti, int idUtente, LogTransazione logTransazione)
        {
            try
            {
                var logTransazioneModello = logTransazione;
                var logTransazioneDettaglioModello = logTransazione;
                var logTransazioneFornitoreModello = logTransazione;
                var logTransazioneContoModello = logTransazione;

                var fatalMessage = string.Empty;
                var warnMessage = string.Empty;
                ModelloRegistrazioneContabile modello = null;
                if (dto.ID == 0)
                {
                    var condominio = _daoFactory.GetCondominioDao().Find(dto.IdCondominio, false);
                    if (condominio != null)
                    {
                        var descrizione = string.Empty;
                        if (!string.IsNullOrEmpty(dto.Descrizione))
                        {
                            descrizione = dto.Descrizione;
                            if (descrizione.Length > 100)
                                descrizione = descrizione.Substring(0, 100);
                        }

                        var voceFattura = string.Empty;
                        if (!string.IsNullOrEmpty(dto.DescrizioneVoceFattura))
                        {
                            voceFattura = dto.DescrizioneVoceFattura;
                            if (voceFattura.Length > 512)
                                voceFattura = voceFattura.Substring(0, 512);
                        }

                        modello = new ModelloRegistrazioneContabile(condominio, descrizione, logTransazioneModello) { DescrizioneVoceFattura = voceFattura };
                        if (logTransazioneModello != null)
                        {
                            _daoFactory.GetModelloRegistrazioneContabileDao().SaveOrUpdate(modello);
                            logTransazioneContoModello = null;
                            logTransazioneDettaglioModello = null;
                            logTransazioneFornitoreModello = null;
                        }
                    }
                }
                else
                {
                    modello = _daoFactory.GetModelloRegistrazioneContabileDao().Find(dto.ID, false);
                    if(modello != null)
                        modello.Descrizione = dto.Descrizione;
                }

                if (modello != null)
                {
                    modello.DescrizioneVoceFattura = dto.DescrizioneVoceFattura;

                    // --------------------------
                    // Fornitori
                    // --------------------------
                    modello.Fornitori.Clear();
                    foreach (var dtoFornitore in dto.Fornitori)
                    {
                        ModelloContabileFornitore modelloFornitore = null;
                        if (dtoFornitore.ID == 0)
                        {
                            if (dtoFornitore.IdFornitore > 0)
                            {
                                var fornitore = _daoFactory.GetFornitoreDao().Find(dtoFornitore.IdFornitore, false);
                                if (fornitore != null)
                                {
                                    modelloFornitore = new ModelloContabileFornitore(fornitore, modello, logTransazioneFornitoreModello);
                                    if(logTransazioneFornitoreModello != null)
                                        _daoFactory.GetModelloContabileFornitoreDao().SaveOrUpdate(modelloFornitore);
                                }
                                else
                                {
                                    _log.WarnFormat("Fornitore inesistente - {0} - fornitore:{1}", Library.Utility.GetMethodDescription(), dtoFornitore.IdFornitore);
                                }
                            }
                            else
                            {
                                _log.WarnFormat("Fornitore non definito - {0}", Library.Utility.GetMethodDescription());
                            }
                        }
                        else
                        {
                            modelloFornitore = _daoFactory.GetModelloContabileFornitoreDao().Find(dtoFornitore.ID, false);
                            if (modelloFornitore != null)
                                modelloFornitore.Fornitore = _daoFactory.GetFornitoreDao().GetById(dtoFornitore.IdFornitore, false);
                            else
                            {
                                _log.WarnFormat("Modello inesistente - {0} - IdModello:{1}", Library.Utility.GetMethodDescription(), dtoFornitore.IdModello);
                            }
                        }

                        if (modelloFornitore != null)
                            modello.Fornitori.Add(modelloFornitore);
                    }

                    // --------------------------
                    // Conti
                    // --------------------------
                    modello.Conti.Clear();
                    foreach (var dtoConto in dto.Conti)
                    {
                        var conto = _daoFactory.GetContoDao().Find(dtoConto.IdConto, false);
                        var sottoConto = _daoFactory.GetSottoContoDao().Find(dtoConto.IdSottoConto, false);

                        var modelloConto = _daoFactory.GetContiModelloRegistrazioneContabileDao().Find(dtoConto.ID, false);
                        if (modelloConto == null)
                        {
                            modelloConto = new ContiModelloRegistrazioneContabile(modello, conto, sottoConto, dtoConto.PercentualeRipartizione, logTransazioneContoModello);
                            if (logTransazioneContoModello != null)
                            {
                                _daoFactory.GetContiModelloRegistrazioneContabileDao().SaveOrUpdate(modelloConto);
                                logTransazioneDettaglioModello = null;
                            }
                        }
                        else
                        {
                            modelloConto.PercentualeRipartizione = dtoConto.PercentualeRipartizione;

                            if (conto != null)
                                modelloConto.ContoRiferimento = conto;

                            if (sottoConto != null)
                                modelloConto.SottoContoRiferimento = sottoConto;
                        }

                        // --------------------------
                        // Riparto
                        // --------------------------
                        modelloConto.Unita.Clear();
                        foreach (var dtoRiparto in dtoConto.Riparto)
                        {
                            var modelloRiparto = _daoFactory.GetDettaglioModelloRegistrazioneContabileDao().Find(dtoRiparto.ID, false);
                            if (modelloRiparto == null)
                            {
                                modelloRiparto = new DettaglioModelloRegistrazioneContabile(modelloConto, logTransazioneDettaglioModello);
                                if(logTransazioneDettaglioModello != null)
                                    _daoFactory.GetDettaglioModelloRegistrazioneContabileDao().SaveOrUpdate(modelloRiparto);
                            }

                            // Lotto
                            modelloRiparto.LottoRiferimento = dtoRiparto.IdLotto > 0 ? _daoFactory.GetLottoDao().GetById(dtoRiparto.IdLotto.Value, false) : null;

                            // Stabile
                            modelloRiparto.PalazzinaRiferimento = dtoRiparto.IdStabile > 0 ? _daoFactory.GetPalazzinaDao().GetById(dtoRiparto.IdStabile.Value, false) : null;

                            // Gruppo Stabile
                            modelloRiparto.GruppoStabileRiferimento = dtoRiparto.IdGruppoStabile > 0 ? _daoFactory.GetGruppoStabileDao().GetById(dtoRiparto.IdGruppoStabile.Value, false) : null;

                            // Unità Immobiliare
                            modelloRiparto.UnitaRiferimento = dtoRiparto.IdUnita > 0 ? _daoFactory.GetUnitaImmobiliareDao().GetById(dtoRiparto.IdUnita.Value, false) : null;

                            modelloConto.Unita.Add(modelloRiparto);
                        }

                        modello.Conti.Add(modelloConto);
                    }

                    if (ricalcoloSpeseEsistenti)
                    {
                        var authMessage = ReloadRipartizioneByModelloEsercizio(modello.ID, null, null, idUtente, logTransazione);
                        if (!string.IsNullOrEmpty(authMessage.FatalMessage))
                            fatalMessage += authMessage.FatalMessage + Environment.NewLine;
                        if (!string.IsNullOrEmpty(authMessage.WarnMessage))
                            warnMessage += authMessage.WarnMessage + Environment.NewLine;

                    }

                    return new AuthorizationMessages(fatalMessage, warnMessage) {Id = modello.ID};
                }

                return new AuthorizationMessages(fatalMessage, warnMessage);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante il salvataggio del modello contabile - {0} - modello:{1} - condominio:{2}", ex, Library.Utility.GetMethodDescription(), dto.ID, dto.IdCondominio);
                throw;
            }
        }
 public virtual IUpdatableBusinessEntity Copy()
 {
     var contiModello = new ContiModelloRegistrazioneContabile(Modello, ContoRiferimento, SottoContoRiferimento, null, null);
     return contiModello;
 }
        private IList<UnitaImmobiliare> getUnitaByConto(ContiModelloRegistrazioneContabile dettaglioModello)
        {
            Iesi.Collections.Generic.ISet<UnitaImmobiliare> listaUnita = new HashedSet<UnitaImmobiliare>();
            if (dettaglioModello.Unita.Count > 0)
            {
                foreach (var dettaglioRiparto in dettaglioModello.Unita)
                {
                    if (dettaglioRiparto.LottoRiferimento != null)
                        listaUnita.AddAll(dettaglioRiparto.LottoRiferimento.GetUnitaImmobiliari());
                    else if (dettaglioRiparto.PalazzinaRiferimento != null)
                        listaUnita.AddAll(dettaglioRiparto.PalazzinaRiferimento.GetUnitaImmobiliari());
                    else if (dettaglioRiparto.GruppoStabileRiferimento != null)
                        listaUnita.AddAll(dettaglioRiparto.GruppoStabileRiferimento.UnitaImmobiliari);
                    else if (dettaglioRiparto.UnitaRiferimento != null)
                        listaUnita.Add(dettaglioRiparto.UnitaRiferimento);
                    else
                        listaUnita.AddAll(dettaglioModello.Modello.CondominioRiferimento.GetUnitaImmobiliari());
                }
            }
            else
                listaUnita.AddAll(dettaglioModello.Modello.CondominioRiferimento.GetUnitaImmobiliari());

            return listaUnita.ToList();
        }
Ejemplo n.º 5
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;
        }
Ejemplo n.º 6
0
        public ModelloRegistrazioneContabile CreateModelloRipartizione(int idCondominio, ISet<MovimentoContabile> movimenti, decimal importo, string nomeModello, string descrizioneVoceSpesa)
        {
            try
            {
                if (movimenti.Count > 0)
                {
                    if (nomeModello.Length > 100)
                        nomeModello = nomeModello.Substring(0, 100);
                    if (!string.IsNullOrEmpty(descrizioneVoceSpesa) && descrizioneVoceSpesa.Length > 50)
                        descrizioneVoceSpesa = descrizioneVoceSpesa.Substring(0, 50);

                    var modello = new ModelloRegistrazioneContabile(_daoFactory.GetCondominioDao().GetById(idCondominio, false), nomeModello, null) { DescrizioneVoceFattura = descrizioneVoceSpesa };
                    decimal divisore = 1;
                    foreach (var movimento in movimenti.OrderBy(item => Math.Abs(item.GetImportoConSegno().GetValueOrDefault())))
                    {
                        decimal percentuale;
                        if (importo != 0)
                            percentuale = movimento.GetImportoConSegno().GetValueOrDefault() / importo;
                        else
                        {
                            if (divisore != 1)
                                percentuale = movimento.GetImportoConSegno().GetValueOrDefault() / divisore;
                            else
                            {
                                percentuale = movimento.GetImportoConSegno().GetValueOrDefault();
                                do
                                {
                                    percentuale = percentuale / 10;
                                    divisore = divisore * 10;
                                } while (Math.Abs(percentuale) >= 10);
                            }
                        }

                        var contoModello = new ContiModelloRegistrazioneContabile(modello, movimento.ContoRiferimento, movimento.SottoContoRiferimento, percentuale, null);

                        // -----------------------------------------------------
                        // Selezione per lotti
                        // -----------------------------------------------------
                        if (_lottiSelezionati.ContainsKey(GetKey(movimento)))
                        {
                            var lottiTable = _lottiSelezionati[GetKey(movimento)];
                            foreach (DataRow row in lottiTable.Rows)
                            {
                                if (row["Selezionato"] != DBNull.Value && (bool)row["Selezionato"])
                                {
                                    new DettaglioModelloRegistrazioneContabile(contoModello, null)
                                    {
                                        LottoRiferimento = _daoFactory.GetLottoDao().GetById((int)row["Id"], false)
                                    };
                                }
                            }
                        }

                        // -----------------------------------------------------
                        // Selezione per stabili
                        // -----------------------------------------------------
                        var selezioneStabili = false;
                        if (_stabiliSelezionati.ContainsKey(GetKey(movimento)))
                        {
                            var stabiliTable = _stabiliSelezionati[GetKey(movimento)];
                            foreach (DataRow row in stabiliTable.Rows)
                            {
                                if (row["Selezionato"] != DBNull.Value && (bool)row["Selezionato"])
                                {
                                    new DettaglioModelloRegistrazioneContabile(contoModello, null)
                                    {
                                        PalazzinaRiferimento = _daoFactory.GetPalazzinaDao().GetById((int)row["Id"], false)
                                    };
                                    selezioneStabili = true;
                                }
                            }
                        }

                        // -----------------------------------------------------
                        // Selezione per gruppi
                        // -----------------------------------------------------
                        if (_gruppiSelezionati.ContainsKey(GetKey(movimento)) && !selezioneStabili)
                        {
                            var gruppiTable = _gruppiSelezionati[GetKey(movimento)];
                            foreach (DataRow row in gruppiTable.Rows)
                            {
                                if (row["Selezionato"] != DBNull.Value && (bool)row["Selezionato"])
                                {
                                    new DettaglioModelloRegistrazioneContabile(contoModello, null)
                                    {
                                        GruppoStabileRiferimento = _daoFactory.GetGruppoStabileDao().GetById((int)row["Id"], false)
                                    };
                                }
                            }
                        }
                    }

                    return modello;
                }

                _log.ErrorFormat("Tentativo di salvare un modello senza movimenti associati - {0} - idCondominio:{1} - nome:{2}", Utility.GetMethodDescription(), idCondominio.ToString(), nomeModello);

                return null;

            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore nella creazione del modello di riparto - {0} - condominio:{1} - importo:{2} - nomeModello:{3} - descrizioneVoceSpesa:{4}", ex, Utility.GetMethodDescription(), idCondominio, importo, nomeModello, descrizioneVoceSpesa);
                throw;
            }
        }