public IActionResult CaseConfirm() { CoaSessionBookingInfo bookingInfo = _session.CoaBookingInfo; if (string.IsNullOrEmpty(bookingInfo.CaseNumber)) { return(Redirect("/scjob/booking/coa/CaseSearch")); } //user information SessionUserInfo cui = _session.GetUserInformation(); //Swapping Case Number to the main case file if it was selected from the search result of a sub case file number if (bookingInfo.CaseList.Length > 1) { var mainCase = bookingInfo.CaseList.Where(x => x.Main).First(); var finalCaseNumber = bookingInfo.SelectedCases.Where(x => x == mainCase.Case_Num).FirstOrDefault() ?? bookingInfo.CaseNumber; //Store final main case number back to the session bookingInfo.CaseNumber = finalCaseNumber; //Filtering out related cases var relatedCaseList = new List <string>(); foreach (var x in bookingInfo.SelectedCases) { if (x != finalCaseNumber) { relatedCaseList.Add(x); } } //Store final main case number back to the session bookingInfo.RelatedCaseList = relatedCaseList; } //Time-slot is still available var model = new CoaCaseConfirmViewModel { CaseNumber = bookingInfo.CaseNumber, CaseType = bookingInfo.CaseType, CertificateOfReadiness = bookingInfo.CertificateOfReadiness, DateIsAgreed = bookingInfo.DateIsAgreed, //LowerCourtOrder = bookingInfo.LowerCourtOrder, IsFullDay = bookingInfo.IsFullDay, HearingTypeId = bookingInfo.HearingTypeId, HearingTypeName = bookingInfo.HearingTypeName, SelectedDate = bookingInfo.SelectedDate, EmailAddress = cui.Email, Phone = cui.Phone, CaseList = bookingInfo.CaseList, SelectedCases = bookingInfo.SelectedCases, RelatedCaseList = bookingInfo.RelatedCaseList }; // save the booking info back to the session _session.CoaBookingInfo = bookingInfo; return(View(model)); }
public async Task <IActionResult> CaseConfirm(CoaCaseConfirmViewModel model) { if (!ModelState.IsValid) { return(View(model)); } string userGuid; string userDisplayName; if (_coaBookingService.IsLocalDevEnvironment) { // use fake SiteMinder header values for local development userGuid = "072cfc73-e3b9-437b-8012-0b0945f09879"; userDisplayName = "Matthew Begbie"; } else { //read smgov_userguid SiteMinder header userGuid = HttpContext.Request.Headers.ContainsKey("smgov_userguid") ? HttpContext.Request.Headers["smgov_userguid"].ToString() : string.Empty; //read smgov_userdisplayname SiteMinder header userDisplayName = HttpContext.Request.Headers.ContainsKey("smgov_userdisplayname") ? HttpContext.Request.Headers["smgov_userdisplayname"].ToString() : string.Empty; } //make booking CoaCaseConfirmViewModel result = await _coaBookingService.BookCourtCase(model, userGuid, userDisplayName); return(Redirect( $"/scjob/booking/coa/CaseBooked?booked={(result.IsBooked ? "true" : "false")}")); }
/// <summary> /// Book court case /// </summary> public async Task <CoaCaseConfirmViewModel> BookCourtCase(CoaCaseConfirmViewModel model, string userGuid, string userDisplayName) { //if the user could not be detected return if (string.IsNullOrWhiteSpace(userGuid)) { return(model); } CoaSessionBookingInfo bookingInfo = _session.CoaBookingInfo; // check the schedule again to make sure the time slot wasn't taken by someone else CoAAvailableDates schedule = await _client.COAAvailableDatesAsync(); //ensure time slot is still available if (IsTimeStillAvailable(schedule, bookingInfo.SelectedDate.Value)) { //Fetch final main case file after ruling out selection of cases with main case and related cases var finalCase = bookingInfo.CaseList.Where(x => x.Case_Num == bookingInfo.CaseNumber).First(); var relatedCases = ""; if (finalCase.Main && model.RelatedCaseList != null && model.RelatedCaseList.Count > 0) { var relatedCaseIDList = bookingInfo.CaseList.Where(x => model.RelatedCaseList.Contains(x.Case_Num)).Select(x => x.CaseId).ToList(); relatedCases = string.Join("|", relatedCaseIDList); } //build object to send to the API var bookInfo = new CoABookingHearingInfo { caseID = finalCase.CaseId, MainCase = finalCase.Main, RelatedCases = relatedCases, email = $"{model.EmailAddress}", hearingDate = DateTime.Parse($"{model.SelectedDate.Value}"), hearingLength = (bookingInfo.IsFullDay ?? false) ? "Full" : "Half", phone = $"{model.Phone}", hearingTypeId = bookingInfo.HearingTypeId, requestedBy = $"{userDisplayName}" }; //submit booking BookingHearingResult result = await _client.CoAQueueHearingAsync(bookInfo); //get the raw result bookingInfo.RawResult = result.bookingResult; //test to see if the booking was successful if (result.bookingResult.ToLower().StartsWith("success")) { //create database entry DbSet <BookingHistory> bookingHistory = _dbContext.Set <BookingHistory>(); bookingHistory.Add(new BookingHistory { ContainerId = bookingInfo.ContainerId, SmGovUserGuid = userGuid, Timestamp = DateTime.Now }); //save to DB _dbContext.SaveChanges(); //update model model.IsBooked = true; bookingInfo.IsBooked = true; //store user info in session for next booking var userInfo = new SessionUserInfo { Phone = model.Phone, Email = model.EmailAddress, ContactName = $"{userDisplayName}" }; _session.UserInfo = userInfo; //send email await _mailService.SendEmail( model.EmailAddress, EmailSubject, await GetEmailBody()); //clear booking info session _session.CoaBookingInfo = null; } else { model.IsBooked = false; bookingInfo.IsBooked = false; } } else { //The booking is not available anymore //user needs to choose a new time slot model.IsTimeSlotAvailable = false; model.IsBooked = false; bookingInfo.IsBooked = false; } // save the booking info back to the session _session.CoaBookingInfo = bookingInfo; return(model); }