public ValidationData ValidateCancelBooking(ClaimsPrincipal principal, Booking entity, CancelBookingModel model) { var validationData = new ValidationData(); var userId = principal.Identity.Name; if (entity.BookMemberId != userId) { validationData.Fail(code: AppResultCode.AccessDenied); } var now = DateTime.UtcNow; var startTime = entity.BookedDate.Add(entity.FromTime); if (entity.Status == BookingStatusValues.FINISHED || entity.Status == BookingStatusValues.DENIED || entity.Status == BookingStatusValues.ABORTED || startTime <= now) { validationData.Fail(mess: "Not allowed", code: AppResultCode.FailValidation); } if (model.Feedback == null) { validationData.Fail(mess: "You must provide a reason in feedback", code: AppResultCode.FailValidation); } return(validationData); }
public async Task <ResponseObject> Handle(CancelBookingModel message) { List <CancelPNRResponse> cancelbookinpnrresponse = new List <CancelPNRResponse>(); bool mystiflyResponse = await CancelbookingfromSupplier(cancelbookinpnrresponse, message); var response = new ResponseObject { ResponseMessage = new HttpResponseMessage(HttpStatusCode.OK), Data = cancelbookinpnrresponse, Message = "Data retrieved Successfully", IsSuccessful = true }; return(response); }
public async Task <IActionResult> CancelBooking(int id, CancelBookingModel model) { var entity = _service.Bookings.Id(id).FirstOrDefault(); if (entity == null) { return(NotFound(AppResult.NotFound())); } var validationData = _service.ValidateCancelBooking(User, entity, model); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var fromStatus = entity.Status; AppEvent ev; using (var trans = context.Database.BeginTransaction()) { _service.CancelBooking(model, entity); var history = _service.CreateHistoryForCancelBooking(entity, fromStatus, entity.BookMember); //log event ev = _sysService.GetEventForBookingProcessing(history); _sysService.CreateAppEvent(ev); //end log event context.SaveChanges(); trans.Commit(); } //notify using members, managers (if any) var notiData = new Dictionary <string, string> { { "event", ev.Type }, { "id", entity.Id.ToString() } }; var notiMemberIds = entity.UsingMemberIds.Split('\n') .Where(o => o != UserId).ToList(); var notiMembers = notiMemberIds.Any() ? NotiHelper.Notify(notiMemberIds, new Notification { Title = $"Your booking {entity.Code} has been aborted", Body = $"{UserEmail} has just aborted booking {entity.Code}. Press for more detail" }, data: notiData) : Task.CompletedTask; var managerNoti = new Notification { Title = $"A booking managed by you has been aborted", Body = $"{UserEmail} has just aborted booking {entity.Code}. Press for more detail" }; if (entity.Status == BookingStatusValues.VALID) { var managerIds = _memberService.QueryManagersOfMember(entity.BookMemberId) .Select(o => o.UserId).ToList(); if (managerIds.Count > 0) { await NotiHelper.Notify(managerIds, managerNoti, data : notiData); } } else if (entity.Status == BookingStatusValues.APPROVED) { var managerIds = _memberService.QueryManagersOfArea(entity.Room.BuildingAreaCode) .Select(o => o.UserId).ToList(); if (managerIds.Count > 0) { await NotiHelper.Notify(managerIds, managerNoti, data : notiData); } } await notiMembers; return(NoContent()); }
public Booking CancelBooking(CancelBookingModel model, Booking entity) { model.CopyTo(entity); entity.Status = BookingStatusValues.ABORTED; return(entity); }