/// <summary> /// Registra na sessão de persistencia o log da exclusão da entidade. /// </summary> /// <param name="sessao"></param> /// <param name="entidade"></param> public void RegistraExclusao(Colosoft.Data.IPersistenceSession sessao, Colosoft.Business.IEntity entidade) { // Verifica se está apagando uma entidade existente if (entidade.ExistsInStorage && !entidade.InstanceState.Parameters.Contains(IgnoreExclusaoParameterName)) { var cancelamentoAttribute = entidade.GetType() .GetCustomAttributes(typeof(ControleAlteracaoAttribute), false) .FirstOrDefault() as ControleAlteracaoAttribute; if (cancelamentoAttribute != null && cancelamentoAttribute.TabelaCancelamento.HasValue) { dynamic entidade2 = entidade; var logs = Data.DAL.LogCancelamentoDAO.Instance.ObtemLogs(Glass.Data.Helper.UserInfo.GetUserInfo.CodUser, cancelamentoAttribute.TabelaCancelamento.Value, entidade.Uid, entidade2.DataModel, null, false); foreach (Data.Model.LogCancelamento log in logs) { if (log.IdLogCancelamento == 0) { // Define o novo identificador virtual log.IdLogCancelamento = Colosoft.Business.EntityTypeManager.Instance.GenerateInstanceUid(typeof(Data.Model.LogCancelamento)); } // Adiciona a entrada do log para inserir no banco sessao.Insert(log, (string[])null); } } } }
/// <summary> /// Salva todos os dados gerados na conversão. /// </summary> /// <param name="session">Sessão de persistencia que será usada para salva os dados.</param> /// <returns>Resultado da operação.</returns> public Colosoft.Business.SaveResult Salvar(Colosoft.Data.IPersistenceSession session) { Colosoft.Business.SaveResult resultado; foreach (var produto in this._produtosRetalhos) { resultado = produto.Save(session); if (!resultado) { return(resultado); } } foreach (var retalhoProducao in this._retalhosProducao) { session.Insert(retalhoProducao); } return(this.Solucao.Save(session)); }
/// <summary> /// Registra na sessão de persistencia a operação para salvar /// as alterações da entidade. /// </summary> /// <param name="sessao">Sessão de persistencia.</param> /// <param name="entidade">Entidade com os dados alterados.</param> public void RegistraAlteracoes(Colosoft.Data.IPersistenceSession sessao, Colosoft.Business.IEntity entidade) { var attribute = entidade.GetType() .GetCustomAttributes(typeof(ControleAlteracaoAttribute), false) .FirstOrDefault() as ControleAlteracaoAttribute; var id = new Lazy <int>(() => { if (entidade.HasUid) { return(entidade.Uid); } else if (attribute.LogIdCreatorType != null) { var idCreator = Activator.CreateInstance(attribute.LogIdCreatorType) as ILogIdCreator; return(idCreator.Create(entidade)); } return(0); }); // Verifica se está atualizando a entidade if (attribute != null && attribute.TabelaAlteracao.HasValue && (entidade.ExistsInStorage || attribute.LogAoInserir)) { dynamic entidade2 = entidade; object atual = ObtemDadosAtuais(entidade); bool criou = false; if (atual == null && attribute.LogAoInserir) { dynamic e = entidade.Loader.Create(null, Colosoft.Business.EntityTypeManager.Instance, SourceContext.Instance); atual = e.DataModel; criou = atual != null; } if (atual == null) { return; } string referencia = attribute.LogAoInserir && criou && entidade.Loader.HasFindName ? entidade.Loader.GetInstanceFindName(entidade2) : null; var logs = Data.DAL.LogAlteracaoDAO.Instance.ObtemLogs(Glass.Data.Helper.UserInfo.GetUserInfo.CodUser, attribute.TabelaAlteracao.Value, id.Value, atual, entidade2.DataModel, referencia); foreach (Data.Model.LogAlteracao log in logs) { if (log.IdLog == 0) { // Define o novo identificador virtual log.IdLog = Colosoft.Business.EntityTypeManager.Instance.GenerateInstanceUid(typeof(Data.Model.LogAlteracao)); } // Adiciona a entrada do log para inserir no banco sessao.Insert(log, (string[])null); } } // Verifica se possui configuração de log if (ControleAlteracaoEntityLoaderConfiguration.PossuiConfiguracao(entidade.Loader) && (entidade.ExistsInStorage || (attribute != null && attribute.LogFilhoAoInserir))) { var config = ControleAlteracaoEntityLoaderConfiguration.ObtemConfiguracao(entidade.Loader); foreach (var entry in config.Entries) { // Recupera o valor da entidade var value = entry.GetValue(entidade.Loader, entidade); // Verifica se é uma lista de filho if (value is Colosoft.Business.IEntityChildrenList) { var children = (Colosoft.Business.IEntityChildrenList)value; if (!children.IsLazyLoadState) { if (children.IsChanged) { // Recupera os loader da entidades filhas var entityLoader = children.GetNewItems() .Union(children.GetChangedItems() .Union(children.GetRemovedItems())) .Select(f => f.Loader) .FirstOrDefault(f => f != null); if (entityLoader == null) { continue; } IEnumerable <string> changedItems = null; if (children.GetChangedItems().Any()) { // Cria uma consulta para recupera os filhos alterados var query = SourceContext.Instance.CreateQuery() .From(new Colosoft.Query.EntityInfo(entityLoader.DataModelType.FullName)) .Select(string.Join(",", entityLoader.FindNameProperties)); if (entityLoader.HasUid) { // Consulta pelos ids var ids = string.Join(",", children.GetChangedItems().Select(f => entityLoader.GetInstanceUid(f))); query.Where(string.Format("{0} IN ({1})", entityLoader.UidPropertyName, ids)); } else { var count = 0; // Consulta pelas alterações foreach (var i in children.GetChangedItems()) { var container = new Colosoft.Query.ConditionalContainer(); // Recupera os valores das chaves da instancia. var keys = entityLoader.GetInstanceKeysValues(i); foreach (var k in keys) { container .And(string.Format("{0}=?v{1}", k.Item1, count)) .Add(string.Format("?v{0}", count++), k.Item2); } query.WhereClause.Or(container); } } var properties = entityLoader.DataModelType.GetProperties().Where(f => (entityLoader.FindNameProperties.Contains(f.Name))).ToArray(); properties = entityLoader.FindNameProperties.Select(f => properties.First(x => x.Name == f)).ToArray(); // Recupera os itens alterados changedItems = query.Execute() .Select(f => entityLoader.GetInstanceFindName( properties.Select(x => Colosoft.Reflection.TypeConverter.Get(x.PropertyType, f.GetValue(x.Name))).ToArray())) .ToList(); } else { changedItems = new string[0]; } var anterior = changedItems.Any() ? string.Format("-> Alterados:\r\n{0}", string.Join("\r\n", changedItems)) : ""; var newItems = children.GetNewItems().Any() ? children.GetNewItems().Select(f => f.FindName).ToArray() : new string[0]; changedItems = children.GetChangedItems().Select(f => f.FindName).Where(f => !newItems.Contains(f)).ToList(); /*var atual = string.Join("\r\n", new[] * { * newItems.Any() ? string.Format("-> Novos:\r\n{0}", string.Join("\r\n", newItems)) : "", * changedItems.Any() ? string.Format("-> Alterados:\r\n{0}", string.Join("\r\n", changedItems)) : "", * children.GetRemovedItems().Any() ? string.Format("-> Removidos:\r\n{0}", string.Join("\r\n", children.GetRemovedItems().Select(f => f.FindName))) : "" * }.Where(f => !string.IsNullOrEmpty(f)));*/ /* Chamado 18215. */ var atual = string.Join("\r\n", new[] { newItems.Any() ? string.Format(entry.ChildName == "FormasPagto" ? "-> Removidos:\r\n{0}" : "-> Novos:\r\n{0}", string.Join("\r\n", newItems)) : "", changedItems.Any() ? string.Format("-> Alterados:\r\n{0}", string.Join("\r\n", changedItems)) : "", children.GetRemovedItems().Any() ? string.Format(entry.ChildName == "FormasPagto" ? "-> Novos:\r\n{0}" : "-> Removidos:\r\n{0}", string.Join("\r\n", children.GetRemovedItems().Select(f => f.FindName))) : "" }.Where(f => !string.IsNullOrEmpty(f))); var log = new Data.Model.LogAlteracao(); // Define o novo identificador virtual log.IdLog = Colosoft.Business.EntityTypeManager.Instance.GenerateInstanceUid(typeof(Data.Model.LogAlteracao)); log.Tabela = (int)attribute.TabelaAlteracao.Value; log.IdRegistroAlt = id.Value; log.NumEvento = Glass.Data.DAL.LogAlteracaoDAO.Instance.GetNumEvento(attribute.TabelaAlteracao.Value, id.Value);; log.Campo = entry.Description; log.DataAlt = DateTime.Now; log.IdFuncAlt = Glass.Data.Helper.UserInfo.GetUserInfo.CodUser; log.ValorAnterior = anterior; log.ValorAtual = atual; // Adiciona a entrada do log para inserir no banco sessao.Insert(log, (string[])null); } } } } } }