コード例 #1
0
        public EntityChange GetEntityChange(object entity, IAbpSession abpSession, string[] propertyNames, object[] loadedState, object[] currentState, Int32[] dirtyProps)
        {
            var setting = entity as Setting;

            if (setting == null)
            {
                return(null);
            }

            var entityChange = new EntityChange
            {
                ChangeType         = EntityChangeType.Updated,
                ChangeTime         = DateTime.Now,
                EntityEntry        = entity, // [NotMapped]
                EntityId           = setting.Name + (setting.UserId != null ? "@" + setting.UserId : ""),
                EntityTypeFullName = typeof(Setting).FullName,
                TenantId           = abpSession.TenantId,
            };

            object oldValue;
            object newValue;
            var    valueIndex = Array.IndexOf(propertyNames, nameof(Setting.Value));

            if (loadedState == null)
            {
                // changed from default
                newValue = currentState[valueIndex];
                oldValue = _settingDefinitionManager.GetSettingDefinition(setting.Name)?.DefaultValue; //default
            }
            else if (dirtyProps == null)
            {
                // delete = restored to default
                newValue = $"default ({_settingDefinitionManager.GetSettingDefinition(setting.Name)?.DefaultValue})"; //default
                oldValue = loadedState[valueIndex];
            }
            else
            {
                // changed
                newValue = currentState[valueIndex];
                oldValue = loadedState[valueIndex];
            }

            var propChange = new EntityPropertyChange()
            {
                OriginalValue        = oldValue?.ToJsonString().TruncateWithPostfix(EntityPropertyChange.MaxValueLength),
                NewValue             = newValue?.ToJsonString().TruncateWithPostfix(EntityPropertyChange.MaxValueLength),
                PropertyName         = nameof(Setting.Value),
                PropertyTypeFullName = typeof(string).FullName,
                TenantId             = abpSession.TenantId,
            };

            entityChange.PropertyChanges = new List <EntityPropertyChange>()
            {
                propChange
            };

            return(entityChange);
        }
コード例 #2
0
        public override bool Equals(object obj)
        {
            bool result = false;

            if (obj is EntityChange)
            {
                EntityPropertyChange epc = (EntityPropertyChange)obj;
                result = string.Equals(epc.ColumnName, this.ColumnName);
            }

            return(result);
        }
コード例 #3
0
        private EntityPropertyChange CreateEntityPropertyChange(object oldValue, object newValue, PropertyInfo propertyInfo)
        {
            var proprtyName    = propertyInfo.Name.TruncateWithPostfix(EntityPropertyChange.MaxPropertyNameLength);
            var propertyChange = new EntityPropertyChange()
            {
                PropertyName         = proprtyName,
                PropertyTypeFullName = propertyInfo.PropertyType.FullName.TruncateWithPostfix(EntityPropertyChange.MaxPropertyTypeFullNameLength),
                TenantId             = AbpSession.TenantId
            };

            propertyChange.SetOriginalValue(oldValue?.ToJsonString());
            propertyChange.SetNewValue(newValue?.ToJsonString());

            return(propertyChange);
        }
コード例 #4
0
        public async Task <PS_PaySubGroup> GetPaySubGroupRawAsync(int id, string asOf = null)
        {
            try {
                PS_PaySubGroup result = ObjectMapper.Map <PS_PaySubGroup, PS_PaySubGroup>(await Task.Run(() => Repository
                                                                                                         .Include(x => x.PayGroup)
                                                                                                         .Include(x => x.LegalEntity)
                                                                                                         .Include(x => x.Frequency)
                                                                                                         .Include(x => x.PayrollPeriod)
                                                                                                         .ThenInclude(x => x.PayPeriods)
                                                                                                         .Include(x => x.AllowedBanks)
                                                                                                         .First(x => x.Id == id)));

                if (asOf != null)
                {
                    DateTime            asOfDateTime = DateTime.Parse(asOf);
                    List <EntityChange> logs         = AuditLogsRepo.WithDetails().Where(x => x.EntityChanges != null && x.EntityChanges.Any(x => x.EntityId == id.ToString() && x.EntityTenantId == CurrentTenant.Id && x.ChangeTime >= asOfDateTime))
                                                       .SelectMany(x => x.EntityChanges.Where(y => y.EntityId == id.ToString() && y.EntityTenantId == CurrentTenant.Id)).ToList();

                    logs.Reverse();
                    for (int i = 0; i < logs.Count; i++)
                    {
                        EntityChange log = logs[i];
                        //log.ChangeType
                        for (int y = 0; y < log.PropertyChanges.Count; y++)
                        {
                            EntityPropertyChange propertyChange = log.PropertyChanges.ElementAt(y);
                            PropertyInfo         prop           = typeof(PS_PaySubGroup).GetProperty(propertyChange.PropertyName);
                            if (prop != null)
                            {
                                try
                                {
                                    prop.SetValue(result, propertyChange.OriginalValue);
                                }
                                catch (Exception ex)
                                {
                                }
                            }
                        }
                    }
                }
                return(result);
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
コード例 #5
0
        private bool AddAuditedAsEvent(PropertyInfo propInfo, SessionExtensions.DirtyPropertyInfo property, EntityPropertyChange propertyChange, EntityChange entityChange, object entity)
        {
            var auditedAsEvent = propInfo.GetCustomAttribute <AuditedAsEventAttribute>();

            if (auditedAsEvent != null)
            {
                // Try to start Event creator from the property attribute
                if (Activator.CreateInstance(auditedAsEvent.EventCreator) is IEntityHistoryEventCreator instance)
                {
                    var enentInfo = instance.CreateEvent(new EntityChangesInfo()
                    {
                        Entity   = entity,
                        DateTime = DateTime.Now,
                        OldValue = property.OldValue,
                        NewValue = property.NewValue
                    });

                    EntityHistoryEvents.Add(new EntityHistoryEvent()
                    {
                        Description  = enentInfo.Description,
                        PropertyName =
                            propInfo.Name.TruncateWithPostfix(EntityPropertyChange.MaxPropertyNameLength),
                        EventName            = enentInfo.EventName,
                        EventType            = string.IsNullOrEmpty(enentInfo.EventType) ? EntityHistoryCommonEventTypes.PROPERTY_CHANGE_AS_EVENT : enentInfo.EventType,
                        EntityPropertyChange = propertyChange,
                        EntityChange         = entityChange
                    });
                    return(true);
                }
            }

            return(false);
        }
コード例 #6
0
        /// <summary>
        /// Gets the property changes for this entry.
        /// </summary>
        private ICollection <EntityPropertyChange> GetPropertyChanges(bool fullAudited, EntityChange entityChange, Type unproxiedEntityType, object entity,
                                                                      IList <SessionExtensions.DirtyPropertyInfo> dirtyProps)
        {
            var propertyChanges = new List <EntityPropertyChange>();

            var entityProps = unproxiedEntityType.GetProperties().ToList();

            foreach (var property in dirtyProps)
            {
                var propInfo = entityProps.FirstOrDefault(x => x.Name == property.Name);
                if (propInfo == null)
                {
                    Logger.Debug($"Changed property {property.Name} not found");
                    continue;
                }

                var isAuditedProp      = IsAuditedPropertyInfo(propInfo);
                var shouldSaveProperty =
                    fullAudited && (isAuditedProp == null || isAuditedProp.Value) ||
                    (isAuditedProp != null && isAuditedProp.Value) ||
                    (IsAditedBooleanPropertyInfo(propInfo) ?? false) ||
                    (IsAditedAsEventPropertyInfo(propInfo) ?? false)
                ;

                if (shouldSaveProperty)
                {
                    var propType = propInfo.PropertyType;

                    var propName = ReflectionHelper.GetDisplayName(propInfo).TruncateWithPostfix(EntityPropertyChange.MaxPropertyNameLength);

                    if (propType.GetInterfaces().Contains(typeof(IEntity)) ||
                        propType.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntity <>)))
                    {
                        EntityPropertyChange propchange = null;
                        // skip creating property changes
                        if (propInfo.GetCustomAttribute <AuditedAsEventAttribute>()?.SaveFullInfo ?? true)
                        {
                            propchange = CreateEntityPropertyChange(
                                property.OldValue != null
                                    ? propType.GetProperty("Id")?.GetValue(property.OldValue).ToString() ??
                                property.OldValue.ToString()
                                    : "",
                                property.NewValue != null
                                    ? propType.GetProperty("Id")?.GetValue(property.NewValue).ToString() ??
                                property.NewValue.ToString()
                                    : "",
                                propInfo
                                );
                            propertyChanges.Add(propchange);
                        }

                        if (!AddAuditedAsEvent(propInfo, property, propchange, entityChange, entity))
                        {
                            var displayProperty = propType.GetProperties()
                                                  .FirstOrDefault(x => x.HasAttribute <EntityDisplayNameAttribute>());

                            var description = $"`{propName}` was changed from `" +
                                              (property.OldValue != null
                                                  ? displayProperty?.GetValue(property.OldValue)?.ToString() ??
                                               property.OldValue.ToString()
                                                  : "") +
                                              "` to `" +
                                              (property.NewValue != null
                                                  ? displayProperty?.GetValue(property.NewValue)?.ToString() ??
                                               property.NewValue.ToString()
                                                  : "") + '`';
                            // Add extended (friendly) description for Reference types
                            EntityHistoryEvents.Add(new EntityHistoryEvent()
                            {
                                Description  = description,
                                PropertyName =
                                    propInfo.Name.TruncateWithPostfix(EntityPropertyChange.MaxPropertyNameLength),
                                EventName            = "",
                                EventType            = EntityHistoryCommonEventTypes.PROPERTY_CHANGE_FRIENDLY_TEXT,
                                EntityPropertyChange = propchange
                            });
                        }
                    }
                    else
                    {
                        var oldValue = property.OldValue;
                        var newValue = property.NewValue;

                        EntityPropertyChange propchange = null;
                        // skip creating property changes
                        if (propInfo.GetCustomAttribute <AuditedAsEventAttribute>()?.SaveFullInfo ?? true)
                        {
                            // Get Reference List item values
                            var refListProperty = propInfo.GetReferenceListIdentifierOrNull();
                            if (refListProperty != null)
                            {
                                oldValue = property.OldValue != null
                                    ? StaticContext.IocManager.Resolve <IReferenceListHelper>()
                                           .GetItemDisplayText(refListProperty.Namespace, refListProperty.Name,
                                                               property.OldValue.GetType().IsEnum
                                                ? (int?)Convert.ChangeType(property.OldValue, Enum.GetUnderlyingType(property.OldValue.GetType()))
                                                : (int?)property.OldValue)
                                    : null;

                                newValue = property.NewValue != null
                                    ? StaticContext.IocManager.Resolve <IReferenceListHelper>()
                                           .GetItemDisplayText(refListProperty.Namespace, refListProperty.Name,
                                                               property.NewValue.GetType().IsEnum
                                                ? (int?)Convert.ChangeType(property.NewValue, Enum.GetUnderlyingType(property.NewValue.GetType()))
                                                : (int?)property.NewValue)
                                    : null;
                            }

                            propchange = CreateEntityPropertyChange(
                                oldValue,
                                newValue,
                                propInfo
                                );
                            propertyChanges.Add(propchange);
                        }


                        if (!AddAuditedAsEvent(propInfo, property, propchange, entityChange, entity))
                        {
                            var attr = propInfo.GetCustomAttribute <AuditedBooleanAttribute>();
                            if (attr != null)
                            {
                                var description = (bool)newValue ? attr.TrueText : attr.FalseText;
                                // Add extended (friendly) description for Reference types
                                EntityHistoryEvents.Add(new EntityHistoryEvent()
                                {
                                    Description  = description,
                                    PropertyName =
                                        propInfo.Name.TruncateWithPostfix(EntityPropertyChange.MaxPropertyNameLength),
                                    EventName            = attr.EventText,
                                    EventType            = EntityHistoryCommonEventTypes.PROPERTY_CHANGE_FRIENDLY_TEXT,
                                    EntityPropertyChange = propchange
                                });
                            }
                        }
                    }
                }
            }

            return(propertyChanges);
        }
コード例 #7
0
        public async Task <JsonResult> OnGetDataAuditTrail()
        {
            dynamic        result         = new ExpandoObject();
            List <dynamic> DS             = new List <dynamic>();
            List <dynamic> secondaryDS    = new List <dynamic>();
            List <dynamic> tertiaryDS     = new List <dynamic>();
            var            departmentLogs = AuditLogsRepo.WithDetails().Where(x => x.Url == HttpContext.Request.Path.Value && x.EntityChanges != null && x.EntityChanges.Count > 0).ToList();

            List <OS_DivisionTemplate_Dto> Entities = await OS_DivisionTemplateAppService.GetAllDivisionTemplatesAsync();

            TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

            for (int i = 0; i < departmentLogs.Count; i++)
            {
                AuditLog auditLog = departmentLogs[i];
                if (auditLog.EntityChanges == null || auditLog.EntityChanges.Count == 0)
                {
                    continue;
                }
                var entityChanges = auditLog.EntityChanges.ToList();
                for (int j = 0; j < entityChanges.Count; j++)
                {
                    EntityChange entityChange = entityChanges[j];

                    dynamic changeRow = new ExpandoObject();
                    changeRow.AuditLogId     = entityChange.Id;
                    changeRow.EntityChangeId = entityChange.Id;

                    OS_DivisionTemplate_Dto department = Entities.First(x => x.Id.ToString() == entityChange.EntityId);
                    changeRow.Id     = department.Id;
                    changeRow.Name   = department.Name;
                    changeRow.Date   = entityChange.ChangeTime.ToShortDateString();
                    changeRow.Time   = entityChange.ChangeTime.ToShortTimeString();
                    changeRow.User   = auditLog.UserName;
                    changeRow.Status = entityChange.ChangeType.GetDisplayName();

                    DS.Add(changeRow);

                    dynamic generalTypeRow = new ExpandoObject();
                    generalTypeRow.EntityChangeId = entityChange.Id;
                    generalTypeRow.TypeId         = 1;
                    generalTypeRow.Type           = "General";
                    generalTypeRow.Name           = "";
                    generalTypeRow.Status         = "Updated";

                    changeRow.Type = "General";
                    //changeRow.Name = "";
                    changeRow.ChangeStatus = "Updated";

                    secondaryDS.Add(generalTypeRow);

                    var generalPropertyChanges = entityChange.PropertyChanges.ToList();

                    for (int k = 0; k < generalPropertyChanges.Count; k++)
                    {
                        EntityPropertyChange propertyChange = generalPropertyChanges[k];
                        dynamic propertyChangeRow           = new ExpandoObject();
                        propertyChangeRow.TypeId         = 1;
                        propertyChangeRow.EntityChangeId = propertyChange.EntityChangeId;
                        propertyChangeRow.Field          = textInfo.ToTitleCase(propertyChange.PropertyName.ToSentenceCase());
                        propertyChangeRow.NewValue       = propertyChange.NewValue != "null" && propertyChange.NewValue != "\"\"" ? propertyChange.NewValue.TrimStart('"').TrimEnd('"') : "—";
                        propertyChangeRow.OriginalValue  = propertyChange.OriginalValue != "null" && propertyChange.OriginalValue != "\"\"" ? propertyChange.OriginalValue.TrimStart('"').TrimEnd('"') : "—";;

                        changeRow.Field         = textInfo.ToTitleCase(propertyChange.PropertyName.ToSentenceCase());
                        changeRow.NewValue      = propertyChange.NewValue != "null" && propertyChange.NewValue != "\"\"" ? propertyChange.NewValue.TrimStart('"').TrimEnd('"') : "—";
                        changeRow.OriginalValue = propertyChange.OriginalValue != "null" && propertyChange.OriginalValue != "\"\"" ? propertyChange.OriginalValue.TrimStart('"').TrimEnd('"') : "—";;

                        tertiaryDS.Add(propertyChangeRow);
                    }

                    //List<EmployeeExtraPropertyHistory> extraPropertyHistories = entityChange.GetProperty<List<EmployeeExtraPropertyHistory>>("extraPropertiesHistory");
                    //if (extraPropertyHistories != null && extraPropertyHistories.Count > 0)
                    //{
                    //    foreach (EmployeeExtraPropertyHistory extraPropertyHistory in extraPropertyHistories)
                    //    {
                    //        dynamic typeRow = new ExpandoObject();
                    //        typeRow.EntityChangeId = entityChange.Id;
                    //        typeRow.TypeId = extraPropertyHistory.TypeId;
                    //        typeRow.Type = extraPropertyHistory.Type;
                    //        typeRow.Name = extraPropertyHistory.Name;
                    //        typeRow.Status = extraPropertyHistory.Status;

                    //        secondaryDS.Add(typeRow);

                    //        var propertyChanges = extraPropertyHistory.PropertyChanges.ToList();

                    //        for (int k = 0; k < propertyChanges.Count; k++)
                    //        {
                    //            EmployeeTypePropertyChange propertyChange = propertyChanges[k];
                    //            dynamic propertyChangeRow = new ExpandoObject();
                    //            propertyChangeRow.TypeId = extraPropertyHistory.TypeId;
                    //            propertyChangeRow.EntityChangeId = typeRow.EntityChangeId;
                    //            propertyChangeRow.Field = textInfo.ToTitleCase(propertyChange.PropertyName.ToSentenceCase());
                    //            propertyChangeRow.NewValue = propertyChange.NewValue != "null" && propertyChange.NewValue != "\"\"" ? propertyChange.NewValue.TrimStart('"').TrimEnd('"') : "—";
                    //            propertyChangeRow.OriginalValue = propertyChange.OriginalValue != "null" && propertyChange.OriginalValue != "\"\"" ? propertyChange.OriginalValue.TrimStart('"').TrimEnd('"') : "—"; ;

                    //            tertiaryDS.Add(propertyChangeRow);
                    //        }
                    //    }
                    //}
                }
            }
            result.ds          = DS;
            result.secondaryDS = secondaryDS;
            result.tertiaryDS  = tertiaryDS;

            var secondaryGrid = new JsonResult(result);

            return(secondaryGrid);
        }