public static bool NeedNotifyLock(DateTime lockDate, ComplianceState state) { if (lockDate == DateTime.MinValue) { return(false); } var now = GetCurrentBusinessTime(); var first = (lockDate - now).TotalDays <= FirstLockNotificationDays && !state.FirstLockNotificationSent; var second = (lockDate - now).TotalDays <= SecondLockNotificationDays && !state.SecondLockNotificationSent; return(first || second); }
public static bool NeedLock(DateTime lockDate, ComplianceState state) { if (lockDate == DateTime.MinValue) { return(false); } if (state.IsLocked) { return(false); } var now = GetCurrentBusinessTime(); var ret = (lockDate - now).TotalDays <= 0; return(ret); }
public static bool NeedNotifyDelete(DateTime lockDate, ComplianceState state) { if (lockDate == DateTime.MinValue) { return(false); } var now = GetCurrentBusinessTime(); var ret = (now - lockDate).TotalDays >= DeleteNotificationDays && !state.DeleteNotificationSent; if (ret) { state.DeleteDate = lockDate.AddDays(DeleteDays); } return(ret); }
/// <summary> /// Converts the <see cref="sourceValue" /> parameter to the <see cref="destinationType" /> parameter using <see cref="formatProvider" /// /> and <see cref="ignoreCase" /> /// </summary> /// <param name="sourceValue">the <see cref="System.Object"/> to convert from</param> /// <param name="destinationType">the <see cref="System.Type" /> to convert to</param> /// <param name="formatProvider">not used by this TypeConverter.</param> /// <param name="ignoreCase">when set to <c>true</c>, will ignore the case when converting.</param> /// <returns> /// an instance of <see cref="ComplianceState" />, or <c>null</c> if there is no suitable conversion. /// </returns> public override object ConvertFrom(object sourceValue, global::System.Type destinationType, global::System.IFormatProvider formatProvider, bool ignoreCase) => ComplianceState.CreateFrom(sourceValue);
//Start this by Only looking at Config Files and Lines that have = public bool Execute(MeterDataSet meterDataSet) { if (meterDataSet.Type != DataSetType.Config) { return(false); } if (!HasComplianceMeter(meterDataSet)) { return(false); } using (AdoDataConnection connection = new AdoDataConnection("systemSettings")) { ComplianceMeter meter = new TableOperations <ComplianceMeter>(connection).QueryRecordWhere("MeterId = {0}", meterDataSet.Meter.ID); //This means we need to activate the meter if (!meter.Active) { meter.Active = true; new TableOperations <ComplianceMeter>(connection).UpdateRecord(meter); } // Get appropriate Base Configurations IEnumerable <BaseConfig> baseConfigsMeter = new TableOperations <BaseConfig>(connection).QueryRecordsWhere("MeterId = {0}", meter.ID); //Filter by Pattern baseConfigsMeter = baseConfigsMeter.Where(item => FilePath.IsFilePatternMatch(item.Pattern, meterDataSet.FilePath, true)); if (baseConfigsMeter.Count() == 0) { return(true); } // Pares File using Compliance Operations // Instantiates the given data reader and wraps it in a disposable wrapper object. Model.ComplianceOperation parser = new TableOperations <Model.ComplianceOperation>(connection).QueryRecords("LoadOrder") .FirstOrDefault(reader => FilePath.IsFilePatternMatch(reader.FilePattern, meterDataSet.FilePath, true)); ComplianceParserWrapper wrapper; try { Assembly assembly = Assembly.LoadFrom(parser.AssemblyName); Type type = assembly.GetType(parser.TypeName); wrapper = new ComplianceParserWrapper(parser.ID, type); } catch (Exception ex) { string message = $"Failed to create Compliance File parser of type {parser.TypeName}: {ex.Message}"; throw new TypeLoadException(message, ex); } // Parse ConfigFile into Dictionary of Fields Dictionary <string, string> activeConfig = new Dictionary <string, string>(); try { activeConfig = wrapper.DataObject.ParseFields(meterDataSet); } catch (Exception ex) { string message = $"Failed to parse Config File for Compliance Fields {parser.TypeName}: {ex.Message}"; throw new TypeLoadException(message, ex); } // If Meter is not Reviewed just keep updating Base Config if (!meter.Reviewed) { foreach (BaseConfig baseConfig in baseConfigsMeter) { UpdateBaseConfig(baseConfig, activeConfig); } return(true); } // Get a Bunch of AlarmStates TableOperations <ComplianceState> complianceStateTbl = new TableOperations <ComplianceState>(connection); ComplianceState resolved = complianceStateTbl.QueryRecordWhere("Description = 'In Compliance'"); ComplianceState noCompliance = complianceStateTbl.QueryRecordWhere("Description = 'Compliance Issue'"); ComplianceState acknowledged = complianceStateTbl.QueryRecordWhere("Description = 'Acknowledged'"); ComplianceState reviewed = complianceStateTbl.QueryRecordWhere("Description = 'Reviewed'"); TableOperations <ComplianceRecord> complianceRecordTbl = new TableOperations <ComplianceRecord>(connection); TableOperations <ComplianceRecordView> complianceRecordViewTbl = new TableOperations <ComplianceRecordView>(connection); TableOperations <ComplianceRecordField> recordFieldTbl = new TableOperations <ComplianceRecordField>(connection); TableOperations <ComplianceField> complianceFieldTbl = new TableOperations <ComplianceField>(connection); TableOperations <ComplianceAction> complianceActionTbl = new TableOperations <ComplianceAction>(connection); TableOperations <ComplianceFieldValue> complianceFieldValueTbl = new TableOperations <ComplianceFieldValue>(connection); TableOperations <ComplianceFieldValueView> complianceFieldValueViewTbl = new TableOperations <ComplianceFieldValueView>(connection); //Walk through each BaseConfig separately foreach (BaseConfig baseConfig in baseConfigsMeter) { // Get relevant Compliance Fields List <ComplianceField> baseConfigfields = complianceFieldTbl.QueryRecordsWhere("BaseConfigId = {0}", baseConfig.ID).ToList(); if (baseConfigfields.Count() == 0) { continue; } List <ComplianceField> changingFields = baseConfigfields.Where(fld => { ComplianceFieldValueView value = complianceFieldValueViewTbl.QueryRecordWhere("FieldId = {0}", fld.ID); if (value == null) { return(!fld.Evaluate(activeConfig[fld.Name])); } return(activeConfig[fld.Name] != value.Value); }).ToList(); if (changingFields.Count == 0) { continue; } //Clear so that -1 if Record is resolved IEnumerable <IGrouping <int, ComplianceField> > recordGroups = changingFields.GroupBy(fld => { ComplianceRecordView record = complianceRecordViewTbl.QueryRecordWhere("BaseConfigId = {0} AND ID IN (SELECT RecordID FROM ComplianceRecordFields WHERE FieldId = {1}) AND Status IN ({2},{3}, {4})", baseConfig.ID, fld.ID, acknowledged.ID, noCompliance.ID, reviewed.ID); if (record == null) { return(-1); } return(record.ID); }, fld => fld); //Count those that exist and change Status meterDataSet.ComplianceIssues += recordGroups.Count(); if (recordGroups.Any(g => g.Key == -1)) { meterDataSet.ComplianceIssues--; } // Some Records can not be updated with failing Fields they need to be separate List <ComplianceField> newFields = new List <ComplianceField>(); // Work Backwards to get associated Record for a Field foreach (IGrouping <int, ComplianceField> group in recordGroups) { //we skip those that don't have a record if (group.Key > -1) { // grab status ComplianceRecordView view = complianceRecordViewTbl.QueryRecordWhere("Id = {0}", group.Key); //Check if we can resolve everything including some fields that are previously resolved. bool canResolve = complianceFieldValueViewTbl.QueryRecordsWhere("RecordID = {0}", group.Key).All(fld => { string value; if (!activeConfig.TryGetValue(fld.FieldName, out value)) { value = fld.Value; } return(baseConfigfields.Find(field => field.ID == fld.FieldId).Evaluate(value)); }); if (canResolve) { //Create Action complianceActionTbl.AddNewRecord(new ComplianceAction() { Note = "New File Downloaded", UserAccount = "MiMD", RecordId = group.Key, StateId = resolved.ID, Timestamp = DateTime.UtcNow }); int resolvedId = connection.ExecuteScalar <int>("SELECT @@identity"); group.ToList().ForEach(item => complianceFieldValueTbl.AddNewRecord(new ComplianceFieldValue() { ActionId = resolvedId, FieldId = item.ID, Value = activeConfig[item.Name] })); } else if (view.Status == noCompliance.ID) { //Create Action complianceActionTbl.AddNewRecord(new ComplianceAction() { Note = "New File Downloaded", UserAccount = "MiMD", RecordId = group.Key, StateId = null, Timestamp = DateTime.UtcNow }); int resolvedId = connection.ExecuteScalar <int>("SELECT @@identity"); group.ToList().ForEach(item => complianceFieldValueTbl.AddNewRecord(new ComplianceFieldValue() { ActionId = resolvedId, FieldId = item.ID, Value = activeConfig[item.Name] })); } else { List <ComplianceField> nonresolving = group.ToList().Where(fld => { string old = complianceFieldValueViewTbl.QueryRecordWhere("FieldId = {0}", fld.ID).Value; return(!fld.Evaluate(activeConfig[fld.Name]) && fld.Evaluate(old)); }).ToList(); List <ComplianceField> resolving = group.ToList().Where(fld => { string old = complianceFieldValueViewTbl.QueryRecordWhere("FieldId = {0}", fld.ID).Value; return(!fld.Evaluate(old)); }).ToList(); if (resolving.Count > 0) { complianceActionTbl.AddNewRecord(new ComplianceAction() { Note = "New File Downloaded", UserAccount = "MiMD", RecordId = group.Key, StateId = null, Timestamp = DateTime.UtcNow }); int resolvedId = connection.ExecuteScalar <int>("SELECT @@identity"); resolving.ForEach(item => complianceFieldValueTbl.AddNewRecord(new ComplianceFieldValue() { ActionId = resolvedId, FieldId = item.ID, Value = activeConfig[item.Name] })); } newFields = newFields.Concat(nonresolving).ToList(); } } else { newFields = newFields.Concat(group.ToList()).ToList(); } } if (newFields.Count == 0) { continue; } // Add the new Compliance Issue to count if it is opened meterDataSet.ComplianceIssues++; complianceRecordTbl.AddNewRecord(new ComplianceRecord() { BaseConfigId = baseConfig.ID, MeterId = meter.ID, TimerOffset = 0 }); int recordId = connection.ExecuteScalar <int>("SELECT @@identity"); //Create Action complianceActionTbl.AddNewRecord(new ComplianceAction() { Note = "New File Downloaded", UserAccount = "MiMD", RecordId = recordId, StateId = noCompliance.ID, Timestamp = DateTime.UtcNow }); int actionId = connection.ExecuteScalar <int>("SELECT @@identity"); newFields.ForEach(item => recordFieldTbl.AddNewRecord(new ComplianceRecordField() { FieldId = item.ID, RecordId = recordId })); newFields.ForEach(item => complianceFieldValueTbl.AddNewRecord(new ComplianceFieldValue() { ActionId = actionId, FieldId = item.ID, Value = activeConfig[item.Name] })); } return(true); } }