Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 /// <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);
Ejemplo n.º 5
0
        //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);
            }
        }