Example #1
0
        public void ProcessData(ScenarioCampaignFailureOutput data, Run run, Scenario scenario)
        {
            if (!_saveData)
            {
                PreGenerateReport(data.Data, run, scenario);
                return;
            }

            try
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"Start insert of campaign failures. ScenarioId: {data.ScenarioId} Count: {data.Data.Count}"));
                using (var internalScope = _repositoryFactory.BeginRepositoryScope())
                {
                    var scenarioCampaignFailureRepository = internalScope.CreateRepository <IScenarioCampaignFailureRepository>();
                    scenarioCampaignFailureRepository.AddRange(data.Data, false);
                    scenarioCampaignFailureRepository.SaveChanges();
                }
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"Complete insert of campaign failures. ScenarioId: {data.ScenarioId} Count: {data.Data.Count}"));
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, $"Error while processing scenario campaign failures. ScenarioId: {scenario.Id}", e));
                throw;
            }

            PreGenerateReport(data.Data, run, scenario);
        }
        public ScenarioCampaignLevelResult ProcessFile(Guid scenarioId, string folder)
        {
            string pathToFile = FileHelpers.GetPathToFileIfExists(folder, FileName);

            var result = new ScenarioCampaignLevelResult {
                Id = scenarioId
            };

            if (string.IsNullOrEmpty(pathToFile))
            {
                _audit.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, $"File {pathToFile} was not found."));

                return(result);
            }

            _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                  0, $"Processing output file {pathToFile}"));

            var importSettings = CSVImportSettings.GetImportSettings(pathToFile, typeof(ScenarioCampaignLevelResultHeaderMap), typeof(ScenarioCampaignLevelResultIndexMap));
            IScenarioCampaignLevelResultsImportRepository repository = new CSVScenarioCampaignLevelResultsImportRepository(importSettings);

            var data = repository.GetAll();

            result.Items = _mapper.Map <List <ScenarioCampaignLevelResultItem> >(data);

            _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                  0, $"Processed output file {pathToFile}"));

            return(result);
        }
Example #3
0
        /// <summary>
        /// Executes systems task
        /// </summary>
        /// <param name="taskId"></param>
        /// <returns></returns>
        public List<SystemTaskResult> ExecuteTask(string taskId)
        {
            var allSystemTaskResults = new List<SystemTaskResult>();
            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, String.Format("Executing system task {0}", taskId)));

            try
            {
                // Get task to run
                var systemTask = GetSystemTasks().Where(mt => mt.Id == taskId).First();
                var systemTaskResults = systemTask.Execute();
                allSystemTaskResults.AddRange(systemTaskResults);

                // Log results
                foreach (var systemTaskResult in systemTaskResults)
                {
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, String.Format("System task result for {0}: {1}: {2}", taskId, systemTaskResult.ResultType, systemTaskResult.Message)));
                }
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, String.Format("Executed system task {0}", taskId)));
            }
            catch (System.Exception exception)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, String.Format("Error executing system task {0}", taskId), exception));
                throw;
            }
            return allSystemTaskResults;
        }
Example #4
0
        public void ProcessData(SpotsReqmOutput data, Run run, Scenario scenario)
        {
            try
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"Start insert of recommendations. ScenarioId: {data.ScenarioId} Count: {data.Recommendations.Count}"));

                using (var innerScope = _repositoryFactory.BeginRepositoryScope())
                {
                    var recommendationBatchRepository = innerScope.CreateRepository <IRecommendationRepository>();
                    recommendationBatchRepository.Insert(data.Recommendations, false);
                    recommendationBatchRepository.SaveChanges();
                }

                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"End insert of recommendations. ScenarioId: {data.ScenarioId}"));
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, $"Error while processing scenario recommendations. ScenarioId: {scenario.Id}", e));
                throw;
            }

            // do not generate report for scenario with smooth
            if (run.Smooth)
            {
                return;
            }

            var fileName = ReportFileNameHelper.RecommendationResult(run, scenario);

            PreGenerateReport(data.Recommendations, fileName, scenario.Id);
        }
Example #5
0
        private List <SystemTestResult> ExecuteLoggingTest()
        {
            var results = new List <SystemTestResult>();

            // Write audit event
            AuditEvent auditEvent = AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, "Test message");

            _auditEventRepository.Insert(auditEvent);

            // Try reading audit event, may fail if there's an issue such as log file permissions
            AuditEventFilter auditEventFilter = new AuditEventFilter()
            {
                MinTimeCreated = auditEvent.TimeCreated.AddSeconds(-1),
                MaxTimeCreated = auditEvent.TimeCreated.AddSeconds(1)
            };
            var        auditEvents      = _auditEventRepository.Get(auditEventFilter);
            AuditEvent auditEventLogged = auditEvents.Where(ae => ae.ID == auditEvent.ID).FirstOrDefault();

            if (auditEventLogged == null)       // Not logged
            {
                results.Add(new SystemTestResult(SystemTestResult.ResultTypes.Error, _category, "Event logging logging mechanism is not working because it was not possible to log a test event. There may be a problem with log folder permissions or disk space on the Gameplan API server.", ""));
            }
            else
            {
                results.Add(new SystemTestResult(SystemTestResult.ResultTypes.Information, _category, "Event logging mechanism is OK", ""));
            }
            return(results);
        }
Example #6
0
        /// <summary>
        /// Waits for the task instance status to change or timeout
        /// </summary>
        /// <param name="id"></param>
        /// <param name="process"></param>
        /// <param name="currentStatus"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        private TaskInstanceStatues WaitForStatusChange(Guid id, Process process, TaskInstanceStatues currentStatus, TimeSpan timeout)
        {
            var timeNow     = DateTime.UtcNow;
            var waitTimeout = timeNow.Add(timeout);

            TaskInstanceStatues newStatus = currentStatus;

            do
            {
                // Wait a bit before we check the status
                if (!process.HasExited)
                {
                    Thread.Sleep(2000);
                }

                using var scope = _repositoryFactory.BeginRepositoryScope();
                var          taskInstanceRepository = scope.CreateRepository <ITaskInstanceRepository>();
                TaskInstance taskInstance           = taskInstanceRepository.Get(id);
                newStatus = taskInstance.Status;
            } while (currentStatus == newStatus && DateTime.UtcNow < waitTimeout && !process.HasExited);

            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                 string.Format("WaitForStatusChange [TID: {0}] Waited for {1}", id, DateTime.UtcNow - timeNow)));

            return(newStatus);
        }
 /// <summary>
 /// It is called dynamically.
 /// </summary>
 public async Task Execute(CancellationToken cancellationToken, AutoBook autoBook)
 {
     try
     {
         try
         {
             _autoBooks.Create(autoBook);
             _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                  $"Creating AutoBook instance (AutoBookID={autoBook.Id}): Waiting for Idle notification"));
         }
         catch (Exception ex)
         {
             _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0,
                                                                                         $"Error creating AutoBook (AutoBookID={autoBook.Id})", ex));
             autoBook.Status = AutoBookStatuses.Fatal_Error;
             _autoBookRepository.Update(autoBook);
         }
     }
     finally
     {
         foreach (var dbContext in _tenantDbContexts)
         {
             try
             {
                 await dbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
             }
             catch //ignore exception
             {
             }
         }
     }
 }
Example #8
0
        /// <summary>
        /// Deletes all logs of specific type that are older than date range
        ///
        /// Log format: [Date].[Optional:Something].[LogType].txt
        /// </summary>
        /// <param name="retention"></param>
        /// <param name="folder"></param>
        /// <param name="logType"></param>
        /// <returns></returns>
        private List <SystemTaskResult> DeleteLogsByType(TimeSpan retention, string folder, string logType)
        {
            List <SystemTaskResult> results = new List <SystemTaskResult>();

            try
            {
                DateTime     minEventDate       = DateTime.UtcNow.Subtract(retention);
                const string eventLogDateFormat = "dd-MM-yyyy";
                Dictionary <string, string> fileNamePatternByLogType = FileNamePatternByLogType;
                if (Directory.Exists(folder))
                {
                    foreach (string logFile in GetLogsByType(folder, logType, fileNamePatternByLogType[logType]))
                    {
                        DateTime eventsDate = DateHelper.GetDate(Path.GetFileNameWithoutExtension(logFile), eventLogDateFormat);
                        if (eventsDate < minEventDate)
                        {
                            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, string.Format("Deleting {0} log {1}", logType, Path.GetFileName(logFile))));
                            File.Delete(logFile);
                            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, string.Format("Deleted {0} log {1}", logType, Path.GetFileName(logFile))));
                        }
                    }
                }
            }
            catch (System.Exception exception)
            {
                results.Add(new SystemTaskResult(SystemTaskResult.ResultTypes.Error, this.Id, string.Format("Error deleting logs for type {0}: {1}", logType, exception.Message)));
            }
            return(results);
        }
        private void PreGenerateReport(List <ScenarioCampaignLevelResultItem> data, Run run, Scenario scenario)
        {
            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                 0, $"Start scenario campaign level results report generation. ScenarioId: {scenario.Id} Count: {data.Count}"));
            try
            {
                _campaignResultReportCreator.EnablePerformanceKPIColumns(_includeScenarioPerformanceMeasurementKpIs);
                _campaignResultReportCreator.EnableCampaignLevel(!_saveData);
                string fileName = ReportFileNameHelper.ScenarioCampaignResult(scenario, run.ExecuteStartedDateTime.Value);

                using (var reportStream = _campaignResultReportCreator.GenerateReport(() =>
                                                                                      ScenarioCampaignResultReportHelper.MapToExtendedResults(data, scenario.CampaignPassPriorities, _mapper)))
                {
                    _ = _cloudStorage.Upload(new S3UploadComment
                    {
                        BucketName          = _awsSettings.S3Bucket,
                        DestinationFilePath = fileName,
                        FileStream          = reportStream
                    });
                }
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(
                    AuditEventFactory.CreateAuditEventForException(
                        0,
                        0,
                        $"Error while generating report for scenario campaign level results. ScenarioId: {scenario.Id}", e
                        )
                    );
                throw;
            }
            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                 0, $"End scenario campaign level results report generation. ScenarioId: {scenario.Id}"));
        }
Example #10
0
        public void ProcessScenarioCampaignMetrics(Guid runId, Guid scenarioId, IEnumerable <Recommendation> scenarioRecommendations)
        {
            try
            {
                var scenarioCampaignMetrics = new ScenarioCampaignMetric
                {
                    Id      = scenarioId,
                    Metrics = GenerateCampaignKPIs(runId, scenarioId, scenarioRecommendations)
                };

                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"Start insert of scenario campaign metrics. ScenarioId: {scenarioId} Count: {scenarioCampaignMetrics.Metrics.Count}"));

                using (var innerScope = _repositoryFactory.BeginRepositoryScope())
                {
                    var scenarioCampaignMetricRepository = innerScope.CreateRepository <IScenarioCampaignMetricRepository>();
                    scenarioCampaignMetricRepository.AddOrUpdate(scenarioCampaignMetrics);
                    scenarioCampaignMetricRepository.SaveChanges();
                }

                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"End insert of scenario campaign metrics. ScenarioId: {scenarioId} Count: {scenarioCampaignMetrics.Metrics.Count}"));
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, $"Error while processing scenario campaign metrics. ScenarioId: {scenarioId}", e));
            }
        }
        public IEnumerable <ConversionEfficiency> Process(string pathToFile)
        {
            if (!File.Exists(pathToFile))
            {
                _audit?.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, "File was not found."));

                return(Enumerable.Empty <ConversionEfficiency>());
            }

            _audit?.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                   0, $"Processing output file {pathToFile}"));

            try
            {
                var importSettings = CSVImportSettings.GetImportSettings(pathToFile, typeof(ConversionEfficiencyHeaderMap), typeof(ConversionEfficiencyIndexMap));

                var conversionEfficiency = new CSVConversionEfficiencyImportRepository(importSettings);

                var data = conversionEfficiency.GetAll();

                var output = _mapper.Map <IEnumerable <ConversionEfficiency> >(data);

                _audit?.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                       0, $"Processed output file {pathToFile}"));

                return(output);
            }
            catch (Exception exception)
            {
                _audit?.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, $"Error processing file {pathToFile}", exception));

                return(Enumerable.Empty <ConversionEfficiency>());
            }
        }
Example #12
0
        private void PreGenerateReport(IReadOnlyCollection <Recommendation> data, string fileName, Guid scenarioId)
        {
            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                 0, $"Start recommendations report generation. ScenarioId: {scenarioId} Count: {data.Count}"));
            try
            {
                using (var reportStream = _recommendationsReportCreator.GenerateReport(data))
                {
                    _ = _cloudStorage.Upload(new S3UploadComment
                    {
                        BucketName          = _awsSettings.S3Bucket,
                        DestinationFilePath = fileName,
                        FileStream          = reportStream
                    });
                }
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, $"Error while generating report for scenario recommendations. ScenarioId: {scenarioId}", e));
                throw;
            }

            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                 0, $"End recommendations report generation. ScenarioId: {scenarioId}"));
        }
        public CampaignsReqmOutput ProcessFile(Guid scenarioId, string folder)
        {
            string pathToFile = FileHelpers.GetPathToFileIfExists(folder, FileName);
            var    result     = new CampaignsReqmOutput();

            if (String.IsNullOrEmpty(pathToFile))
            {
                _audit.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, $"File {pathToFile} was not found."));

                return(result);
            }

            _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                  0, $"Processing output file {pathToFile}"));

            var importSettings = CSVImportSettings.GetImportSettings(pathToFile, typeof(CampaignsReqmHeaderMap), typeof(CampaignsReqmIndexMap));

            ICampaignsReqmImportRepository _fileReader = new CSVCampaignsReqmImportRepository(importSettings);

            var data = _fileReader.GetAll().ToList();

            result.Data = _mapper.Map <IEnumerable <CampaignsReqm> >(data);

            _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                  0, $"Processed output file {pathToFile}"));

            return(result);
        }
        /// <summary>
        /// Load breaks for break efficiency import record if not already in memory
        /// </summary>
        /// <param name="salesArea"></param>
        /// <param name="breakEfficiencyImport"></param>
        /// <param name="schedules"></param>
        private void LoadBreaks(SalesArea salesArea, BreakEfficiencyImport breakEfficiencyImport, List <ScheduleIndexed <Break, int> > schedules, IScheduleRepository scheduleRepository)
        {
            DateTime startDateTime = GetStartDateTime(breakEfficiencyImport);

            // Load Schedule document if necessary
            var schedule = schedules.Where(s => s.SalesArea == salesArea.Name && s.Date.Date == startDateTime.Date).FirstOrDefault();

            if (schedule == null)       // Not in memory, load it
            {
                var scheduleObject = scheduleRepository.GetSchedule(salesArea.Name, startDateTime.Date);
                if (scheduleObject != null)
                {
                    if (scheduleObject.Breaks != null && scheduleObject.Breaks.Count > 0)  // Schedule has breaks
                    {
                        _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, string.Format("Break Efficiency processing. Schedule loaded for sales area {0} and date {1}", salesArea.Name, startDateTime.Date)));
                        scheduleObject.Breaks.ForEach(@break => @break.BreakEfficiencyList = null);
                    }
                    else    // No breaks
                    {
                        _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, string.Format("Break Efficiency processing. Schedule document has no breaks for sales area {0} and date {1}", salesArea.Name, startDateTime.Date)));
                    }
                    schedules.Add(new ScheduleIndexed <Break, int>(scheduleObject, delegate(Break currentBreak) { return(currentBreak); }, delegate(Break currentBreak) { return(currentBreak.CustomId); }));
                }
                else    // No Schedule document, log warning
                {
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, string.Format("Break Efficiency processing. Schedule document does not exist for sales area {0} and date {1}", salesArea.Name, startDateTime.Date)));
                }
            }
        }
Example #15
0
        /// <summary>
        /// Deletes SpotPlacement docs for dead spots, not modified for more than N days
        /// </summary>
        /// <returns></returns>
        private List <SystemTaskResult> DeleteSpotPlacements(TimeSpan spotPlacementRetention)
        {
            List <SystemTaskResult> results = new List <SystemTaskResult>();

            if (spotPlacementRetention.Ticks != 0)
            {
                try
                {
                    using (var scope = _repositoryFactory.BeginRepositoryScope())
                    {
                        _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, string.Format("Deleting spot placements (Days Old={0})", spotPlacementRetention.TotalDays)));
                        var spotPlacementRepository = scope.CreateRepository <ISpotPlacementRepository>();

                        DateTime modifiedBefore = DateTime.UtcNow.Subtract(spotPlacementRetention);
                        spotPlacementRepository.DeleteBefore(modifiedBefore);
                        _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, "Deleted spot placements"));
                    }
                }
                catch (System.Exception exception)
                {
                    results.Add(new SystemTaskResult(SystemTaskResult.ResultTypes.Error, this.Id, string.Format("Error deleting spot placements: {0}", exception.Message)));
                }
            }
            return(results);
        }
Example #16
0
        private string CreateAutoBookRequest(IReadOnlyCollection <AutoBookInstanceConfiguration> autoBookInstanceConfigurations)
        {
            //AutoDistributed - autoBookRequest needs to be sent with the new API autodistributed model
            // "Id": "imag-dev07-1",
            var respondTo = "http://" + _configuration["Environment:Id"] + "-api.xggamplan.com/autobooks/";

            AutoBookRequestModel autoBookRequest = new AutoBookRequestModel
            {
                respondTo       = respondTo,
                runId           = RunId.ToString(),
                scenarioId      = ScenarioId.ToString(),
                instanceType    = autoBookInstanceConfigurations.First().InstanceType,   //check
                storageSizeGB   = autoBookInstanceConfigurations.First().StorageSizeGb,  //check
                version         = _autoBooks.Settings.ApplicationVersion,
                binariesVersion = _autoBooks.Settings.BinariesVersion,
                maxInstances    = _autoBooks.Settings.MaxInstances,
                mock            = "false" //set to true in dev stage, not needed in prod
                                          //Mock = false in prod, will actually call the nec. lambda:
                                          // otherwise respond with : will have invoked:
                                          // bash aws/request-invoke.sh http://imag-dev07-1-api.xggamplan.com/autobooks/   t3.medium 50 v4.4.0 xg-gameplan-autobook-binaries.2.40.012.120 3
            };

            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                 $"AutoDistributed - AutoBookRequest object: " +
                                                                                                 $"{autoBookRequest.respondTo}, {autoBookRequest.runId}, {autoBookRequest.scenarioId}, {autoBookRequest.instanceType}, " +
                                                                                                 $"{autoBookRequest.storageSizeGB}, {autoBookRequest.version}, {autoBookRequest.binariesVersion}, " +
                                                                                                 $"{autoBookRequest.maxInstances}, {autoBookRequest.mock}"));

            return(_autoBooks.CreateAutoBookRequestRun(autoBookRequest));
        }
        public async Task Execute(Guid runId)
        {
            var runCompleted = false;

            try
            {
                runCompleted = await WaitForRunCompletedAsync(runId).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0,
                                                                                            $"Completed run notification error (RunID={runId})", ex));
            }
            finally
            {
                if (runCompleted)
                {
                    _runManager.CreateNotificationForCompletedRun(_run);
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                         $"Completed run notification has sent (RunID={runId})"));
                }
                else
                {
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0,
                                                                                                     $"Completed run notification warning, Run not found (RunID={runId})"));
                }
            }
        }
Example #18
0
        /// <inheritdoc />
        public List <KPI> CalculateKPIs(HashSet <string> kpiNamesToCalculate, Guid rawRunId, Guid rawScenarioId)
        {
            if (kpiNamesToCalculate is null)
            {
                throw new ArgumentNullException(nameof(kpiNamesToCalculate));
            }

            var runId      = rawRunId.ToString();
            var scenarioId = rawScenarioId.ToString();

            _audit?.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                   $"Executing KPI processing (RunID={runId}, ScenarioID={scenarioId}) "
                                                                                   + $"KPIs to calculate: [{string.Join(", ", kpiNamesToCalculate)}]"));

            var kpis = new List <KPI>();

            foreach (var kpiName in kpiNamesToCalculate)
            {
                _audit?.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                       $"Executing KPI calculation (KPI={kpiName}, RunID={runId}, ScenarioID={scenarioId})"));

                try
                {
                    var kpiResult = _kpiResolver.Resolve(kpiName);

                    if (kpiResult is null || !kpiResult.Any())
                    {
                        _audit?.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                               $"No result of {kpiName} KPI calculation (RunID={runId}, ScenarioID={scenarioId})"));

                        continue;
                    }

                    kpis.AddRange(kpiResult);
                }
                catch (DependencyResolutionException exception)
                {
                    _audit?.Insert(AuditEventFactory.CreateAuditEventForException(0, 0,
                                                                                  $"Error resolving calculator for {kpiName} KPI for Scenario {scenarioId} of Run {runId}",
                                                                                  exception));
                }
                catch (Exception exception)
                {
                    _audit?.Insert(AuditEventFactory.CreateAuditEventForException(0, 0,
                                                                                  $"Error calculating {kpiName} KPI for Scenario {scenarioId} of Run {runId}",
                                                                                  exception));
                }

                _audit?.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                       $"Executed KPI calculation (KPI={kpiName}, RunID={runId}, ScenarioID={scenarioId})"));
            }

            _audit?.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                   $"Executed KPI processing (RunID={runId}, ScenarioID={scenarioId})"));

            return(kpis);
        }
Example #19
0
        public Failures ProcessFile(Guid scenarioId, string folder)
        {
            string pathToFile = FileHelpers.GetPathToFileIfExists(folder, FileName);
            var    failures   = new Failures {
                Id = scenarioId
            };

            if (string.IsNullOrEmpty(pathToFile))
            {
                _audit.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, $"File {pathToFile} was not found."));

                return(failures);
            }

            _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                  0, $"Processing output file {pathToFile}"));

            var importSettings = CSVImportSettings.GetImportSettings(pathToFile, typeof(FailureHeaderMap), typeof(FailureIndexMap));

            var campaignsIndex = _dataSnapshot.AllCampaigns.Value.ToDictionary(c => (long)c.CustomId);
            var salesAreaIndex = _dataSnapshot.AllSalesAreas.Value.ToDictionary(c => c.CustomId);

            IFailureImportRepository failureRepository = new CSVFailureImportRepository(importSettings);

            foreach (var summary in failureRepository.GetAll())
            {
                var failure = new Failure();

                if (!campaignsIndex.TryGetValue(summary.Campaign, out var campaign))
                {
                    failure.ExternalId = failure.CampaignName = "Unknown";
                }
                else
                {
                    failure.ExternalId   = campaign.ExternalId;
                    failure.CampaignName = campaign.Name;
                }

                failure.Type     = summary.Type;
                failure.Failures = summary.Failures;
                failure.Campaign = summary.Campaign;

                failure.SalesAreaName = !salesAreaIndex.TryGetValue(summary.SalesAreaNumberOfBooking, out var salesArea)
                    ? "Unknown"
                    : salesArea.Name;

                failures.Items.Add(failure);
            }

            _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                  0, $"Processed output file {pathToFile}"));

            return(failures);
        }
Example #20
0
        public List <SystemTaskResult> Execute()
        {
            IReadOnlyCollection <Run> GetRunsToDeleteForLastNDays(DateTime minCreatedDate)
            {
                using (var scope = _repositoryFactory.BeginRepositoryScope())
                {
                    var runRepository = scope.CreateRepository <IRunRepository>();

                    return(runRepository.GetAll()
                           .Where(r => r.CreatedDateTime.Year > 2000 && r.CreatedDateTime < minCreatedDate)
                           .OrderBy(r => r.CreatedDateTime)
                           .ToList());
                }
            }

            DateTime minCreated            = DateTime.UtcNow.Subtract(_runRetention);
            IReadOnlyCollection <Run> runs = GetRunsToDeleteForLastNDays(minCreated);

            var results = new List <SystemTaskResult>();

            foreach (var run in runs)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                     $"Deleting run {run.Id} ({run.Description})"
                                                                                                     ));

                try
                {
                    Run.ValidateForDelete(run);

                    _runManager.DeleteRun(run.Id);

                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForRunDeleted(0, 0, run.Id, null));
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                         $"Deleted run {run.Id} ({run.Description})"
                                                                                                         ));
                }
                catch (Exception exception)
                {
                    results.Add(
                        new SystemTaskResult(SystemTaskResult.ResultTypes.Error, Id,
                                             $"Error deleting run {run.Id} ({run.Description}): {exception.Message}"
                                             )
                        );
                }
            }

            return(results);
        }
Example #21
0
        public List <SystemTaskResult> Execute()
        {
            List <SystemTaskResult> results = new List <SystemTaskResult>();

            try
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, "Deleting access tokens"));
                var accessTokens = _accessTokensRepository.RemoveAllExpired();
                _accessTokensRepository.SaveChanges();
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, $"Deleted {accessTokens.Count()} access tokens"));
            }
            catch (Exception exception)
            {
                results.Add(new SystemTaskResult(SystemTaskResult.ResultTypes.Error, Id, $"Error deleting access tokens: {exception.Message}"));
            }
            return(results);
        }
Example #22
0
        private void PreGenerateReport(IReadOnlyCollection <ScenarioCampaignFailure> data, Run run, Scenario scenario)
        {
            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                 0, $"Start scenario campaign failures report generation. ScenarioId: {scenario.Id} Count: {data.Count}"));
            try
            {
                var reportService = new ScenarioCampaignFailuresReportCreator();
                var reportData    = new ScenarioCampaignFailuresDataSnapshot();
                var fileName      = ScenarioCampaignFailuresReportCreator.GetFilePath(scenario.Name, run.ExecuteStartedDateTime.Value, scenario.Id);

                var failureTypes = data.Select(c => c.FailureType)
                                   .Distinct()
                                   .ToList();

                DayOfWeek tenantStartDayOfWeek;
                using (var internalScope = _repositoryFactory.BeginRepositoryScope())
                {
                    reportData.Campaigns  = internalScope.CreateRepository <ICampaignRepository>().GetAllFlat();
                    reportData.FaultTypes = internalScope.CreateRepository <IFunctionalAreaRepository>().FindFaultTypes(failureTypes);
                    tenantStartDayOfWeek  = internalScope.CreateRepository <ITenantSettingsRepository>().GetStartDayOfWeek();
                }

                using (var reportStream = reportService.GenerateReport(data, reportData, tenantStartDayOfWeek))
                {
                    _ = _cloudStorage.Upload(new S3UploadComment
                    {
                        BucketName          = _awsSettings.S3Bucket,
                        DestinationFilePath = fileName,
                        FileStream          = reportStream
                    });
                }
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(
                    AuditEventFactory.CreateAuditEventForException(
                        0,
                        0,
                        $"Error while generating report for scenario campaign failures. ScenarioId: {scenario.Id}", e
                        )
                    );
                throw;
            }
            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                 0, $"End scenario campaign failures report generation. ScenarioId: {scenario.Id}"));
        }
Example #23
0
        /// <summary>
        /// Processes the concrete AutoBook output data type.
        /// </summary>
        /// <typeparam name="TData">The type of the data.</typeparam>
        /// <param name="scope">Current KPI calculation scope.</param>
        /// <param name="featureManager">The feature manager.</param>
        /// <param name="audit">The audit.</param>
        /// <param name="folder">The folder.</param>
        /// <returns></returns>
        private static void ProcessData <TData>(IKPICalculationScope scope, IFeatureManager featureManager,
                                                IAuditEventRepository audit, string folder) where TData : class
        {
            var context       = scope.Resolve <IKPICalculationContext>();
            var fileProcessor = scope.Resolve <IOutputFileProcessor <TData> >();

            if (!featureManager.IsServiceEnabled(fileProcessor.GetType()))
            {
                audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                     $"Skipping disabled file processor. ScenarioId: {context.ScenarioId}, FileName: {fileProcessor.FileName}"));
                return;
            }

            var data = fileProcessor.ProcessFile(context.ScenarioId, folder);

            context.SetContextData(data);

            if (scope.TryResolve <IOutputDataHandler <TData> >(out var handler))
            {
                handler.ProcessData(data, context.Snapshot.Run.Value, context.Snapshot.Scenario.Value);
            }
        }
Example #24
0
        public void ProcessData(ScenarioCampaignResult data, Run run, Scenario scenario)
        {
            var scenarioId = data.Id;

            if (!_saveData)
            {
                const string campaignLevelReportFacility = "XGSCRC";

                var facility = _facilityRepository.GetByCode(campaignLevelReportFacility);

                if (facility is null || facility.Enabled == false)
                {
                    PreGenerateReport(data.Items, run, scenario);
                }

                return;
            }

            try
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"Start insert of scenario campaigns. ScenarioId: {scenarioId} Count: {data.Items.Count}"));
                using (var innerScope = _repositoryFactory.BeginRepositoryScope())
                {
                    var scenarioCampaignResultRepository = innerScope.CreateRepository <IScenarioCampaignResultRepository>();
                    scenarioCampaignResultRepository.AddOrUpdate(data);
                    scenarioCampaignResultRepository.SaveChanges();
                }
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"End insert of scenario campaigns. ScenarioId: {scenarioId} Count: {data.Items.Count}"));
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, $"Error while processing scenario campaign results. ScenarioId: {scenarioId}", e));
                throw;
            }

            PreGenerateReport(data.Items, run, scenario);
        }
Example #25
0
        /// <summary>
        /// It is called dynamically.
        /// </summary>
        public async Task Execute(CancellationToken cancellationToken, AutoBook autoBook)
        {
            try
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                     $"Deleting AutoBook (AutoBookID={autoBook.Id})"));
                var autobookDeleted = false;
                try
                {
                    _autoBooks.Delete(autoBook);
                    autobookDeleted = true;
                }
                catch (Exception ex)
                {
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0,
                                                                                                $"Error deleting AutoBook (AutoBookID={autoBook.Id})", ex));
                }

                if (autobookDeleted)
                {
                    _auditEventRepository.Insert(
                        AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, "Deleted AutoBook"));
                }
            }
            finally
            {
                foreach (var dbContext in _tenantDbContexts)
                {
                    try
                    {
                        await dbContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
                    }
                    catch //ignore exception
                    {
                    }
                }
            }
        }
Example #26
0
        public void ProcessData(Failures data, Run run, Scenario scenario)
        {
            try
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"Failures has been generated. ScenarioId: {data.Id}, Count: {data.Items.Count}"));

                using (var innerScope = _repositoryFactory.BeginRepositoryScope())
                {
                    var failuresRepository = innerScope.CreateRepository <IFailuresRepository>();
                    failuresRepository.Add(data);
                    failuresRepository.SaveChanges();
                }

                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                                     0, $"Failures has been saved to the db. ScenarioId: {data.Id}"));
            }
            catch (Exception e)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, "Error while processing failures", e));
                throw;
            }
        }
        public BaseRatingsOutput ProcessFile(Guid scenarioId, string folder)
        {
            string pathToFile = FileHelpers.GetPathToFileIfExists(folder, FileName);
            var    result     = new BaseRatingsOutput();

            if (String.IsNullOrEmpty(pathToFile))
            {
                _audit.Insert(AuditEventFactory.CreateAuditEventForWarningMessage(0, 0, $"File {pathToFile} was not found."));

                return(result);
            }

            _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                  0, $"Processing output file {pathToFile}"));

            try
            {
                var importSettings = CSVImportSettings.GetImportSettings(pathToFile, typeof(BaseRatingsHeaderMap), typeof(BaseRatingsIndexMap));

                var baseRatingsImportRepository = new CSVBaseRatingsImportRepository(importSettings);

                var data = baseRatingsImportRepository.GetAll();

                result.Data = _mapper.Map <IEnumerable <BaseRatings> >(data);

                _audit.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0,
                                                                                      0, $"Processed output file {pathToFile}"));

                return(result);
            }
            catch (Exception exception)
            {
                _audit.Insert(AuditEventFactory.CreateAuditEventForException(0, 0, "Error processing base ratings file", exception));

                return(result);
            }
        }
Example #28
0
        public TaskResult Execute(TaskInstance taskInstance)
        {
            var  taskResult = new TaskResult();
            Guid runId      = Guid.Empty;

            try
            {
                StartActiveNotifier(taskInstance.Id);

                TaskUtilities.UpdateTaskInstanceStatus(taskInstance.Id, _repositoryFactory, TaskInstanceStatues.InProgress, null);

                // Read parameters
                runId = new Guid(taskInstance.Parameters["RunId"].ToString());
                var runInstances = _runManager.AllScenariosStartRun(runId);

                TaskUtilities.UpdateTaskInstanceStatus(taskInstance.Id, _repositoryFactory, TaskInstanceStatues.CompletedSuccess, DateTime.UtcNow);
                taskResult.Status = TaskInstanceStatues.CompletedSuccess;
            }
            catch (Exception exception)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, $"{exception.StackTrace}"));///testing
                _auditEventRepository.Insert(
                    AuditEventFactory.CreateAuditEventForException(0, 0, $"Error executing task for start run (TaskInstanceID={taskInstance.Id.ToString()}, RunID={runId.ToString()})",
                                                                   exception)
                    );

                TaskUtilities.UpdateTaskInstanceStatus(taskInstance.Id, _repositoryFactory, TaskInstanceStatues.CompletedError, DateTime.UtcNow);
                taskResult.Status    = TaskInstanceStatues.CompletedError;
                taskResult.Exception = exception;
            }
            finally
            {
                StopActiveNotifier();
            }

            return(taskResult);
        }
Example #29
0
        private List <ScenarioCampaignMetricItem> GenerateCampaignKPIs(Guid runId, Guid scenarioId, IEnumerable <Recommendation> scenarioRecommendations)
        {
            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, String.Format("Executing Campaign KPI processing (RunID={0}, ScenarioID={1})", runId, scenarioId)));

            var kpis       = new List <ScenarioCampaignMetricItem>();
            var calculator = new ScenarioCampaignKPIsCalculator();

            var recommendations = scenarioRecommendations
                                  .GroupBy(x => x.ExternalCampaignNumber)
                                  .ToDictionary(x => x.Key, x => x.ToList());

            foreach (var campaign in _campaignRepository.GetAllFlat())
            {
                var nominalPrice            = _spotRepository.GetNominalPriceByCampaign(campaign.ExternalId);
                var campaignRecommendations = recommendations.ContainsKey(campaign.ExternalId)
                    ? recommendations[campaign.ExternalId]
                    : Enumerable.Empty <Recommendation>();

                kpis.Add(calculator.CalculateCampaignKPIs(campaign, campaignRecommendations, nominalPrice));
            }

            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, String.Format("Executed Campaign KPI processing (RunID={0}, ScenarioID={1})", runId, scenarioId)));
            return(kpis);
        }
Example #30
0
        /// <summary>
        /// Requests an autobookRequest model
        /// </summary>
        /// <param name="autoBookRequest"></param>
        public string AutoBookRequestRun(AutoBookRequestModel autoBookRequest)
        {
            string url = $"{_apibaseUrl}/run";

            byte[] contentBody = SerializeContentBody(autoBookRequest);
            int    len         = 0;

            len = contentBody.Length;

            _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                 $"Creating WebRequest for {nameof(AutoBookRequestRun)}, content body len after serialization: {len.ToString()}, url: {url}, autoBookRequest.mock: {autoBookRequest.mock}"));

            try
            {
                var webRequest = CreateHttpWebRequest(url, "POST", GetAuthHeaders(AuthType, _accessToken), ContentTypeJSON, contentBody);

                using var webResponse = (HttpWebResponse)webRequest.GetResponse();
                ThrowExceptionIfNotSuccess(webResponse, new List <HttpStatusCode>()
                {
                    HttpStatusCode.OK
                });
                using var reader = new StreamReader(webResponse.GetResponseStream());
                {
                    var data = reader.ReadToEnd();
                    _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                         $"Created WebRequest for {nameof(AutoBookRequestRun)}, url: {url}, data: {data})"));
                    return(data);
                }
            }
            catch (WebException ex)
            {
                _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0,
                                                                                                     $"Error thrown Creating WebRequest for {nameof(AutoBookRequestRun)}, url: {url}, ex: {ex})"));
                throw ex;
            }
        }