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); }
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); }
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); }
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); } }
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); }
/// <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); }
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); }