private static async Task _completeBooking(Guid requestId, Reservation reservationDetails, HttpRequest originRequest)
        {
            LogUtility.LogWithContext(requestId, "Completing a booking");
            reservationDetails.State   = ReservationStatus.Completing.ToString();
            reservationDetails.EndTime = string.Empty;

            var reservationCompletingResult = await MongoHelper.UpdateReservationStateAndEndTime(requestId, reservationDetails);

            if (reservationCompletingResult.ModifiedCount == 0)
            {
                LogUtility.LogErrorWithContext(requestId, "Reservation not updated to 'Completing'! MatchedCount: {0}, ModifiedCount: {1}", reservationCompletingResult.MatchedCount.ToString(), reservationCompletingResult.ModifiedCount.ToString());
                await _failBooking(requestId, reservationDetails);

                return;
            }

            var freeBikeResponse = await BikesHelper.FreeBike(requestId, reservationDetails.BikeId, originRequest);

            if (!freeBikeResponse.IsSuccessStatusCode)
            {
                LogUtility.LogErrorWithContext(requestId, "Error response from Bikes! ResponseCode: {0}, Content: {1}", freeBikeResponse.StatusCode.ToString(), await freeBikeResponse.Content.ReadAsStringAsync());
                await _failBooking(requestId, reservationDetails);

                return;
            }

            reservationDetails.State   = ReservationStatus.Completed.ToString();
            reservationDetails.EndTime = DateTime.UtcNow.ToString(DateTimeFormat);
            var createInvoiceResponse = await BillingHelper.CreateInvoice(requestId, reservationDetails, originRequest);

            if (!createInvoiceResponse.HttpResponse.IsSuccessStatusCode)
            {
                LogUtility.LogErrorWithContext(requestId, "Couldn't create invoice, rolling back!");
                // Rollback
                reservationDetails.EndTime = string.Empty;
                await BikesHelper.ReserveBike(requestId, reservationDetails.BikeId, originRequest);
                await _failBooking(requestId, reservationDetails);

                return;
            }
            reservationDetails.InvoiceId = createInvoiceResponse.InvoiceId;

            var reservationCompletedResult = await MongoHelper.UpdateReservationStateAndEndTime(requestId, reservationDetails);

            if (reservationCompletedResult.ModifiedCount == 0)
            {
                LogUtility.LogErrorWithContext(requestId, "Reservation not updated to 'Completed'! MatchedCount: {0}, ModifiedCount: {1}", reservationCompletedResult.MatchedCount.ToString(), reservationCompletedResult.ModifiedCount.ToString());
                await _failBooking(requestId, reservationDetails);

                return;
            }

            LogUtility.LogWithContext(requestId, "Complete booking succeeded");
        }