BokaMera.API.Host

<back to all web services

CreateBookings

The following routes are available for this service:
POST/bookings/repeatCreate new bookingsCreate new bookings if you are authorized to do so.
namespace BokaMera.API.ServiceModel.Dtos

open System
open System.Collections
open System.Collections.Generic
open System.Runtime.Serialization
open ServiceStack
open ServiceStack.DataAnnotations

    type BookingStatusEnum =
        | Booked = 1
        | Unbooked = 2
        | Reserved = 3
        | Canceled = 4
        | AwaitingPayment = 5
        | AwaitingPaymentNoTimeLimit = 6
        | Payed = 7
        | AwaitingPaymentRequestFromAdmin = 8
        | AwaitingPaymentFromProvider = 9
        | Invoiced = 10

    [<AllowNullLiteral>]
    type BookingStatusQueryResponse() = 
        member val Id:Int32 = new Int32() with get,set
        member val Name:String = null with get,set
        member val Description:String = null with get,set
        member val Icon:String = null with get,set
        member val Color:String = null with get,set

    [<AllowNullLiteral>]
    type CustomFieldValueResponse() = 
        member val Value:String = null with get,set

    [<AllowNullLiteral>]
    type CustomFieldConfigData() = 
        ///<summary>
        ///Custom field id
        ///</summary>
        [<ApiMember(Description="Custom field id")>]
        member val Id:Int32 = new Int32() with get,set

        ///<summary>
        ///Configuration name. Example: 'Number of persons'.
        ///</summary>
        [<ApiMember(Description="Configuration name. Example: 'Number of persons'.")>]
        member val Name:String = null with get,set

        ///<summary>
        ///Custom field description. Example: 'For how many persons is this booking?'
        ///</summary>
        [<ApiMember(Description="Custom field description. Example: 'For how many persons is this booking?'")>]
        member val Description:String = null with get,set

        ///<summary>
        ///Field width. Example: 20 for 20px
        ///</summary>
        [<ApiMember(Description="Field width. Example: 20 for 20px")>]
        member val Width:Nullable<Int32> = new Nullable<Int32>() with get,set

        ///<summary>
        ///Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox'
        ///</summary>
        [<ApiMember(Description="Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox'")>]
        member val DataType:String = null with get,set

        ///<summary>
        ///Default value of the field. Example: '3'
        ///</summary>
        [<ApiMember(Description="Default value of the field. Example: '3'")>]
        member val DefaultValue:String = null with get,set

        ///<summary>
        ///Determines if the field is required to have a value or not
        ///</summary>
        [<ApiMember(Description="Determines if the field is required to have a value or not")>]
        member val IsMandatory:Boolean = new Boolean() with get,set

        ///<summary>
        ///Error message shown to the user if the field data is required but not entered
        ///</summary>
        [<ApiMember(Description="Error message shown to the user if the field data is required but not entered")>]
        member val MandatoryErrorMessage:String = null with get,set

        ///<summary>
        ///Max lenght of the field
        ///</summary>
        [<ApiMember(Description="Max lenght of the field")>]
        member val MaxLength:Int32 = new Int32() with get,set

        ///<summary>
        ///If the field should have multiple lines
        ///</summary>
        [<ApiMember(Description="If the field should have multiple lines")>]
        member val MultipleLineText:Boolean = new Boolean() with get,set

        ///<summary>
        ///Regular expression used for validation of the field
        ///</summary>
        [<ApiMember(Description="Regular expression used for validation of the field")>]
        member val RegEx:String = null with get,set

        ///<summary>
        ///Error message shown if the regular expression validation failed
        ///</summary>
        [<ApiMember(Description="Error message shown if the regular expression validation failed")>]
        member val RegExErrorMessage:String = null with get,set

        ///<summary>
        ///The values to select from if Datatype is DropDown for this custom field
        ///</summary>
        [<ApiMember(Description="The values to select from if Datatype is DropDown for this custom field")>]
        member val Values:ResizeArray<CustomFieldValueResponse> = new ResizeArray<CustomFieldValueResponse>() with get,set

    [<AllowNullLiteral>]
    type CustomFieldDataResponse() = 
        member val Id:Int32 = new Int32() with get,set
        member val Column:String = null with get,set
        member val Name:String = null with get,set
        member val Description:String = null with get,set
        member val Value:String = null with get,set
        ///<summary>
        ///Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox'
        ///</summary>
        [<ApiMember(Description="Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox'")>]
        member val DataType:String = null with get,set

    [<AllowNullLiteral>]
    type BookedResource() = 
        member val Id:Int32 = new Int32() with get,set
        member val Name:String = null with get,set
        member val Color:String = null with get,set
        member val ImageUrl:Uri = null with get,set
        member val Email:String = null with get,set
        member val MobilePhone:String = null with get,set
        member val AccessGroup:String = null with get,set
        member val EmailNotification:Boolean = new Boolean() with get,set
        member val SMSNotification:Boolean = new Boolean() with get,set
        member val EmailReminder:Boolean = new Boolean() with get,set
        member val SMSReminder:Boolean = new Boolean() with get,set

    [<AllowNullLiteral>]
    type BookedResourceType() = 
        ///<summary>
        ///The resource type id
        ///</summary>
        [<ApiMember(Description="The resource type id")>]
        member val Id:Int32 = new Int32() with get,set

        ///<summary>
        ///The resource type name
        ///</summary>
        [<ApiMember(Description="The resource type name")>]
        member val Name:String = null with get,set

        ///<summary>
        ///The resources inside resource type
        ///</summary>
        [<ApiMember(Description="The resources inside resource type")>]
        member val Resources:ResizeArray<BookedResource> = new ResizeArray<BookedResource>() with get,set

    [<AllowNullLiteral>]
    type BookedCompany() = 
        member val Id:Guid = new Guid() with get,set
        member val Name:String = null with get,set
        member val LogoType:Uri = null with get,set
        member val Category:String = null with get,set
        member val Street1:String = null with get,set
        member val Street2:String = null with get,set
        member val ZipCode:String = null with get,set
        member val City:String = null with get,set
        member val CountryId:String = null with get,set
        member val Longitude:String = null with get,set
        member val Latitude:String = null with get,set
        member val Phone:String = null with get,set
        member val Email:String = null with get,set
        member val HomePage:String = null with get,set
        member val SitePath:String = null with get,set
        member val IsFavorite:Boolean = new Boolean() with get,set
        member val PaymentProviderId:Nullable<Int32> = new Nullable<Int32>() with get,set

    [<AllowNullLiteral>]
    type BookedCustomer() = 
        member val Id:Guid = new Guid() with get,set
        member val Firstname:String = null with get,set
        member val Lastname:String = null with get,set
        member val Email:String = null with get,set
        member val Phone:String = null with get,set
        member val FacebookUserName:String = null with get,set
        member val ImageUrl:String = null with get,set
        member val CorporateIdentityNumber:String = null with get,set
        member val InvoiceAddress1:String = null with get,set
        member val InvoiceAddress2:String = null with get,set
        member val InvoiceCity:String = null with get,set
        member val InvoicePostalCode:String = null with get,set
        member val InvoiceCountryCode:String = null with get,set

    [<AllowNullLiteral>]
    type BookedQuantity() = 
        ///<summary>
        ///The quantity Id
        ///</summary>
        [<ApiMember(Description="The quantity Id")>]
        member val Id:Int32 = new Int32() with get,set

        ///<summary>
        ///The quantity for booked on this price category
        ///</summary>
        [<ApiMember(Description="The quantity for booked on this price category")>]
        member val Quantity:Int32 = new Int32() with get,set

        ///<summary>
        ///The price
        ///</summary>
        [<ApiMember(Description="The price")>]
        member val Price:Nullable<Double> = new Nullable<Double>() with get,set

        ///<summary>
        ///The price bofore rebate codes
        ///</summary>
        [<ApiMember(Description="The price bofore rebate codes")>]
        member val PriceBeforeRebate:Nullable<Double> = new Nullable<Double>() with get,set

        ///<summary>
        ///The price currency
        ///</summary>
        [<ApiMember(Description="The price currency")>]
        member val CurrencyId:String = null with get,set

        ///<summary>
        ///The price sign
        ///</summary>
        [<ApiMember(Description="The price sign")>]
        member val PriceSign:String = null with get,set

        ///<summary>
        ///The price category
        ///</summary>
        [<ApiMember(Description="The price category")>]
        member val Category:String = null with get,set

        ///<summary>
        ///The price VAT in percent
        ///</summary>
        [<ApiMember(Description="The price VAT in percent")>]
        member val VAT:Nullable<Decimal> = new Nullable<Decimal>() with get,set

        ///<summary>
        ///The price text to display
        ///</summary>
        [<ApiMember(Description="The price text to display")>]
        member val PriceText:String = null with get,set

        ///<summary>
        ///If the quantity you add should occupy a spot. Default is true. If no it will only be a row that includes price information.
        ///</summary>
        [<ApiMember(Description="If the quantity you add should occupy a spot. Default is true. If no it will only be a row that includes price information.")>]
        member val OccupiesSpot:Boolean = new Boolean() with get,set

    [<AllowNullLiteral>]
    type GroupBookingSettings() = 
        member val Active:Boolean = new Boolean() with get,set
        member val Min:Int32 = new Int32() with get,set
        member val Max:Int32 = new Int32() with get,set

    [<AllowNullLiteral>]
    type MultipleResourceSettings() = 
        member val Active:Boolean = new Boolean() with get,set
        member val Min:Int32 = new Int32() with get,set
        member val Max:Int32 = new Int32() with get,set

    [<AllowNullLiteral>]
    type ServiceInfoResponse() = 
        member val Id:Int32 = new Int32() with get,set
        member val Name:String = null with get,set
        member val Description:String = null with get,set
        member val ImageUrl:Uri = null with get,set
        member val LengthInMinutes:Nullable<Int32> = new Nullable<Int32>() with get,set
        member val MaxNumberOfSpotsPerBooking:Int32 = new Int32() with get,set
        member val GroupBooking:GroupBookingSettings = null with get,set
        member val MultipleResource:MultipleResourceSettings = null with get,set
        member val IsGroupBooking:Boolean = new Boolean() with get,set
        member val IsPaymentEnabled:Boolean = new Boolean() with get,set

    [<AllowNullLiteral>]
    type BookingLogEventTypeResponse() = 
        ///<summary>
        ///The event type id
        ///</summary>
        [<ApiMember(Description="The event type id")>]
        member val Id:Int32 = new Int32() with get,set

        ///<summary>
        ///The event type name
        ///</summary>
        [<ApiMember(Description="The event type name")>]
        member val Name:String = null with get,set

        ///<summary>
        ///The event type description
        ///</summary>
        [<ApiMember(Description="The event type description")>]
        member val Description:String = null with get,set

    [<AllowNullLiteral>]
    type BookingLogQueryResponse() = 
        ///<summary>
        ///The booking log id
        ///</summary>
        [<ApiMember(Description="The booking log id")>]
        member val Id:Int32 = new Int32() with get,set

        ///<summary>
        ///The booking id
        ///</summary>
        [<ApiMember(Description="The booking id")>]
        member val BookingId:Int32 = new Int32() with get,set

        ///<summary>
        ///The type of event
        ///</summary>
        [<ApiMember(Description="The type of event")>]
        member val EventTypeId:Int32 = new Int32() with get,set

        ///<summary>
        ///The type of event
        ///</summary>
        [<ApiMember(Description="The type of event")>]
        member val EventType:BookingLogEventTypeResponse = null with get,set

        ///<summary>
        ///Comments that could be added to the event log item
        ///</summary>
        [<ApiMember(Description="Comments that could be added to the event log item")>]
        member val Comments:String = null with get,set

        ///<summary>
        ///The user created the event
        ///</summary>
        [<ApiMember(Description="The user created the event")>]
        member val UserName:String = null with get,set

        ///<summary>
        ///Then date when the event occured
        ///</summary>
        [<ApiMember(Description="Then date when the event occured")>]
        member val Created:DateTime = new DateTime() with get,set

    [<AllowNullLiteral>]
    type CurrencyInfoResponse() = 
        ///<summary>
        ///The currency id
        ///</summary>
        [<ApiMember(Description="The currency id")>]
        member val Id:String = null with get,set

        ///<summary>
        ///The currency id
        ///</summary>
        [<ApiMember(Description="The currency id")>]
        member val Name:String = null with get,set

        ///<summary>
        ///The currency id
        ///</summary>
        [<ApiMember(Description="The currency id")>]
        member val CurrencySign:String = null with get,set

    [<AllowNullLiteral>]
    type BookingPaymentLogQueryResponse() = 
        ///<summary>
        ///The booking payment log id
        ///</summary>
        [<ApiMember(Description="The booking payment log id")>]
        member val Id:Int32 = new Int32() with get,set

        ///<summary>
        ///The booking id
        ///</summary>
        [<ApiMember(Description="The booking id")>]
        member val BookingId:Int32 = new Int32() with get,set

        ///<summary>
        ///The payment reference id
        ///</summary>
        [<ApiMember(Description="The payment reference id")>]
        member val PaymentReferenceId:String = null with get,set

        ///<summary>
        ///The payment order item reference id
        ///</summary>
        [<ApiMember(Description="The payment order item reference id")>]
        member val OrderItemReferenceId:String = null with get,set

        ///<summary>
        ///The payment reference id
        ///</summary>
        [<ApiMember(Description="The payment reference id")>]
        member val PaymentProviderId:Nullable<Int32> = new Nullable<Int32>() with get,set

        ///<summary>
        ///The payment amount
        ///</summary>
        [<ApiMember(Description="The payment amount")>]
        member val Amount:Double = new Double() with get,set

        ///<summary>
        ///The payment VAT in percent
        ///</summary>
        [<ApiMember(Description="The payment VAT in percent")>]
        member val VAT:Decimal = new Decimal() with get,set

        ///<summary>
        ///The payment amount that is credited
        ///</summary>
        [<ApiMember(Description="The payment amount that is credited")>]
        member val AmountCredited:Double = new Double() with get,set

        ///<summary>
        ///The payment currency id
        ///</summary>
        [<ApiMember(Description="The payment currency id")>]
        member val CurrencyId:String = null with get,set

        ///<summary>
        ///The payment currency info
        ///</summary>
        [<ApiMember(Description="The payment currency info")>]
        member val CurrencyInfo:CurrencyInfoResponse = null with get,set

        ///<summary>
        ///Comments that could be added to the event log item
        ///</summary>
        [<ApiMember(Description="Comments that could be added to the event log item")>]
        member val Comments:String = null with get,set

        ///<summary>
        ///The date when the payment items was created
        ///</summary>
        [<ApiMember(Description="The date when the payment items was created")>]
        member val Created:DateTime = new DateTime() with get,set

        ///<summary>
        ///The date when the payment items was update
        ///</summary>
        [<ApiMember(Description="The date when the payment items was update")>]
        member val Updated:DateTime = new DateTime() with get,set

    [<AllowNullLiteral>]
    type BookingCheckoutQueryResponse() = 
        ///<summary>
        ///The checkout id
        ///</summary>
        [<ApiMember(Description="The checkout id")>]
        member val Id:Guid = new Guid() with get,set

        ///<summary>
        ///The booking id
        ///</summary>
        [<ApiMember(Description="The booking id")>]
        member val BookingId:Int32 = new Int32() with get,set

        ///<summary>
        ///The purchase id
        ///</summary>
        [<ApiMember(Description="The purchase id")>]
        member val PurchaseId:Nullable<Int32> = new Nullable<Int32>() with get,set

        ///<summary>
        ///The payment checkout expiration datetime
        ///</summary>
        [<ApiMember(Description="The payment checkout expiration datetime")>]
        member val ExpirationTime:Nullable<DateTime> = new Nullable<DateTime>() with get,set

        ///<summary>
        ///The payment snippet code
        ///</summary>
        [<ApiMember(Description="The payment snippet code")>]
        member val Snippet:String = null with get,set

        ///<summary>
        ///The payment status
        ///</summary>
        [<ApiMember(Description="The payment status")>]
        member val Status:String = null with get,set

        ///<summary>
        ///Log message
        ///</summary>
        [<ApiMember(Description="Log message")>]
        member val Message:String = null with get,set

        ///<summary>
        ///When the checkout log item was created
        ///</summary>
        [<ApiMember(Description="When the checkout log item was created")>]
        member val Created:DateTime = new DateTime() with get,set

        ///<summary>
        ///When the checkout log item was updated
        ///</summary>
        [<ApiMember(Description="When the checkout log item was updated")>]
        member val Updated:DateTime = new DateTime() with get,set

    [<AllowNullLiteral>]
    type ExternalReferenceResponse() = 
        member val CompanyId:Guid = new Guid() with get,set
        member val Id:Guid = new Guid() with get,set
        member val OwnerId:Guid = new Guid() with get,set
        member val ReferenceType:String = null with get,set
        member val ExternalData:String = null with get,set
        member val CreatedBy:String = null with get,set
        member val Updated:DateTime = new DateTime() with get,set
        member val Created:DateTime = new DateTime() with get,set

    [<AllowNullLiteral>]
    type BookingCalendarExportStatus() = 
        member val CalendarId:String = null with get,set
        member val BookingId:Int32 = new Int32() with get,set
        member val Synced:Nullable<Boolean> = new Nullable<Boolean>() with get,set

    [<AllowNullLiteral>]
    type BookingQueryResponse() = 
        member val Id:Int32 = new Int32() with get,set
        member val CompanyId:Guid = new Guid() with get,set
        member val From:DateTime = new DateTime() with get,set
        member val To:DateTime = new DateTime() with get,set
        member val Status:BookingStatusEnum = new BookingStatusEnum() with get,set
        member val StatusId:Int32 = new Int32() with get,set
        member val StatusName:String = null with get,set
        member val StatusInfo:BookingStatusQueryResponse = null with get,set
        member val SendEmailReminder:Boolean = new Boolean() with get,set
        member val SendSmsReminder:Boolean = new Boolean() with get,set
        member val SendSmsConfirmation:Boolean = new Boolean() with get,set
        member val SendEmailConfirmation:Boolean = new Boolean() with get,set
        member val LastTimeToUnBook:Nullable<DateTime> = new Nullable<DateTime>() with get,set
        member val CustomFields:ResizeArray<CustomFieldConfigData> = new ResizeArray<CustomFieldConfigData>() with get,set
        member val CustomFieldValues:ResizeArray<CustomFieldDataResponse> = new ResizeArray<CustomFieldDataResponse>() with get,set
        member val BookedResourceTypes:ResizeArray<BookedResourceType> = new ResizeArray<BookedResourceType>() with get,set
        member val Company:BookedCompany = null with get,set
        member val Customer:BookedCustomer = null with get,set
        member val Quantities:ResizeArray<BookedQuantity> = new ResizeArray<BookedQuantity>() with get,set
        member val Service:ServiceInfoResponse = null with get,set
        member val PaymentExpiration:Nullable<DateTime> = new Nullable<DateTime>() with get,set
        member val Log:ResizeArray<BookingLogQueryResponse> = new ResizeArray<BookingLogQueryResponse>() with get,set
        member val PaymentLog:ResizeArray<BookingPaymentLogQueryResponse> = new ResizeArray<BookingPaymentLogQueryResponse>() with get,set
        member val CheckoutLog:ResizeArray<BookingCheckoutQueryResponse> = new ResizeArray<BookingCheckoutQueryResponse>() with get,set
        member val ExternalReference:ResizeArray<ExternalReferenceResponse> = new ResizeArray<ExternalReferenceResponse>() with get,set
        member val ResponseStatus:ResponseStatus = null with get,set
        member val CalendarExportStatus:BookingCalendarExportStatus = null with get,set
        member val LengthInMinutes:Nullable<Int32> = new Nullable<Int32>() with get,set
        member val BookedBy:String = null with get,set
        member val BookedComments:String = null with get,set
        member val UnbookedComments:String = null with get,set
        member val CommentsToCustomer:String = null with get,set
        member val CreatedDate:DateTime = new DateTime() with get,set
        member val UpdatedDate:DateTime = new DateTime() with get,set
        member val UnbookedOn:Nullable<DateTime> = new Nullable<DateTime>() with get,set
        member val CancellationCode:String = null with get,set
        member val RatingCode:String = null with get,set

    [<AllowNullLiteral>]
    type FailedBookings() = 
        member val From:DateTime = new DateTime() with get,set
        member val To:DateTime = new DateTime() with get,set
        member val Reason:String = null with get,set
        ///<summary>
        ///Set the number of spots you want to book. You add number of spots per price category. Multiple spots require that the service has GroupBooking enabled. Default is one spot.
        ///</summary>
        [<ApiMember(Description="Set the number of spots you want to book. You add number of spots per price category. Multiple spots require that the service has GroupBooking enabled. Default is one spot.")>]
        member val Quantities:QuantityToBook[] = [||] with get,set

    [<AllowNullLiteral>]
    type CreateBookingsResponse() = 
        ///<summary>
        ///The datetime you want to end the booking.
        ///</summary>
        [<ApiMember(Description="The datetime you want to end the booking.", IsRequired=true)>]
        member val Created:ResizeArray<BookingQueryResponse> = new ResizeArray<BookingQueryResponse>() with get,set

        ///<summary>
        ///The dates that didn't work to book.
        ///</summary>
        [<ApiMember(Description="The dates that didn't work to book.", IsRequired=true)>]
        member val Failed:ResizeArray<FailedBookings> = new ResizeArray<FailedBookings>() with get,set

        member val ResponseStatus:ResponseStatus = null with get,set

    [<AllowNullLiteral>]
    type CustomerToBook() = 
        ///<summary>
        ///Customers firstname
        ///</summary>
        [<ApiMember(Description="Customers firstname", IsRequired=true)>]
        member val Firstname:String = null with get,set

        ///<summary>
        ///Customers lastname
        ///</summary>
        [<ApiMember(Description="Customers lastname", IsRequired=true)>]
        member val Lastname:String = null with get,set

        ///<summary>
        ///Customers email
        ///</summary>
        [<ApiMember(Description="Customers email", IsRequired=true)>]
        member val Email:String = null with get,set

        ///<summary>
        ///Customers phone number. Mobile phone number is required for SMS messages to be sent.
        ///</summary>
        [<ApiMember(Description="Customers phone number. Mobile phone number is required for SMS messages to be sent.", IsRequired=true)>]
        member val Phone:String = null with get,set

    [<AllowNullLiteral>]
    type ResourceToBook() = 
        member val ResourceTypeId:Int32 = new Int32() with get,set
        member val ResourceId:Int32 = new Int32() with get,set

    type PaymentOptions =
        | DefaultSetting = 0
        | BookWithoutPayment = 1
        | BookWithPaymentMessageToCustomer = 2
        | BookWithManualPayment = 3

    [<AllowNullLiteral>]
    type AddCustomField() = 
        member val Id:Int32 = new Int32() with get,set
        member val Value:String = null with get,set

    [<AllowNullLiteral>]
    type CreateBookingBase() = 
        ///<summary>
        ///The company id, if empty will use the company id for the user you are logged in with.
        ///</summary>
        [<ApiMember(Description="The company id, if empty will use the company id for the user you are logged in with.")>]
        member val CompanyId:Nullable<Guid> = new Nullable<Guid>() with get,set

        ///<summary>
        ///If you want to book on an existing customer instead of CustomerToBook info set the CustomerId here. Set Empty Guid (00000000-0000-0000-0000-000000000000) if you want to book without any customer, this is only allowed by admin. The customer id is shown in the customer list named as id. When booking as customer (no admin) leave this field blank.
        ///</summary>
        [<ApiMember(Description="If you want to book on an existing customer instead of CustomerToBook info set the CustomerId here. Set Empty Guid (00000000-0000-0000-0000-000000000000) if you want to book without any customer, this is only allowed by admin. The customer id is shown in the customer list named as id. When booking as customer (no admin) leave this field blank.")>]
        member val CustomerId:Nullable<Guid> = new Nullable<Guid>() with get,set

        ///<summary>
        ///If company requires to be authenticated or a pin code entered to book on a specific customer, enter it here.
        ///</summary>
        [<ApiMember(Description="If company requires to be authenticated or a pin code entered to book on a specific customer, enter it here.")>]
        member val PinCode:String = null with get,set

        ///<summary>
        ///If you want to book with customer information instead of the Customer Id send the customer information here. Note: If customer profile already exists with the same email the information will not be changed, instead the provided information will be added as BookingsComments if it differs from the ordinairy profile. 
        ///</summary>
        [<ApiMember(Description="If you want to book with customer information instead of the Customer Id send the customer information here. Note: If customer profile already exists with the same email the information will not be changed, instead the provided information will be added as BookingsComments if it differs from the ordinairy profile. ")>]
        member val Customer:CustomerToBook = null with get,set

        ///<summary>
        ///The service to be booked
        ///</summary>
        [<ApiMember(Description="The service to be booked", IsRequired=true)>]
        member val ServiceId:Int32 = new Int32() with get,set

        ///<summary>
        ///If you want to add comments to a booking you can add them here, this comments are never shared with the customer
        ///</summary>
        [<ApiMember(Description="If you want to add comments to a booking you can add them here, this comments are never shared with the customer")>]
        member val BookedComments:String = null with get,set

        ///<summary>
        ///If you want to add comments to the booking that is sent to the customer, you can add them here. Comments will be sent in the booking confirmation
        ///</summary>
        [<ApiMember(Description="If you want to add comments to the booking that is sent to the customer, you can add them here. Comments will be sent in the booking confirmation")>]
        member val CommentsToCustomer:String = null with get,set

        member val Resources:ResizeArray<ResourceToBook> = new ResizeArray<ResourceToBook>() with get,set
        ///<summary>
        ///Rebate code ids as an array of integer
        ///</summary>
        [<ApiMember(Description="Rebate code ids as an array of integer")>]
        member val RebateCodeIds:ResizeArray<Int32> = new ResizeArray<Int32>() with get,set

        ///<summary>
        ///If you want to send Email reminder
        ///</summary>
        [<ApiMember(Description="If you want to send Email reminder")>]
        member val SendEmailReminder:Nullable<Boolean> = new Nullable<Boolean>() with get,set

        ///<summary>
        ///If you want to send SMS reminder
        ///</summary>
        [<ApiMember(Description="If you want to send SMS reminder")>]
        member val SendSmsReminder:Nullable<Boolean> = new Nullable<Boolean>() with get,set

        ///<summary>
        ///If you want to send SMS confirmation
        ///</summary>
        [<ApiMember(Description="If you want to send SMS confirmation")>]
        member val SendSmsConfirmation:Nullable<Boolean> = new Nullable<Boolean>() with get,set

        ///<summary>
        ///Only admins are allowed to not send an email confirmation. Default is true
        ///</summary>
        [<ApiMember(Description="Only admins are allowed to not send an email confirmation. Default is true")>]
        member val SendEmailConfirmation:Nullable<Boolean> = new Nullable<Boolean>() with get,set

        ///<summary>
        ///If payment is enabled and you're an administrator, optional to choose payment option, if empty then the default settings will be used. Following payment options exists. DefaultSetting = 0, BookWithoutPayment = 1 (will be direcyly booked without payment), BookWithPaymentMessageToCustomer = 2 (will set status AwaitingPayment and send payment instructions to customer), BookWithManualPayment = 3 (Will set status AwaitingPaymentNoTimeLimit and Admin will need to manually mark the booking as payed when recieved payment).
        ///</summary>
        [<ApiMember(Description="If payment is enabled and you're an administrator, optional to choose payment option, if empty then the default settings will be used. Following payment options exists. DefaultSetting = 0, BookWithoutPayment = 1 (will be direcyly booked without payment), BookWithPaymentMessageToCustomer = 2 (will set status AwaitingPayment and send payment instructions to customer), BookWithManualPayment = 3 (Will set status AwaitingPaymentNoTimeLimit and Admin will need to manually mark the booking as payed when recieved payment).")>]
        member val PaymentOption:PaymentOptions = new PaymentOptions() with get,set

        ///<summary>
        ///If Custom Fields are added to the booking, here you will send the id and the value for each custom field to be saved
        ///</summary>
        [<ApiMember(Description="If Custom Fields are added to the booking, here you will send the id and the value for each custom field to be saved")>]
        member val CustomFields:ResizeArray<AddCustomField> = new ResizeArray<AddCustomField>() with get,set

        ///<summary>
        ///If Custom Fields are added to the customer, here you will send the id and the value for each custom field to be updated
        ///</summary>
        [<ApiMember(Description="If Custom Fields are added to the customer, here you will send the id and the value for each custom field to be updated")>]
        member val CustomerCustomFields:ResizeArray<AddCustomField> = new ResizeArray<AddCustomField>() with get,set

        ///<summary>
        ///If want to allow to book outside the service schedules. This means you can book a time after the schedule opening hours as long as the resource are available. This is only allowed by administrators
        ///</summary>
        [<ApiMember(Description="If want to allow to book outside the service schedules. This means you can book a time after the schedule opening hours as long as the resource are available. This is only allowed by administrators")>]
        member val AllowBookingOutsideSchedules:Boolean = new Boolean() with get,set

    [<AllowNullLiteral>]
    type DatesToRepeat() = 
        ///<summary>
        ///Booking start
        ///</summary>
        [<ApiMember(Description="Booking start")>]
        member val From:DateTime = new DateTime() with get,set

        ///<summary>
        ///Booking end
        ///</summary>
        [<ApiMember(Description="Booking end")>]
        member val To:DateTime = new DateTime() with get,set

        ///<summary>
        ///Set the number of spots you want to book. You add number of spots per price category. Multiple spots require that the service has GroupBooking enabled. Default is one spot.
        ///</summary>
        [<ApiMember(Description="Set the number of spots you want to book. You add number of spots per price category. Multiple spots require that the service has GroupBooking enabled. Default is one spot.")>]
        member val Quantities:QuantityToBook[] = [||] with get,set

    [<ApiResponse(Description="You were unauthorized to call this service", StatusCode=401)>]
    [<AllowNullLiteral>]
    type CreateBookings() = 
        inherit CreateBookingBase()
        ///<summary>
        ///Set the dates you want to book and it's quantities. It's an array of dates and quantities.
        ///</summary>
        [<ApiMember(DataType="List<DatesToRepeat>", Description="Set the dates you want to book and it's quantities. It's an array of dates and quantities.", IsRequired=true)>]
        member val DatesToRepeat:ResizeArray<DatesToRepeat> = new ResizeArray<DatesToRepeat>() with get,set

    [<AllowNullLiteral>]
    type QuantityToBook() = 
        ///<summary>
        ///If service has a price, enter the price id for that price. If no price exists for the service set 0 as PriceId. If you put 0 and a price exists, it will use that price (only works if just one price exists for the current selected date to book)
        ///</summary>
        [<ApiMember(Description="If service has a price, enter the price id for that price. If no price exists for the service set 0 as PriceId. If you put 0 and a price exists, it will use that price (only works if just one price exists for the current selected date to book)", IsRequired=true)>]
        member val PriceId:Int32 = new Int32() with get,set

        ///<summary>
        ///Set the number of spots or resources you want to book on the specific price category
        ///</summary>
        [<ApiMember(Description="Set the number of spots or resources you want to book on the specific price category", IsRequired=true)>]
        member val Quantity:Int32 = new Int32() with get,set

        ///<summary>
        ///If the quantity you add should occupy a spot. Default is true. If no it will only be a row that includes price information.
        ///</summary>
        [<ApiMember(Description="If the quantity you add should occupy a spot. Default is true. If no it will only be a row that includes price information.")>]
        member val OccupiesSpot:Boolean = new Boolean() with get,set

F# CreateBookings DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /bookings/repeat HTTP/1.1 
Host: testapi.bokamera.se 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	DatesToRepeat: 
	[
		{
			Quantities: 
			[
				{
					PriceId: 0,
					Quantity: 0,
					OccupiesSpot: False
				}
			]
		}
	],
	CompanyId: 00000000-0000-0000-0000-000000000000,
	CustomerId: 00000000-0000-0000-0000-000000000000,
	PinCode: String,
	Customer: 
	{
		Firstname: String,
		Lastname: String,
		Email: String,
		Phone: String
	},
	ServiceId: 0,
	BookedComments: String,
	CommentsToCustomer: String,
	Resources: 
	[
		{
			ResourceTypeId: 0,
			ResourceId: 0
		}
	],
	RebateCodeIds: 
	[
		0
	],
	SendEmailReminder: False,
	SendSmsReminder: False,
	SendSmsConfirmation: False,
	SendEmailConfirmation: False,
	PaymentOption: DefaultSetting,
	CustomFields: 
	[
		{
			Id: 0,
			Value: String
		}
	],
	CustomerCustomFields: 
	[
		{
			Id: 0,
			Value: String
		}
	],
	AllowBookingOutsideSchedules: False
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	Created: 
	[
		{
			Id: 0,
			Status: Booked,
			StatusId: 0,
			StatusName: String,
			StatusInfo: 
			{
				Id: 0,
				Name: String,
				Description: String,
				Icon: String,
				Color: String
			},
			SendEmailReminder: False,
			SendSmsReminder: False,
			SendSmsConfirmation: False,
			SendEmailConfirmation: False,
			LastTimeToUnBook: "0001-01-01T00:00:00",
			CustomFields: 
			[
				{
					"Id": 0,
					"Name": "String",
					"Description": "String",
					"Width": 0,
					"DataType": "String",
					"DefaultValue": "String",
					"IsMandatory": false,
					"MandatoryErrorMessage": "String",
					"MaxLength": 0,
					"MultipleLineText": false,
					"RegEx": "String",
					"RegExErrorMessage": "String",
					"Values": 
					[
						{
							"Value": "String"
						}
					]
				}
			],
			CustomFieldValues: 
			[
				{
					Id: 0,
					Column: String,
					Name: String,
					Description: String,
					Value: String,
					DataType: String
				}
			],
			BookedResourceTypes: 
			[
				{
					Id: 0,
					Name: String,
					Resources: 
					[
						{
							Id: 0,
							Name: String,
							Color: String,
							Email: String,
							MobilePhone: String,
							AccessGroup: String,
							EmailNotification: False,
							SMSNotification: False,
							EmailReminder: False,
							SMSReminder: False
						}
					]
				}
			],
			Company: 
			{
				Name: String,
				Category: String,
				Street1: String,
				Street2: String,
				ZipCode: String,
				City: String,
				CountryId: String,
				Longitude: String,
				Latitude: String,
				Phone: String,
				Email: String,
				HomePage: String,
				SitePath: String,
				IsFavorite: False,
				PaymentProviderId: 0
			},
			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
			},
			Quantities: 
			[
				{
					Id: 0,
					Quantity: 0,
					Price: 0,
					PriceBeforeRebate: 0,
					CurrencyId: String,
					PriceSign: String,
					Category: String,
					VAT: 0,
					PriceText: String,
					OccupiesSpot: False
				}
			],
			Service: 
			{
				Id: 0,
				Name: String,
				Description: String,
				LengthInMinutes: 0,
				MaxNumberOfSpotsPerBooking: 0,
				GroupBooking: 
				{
					Active: False,
					Min: 0,
					Max: 0
				},
				MultipleResource: 
				{
					Active: False,
					Min: 0,
					Max: 0
				},
				IsGroupBooking: False,
				IsPaymentEnabled: False
			},
			PaymentExpiration: "0001-01-01T00:00:00",
			Log: 
			[
				{
					Id: 0,
					BookingId: 0,
					EventTypeId: 0,
					EventType: 
					{
						Id: 0,
						Name: String,
						Description: String
					},
					Comments: String,
					UserName: String
				}
			],
			PaymentLog: 
			[
				{
					Id: 0,
					BookingId: 0,
					PaymentReferenceId: String,
					OrderItemReferenceId: String,
					PaymentProviderId: 0,
					Amount: 0,
					VAT: 0,
					AmountCredited: 0,
					CurrencyId: String,
					CurrencyInfo: 
					{
						Id: String,
						Name: String,
						CurrencySign: String
					},
					Comments: String
				}
			],
			CheckoutLog: 
			[
				{
					BookingId: 0,
					PurchaseId: 0,
					ExpirationTime: "0001-01-01T00:00:00",
					Snippet: String,
					Status: String,
					Message: String
				}
			],
			ExternalReference: 
			[
				{
					ReferenceType: String,
					ExternalData: String,
					CreatedBy: String
				}
			],
			ResponseStatus: 
			{
				ErrorCode: String,
				Message: String,
				StackTrace: String,
				Errors: 
				[
					{
						ErrorCode: String,
						FieldName: String,
						Message: String,
						Meta: 
						{
							String: String
						}
					}
				],
				Meta: 
				{
					String: String
				}
			},
			CalendarExportStatus: 
			{
				CalendarId: String,
				BookingId: 0,
				Synced: False
			},
			LengthInMinutes: 0,
			BookedBy: String,
			BookedComments: String,
			UnbookedComments: String,
			CommentsToCustomer: String,
			UnbookedOn: "0001-01-01T00:00:00",
			CancellationCode: String,
			RatingCode: String
		}
	],
	Failed: 
	[
		{
			Reason: String,
			Quantities: 
			[
				{
					PriceId: 0,
					Quantity: 0,
					OccupiesSpot: False
				}
			]
		}
	],
	ResponseStatus: 
	{
		ErrorCode: String,
		Message: String,
		StackTrace: String,
		Errors: 
		[
			{
				ErrorCode: String,
				FieldName: String,
				Message: String,
				Meta: 
				{
					String: String
				}
			}
		],
		Meta: 
		{
			String: String
		}
	}
}