예제 #1
0
        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));
            }
        }