public async Task <IActionResult> AddBookingAsync([FromBody] BookingModelDTO BookingModelDTO) { Guard.Against.Null(BookingModelDTO, nameof(BookingModelDTO)); bool refCodeDiscount = false; if (!string.IsNullOrEmpty(BookingModelDTO.ReferralCode)) { (bool HasReferralCodeTransactionCountExceeded, bool IsDuplicateTransaction, bool IsReferralCodeSelfUsed) = await _bookingManager.CheckReferralCodeAsync(BookingModelDTO.ReferralCode, Guid.Parse(BookingModelDTO.UserID)); if (HasReferralCodeTransactionCountExceeded) { return(BadRequest(new { message = "Referral Code provided cannot be used, as it has been used 3 times." })); } if (IsDuplicateTransaction) { return(BadRequest(new { message = "Referral Code shared to you cannot be used more than once, please apply with a fresh one." })); } if (IsReferralCodeSelfUsed) { return(BadRequest(new { message = "Referral Code provider and the beneficiary cannot be same!" })); } refCodeDiscount = true; } DateTime bookingFromDate = DateTime.Parse(BookingModelDTO.BookedFrom, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind); DateTime bookingToDate = DateTime.Parse(BookingModelDTO.BookedTo, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind); bool availabilityOfVenue = await _bookingManager.CheckBookingAvailabilityAsync(bookingFromDate, bookingToDate, BookingModelDTO.VenueID); if (!availabilityOfVenue) { return(BadRequest(new { message = "Sorry, try to book for some other slot, the current selected slot is already booked by someone else." })); } Guid bookingId = Guid.NewGuid(); TimeSpan bookingTimeSpan = (bookingToDate - bookingFromDate); VenueInventoryViewModel selectedVenueDetail = await _venueService.GetVenueByIdAsync(BookingModelDTO.VenueID); double calculatedPrice = bookingTimeSpan.TotalHours * selectedVenueDetail.HourlyRate; if (refCodeDiscount) { calculatedPrice = calculatedPrice - (0.1 * calculatedPrice); } //Entity Model Booking newBooking = new Booking { BookingID = bookingId, VenueID = BookingModelDTO.VenueID, BookingFromDate = bookingFromDate, BookingToDate = bookingToDate, UserID = Guid.Parse(BookingModelDTO.UserID), Price = calculatedPrice, BookingStatus = BookingStatus.ACTIVE.ToString() }; await _bookingManager.AddNewBookingAsync(newBooking, BookingModelDTO.ReferralCode, BookingModelDTO.TimeZoneId); return(StatusCode(201, new { message = $"Successfully booked the venue {selectedVenueDetail.VenueName}." })); }