""" Options: Date: 2024-06-26 19:07:04 Version: 8.23 Tip: To override a DTO option, remove "#" prefix before updating BaseUrl: https://testapi.bokamera.se #GlobalNamespace: #AddServiceStackTypes: True #AddResponseStatus: False #AddImplicitVersion: #AddDescriptionAsComments: True IncludeTypes: AddResourceTypeToService.* #ExcludeTypes: #DefaultImports: datetime,decimal,marshmallow.fields:*,servicestack:*,typing:*,dataclasses:dataclass/field,dataclasses_json:dataclass_json/LetterCase/Undefined/config,enum:Enum/IntEnum #DataClass: #DataClassJson: """ import datetime import decimal from marshmallow.fields import * from servicestack import * from typing import * from dataclasses import dataclass, field from dataclasses_json import dataclass_json, LetterCase, Undefined, config from enum import Enum, IntEnum class ICompany: company_id: Optional[str] = None class BookingStatusEnum(IntEnum): BOOKED = 1 UNBOOKED = 2 RESERVED = 3 CANCELED = 4 AWAITING_PAYMENT = 5 AWAITING_PAYMENT_NO_TIME_LIMIT = 6 PAYED = 7 AWAITING_PAYMENT_REQUEST_FROM_ADMIN = 8 AWAITING_PAYMENT_FROM_PROVIDER = 9 INVOICED = 10 class IInterval: from_: datetime.datetime = field(metadata=config(field_name='from'), default=datetime.datetime(1, 1, 1)) to: datetime.datetime = datetime.datetime(1, 1, 1) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BaseModel: pass @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomFieldValue(BaseModel): # @Required() company_id: Optional[str] = None id: int = 0 # @Required() value: Optional[str] = None # @Required() active: bool = False sort_order: Optional[int] = None modified_date: Optional[datetime.datetime] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomField(BaseModel): # @Required() table: Optional[str] = None # @Required() column: Optional[str] = None # @Required() data_type: Optional[str] = None # @Required() description: Optional[str] = None # @Required() active: bool = False modified_date: Optional[datetime.datetime] = None id: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class RegEx(BaseModel): # @Required() name: Optional[str] = None # @Required() description: Optional[str] = None # @Required() reg_ex_code: Optional[str] = None error_message: Optional[str] = None modified_date: Optional[datetime.datetime] = None id: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomFieldServiceRelation(BaseModel): # @Required() company_id: Optional[str] = None id: int = 0 # @Required() custom_field_config_id: int = 0 # @Required() service_id: int = 0 modified_date: Optional[datetime.datetime] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomFieldConfig(BaseModel): # @Ignore() values: Optional[List[CustomFieldValue]] = None custom_field: Optional[CustomField] = None # @Ignore() reg_ex: Optional[RegEx] = None # @Ignore() services: Optional[List[Service]] = None custom_field_service_relation: Optional[List[CustomFieldServiceRelation]] = None # @Required() company_id: Optional[str] = None id: int = 0 group_id: Optional[int] = None # @Required() field_id: int = 0 # @Required() icon_id: int = 0 reg_ex_id: Optional[int] = None # @Required() name: Optional[str] = None # @Required() description: Optional[str] = None # @Required() datatype: Optional[str] = None # @Required() max_length: int = 0 # @Required() is_public: bool = False # @Required() is_hidden: bool = False # @Required() is_mandatory: bool = False default_value: Optional[str] = None reg_ex_error_message: Optional[str] = None mandatory_error_message: Optional[str] = None width: Optional[int] = None # @Required() multiple_line_text: bool = False modified_date: Optional[datetime.datetime] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class RatingReviewResponse: # @ApiMember(Description="The title for the review") title: Optional[str] = None """ The title for the review """ # @ApiMember(Description="The description for the review") description: Optional[str] = None """ The description for the review """ # @ApiMember(Description="The rating score") rating_score: int = 0 """ The rating score """ # @ApiMember(Description="The review author") author: Optional[str] = None """ The review author """ # @ApiMember(Description="The created date") created: datetime.datetime = datetime.datetime(1, 1, 1) """ The created date """ # @ApiMember(Description="The review answer from the company") review_answer: Optional[str] = None """ The review answer from the company """ class ITimeException(IInterval): id: int = 0 reason_text: Optional[str] = None is_block: bool = False reason_text_public: Optional[str] = None is_recurring: bool = False resource_ids: Optional[List[int]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BookedCustomer: id: Optional[str] = None firstname: Optional[str] = None lastname: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None facebook_user_name: Optional[str] = None image_url: Optional[str] = None corporate_identity_number: Optional[str] = None invoice_address1: Optional[str] = None invoice_address2: Optional[str] = None invoice_city: Optional[str] = None invoice_postal_code: Optional[str] = None invoice_country_code: Optional[str] = None class IBookedTime(IInterval): id: int = 0 service_id: int = 0 booked_spots: int = 0 total_spots: int = 0 pause_after_in_minutes: int = 0 status: Optional[BookingStatusEnum] = None status_id: int = 0 customer: Optional[BookedCustomer] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomFieldDataResponse: id: int = 0 column: Optional[str] = None name: Optional[str] = None description: Optional[str] = None value: Optional[str] = None # @ApiMember(Description="Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox'") data_type: Optional[str] = None """ Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox' """ @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class Resource(BaseModel, ICustomFieldTable, IBaseModelCreated, IBaseModelUpdated): # @Ignore() priority: int = 0 # @Ignore() schedules: Optional[IList[ISchedule]] = None # @Ignore() exceptions: Optional[IList[ITimeException]] = None # @Ignore() bookings: Optional[IList[IBookedTime]] = None # @Ignore() custom_fields_config: Optional[IList[CustomFieldConfig]] = None # @Ignore() custom_fields_data: Optional[IList[CustomFieldDataResponse]] = None # @Required() company_id: Optional[str] = None id: int = 0 # @Required() name: Optional[str] = None # @Required() active: bool = False description: Optional[str] = None image_url: Optional[str] = None # @Required() updated_date: datetime.datetime = datetime.datetime(1, 1, 1) # @Required() created_date: datetime.datetime = datetime.datetime(1, 1, 1) # @Required() color: Optional[str] = None email: Optional[str] = None mobile_phone: Optional[str] = None email_notification: Optional[bool] = None sms_notification: Optional[bool] = None # @Required() send_s_m_s_reminder: bool = False # @Required() send_email_reminder: bool = False modified_date: Optional[datetime.datetime] = None access_group: Optional[str] = None text_field1: Optional[str] = None text_field2: Optional[str] = None text_field3: Optional[str] = None text_field4: Optional[str] = None text_field5: Optional[str] = None text_field6: Optional[str] = None text_field7: Optional[str] = None text_field8: Optional[str] = None text_field9: Optional[str] = None text_field10: Optional[str] = None text_field11: Optional[str] = None text_field12: Optional[str] = None text_field13: Optional[str] = None text_field14: Optional[str] = None text_field15: Optional[str] = None text_field16: Optional[str] = None text_field17: Optional[str] = None text_field18: Optional[str] = None text_field19: Optional[str] = None text_field20: Optional[str] = None class ScheduleType(str, Enum): NOT_DEFINED = 'NotDefined' RECURRING_SCHEDULE = 'RecurringSchedule' DATE_SCHEDULE = 'DateSchedule' class ISchedule: resources: Optional[IList[Resource]] = None type: Optional[ScheduleType] = None active: bool = False is_resource_specific: bool = False @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class GroupBookingSettings: active: bool = False min: int = 0 max: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class MultipleResourceSettings: active: bool = False min: int = 0 max: int = 0 @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class AddResourceTypeService(ICompany): # @ApiMember(Description="The company id, if empty will use the company id for the user you are logged in with.") company_id: Optional[str] = None """ The company id, if empty will use the company id for the user you are logged in with. """ # @ApiMember(Description="The resourcetype id") id: int = 0 """ The resourcetype id """ # @ApiMember(Description="If the resources within the resourcetype should be selectable by customer when creating a booking") selectable_by_user: bool = False """ If the resources within the resourcetype should be selectable by customer when creating a booking """ @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomFieldValueResponse: value: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CustomFieldConfigData: # @ApiMember(Description="Custom field id") id: int = 0 """ Custom field id """ # @ApiMember(Description="Configuration name. Example: 'Number of persons'.") name: Optional[str] = None """ Configuration name. Example: 'Number of persons'. """ # @ApiMember(Description="Custom field description. Example: 'For how many persons is this booking?'") description: Optional[str] = None """ Custom field description. Example: 'For how many persons is this booking?' """ # @ApiMember(Description="Field width. Example: 20 for 20px") width: Optional[int] = None """ Field width. Example: 20 for 20px """ # @ApiMember(Description="Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox'") data_type: Optional[str] = None """ Data field of custom field. Valid values are: TextBox, ... Example: 'TextBox' """ # @ApiMember(Description="Default value of the field. Example: '3'") default_value: Optional[str] = None """ Default value of the field. Example: '3' """ # @ApiMember(Description="Determines if the field is required to have a value or not") is_mandatory: bool = False """ Determines if the field is required to have a value or not """ # @ApiMember(Description="Error message shown to the user if the field data is required but not entered") mandatory_error_message: Optional[str] = None """ Error message shown to the user if the field data is required but not entered """ # @ApiMember(Description="Max lenght of the field") max_length: int = 0 """ Max lenght of the field """ # @ApiMember(Description="If the field should have multiple lines") multiple_line_text: bool = False """ If the field should have multiple lines """ # @ApiMember(Description="Regular expression used for validation of the field") reg_ex: Optional[str] = None """ Regular expression used for validation of the field """ # @ApiMember(Description="Error message shown if the regular expression validation failed") reg_ex_error_message: Optional[str] = None """ Error message shown if the regular expression validation failed """ # @ApiMember(Description="The values to select from if Datatype is DropDown for this custom field") values: Optional[List[CustomFieldValueResponse]] = None """ The values to select from if Datatype is DropDown for this custom field """ @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CompanyRatingSummary: # @ApiMember(Description="The average rating score") average_score: float = 0.0 """ The average rating score """ # @ApiMember(Description="The number of ratings of score 1") rating_score1_count: int = 0 """ The number of ratings of score 1 """ # @ApiMember(Description="The number of ratings of score 2") rating_score2_count: int = 0 """ The number of ratings of score 2 """ # @ApiMember(Description="The number of ratings of score 3") rating_score3_count: int = 0 """ The number of ratings of score 3 """ # @ApiMember(Description="The number of ratings of score 4") raing_score4_count: int = 0 """ The number of ratings of score 4 """ # @ApiMember(Description="The number of ratings of score 5") rating_score5_count: int = 0 """ The number of ratings of score 5 """ # @ApiMember(Description="The number of ratings") count: int = 0 """ The number of ratings """ @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class BookingStatusOptionsResponse: id: int = 0 name: Optional[str] = None description: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class ServiceSchedules: schedule_type: Optional[ScheduleType] = None recurring_schedules: Optional[List[ISchedule]] = None date_schedules: Optional[List[ISchedule]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class ServiceResourceTypeResource: # @ApiMember(Description="The resource id") id: int = 0 """ The resource id """ # @ApiMember(Description="The resource name") name: Optional[str] = None """ The resource name """ # @ApiMember(Description="The resource description") description: Optional[str] = None """ The resource description """ # @ApiMember(Description="The resource email") email: Optional[str] = None """ The resource email """ # @ApiMember(Description="The resource phone") phone: Optional[str] = None """ The resource phone """ # @ApiMember(Description="The resource color") color: Optional[str] = None """ The resource color """ # @ApiMember(Description="The resource image") image_url: Optional[str] = None """ The resource image """ # @ApiMember(Description="The priority of the resource") priority: int = 0 """ The priority of the resource """ # @ApiMember(Description="If the resource want to receive email notifications") email_notification: bool = False """ If the resource want to receive email notifications """ # @ApiMember(Description="If the resource want to receive sms notifications") sms_notification: bool = False """ If the resource want to receive sms notifications """ # @ApiMember(Description="If the resource want to receive email reminders") email_reminder: bool = False """ If the resource want to receive email reminders """ # @ApiMember(Description="If the resource want to receive sms reminders") sms_reminder: bool = False """ If the resource want to receive sms reminders """ @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class ServiceResourceTypeResponse: # @ApiMember(Description="The resourcetype id") id: int = 0 """ The resourcetype id """ # @ApiMember(Description="The resourcetype is selectable by customer") selectable_by_user: bool = False """ The resourcetype is selectable by customer """ # @ApiMember(Description="The resourcetype name") name: Optional[str] = None """ The resourcetype name """ # @ApiMember(Description="The resourcetype description") description: Optional[str] = None """ The resourcetype description """ # @ApiMember(Description="The resources in the resourcetype. Only shows active resources if not admin.") resources: Optional[List[ServiceResourceTypeResource]] = None """ The resources in the resourcetype. Only shows active resources if not admin. """ class ICustomFieldTable: custom_fields_config: Optional[IList[CustomFieldConfig]] = None custom_fields_data: Optional[IList[CustomFieldDataResponse]] = None text_field1: Optional[str] = None text_field2: Optional[str] = None text_field3: Optional[str] = None text_field4: Optional[str] = None text_field5: Optional[str] = None text_field6: Optional[str] = None text_field7: Optional[str] = None text_field8: Optional[str] = None text_field9: Optional[str] = None text_field10: Optional[str] = None text_field11: Optional[str] = None text_field12: Optional[str] = None text_field13: Optional[str] = None text_field14: Optional[str] = None text_field15: Optional[str] = None text_field16: Optional[str] = None text_field17: Optional[str] = None text_field18: Optional[str] = None text_field19: Optional[str] = None text_field20: Optional[str] = None class IBaseModelUpdated: updated_date: datetime.datetime = datetime.datetime(1, 1, 1) class IBaseModelCreated: created_date: datetime.datetime = datetime.datetime(1, 1, 1) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class ServicePriceResponse: # @ApiMember(Description="The company id") company_id: Optional[str] = None """ The company id """ # @ApiMember(Description="The price id") id: int = 0 """ The price id """ # @ApiMember(Description="The service id") service_id: int = 0 """ The service id """ # @ApiMember(Description="The price") price: float = 0.0 """ The price """ # @ApiMember(Description="The price calculation type id, 1 = Normal, price is for the service total duration, 2 = Price is per minute, 3 = Price is per hour, 4= Price is per day") calculation_type_id: int = 0 """ The price calculation type id, 1 = Normal, price is for the service total duration, 2 = Price is per minute, 3 = Price is per hour, 4= Price is per day """ # @ApiMember(Description="The price currency") currency_id: Optional[str] = None """ The price currency """ # @ApiMember(Description="The price sign") price_sign: Optional[str] = None """ The price sign """ # @ApiMember(Description="The price VAT in percent") vat: Decimal = decimal.Decimal(0) """ The price VAT in percent """ # @ApiMember(Description="The price category if price has a category") category: Optional[str] = None """ The price category if price has a category """ # @ApiMember(Description="The price text to display") price_text: Optional[str] = None """ The price text to display """ # @ApiMember(Description="The valid from date for the price.") from_: datetime.datetime = field(metadata=config(field_name='from'), default=datetime.datetime(1, 1, 1)) """ The valid from date for the price. """ # @ApiMember(Description="The valid to date for the price.") to: datetime.datetime = datetime.datetime(1, 1, 1) """ The valid to date for the price. """ # @ApiMember(Description="If the price is only valid for specific days in week add a comma separated list of which days this day price belongs to, 1 = Monday .. 7 = Sunday. All old days connected will be removed on update.") days_of_week: Optional[List[DayOfWeekDto]] = None """ If the price is only valid for specific days in week add a comma separated list of which days this day price belongs to, 1 = Monday .. 7 = Sunday. All old days connected will be removed on update. """ # @ApiMember(Description="If the price is only valid for specific days in week add a comma separated list of which days this day price belongs to, 1 = Monday .. 7 = Sunday. All old days connected will be removed on update.") from_time: Optional[datetime.timedelta] = None """ If the price is only valid for specific days in week add a comma separated list of which days this day price belongs to, 1 = Monday .. 7 = Sunday. All old days connected will be removed on update. """ # @ApiMember(Description="If the price is only valid for a specific time span during a time of day enter the FromTime and ToTime parameters.") to_time: Optional[datetime.timedelta] = None """ If the price is only valid for a specific time span during a time of day enter the FromTime and ToTime parameters. """ service: Optional[ServiceInfoResponse] = None # @ApiMember(Description="If the price is only valid for a specific time span") is_time_specific: bool = False """ If the price is only valid for a specific time span """ # @ApiMember(Description="If the price is only valid for specific days of week") is_days_of_week_specific: bool = False """ If the price is only valid for specific days of week """ # @ApiMember(Description="If the price is Weighted") is_weighted: bool = False """ If the price is Weighted """ @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class ServiceQueryResponse: id: int = 0 name: Optional[str] = None description: Optional[str] = None image_url: Optional[str] = None total_spots: int = 0 # @ApiMember(Description="If this setting is turned on the remaining spots (if Totalspots > 1) is locked from be booked by another customer.") lock_spots_to_booking: Optional[bool] = None """ If this setting is turned on the remaining spots (if Totalspots > 1) is locked from be booked by another customer. """ max_number_of_spots_per_booking: int = 0 min_number_of_resources_to_book: int = 0 max_number_of_resources_to_book: int = 0 unbook_before_days: int = 0 unbook_before_hours: int = 0 unbook_before_minutes: int = 0 # @ApiMember(Description="What type of schedule is connected to the service. RecurringSchedule = 1, DateSchedule = 2") schedule_type: Optional[ScheduleType] = None """ What type of schedule is connected to the service. RecurringSchedule = 1, DateSchedule = 2 """ # @ApiMember(Description="What type of schedule is connected to the service. RecurringSchedule = 1, DateSchedule = 2") schedule_type_id: int = 0 """ What type of schedule is connected to the service. RecurringSchedule = 1, DateSchedule = 2 """ book_before_days: int = 0 book_before_hours: int = 0 book_before_minutes: int = 0 group: Optional[str] = None enable_booking_queue: bool = False enable_code_lock_sync: bool = False enable_customer_manual_payment: bool = False sort_order: int = 0 active: bool = False is_group_booking: bool = False group_booking: Optional[GroupBookingSettings] = None multiple_resource: Optional[MultipleResourceSettings] = None is_payment_enabled: bool = False # @ApiMember(Description="Maximum numbers of minutes the booking payment must be completed before automatically unbooked") max_payment_time: int = 0 """ Maximum numbers of minutes the booking payment must be completed before automatically unbooked """ # @ApiMember(Description="If the booking should be either 1 = Booked) or 3 = Reserved. Default is 1 = Booked.") booking_status_id: int = 0 """ If the booking should be either 1 = Booked) or 3 = Reserved. Default is 1 = Booked. """ only_visible_by_admin: bool = False length_in_minutes: Optional[int] = None duration_type_id: int = 0 duration: Optional[int] = None min_duration: Optional[int] = None max_duration: Optional[int] = None duration_interval: Optional[int] = None pause_after_booking: int = 0 custom_fields: Optional[List[CustomFieldConfigData]] = None custom_field_values: Optional[List[CustomFieldDataResponse]] = None booking_custom_fields: Optional[List[CustomFieldConfigData]] = None customer_custom_fields: Optional[List[CustomFieldConfigData]] = None # @ApiMember(Description="The booking status options to choose from") booking_status_options: Optional[List[BookingStatusOptionsResponse]] = None """ The booking status options to choose from """ prices: Optional[List[ServicePriceResponse]] = None schedules: Optional[ServiceSchedules] = None rating_summary: Optional[CompanyRatingSummary] = None reviews: Optional[List[RatingReviewResponse]] = None resource_types: Optional[List[ServiceResourceTypeResponse]] = None response_status: Optional[ResponseStatus] = None price_view_type_id: Optional[int] = None # @Route("/services/{Id}/addresourcetype", "POST") # @ValidateRequest(Validator="IsAuthenticated") @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class AddResourceTypeToService(IReturn[ServiceQueryResponse]): # @ApiMember(Description="The company id", IsRequired=true) company_id: Optional[str] = None """ The company id """ # @ApiMember(Description="The service id", IsRequired=true, ParameterType="path") id: int = 0 """ The service id """ # @ApiMember(Description="The ResourceType(s) to be added") resource_types: Optional[List[AddResourceTypeService]] = None """ The ResourceType(s) to be added """