public async Task <JsonCamelCaseResult> SaveScanReport(ReportViewModel report) { try { // Save Report. var update = Factory.Save(Mapper.Map <IReportDto>(report)); // Check for Failure. if (update.UpdateResult?.Success != true) { return(new JsonCamelCaseResult(update)); } // Load Messengers. var clientMessenger = new ClientHubMessenger(); var requestMessenger = new ScanRequestHubMessenger(); // Notify Listeners. await(requestMessenger.NotifyScanUpdated(update.RequestId)); await(clientMessenger.ScanRequestOutDated(Factory.User.UserGuid, update.RequestId)); // Check for Completed. if (!update.CompleteReport) { return(new JsonCamelCaseResult(Mapper.Map <ReportViewModel>(update))); } // Notify Listeners. await(clientMessenger.ScanRequestCompleted()); await(requestMessenger.NotifyScanRemoved(update.RequestId)); // Load Notification Queue. var queue = new MessageQueue(); // Check for Not Cancel. if (!update.CancelReport && report.UserCompletedInd) { // Send Notifications. await(queue.AddNotificationQueueMessageAsync(NotificationTemplate.ShopReportEmail, update.RequestId, Factory.User.UserGuid)); // Send Completed Report to Mitchell. await(queue.AddMitchellReportQueueMessageAsync(update.RequestId, Factory.User.UserGuid)); // Check for Auto Close Bypass. if (!report.AutoRepairCloseBypass) { // Run Auto Close Logic. using (var conn = new SqlConnection(MvcApplication.ConnectionString)) { // Get Repair Id. var repairId = await conn.QueryFirstOrDefaultAsync <int>("Repair.usp_CloseRepairByRequestId", new { report.RequestId }, null, null, CommandType.StoredProcedure); // Check Repair. if (repairId > 0) { // Close Repair. if (await Factory.DeleteAsync <IRepairDto>(repairId.ToString())) { // Update Repair Complete. update.AllowEdit = false; update.RepairComplete = true; // Send Notifications. await(clientMessenger.RepairCompleted()); } } } } } // Check for Cancelled. if (update.CancelReport) { // Look for Cancel Reason Template. var cancelReason = await Factory.GetByIdAsync <ICancelReasonTypeDto>(update.CancelReasonTypeId.ToString()); if (cancelReason?.NotificationTemplate != null) { // Send Notification. await(queue.AddNotificationQueueMessageAsync(cancelReason.NotificationTemplate.Value, report.RequestId, Factory.User.UserGuid)); } } // Return Data. return(new JsonCamelCaseResult(Mapper.Map <ReportViewModel>(update))); } catch (Exception e) { // Log Exception. Logger.LogException(e); // Create Result. report.UpdateResult = new UpdateResultViewModel(false, e.Message); // Return Data. return(new JsonCamelCaseResult(report)); } }