Skip to content

Commit 1bdb4ac

Browse files
committed
Confirm booking was successful
1 parent 8096508 commit 1bdb4ac

File tree

4 files changed

+111
-23
lines changed

4 files changed

+111
-23
lines changed

condeco-cli/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,8 @@ static void RunCheckIn(CheckInOptions opts)
346346
var condeco = BuildCondecoInterface(opts, config);
347347
NonInteractiveLogin(condeco);
348348

349-
var upcomingBookings = condeco.GetUpcomingBookings();
349+
var today = DateOnly.FromDateTime(DateTime.Now);
350+
var upcomingBookings = condeco.GetUpcomingBookings(today);
350351

351352
var checkinsToPerform = upcomingBookings
352353
.Where(booking => booking.BookingStartDate.Date == DateTime.Now.Date) //the mobile API can only check in for today

libCondeco/CondecoMobile.cs

Lines changed: 101 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -462,39 +462,81 @@ public GroupSettingsWithRestrictions GetGroupSettings(int locationId, int groupI
462462
}
463463

464464
var url = $"/MobileAPI/DeskBookingService.svc/Book?accessToken={userIdLong}&userID={userIdToBookFor}&locationID={room.LocationId}&groupID={room.GroupId}&floorID={room.FloorId}&deskID={room.RoomId}&startDate={date:dd/MM/yyyy}|3";
465-
var responseStr = client.GetStringAsync(url).Result;
466465

467-
var response = responseStr.ToObject<BookingResponse>();
468-
if (response == null)
466+
string? bookingResponseStr;
467+
try
468+
{
469+
bookingResponseStr = client.GetStringAsync(url).Result;
470+
}
471+
catch (Exception ex)
472+
{
473+
//Catch things such as timeouts
474+
bookingResponseStr = $"Error while booking: {ex.Message}";
475+
}
476+
477+
var successful = false;
478+
try
479+
{
480+
successful = BookingSuccessful(room.RoomId, date, bookForUser);
481+
}
482+
catch (Exception ex)
483+
{
484+
//Catch things such as timeouts
485+
bookingResponseStr ??= $"Error while confirming booking: {ex.Message}";
486+
}
487+
488+
if (successful)
469489
{
470-
return (false, new BookingResponse()
490+
try
491+
{
492+
//Sometimes this contains "You have already reserved this workspace type for this time slot", instead of BookingResponse object
493+
if (!string.IsNullOrEmpty(bookingResponseStr))
494+
{
495+
var bookingResponseObj = bookingResponseStr.ToObject<BookingResponse>();
496+
return (true, bookingResponseObj);
497+
}
498+
}
499+
catch
500+
{
501+
502+
}
503+
504+
var condecoBookingResponse = new BookingResponse()
471505
{
472506
CallResponse = new Callresponse()
473507
{
474-
ResponseCode = 0,
475-
ResponseMessage = "Unsuccessful"
508+
ResponseCode = 100,
509+
ResponseMessage = $"Booking confirmed"
476510
},
477511
CreatedBookings = []
478-
});
512+
};
513+
514+
return (true, condecoBookingResponse);
479515
}
480516
else
481517
{
482-
if (response.CallResponse.ResponseCode == 100)
518+
var condecoBookingResponse = new BookingResponse()
483519
{
484-
return (true, response);
485-
}
486-
else
487-
{
488-
return (false, response);
489-
}
520+
CallResponse = new Callresponse()
521+
{
522+
ResponseCode = 0,
523+
ResponseMessage = $"{bookingResponseStr}"
524+
},
525+
CreatedBookings = []
526+
};
527+
528+
return (false, condecoBookingResponse);
490529
}
491530
}
492531

493-
public List<UpcomingBooking> GetUpcomingBookings()
532+
public List<UpcomingBooking> GetUpcomingBookings(DateOnly? fromDate = null, DateOnly? toDate = null)
494533
{
495534
var ianaTimezoneStr = TimeZoneConverter.TZConvert.WindowsToIana(TimeZoneInfo.Local.Id);
496535

497-
var url = $"/MobileAPI/MobileService.svc/MyBookings/ListV2?sessionGuid={userIdLong}&languageId=1&deskStartDate={DateTime.Now:dd/MM/yyyy}&deskEndDate={DateTime.Now.AddDays(7):dd/MM/yyyy}&roomStartDate={DateTime.Now:dd/MM/yyyy}&timeZoneID={ianaTimezoneStr}&pageSize=100&pageIndex=0";
536+
fromDate ??= DateOnly.FromDateTime(DateTime.Now.Date);
537+
toDate ??= fromDate;
538+
539+
var url = $"/MobileAPI/MobileService.svc/MyBookings/ListV2?sessionGuid={userIdLong}&languageId=1&deskStartDate={fromDate:dd/MM/yyyy}&deskEndDate={toDate:dd/MM/yyyy}&roomStartDate={DateTime.Now:dd/MM/yyyy}&timeZoneID={ianaTimezoneStr}&pageSize=100&pageIndex=0";
498540

499541
var listResultsStr = client.GetStringAsync(url).Result;
500542

@@ -524,6 +566,49 @@ public List<UpcomingBooking> GetUpcomingBookings()
524566
return result;
525567
}
526568

569+
public bool BookingSuccessful(int deskId, DateOnly bookedForDate, BookFor? bookingFor)
570+
{
571+
var bookings = GetUpcomingBookings(bookedForDate, bookedForDate);
572+
var userId = GetUserId();
573+
574+
var successful = bookings
575+
.Where(booking =>
576+
{
577+
var startDate = DateOnly.FromDateTime(booking.BookingStartDate);
578+
var endDateTime = DateOnly.FromDateTime(booking.BookingEndDate);
579+
580+
var matchesDate = bookedForDate >= startDate && bookedForDate <= endDateTime;
581+
return matchesDate;
582+
583+
})
584+
.Where(booking => booking.DeskId == deskId)
585+
.Where(booking =>
586+
{
587+
var matchesUser = true;
588+
589+
if (bookingFor?.IsExternal == "1")
590+
{
591+
matchesUser &= booking.BookedForFullName == $"{bookingFor.FirstName} {bookingFor.LastName}";
592+
}
593+
else
594+
{
595+
if (string.IsNullOrEmpty(bookingFor?.UserId))
596+
{
597+
matchesUser &= true;
598+
}
599+
else
600+
{
601+
matchesUser &= "" + booking.BookedForUserId == bookingFor.UserId;
602+
}
603+
}
604+
605+
return matchesUser;
606+
})
607+
.Any();
608+
609+
return successful;
610+
}
611+
527612
public (bool Success, string BookingStatusStr) CheckIn(UpcomingBooking bookingDetails)
528613
{
529614
var url = $"/MobileAPI/DeskBookingService.svc/CheckIn?accessToken={userIdLong}&locationID={bookingDetails.LocationId}&deskID={bookingDetails.DeskId}&qrCode=";

libCondeco/CondecoWeb.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -268,21 +268,23 @@ public string GetFullName()
268268
}
269269
}
270270

271-
public UpComingBookingsResponse GetUpcomingBookings(DateOnly date)
271+
public UpComingBookingsResponse GetUpcomingBookingsResp(DateOnly? fromDate = null, DateOnly? toDate = null)
272272
{
273273
if (!loginSuccessful) throw new Exception($"Not yet logged in.");
274274

275-
var getUpcomingBookingsUrl = $"/EnterpriseLite/api/Booking/GetUpComingBookings?startDateTime={date.AddDays(-1):yyyy-MM-dd} 14:00:00&endDateTime={date:yyyy-MM-dd} 13:59:59";
275+
fromDate ??= DateOnly.FromDateTime(DateTime.Now.Date);
276+
toDate ??= fromDate;
277+
278+
var getUpcomingBookingsUrl = $"/EnterpriseLite/api/Booking/GetUpComingBookings?startDateTime={fromDate.Value.AddDays(-1):yyyy-MM-dd} 14:00:00&endDateTime={toDate.Value:yyyy-MM-dd} 13:59:59";
276279
var upcomingBookingsJsonArrayStr = client.GetStringAsync(getUpcomingBookingsUrl).Result;
277280

278281
var result = UpComingBookingsResponse.FromServerResponse(upcomingBookingsJsonArrayStr);
279282
return result;
280283
}
281284

282-
public List<UpcomingBooking> GetUpcomingBookings()
285+
public List<UpcomingBooking> GetUpcomingBookings(DateOnly? fromDate = null, DateOnly? toDate = null)
283286
{
284-
var checkinDate = DateOnly.FromDateTime(DateTime.Now.Date);
285-
var upComingBookings = GetUpcomingBookings(checkinDate);
287+
var upComingBookings = GetUpcomingBookingsResp(fromDate, toDate);
286288

287289
var result = upComingBookings
288290
.UpComingBookings

libCondeco/ICondeco.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public interface ICondeco
3636
public DateTime GetBookingWindowStartDate();
3737
public DateTime GetBookingWindowEndDate();
3838
public (bool Success, BookingResponse BookingResponse) BookRoom(Room room, DateOnly date, BookFor? bookForUser);
39-
public List<UpcomingBooking> GetUpcomingBookings();
39+
public List<UpcomingBooking> GetUpcomingBookings(DateOnly? fromDate = null, DateOnly? toDate = null);
4040
public (bool Success, string BookingStatusStr) CheckIn(UpcomingBooking bookingDetails);
4141

4242
}

0 commit comments

Comments
 (0)