Requires any of the roles: | bookingsupplier-administrator-write, superadmin |
GET | /timeexceptions/collidingevents | Searches for collisions with existing bookings of the resource | Searches for existing bookings and investigates if a proposed time exception would collide with them, if so, the bookings should be unbooked to be able to create the time exception. A time exception must be either recurring (DaysOfWeek, ExceptionFromTime, ExceptionToTime is set) or non recurring (From and To are set). |
---|
import 'package:servicestack/servicestack.dart';
enum BookingStatusEnum
{
Booked,
Unbooked,
Reserved,
Canceled,
AwaitingPayment,
AwaitingPaymentNoTimeLimit,
Payed,
AwaitingPaymentRequestFromAdmin,
AwaitingPaymentFromProvider,
Invoiced,
}
class BookedCustomer implements IConvertible
{
String? Id;
String? Firstname;
String? Lastname;
String? Email;
String? Phone;
String? FacebookUserName;
String? ImageUrl;
String? CorporateIdentityNumber;
String? InvoiceAddress1;
String? InvoiceAddress2;
String? InvoiceCity;
String? InvoicePostalCode;
String? InvoiceCountryCode;
BookedCustomer({this.Id,this.Firstname,this.Lastname,this.Email,this.Phone,this.FacebookUserName,this.ImageUrl,this.CorporateIdentityNumber,this.InvoiceAddress1,this.InvoiceAddress2,this.InvoiceCity,this.InvoicePostalCode,this.InvoiceCountryCode});
BookedCustomer.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
Id = json['Id'];
Firstname = json['Firstname'];
Lastname = json['Lastname'];
Email = json['Email'];
Phone = json['Phone'];
FacebookUserName = json['FacebookUserName'];
ImageUrl = json['ImageUrl'];
CorporateIdentityNumber = json['CorporateIdentityNumber'];
InvoiceAddress1 = json['InvoiceAddress1'];
InvoiceAddress2 = json['InvoiceAddress2'];
InvoiceCity = json['InvoiceCity'];
InvoicePostalCode = json['InvoicePostalCode'];
InvoiceCountryCode = json['InvoiceCountryCode'];
return this;
}
Map<String, dynamic> toJson() => {
'Id': Id,
'Firstname': Firstname,
'Lastname': Lastname,
'Email': Email,
'Phone': Phone,
'FacebookUserName': FacebookUserName,
'ImageUrl': ImageUrl,
'CorporateIdentityNumber': CorporateIdentityNumber,
'InvoiceAddress1': InvoiceAddress1,
'InvoiceAddress2': InvoiceAddress2,
'InvoiceCity': InvoiceCity,
'InvoicePostalCode': InvoicePostalCode,
'InvoiceCountryCode': InvoiceCountryCode
};
getTypeName() => "BookedCustomer";
TypeContext? context = _ctx;
}
class GroupBookingSettings implements IConvertible
{
bool? Active;
int? Min;
int? Max;
GroupBookingSettings({this.Active,this.Min,this.Max});
GroupBookingSettings.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
Active = json['Active'];
Min = json['Min'];
Max = json['Max'];
return this;
}
Map<String, dynamic> toJson() => {
'Active': Active,
'Min': Min,
'Max': Max
};
getTypeName() => "GroupBookingSettings";
TypeContext? context = _ctx;
}
class MultipleResourceSettings implements IConvertible
{
bool? Active;
int? Min;
int? Max;
MultipleResourceSettings({this.Active,this.Min,this.Max});
MultipleResourceSettings.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
Active = json['Active'];
Min = json['Min'];
Max = json['Max'];
return this;
}
Map<String, dynamic> toJson() => {
'Active': Active,
'Min': Min,
'Max': Max
};
getTypeName() => "MultipleResourceSettings";
TypeContext? context = _ctx;
}
class ServiceInfoResponse implements IConvertible
{
int? Id;
String? Name;
String? Description;
Uri? ImageUrl;
int? LengthInMinutes;
int? MaxNumberOfSpotsPerBooking;
int? MinNumberOfSpotsPerBooking;
GroupBookingSettings? GroupBooking;
MultipleResourceSettings? MultipleResource;
bool? IsGroupBooking;
bool? IsPaymentEnabled;
ServiceInfoResponse({this.Id,this.Name,this.Description,this.ImageUrl,this.LengthInMinutes,this.MaxNumberOfSpotsPerBooking,this.MinNumberOfSpotsPerBooking,this.GroupBooking,this.MultipleResource,this.IsGroupBooking,this.IsPaymentEnabled});
ServiceInfoResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
Id = json['Id'];
Name = json['Name'];
Description = json['Description'];
ImageUrl = JsonConverters.fromJson(json['ImageUrl'],'Uri',context!);
LengthInMinutes = json['LengthInMinutes'];
MaxNumberOfSpotsPerBooking = json['MaxNumberOfSpotsPerBooking'];
MinNumberOfSpotsPerBooking = json['MinNumberOfSpotsPerBooking'];
GroupBooking = JsonConverters.fromJson(json['GroupBooking'],'GroupBookingSettings',context!);
MultipleResource = JsonConverters.fromJson(json['MultipleResource'],'MultipleResourceSettings',context!);
IsGroupBooking = json['IsGroupBooking'];
IsPaymentEnabled = json['IsPaymentEnabled'];
return this;
}
Map<String, dynamic> toJson() => {
'Id': Id,
'Name': Name,
'Description': Description,
'ImageUrl': JsonConverters.toJson(ImageUrl,'Uri',context!),
'LengthInMinutes': LengthInMinutes,
'MaxNumberOfSpotsPerBooking': MaxNumberOfSpotsPerBooking,
'MinNumberOfSpotsPerBooking': MinNumberOfSpotsPerBooking,
'GroupBooking': JsonConverters.toJson(GroupBooking,'GroupBookingSettings',context!),
'MultipleResource': JsonConverters.toJson(MultipleResource,'MultipleResourceSettings',context!),
'IsGroupBooking': IsGroupBooking,
'IsPaymentEnabled': IsPaymentEnabled
};
getTypeName() => "ServiceInfoResponse";
TypeContext? context = _ctx;
}
class BookingIntervalResponse implements IConvertible
{
int? Id;
String? CompanyId;
DateTime? From;
DateTime? To;
BookingStatusEnum? Status;
int? StatusId;
String? StatusName;
BookedCustomer? Customer;
ServiceInfoResponse? Service;
DateTime? CreatedDate;
BookingIntervalResponse({this.Id,this.CompanyId,this.From,this.To,this.Status,this.StatusId,this.StatusName,this.Customer,this.Service,this.CreatedDate});
BookingIntervalResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
Id = json['Id'];
CompanyId = json['CompanyId'];
From = JsonConverters.fromJson(json['From'],'DateTime',context!);
To = JsonConverters.fromJson(json['To'],'DateTime',context!);
Status = JsonConverters.fromJson(json['Status'],'BookingStatusEnum',context!);
StatusId = json['StatusId'];
StatusName = json['StatusName'];
Customer = JsonConverters.fromJson(json['Customer'],'BookedCustomer',context!);
Service = JsonConverters.fromJson(json['Service'],'ServiceInfoResponse',context!);
CreatedDate = JsonConverters.fromJson(json['CreatedDate'],'DateTime',context!);
return this;
}
Map<String, dynamic> toJson() => {
'Id': Id,
'CompanyId': CompanyId,
'From': JsonConverters.toJson(From,'DateTime',context!),
'To': JsonConverters.toJson(To,'DateTime',context!),
'Status': JsonConverters.toJson(Status,'BookingStatusEnum',context!),
'StatusId': StatusId,
'StatusName': StatusName,
'Customer': JsonConverters.toJson(Customer,'BookedCustomer',context!),
'Service': JsonConverters.toJson(Service,'ServiceInfoResponse',context!),
'CreatedDate': JsonConverters.toJson(CreatedDate,'DateTime',context!)
};
getTypeName() => "BookingIntervalResponse";
TypeContext? context = _ctx;
}
class CollidingBookingQueryResponse implements IConvertible
{
/**
* Resource id of the resource that owns this exception
*/
// @ApiMember(Description="Resource id of the resource that owns this exception")
List<int>? ResourceIds;
/**
* A list of bookings that would collide with the time exception
*/
// @ApiMember(Description="A list of bookings that would collide with the time exception")
List<BookingIntervalResponse>? Bookings;
ResponseStatus? ResponseStatus;
CollidingBookingQueryResponse({this.ResourceIds,this.Bookings,this.ResponseStatus});
CollidingBookingQueryResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
ResourceIds = JsonConverters.fromJson(json['ResourceIds'],'List<int>',context!);
Bookings = JsonConverters.fromJson(json['Bookings'],'List<BookingIntervalResponse>',context!);
ResponseStatus = JsonConverters.fromJson(json['ResponseStatus'],'ResponseStatus',context!);
return this;
}
Map<String, dynamic> toJson() => {
'ResourceIds': JsonConverters.toJson(ResourceIds,'List<int>',context!),
'Bookings': JsonConverters.toJson(Bookings,'List<BookingIntervalResponse>',context!),
'ResponseStatus': JsonConverters.toJson(ResponseStatus,'ResponseStatus',context!)
};
getTypeName() => "CollidingBookingQueryResponse";
TypeContext? context = _ctx;
}
// @ApiResponse(Description="The request parameters was not valid", StatusCode=400)
// @ApiResponse(Description="You were unauthorized to call this service", StatusCode=401)
// @ApiResponse(Description="You have too low privilegies to call this service", StatusCode=403)
// @ValidateRequest(Validator="IsAuthenticated")
class CollidingBookingQuery implements IConvertible
{
/**
* The company id, if empty will use the company id for the user you are logged in with.
*/
// @ApiMember(Description="The company id, if empty will use the company id for the user you are logged in with.")
String? CompanyId;
/**
* Resource ids of the resource that should be matched against booked events
*/
// @ApiMember(Description="Resource ids of the resource that should be matched against booked events")
List<int>? ResourceIds;
/**
* Time exception starting date
*/
// @ApiMember(Description="Time exception starting date")
DateTime? From;
/**
* Time exception ending date
*/
// @ApiMember(Description="Time exception ending date")
DateTime? To;
/**
* This value indicates the time of day when the time exception begins. Example: 10:00. If Recurring this will be the startime for each recurring day.
*/
// @ApiMember(Description="This value indicates the time of day when the time exception begins. Example: 10:00. If Recurring this will be the startime for each recurring day.")
Duration? FromTime;
/**
* This value indicates the time of day when the time exception ends. Example: 12:00. If Recurring this will be the endtime for each recurring day.
*/
// @ApiMember(Description="This value indicates the time of day when the time exception ends. Example: 12:00. If Recurring this will be the endtime for each recurring day.")
Duration? ToTime;
/**
* A comma separated list of which days this day exception belongs to, 1 = Monday .. 7 = Sunday
*/
// @ApiMember(Description="A comma separated list of which days this day exception belongs to, 1 = Monday .. 7 = Sunday")
List<int>? DaysOfWeek;
/**
* If you want to include the service information for the booking
*/
// @ApiMember(DataType="boolean", Description="If you want to include the service information for the booking", ParameterType="query")
bool? IncludeServiceInformation;
/**
* If you want to include the customer information for the booking
*/
// @ApiMember(DataType="boolean", Description="If you want to include the customer information for the booking", ParameterType="query")
bool? IncludeCustomerInformation;
CollidingBookingQuery({this.CompanyId,this.ResourceIds,this.From,this.To,this.FromTime,this.ToTime,this.DaysOfWeek,this.IncludeServiceInformation,this.IncludeCustomerInformation});
CollidingBookingQuery.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
CompanyId = json['CompanyId'];
ResourceIds = JsonConverters.fromJson(json['ResourceIds'],'List<int>',context!);
From = JsonConverters.fromJson(json['From'],'DateTime',context!);
To = JsonConverters.fromJson(json['To'],'DateTime',context!);
FromTime = JsonConverters.fromJson(json['FromTime'],'Duration',context!);
ToTime = JsonConverters.fromJson(json['ToTime'],'Duration',context!);
DaysOfWeek = JsonConverters.fromJson(json['DaysOfWeek'],'List<int>',context!);
IncludeServiceInformation = json['IncludeServiceInformation'];
IncludeCustomerInformation = json['IncludeCustomerInformation'];
return this;
}
Map<String, dynamic> toJson() => {
'CompanyId': CompanyId,
'ResourceIds': JsonConverters.toJson(ResourceIds,'List<int>',context!),
'From': JsonConverters.toJson(From,'DateTime',context!),
'To': JsonConverters.toJson(To,'DateTime',context!),
'FromTime': JsonConverters.toJson(FromTime,'Duration',context!),
'ToTime': JsonConverters.toJson(ToTime,'Duration',context!),
'DaysOfWeek': JsonConverters.toJson(DaysOfWeek,'List<int>',context!),
'IncludeServiceInformation': IncludeServiceInformation,
'IncludeCustomerInformation': IncludeCustomerInformation
};
getTypeName() => "CollidingBookingQuery";
TypeContext? context = _ctx;
}
TypeContext _ctx = TypeContext(library: 'api.bokamera.se', types: <String, TypeInfo> {
'BookingStatusEnum': TypeInfo(TypeOf.Enum, enumValues:BookingStatusEnum.values),
'BookedCustomer': TypeInfo(TypeOf.Class, create:() => BookedCustomer()),
'GroupBookingSettings': TypeInfo(TypeOf.Class, create:() => GroupBookingSettings()),
'MultipleResourceSettings': TypeInfo(TypeOf.Class, create:() => MultipleResourceSettings()),
'ServiceInfoResponse': TypeInfo(TypeOf.Class, create:() => ServiceInfoResponse()),
'Uri': TypeInfo(TypeOf.Class, create:() => Uri()),
'BookingIntervalResponse': TypeInfo(TypeOf.Class, create:() => BookingIntervalResponse()),
'CollidingBookingQueryResponse': TypeInfo(TypeOf.Class, create:() => CollidingBookingQueryResponse()),
'List<BookingIntervalResponse>': TypeInfo(TypeOf.Class, create:() => <BookingIntervalResponse>[]),
'CollidingBookingQuery': TypeInfo(TypeOf.Class, create:() => CollidingBookingQuery()),
});
Dart CollidingBookingQuery DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
GET /timeexceptions/collidingevents HTTP/1.1 Host: api.bokamera.se Accept: text/jsv
HTTP/1.1 200 OK Content-Type: text/jsv Content-Length: length { ResourceIds: [ 0 ], Bookings: [ { Id: 0, Status: Booked, StatusId: 0, StatusName: String, Customer: { Firstname: String, Lastname: String, Email: String, Phone: String, FacebookUserName: String, ImageUrl: String, CorporateIdentityNumber: String, InvoiceAddress1: String, InvoiceAddress2: String, InvoiceCity: String, InvoicePostalCode: String, InvoiceCountryCode: String }, Service: { Id: 0, Name: String, Description: String, LengthInMinutes: 0, MaxNumberOfSpotsPerBooking: 0, MinNumberOfSpotsPerBooking: 0, GroupBooking: { Active: False, Min: 0, Max: 0 }, MultipleResource: { Active: False, Min: 0, Max: 0 }, IsGroupBooking: False, IsPaymentEnabled: False } } ], ResponseStatus: { ErrorCode: String, Message: String, StackTrace: String, Errors: [ { ErrorCode: String, FieldName: String, Message: String, Meta: { String: String } } ], Meta: { String: String } } }