private string insert(MovimentoContabileDTO dto, out MovimentoContabile item)
        {
            var message = string.Empty;

            item = null;
            try
            {
                var daoFactory = _windsorConfigRepository.GetContainer(_info.Azienda).Resolve<IDaoFactory>();

                CausaleContabile causale = null;
                if(dto.Causale != null)
                    causale = daoFactory.GetCausaleContabileDao().Find(dto.Causale.ID, false);
                if (causale == null)
                {
                    var idCausale = "<NULL>";
                    if (dto.Causale != null)
                        idCausale = dto.Causale.ID.ToString(CultureInfo.InvariantCulture);

                    _log.WarnFormat("Non è definito la causale per un movimento da inserire - {0}  - causale:{1} - azienda:{2}", Utility.GetMethodDescription(), idCausale, _info.Azienda);
                    return "Non è definita la causale";
                }

                if (dto.NumeroRiga == null)
                    dto.NumeroRiga = 1;

                DettaglioSpesa dettaglio = null;
                var importo = Math.Round(dto.Importo.GetValueOrDefault(), 2);
                var segno = dto.Segno;
                if (importo < 0)
                {
                    segno = invertiSegno(segno);
                    importo = importo*-1;
                }

                var conto = daoFactory.GetContoDao().Find(dto.IdConto.GetValueOrDefault(), false);
                if (conto == null)
                {
                    _log.WarnFormat("Non è definito il conto per un movimento da inserire - {0}  - conto:{1} - azienda:{2}", Utility.GetMethodDescription(), dto.IdConto.GetValueOrDefault(), _info.Azienda);
                    return "Non è definito il conto economico";
                }

                if (dto.IdDettaglio != null)
                {
                    dettaglio = daoFactory.GetDettaglioSpesaDao().GetById(dto.IdDettaglio.GetValueOrDefault(), false);
                    item = new MovimentoContabile(_testata, dettaglio, causale, dto.NumeroRiga, conto, importo, segno);
                }
                else
                    item = new MovimentoContabile(_testata, causale, dto.NumeroRiga, conto, importo, segno);
                item.PercentualeProprieta = dto.PercentualeProprieta;

                setSottoConto(dto, item, daoFactory);

                if (dto.IdFornitore != null)
                    item.FornitoreRiferimento = daoFactory.GetFornitoreDao().GetById(dto.IdFornitore.Value, false);
                item.Descrizione = dto.Descrizione;
                item.NumeroAssegno = dto.NumeroAssegno;
                item.Note = dto.Note;

                item.GruppiAddebito = dto.GruppiAddebito;
                item.LottiAddebito = dto.LottiAddebito;
                item.StabiliAddebito = dto.StabiliAddebito;

                if (dto.IsMovimentoEconomico != null)
                    item.IsMovimentoEconomico = dto.IsMovimentoEconomico.GetValueOrDefault();

                if(dto.IdMovimentoStorno > 0)
                {
                    var movimentoStorno = daoFactory.GetMovimentoContabileDao().Find(dto.IdMovimentoStorno.GetValueOrDefault(), false);
                    if(movimentoStorno != null)
                    {
                        movimentoStorno.LottiAddebito = item.LottiAddebito;
                        movimentoStorno.StabiliAddebito = item.StabiliAddebito;
                        movimentoStorno.GruppiAddebito = item.GruppiAddebito;
                        movimentoStorno.FornitoreRiferimento = item.FornitoreRiferimento;
                        movimentoStorno.ContoRiferimento = item.ContoRiferimento;
                        movimentoStorno.SottoContoRiferimento = item.SottoContoRiferimento;
                        item.MovimentoStorno = movimentoStorno;
                    }
                }

                // TODO: La valorizzazione del NumeroRegistrazione deve essere spostata nel Domain Model
                if (dto.NumeroRegistrazione != null)
                    item.NumeroRegistrazione = dto.NumeroRegistrazione;
                else
                {
                    try
                    {
                        if(dettaglio != null)
                        {
                            var esercizio = daoFactory.GetEsercizioDao().GetById(dettaglio.SpesaRiferimento.EsercizioRiferimento.ID, true);
                            var numeroRegistrazione = esercizio.ProgressivoRegistrazioneContabile;
                            numeroRegistrazione++;
                            item.NumeroRegistrazione = numeroRegistrazione;
                            esercizio.ProgressivoRegistrazioneContabile = numeroRegistrazione;
                        }
                    }
                    catch (Exception ex)
                    {
                        message = ex.ToString().StartsWith("NHibernate.StaleObjectStateException") ? "Un altro utente ha confermato un movimento." : "Errore inaspettato nell'attribuzione del numero di registrazione, probabilmente determinato da un conflitto di aggiornamento";
                        
                        _log.Error("Errore inaspettato nel salvataggio (UPDATE) del numero di registrazione - " + Utility.GetMethodDescription(), ex);

                        var persistenceContext = _windsorConfigRepository.GetContainer(_info.Azienda).Resolve<IPersistenceContext>();
                        persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                        persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                        return message;
                    }
                }

                if (dto.IdEvasione != null)
                    item.EvasioneBancaria = daoFactory.GetEvasioneBancariaDao().Find(dto.IdEvasione.GetValueOrDefault(), false);

                // ===========================================================================================
                // BUGID#2159 - COMMENTATO: Con la nuova funzione di riparto aggregato gli oggetti SpeseUnita 
                //              dovono essere usati SOLO per le spese personali o quando sono usate ripartizioni
                //              personalizzate
                // ===========================================================================================
                //if (dto.DettaglioRipartizione != null)
                try
                {
                    if (item.ContoRiferimento == null)
                    {
                        message = "Non è stato definito il conto di addebito";

                        _log.ErrorFormat("Conto a NULL - {0}", Utility.GetMethodDescription());

                        var persistenceContext = _windsorConfigRepository.GetContainer(_info.Azienda).Resolve<IPersistenceContext>();
                        persistenceContext.RollbackAndCloseSession(Login.Instance.CurrentLogin().LoginName);
                        persistenceContext.BeginTransaction(Login.Instance.CurrentLogin().LoginName, IsolationLevel.ReadUncommitted);

                        return message;
                    }

                    if ((item.ContoRiferimento.IsSpesePersonali || dto.IsRipartoPersonalizzato) && dto.DettaglioRipartizione != null)
                    {
                        var rep = new SpeseUnitaRepository(item, _info, _windsorConfigRepository);
                        foreach (var t in dto.DettaglioRipartizione)
                        {
                            if (t != null)
                            {
                                try
                                {
                                    rep.ManageDomainEntity(t);
                                }
                                catch (Exception ex)
                                {

                                    _log.Error("Errore nell'inserimento della testata del movimento: " + Utility.GetMethodDescription() + " - 1", ex);
                                    throw;
                                }
                            }
                        }
                    }

                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nel salvataggio del movimento - (ManageDomainEntity) - {0}  - azienda:{1}", ex, Utility.GetMethodDescription(), _info.Azienda);
                    throw;
                }

                item.IsRipartoPersonalizzato = dto.IsRipartoPersonalizzato;

                daoFactory.GetMovimentoContabileDao().SaveOrUpdate(item);
            }
            catch(Exception ex)
            {
                _log.Error("Errore nel salvataggio del movimento: " + Utility.GetMethodDescription(), ex);
                throw;
            }
            return message;
        }
 private SpeseUnitaRepository getSpeseUnitaRepository()
 {
     return _spesaRep ?? (_spesaRep = new SpeseUnitaRepository(_info, _windsorConfigRepository));
 }
        private bool update(MovimentoContabileDTO dto, out MovimentoContabile item)
        {
            var result = false;
            item = null;
            var daoFactory = _windsorConfigRepository.GetContainer(_info.Azienda).Resolve<IDaoFactory>();

            try
            {
                item = daoFactory.GetMovimentoContabileDao().GetById(dto.ID, false);

                // Condizione necessaria per il controllo del fatto che sul DB ho una versione uguale o più vecchia
                if (dto.Version <= item.Version)
                {
                    item.Causale = daoFactory.GetCausaleContabileDao().GetById(dto.Causale.ID, false);
                    item.ContoRiferimento = daoFactory.GetContoDao().GetById(dto.IdConto.GetValueOrDefault(), false);
                    
                    setSottoConto(dto, item, daoFactory);

                    if (dto.IdFornitore != null && dto.IdFornitore > 0)
                        item.FornitoreRiferimento = daoFactory.GetFornitoreDao().GetById(dto.IdFornitore.Value, false);
                    else
                        item.FornitoreRiferimento = null;
                    
                    item.Importo = dto.Importo;
                    item.Note = dto.Note;
                    item.NumeroRiga = dto.NumeroRiga;
                    item.Descrizione = dto.Descrizione;
                    item.Segno = dto.Segno;
                    item.PercentualeProprieta = dto.PercentualeProprieta;
                    item.NumeroRegistrazione = dto.NumeroRegistrazione;
                    item.NumeroAssegno = dto.NumeroAssegno;

                    item.GruppiAddebito = dto.GruppiAddebito;
                    item.LottiAddebito = dto.LottiAddebito;
                    item.StabiliAddebito = dto.StabiliAddebito;

                    if (dto.IsMovimentoEconomico != null)
                        item.IsMovimentoEconomico = dto.IsMovimentoEconomico.GetValueOrDefault();

                    // ------------------------------------------
                    // Dettaglio Ripartizione
                    // ------------------------------------------
                    var rep = new SpeseUnitaRepository(item, _info, _windsorConfigRepository);
                    item.DettaglioRipartizione.Clear();

                    foreach (SpeseUnitaDTO t in dto.DettaglioRipartizione)
                    {
                        try
                        {
                            if (t != null && t.Importo != 0)
                            {
                                t.IdMovimentoRiferimento = item.ID;

                                int? id = t.ID;
                                if ((t.Stato == "U") || (t.Stato == "I"))
                                    id = rep.ManageDomainEntity(t);

                                var spesaUnita = daoFactory.GetSpeseUnitaDao().GetById(id.Value, false);
                                item.DettaglioRipartizione.Add(spesaUnita);
                                spesaUnita.MovimentoRiferimento = item;
                            }
                        }
                        catch (Exception ex)
                        {
                            _log.ErrorFormat("Errore nel salvataggio dek movimenti - DETTAGLIO RIPARTIZIONE - {0} - id:{1}", Utility.GetMethodDescription(), ex);
                            throw;
                        }
                    }

                    if (dto.IdEvasione != null)
                       item.EvasioneBancaria = daoFactory.GetEvasioneBancariaDao().Find(dto.IdEvasione.GetValueOrDefault(), false);

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

            return result;
        }
Exemplo n.º 4
0
 public IList<SpeseUnitaDTO> GetAddebitiPersonaliByMovimenti(IList<int> idMovimenti, UserInfo userinfo)
 {
     var windsorRep = new WindsorConfigRepository();
     try
     {
         windsorRep.BeginTransaction(userinfo);
         var repo = new SpeseUnitaRepository(userinfo, windsorRep);
         var item = repo.GetAddebitiPersonaliByMovimenti(idMovimenti);
         windsorRep.Commit();
         return item;
     }
     catch (Exception ex)
     {
         _log.ErrorFormat("Errore nella lettura degli addebiti personali per movimenti - {0} - movimenti:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), idMovimenti.Aggregate(string.Empty, (current, i) => current + (i + ",")), userinfo.Azienda);
         windsorRep.Rollback();
         throw;
     }
 }