booker_api 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/lib/booker/booker.rb +5 -0
  3. data/lib/booker/business_client.rb +22 -0
  4. data/lib/booker/business_rest.rb +130 -0
  5. data/lib/booker/client.rb +212 -0
  6. data/lib/booker/common_rest.rb +49 -0
  7. data/lib/booker/config/booker_country_ids_to_iso_codes.yml +269 -0
  8. data/lib/booker/customer_client.rb +17 -0
  9. data/lib/booker/customer_rest.rb +169 -0
  10. data/lib/booker/errors.rb +24 -0
  11. data/lib/booker/generic_token_store.rb +25 -0
  12. data/lib/booker/helpers/active_support_helper.rb +102 -0
  13. data/lib/booker/helpers/logging_helper.rb +11 -0
  14. data/lib/booker/models/address.rb +12 -0
  15. data/lib/booker/models/appointment.rb +77 -0
  16. data/lib/booker/models/appointment_treatment.rb +51 -0
  17. data/lib/booker/models/available_time.rb +13 -0
  18. data/lib/booker/models/business_type.rb +5 -0
  19. data/lib/booker/models/category.rb +5 -0
  20. data/lib/booker/models/class_instance.rb +25 -0
  21. data/lib/booker/models/country.rb +19 -0
  22. data/lib/booker/models/current_price.rb +5 -0
  23. data/lib/booker/models/customer.rb +52 -0
  24. data/lib/booker/models/customer_2.rb +5 -0
  25. data/lib/booker/models/customer_record_type.rb +5 -0
  26. data/lib/booker/models/discount.rb +5 -0
  27. data/lib/booker/models/dynamic_price.rb +11 -0
  28. data/lib/booker/models/employee.rb +10 -0
  29. data/lib/booker/models/feature_settings.rb +7 -0
  30. data/lib/booker/models/final_total.rb +5 -0
  31. data/lib/booker/models/gender.rb +5 -0
  32. data/lib/booker/models/itinerary_time_slot.rb +7 -0
  33. data/lib/booker/models/itinerary_time_slots_list.rb +7 -0
  34. data/lib/booker/models/location.rb +23 -0
  35. data/lib/booker/models/location_day_schedule.rb +18 -0
  36. data/lib/booker/models/model.rb +150 -0
  37. data/lib/booker/models/multi_service_availability_result.rb +7 -0
  38. data/lib/booker/models/notification_settings.rb +12 -0
  39. data/lib/booker/models/online_booking_settings.rb +23 -0
  40. data/lib/booker/models/original_price.rb +5 -0
  41. data/lib/booker/models/payment_method.rb +5 -0
  42. data/lib/booker/models/preferred_staff_gender.rb +5 -0
  43. data/lib/booker/models/price.rb +8 -0
  44. data/lib/booker/models/receipt_display_price.rb +5 -0
  45. data/lib/booker/models/room.rb +12 -0
  46. data/lib/booker/models/shipping_address.rb +5 -0
  47. data/lib/booker/models/source.rb +5 -0
  48. data/lib/booker/models/spa.rb +5 -0
  49. data/lib/booker/models/spa_employee_availability_search_item.rb +11 -0
  50. data/lib/booker/models/status.rb +5 -0
  51. data/lib/booker/models/sub_category.rb +5 -0
  52. data/lib/booker/models/tag_price.rb +5 -0
  53. data/lib/booker/models/teacher.rb +5 -0
  54. data/lib/booker/models/teacher_2.rb +5 -0
  55. data/lib/booker/models/time_zone.rb +8 -0
  56. data/lib/booker/models/treatment.rb +19 -0
  57. data/lib/booker/models/treatment_time_slot.rb +5 -0
  58. data/lib/booker/models/type.rb +8 -0
  59. data/lib/booker/models/user.rb +73 -0
  60. data/lib/booker/version.rb +3 -0
  61. data/lib/booker_api.rb +97 -0
  62. metadata +216 -0
@@ -0,0 +1,17 @@
1
+ module Booker
2
+ class CustomerClient < Client
3
+ include Booker::CustomerREST
4
+
5
+ def initialize(options={})
6
+ super
7
+ self.token_store ||= GenericTokenStore
8
+ self.token_store_callback_method ||= :update_booker_access_token!
9
+ end
10
+
11
+ def env_base_url_key; 'BOOKER_CUSTOMER_SERVICE_URL'; end
12
+
13
+ def default_base_url; 'https://apicurrent-app.booker.ninja/webservice4/json/CustomerService.svc'; end
14
+
15
+ def access_token_options; super.merge!(grant_type: 'client_credentials'); end
16
+ end
17
+ end
@@ -0,0 +1,169 @@
1
+ module Booker
2
+ module CustomerREST
3
+ include CommonREST
4
+
5
+ def get_customer_appointments(customer_id, custom_access_token, options = {})
6
+ get "/customer/#{customer_id}/appointments", build_params(options, custom_access_token)
7
+ end
8
+
9
+ def create_appointment(booker_location_id, start_time, treatment_ids, incomplete_appoinment_id, customer, credit_card, coupon_code = nil, notes = nil, custom_access_token = {}, options: {})
10
+ post "/appointment/create", build_params({
11
+ "LocationID" => booker_location_id,
12
+ "ItineraryTimeSlotList" => [
13
+ "StartDateTime" => start_time,
14
+ "TreatmentTimeSlots" => treatment_ids.map { |id|
15
+ {
16
+ "StartDateTime" => start_time,
17
+ "TreatmentID" => id
18
+ }
19
+ }
20
+ ],
21
+ "AppointmentPayment" => {
22
+ "PaymentItem" => {
23
+ "CreditCard" => credit_card,
24
+ "Method" => {
25
+ "ID" => 1
26
+ }
27
+ },
28
+ "CouponCode" => coupon_code
29
+ },
30
+ "Notes" => notes,
31
+ "IncompleteAppointmentID" => incomplete_appoinment_id,
32
+ "Customer" => customer
33
+ }, custom_access_token.merge(options)), Booker::Models::Appointment
34
+ end
35
+
36
+ def create_incomplete_appointment(booker_location_id, start_time, treatment_ids, options = {})
37
+ post '/appointment/createincomplete', build_params({
38
+ 'LocationID' => booker_location_id,
39
+ 'ItineraryTimeSlot' => {
40
+ 'StartDateTime' => start_time,
41
+ 'TreatmentTimeSlots' => treatment_ids.map { |id| { 'StartDateTime' => start_time, 'TreatmentID' => id } }
42
+ }
43
+ }, options)
44
+ end
45
+
46
+ def create_class_appointment(booker_location_id, class_instance_id, customer, options = {})
47
+ post '/class_appointment/create', build_params({
48
+ 'LocationID' => booker_location_id,
49
+ 'ClassInstanceID' => class_instance_id,
50
+ 'Customer' => customer
51
+ }, options), Booker::Models::Appointment
52
+ end
53
+
54
+ def calculate_appointment_cost(booker_location_id, appointment_id, coupon_code, options = {})
55
+ post '/appointment/prebooking/totalcost', build_params({
56
+ 'LocationID' => booker_location_id,
57
+ 'AppointmentID' => appointment_id,
58
+ 'CouponCode' => coupon_code,
59
+ 'AppointmentDate' => DateTime.now,
60
+ 'AppointmentTreatmentDTOs' => []
61
+ }, options)
62
+ end
63
+
64
+ def run_multi_spa_multi_sub_category_availability(booker_location_ids, treatment_sub_category_ids, start_date_time, end_date_time, options = {})
65
+ post '/availability/multispamultisubcategory', build_params({
66
+ 'LocationIDs' => booker_location_ids,
67
+ 'TreatmentSubCategoryIDs' => treatment_sub_category_ids,
68
+ 'StartDateTime' => start_date_time,
69
+ 'EndDateTime' => end_date_time,
70
+ 'MaxTimesPerTreatment' => 1000
71
+ }, options), Booker::Models::SpaEmployeeAvailabilitySearchItem
72
+ end
73
+
74
+ def run_multi_service_availability(booker_location_id, treatment_ids, start_date_time, end_date_time, employee_id = nil, options = {})
75
+ treatment_ids = [treatment_ids] unless treatment_ids.respond_to?(:map)
76
+ post '/availability/multiservice', build_params(
77
+ {
78
+ 'LocationID' => booker_location_id,
79
+ 'StartDateTime' => start_date_time,
80
+ 'EndDateTime' => end_date_time,
81
+ 'MaxTimesPerDay' => 100,
82
+ 'Itineraries' => treatment_ids.map { |id| { 'Treatments' => [{ 'TreatmentID' => id, 'EmployeeID' => employee_id }] } }
83
+ }, options
84
+ ), Booker::Models::MultiServiceAvailabilityResult
85
+ end
86
+
87
+ def run_class_availability(booker_location_id, from_start_date_time, to_start_date_time, options = {})
88
+ post '/availability/class', build_params({
89
+ 'FromStartDateTime' => from_start_date_time,
90
+ 'LocationID' => booker_location_id,
91
+ 'OnlyIfAvailable' => true,
92
+ 'ToStartDateTime' => to_start_date_time,
93
+ 'ExcludeClosedDates' => true
94
+ }, options), Booker::Models::ClassInstance
95
+ end
96
+
97
+ def find_treatments(booker_location_id, category_id = nil)
98
+ post '/treatments', build_params({
99
+ 'LocationID' => booker_location_id,
100
+ 'CategoryID' => category_id
101
+ })
102
+ end
103
+
104
+ def get_treatment_categories(booker_location_id)
105
+ get '/treatment_categories', build_params({
106
+ 'location_id' => booker_location_id
107
+ })
108
+ end
109
+
110
+ def get_locations
111
+ post '/locations', build_params
112
+ end
113
+
114
+ def find_employees(booker_location_id)
115
+ post '/employees', build_params({
116
+ 'LocationID' => booker_location_id
117
+ })
118
+ end
119
+
120
+ def get_customer(customer_id, custom_access_token, options = {})
121
+ get "/customer/#{customer_id}", build_params(options, custom_access_token)
122
+ end
123
+
124
+ def create_customer(booker_location_id, customer_data, options: {})
125
+ post '/customer/account', build_params({
126
+ 'LocationID' => booker_location_id,
127
+ 'Email' => customer_data[:email],
128
+ 'Password' => customer_data[:password],
129
+ 'FirstName' => customer_data[:first_name],
130
+ 'LastName' => customer_data[:last_name],
131
+ 'HomePhone' => customer_data[:HomePhone],
132
+ 'CellPhone' => customer_data[:CellPhone],
133
+ 'AllowReceiveEmails' => customer_data[:AllowReceiveEmails],
134
+ 'AllowReceiveSMS' => customer_data[:AllowReceiveSMS]
135
+ }, options)
136
+ end
137
+
138
+ def update_customer(customer_id, customer_data, custom_access_token = {})
139
+ put "/customer/#{customer_id}", build_params(customer_data, custom_access_token)
140
+ end
141
+
142
+ def login(booker_location_id, email, password, options: {})
143
+ post '/customer/login', build_params({
144
+ 'LocationID' => booker_location_id,
145
+ 'Email' => email,
146
+ 'Password' => password
147
+ }, options.merge({
148
+ client_id: self.client_id,
149
+ client_secret: self.client_secret
150
+ }))
151
+ end
152
+
153
+ def forgot_password(booker_location_id, email, first_name, base_url, options: {})
154
+ post '/forgot_password/custom', build_params({
155
+ 'LocationID' => booker_location_id,
156
+ 'Email' => email,
157
+ 'Firstname' => first_name,
158
+ 'BaseUrlOfHost' => base_url
159
+ }, options)
160
+ end
161
+
162
+ def reset_password(key, password, options: {})
163
+ post '/password/reset', build_params({
164
+ 'Key' => key,
165
+ 'Password' => password
166
+ }, options)
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,24 @@
1
+ module Booker
2
+ class Error < StandardError
3
+ attr_accessor :error, :description, :url, :request, :response, :argument_errors
4
+
5
+ def initialize(url: nil, request: nil, response: nil)
6
+ if request.present?
7
+ self.request = request
8
+ end
9
+
10
+ if response.present?
11
+ self.response = response
12
+ error = response
13
+ error = response["Fault"]["Detail"]["InternalErrorFault"] if response["Fault"]
14
+ self.error = error['error'] || error['ErrorMessage']
15
+ self.description = error['error_description']
16
+ self.argument_errors = error["ArgumentErrors"].map { |a| { :attr => a["ArgumentName"], :message => a["ErrorMessage"] } } unless error["ArgumentErrors"].nil?
17
+ end
18
+
19
+ self.url = url
20
+ end
21
+ end
22
+
23
+ class InvalidApiCredentials < Error; end
24
+ end
@@ -0,0 +1,25 @@
1
+ module Booker
2
+ class GenericTokenStore
3
+ def self.temp_access_token
4
+ @temp_access_token
5
+ end
6
+
7
+ def self.temp_access_token=(token)
8
+ @temp_access_token = token
9
+ end
10
+
11
+ def self.temp_access_token_expires_at
12
+ @temp_access_token_expires_at
13
+ end
14
+
15
+ def self.temp_access_token_expires_at=(expires_at)
16
+ @temp_access_token_expires_at = expires_at
17
+ end
18
+
19
+ def self.update_booker_access_token!(token, expires_at)
20
+ self.temp_access_token = token
21
+ self.temp_access_token_expires_at = expires_at
22
+ true
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,102 @@
1
+ module Booker
2
+ module Helpers
3
+ module ActiveSupport
4
+ BOOKER_TO_ACTIVE_SUPPORT_TIMEZONE = {
5
+ '(GMT-12:00) International Date Line West' => 'International Date Line West',
6
+ '(GMT-11:00) Midway Island, Samoa' => 'Samoa',
7
+ '(GMT-10:00) Hawaii' => 'Hawaii',
8
+ '(GMT-09:00) Alaska' => 'Alaska',
9
+ '(GMT-08:00) Tijuana, Baja California' => 'Tijuana',
10
+ '(GMT-08:00) Pacific Time (US & Canada)' => 'Pacific Time (US & Canada)',
11
+ '(GMT-07:00) Chihuahua, La Paz, Mazatlan - New' => 'Chihuahua',
12
+ '(GMT-07:00) Arizona' => 'Arizona',
13
+ '(GMT-07:00) Mountain Time (US & Canada)' => 'Mountain Time (US & Canada)',
14
+ '(GMT-07:00) Chihuahua, La Paz, Mazatlan - Old' => 'Chihuahua',
15
+ '(GMT-06:00) Guadalajara, Mexico City, Monterrey - New' => 'Guadalajara',
16
+ '(GMT-06:00) Central Time (US & Canada)' => 'Central Time (US & Canada)',
17
+ '(GMT-06:00) Central America' => 'Central America',
18
+ '(GMT-06:00) Guadalajara, Mexico City, Monterrey - Old' => 'Guadalajara',
19
+ '(GMT-06:00) Saskatchewan' => 'Saskatchewan',
20
+ '(GMT-05:00) Bogota, Lima, Quito, Rio Branco' => 'Bogota',
21
+ '(GMT-05:00) Indiana (East)' => 'Indiana (East)',
22
+ '(GMT-05:00) Eastern Time (US & Canada)' => 'Eastern Time (US & Canada)',
23
+ '(GMT-04:00) Santiago' => 'Santiago',
24
+ '(GMT-04:00) Caracas, La Paz' => 'Caracas',
25
+ '(GMT-04:00) Atlantic Time (Canada)' => 'Atlantic Time (Canada)',
26
+ '(GMT-04:00) Manaus' => 'Atlantic Time (Canada)',
27
+ '(GMT-03:30) Newfoundland' => 'Newfoundland',
28
+ '(GMT-03:00) Brasilia' => 'Brasilia',
29
+ '(GMT-03:00) Greenland' => 'Greenland',
30
+ '(GMT-03:00) Montevideo' => 'Montevideo',
31
+ '(GMT-03:00) Buenos Aires, Georgetown' => 'Buenos Aires',
32
+ '(GMT-02:00) Mid-Atlantic' => 'Mid-Atlantic',
33
+ '(GMT-01:00) Cape Verde Is.' => 'Cape Verde Is.',
34
+ '(GMT-01:00) Azores' => 'Azores',
35
+ '(GMT) Casablanca, Monrovia, Reykjavik' => 'Casablanca',
36
+ '(GMT) Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London' => 'Dublin',
37
+ '(GMT+01:00) West Central Africa' => 'West Central Africa',
38
+ '(GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb' => 'Sarajevo',
39
+ '(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Amsterdam',
40
+ '(GMT+01:00) Brussels, Copenhagen, Madrid, Paris' => 'Brussels',
41
+ '(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague' => 'Belgrade',
42
+ '(GMT+02:00) Windhoek' => 'Harare',
43
+ '(GMT+02:00) Jerusalem' => 'Jerusalem',
44
+ '(GMT+02:00) Amman' => 'Jerusalem',
45
+ '(GMT+02:00) Beirut' => 'Jerusalem',
46
+ '(GMT+02:00) Harare, Pretoria' => 'Harare',
47
+ '(GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius' => 'Helsinki',
48
+ '(GMT+02:00) Cairo' => 'Cairo',
49
+ '(GMT+02:00) Minsk' => 'Minsk',
50
+ '(GMT+02:00) Athens, Bucharest, Istanbul' => 'Athens',
51
+ '(GMT+03:00) Moscow, St. Petersburg, Volgograd' => 'Moscow',
52
+ '(GMT+03:00) Nairobi' => 'Nairobi',
53
+ '(GMT+03:00) Kuwait, Riyadh' => 'Kuwait',
54
+ '(GMT+03:00) Tbilisi' => 'Tbilisi',
55
+ '(GMT+03:00) Baghdad' => 'Baghdad',
56
+ '(GMT+03:30) Tehran' => 'Tehran',
57
+ '(GMT+04:00) Caucasus Standard Time' => 'Yerevan',
58
+ '(GMT+04:00) Yerevan' => 'Yerevan',
59
+ '(GMT+04:00) Abu Dhabi, Muscat' => 'Abu Dhabi',
60
+ '(GMT+04:00) Baku' => 'Baku',
61
+ '(GMT+04:30) Kabul' => 'Kabul',
62
+ '(GMT+05:00) Ekaterinburg' => 'Ekaterinburg',
63
+ '(GMT+05:00) Islamabad, Karachi, Tashkent' => 'Islamabad',
64
+ '(GMT+05:30) Sri Jayawardenepura' => 'Sri Jayawardenepura',
65
+ '(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi' => 'Chennai',
66
+ '(GMT+05:45) Kathmandu' => 'Kathmandu',
67
+ '(GMT+06:00) Almaty, Novosibirsk' => 'Almaty',
68
+ '(GMT+06:00) Astana, Dhaka' => 'Astana',
69
+ '(GMT+06:30) Yangon (Rangoon)' => 'Rangoon',
70
+ '(GMT+07:00) Bangkok, Hanoi, Jakarta' => 'Bangkok',
71
+ '(GMT+07:00) Krasnoyarsk' => 'Krasnoyarsk',
72
+ '(GMT+08:00) Taipei' => 'Taipei',
73
+ '(GMT+08:00) Kuala Lumpur, Singapore' => 'Kuala Lumpur',
74
+ '(GMT+08:00) Irkutsk, Ulaan Bataar' => 'Irkutsk',
75
+ '(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi' => 'Beijing',
76
+ '(GMT+08:00) Perth' => 'Perth',
77
+ '(GMT+09:00) Osaka, Sapporo, Tokyo' => 'Osaka',
78
+ '(GMT+09:00) Seoul' => 'Seoul',
79
+ '(GMT+09:00) Yakutsk' => 'Yakutsk',
80
+ '(GMT+09:30) Darwin' => 'Darwin',
81
+ '(GMT+09:30) Adelaide' => 'Adelaide',
82
+ '(GMT+10:00) Hobart' => 'Hobart',
83
+ '(GMT+10:00) Brisbane' => 'Brisbane',
84
+ '(GMT+10:00) Vladivostok' => 'Vladivostok',
85
+ '(GMT+10:00) Guam, Port Moresby' => 'Guam',
86
+ '(GMT+10:00) Canberra, Melbourne, Sydney' => 'Canberra',
87
+ '(GMT+11:00) Magadan, Solomon Is., New Caledonia' => 'Magadan',
88
+ '(GMT+12:00) Fiji, Kamchatka, Marshall Is.' => 'Fiji',
89
+ '(GMT+12:00) Auckland, Wellington' => 'Auckland',
90
+ "(GMT+13:00) Nuku'alofa" => "Nuku'alofa"
91
+ }.freeze
92
+
93
+ def self.to_active_support(booker_timezone_name)
94
+ BOOKER_TO_ACTIVE_SUPPORT_TIMEZONE[booker_timezone_name]
95
+ end
96
+
97
+ def self.booker_timezone_names
98
+ BOOKER_TO_ACTIVE_SUPPORT_TIMEZONE.keys
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,11 @@
1
+ module Booker
2
+ module Helpers
3
+ module LoggingHelper
4
+ def self.log_issue(message, extra_info = {})
5
+ if (log_message_block = Booker.config[:log_message])
6
+ log_message_block.call(message, extra_info)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Booker
2
+ module Models
3
+ class Address < Model
4
+ attr_accessor 'Street1',
5
+ 'Street2',
6
+ 'City',
7
+ 'State',
8
+ 'Zip',
9
+ 'Country'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,77 @@
1
+ module Booker
2
+ module Models
3
+ class Appointment < Model
4
+ attr_accessor 'BookingNumber',
5
+ 'Confirmable',
6
+ 'EndDateTime',
7
+ 'FinalTotal',
8
+ 'ID',
9
+ 'IsCancelled',
10
+ 'IsNoShow',
11
+ 'LocationID',
12
+ 'StartDateTime',
13
+ 'Status',
14
+ 'CanTakePayment',
15
+ 'DateCreated',
16
+ 'BelongsToEnrollment',
17
+ 'Address',
18
+ 'AddressID',
19
+ 'AllowAutoPay',
20
+ 'AppointmentTreatments',
21
+ 'BelongsToGroup',
22
+ 'BelongsToGroupAndGroupOrder',
23
+ 'BelongsToOrder',
24
+ 'CanCancel',
25
+ 'CanCheckin',
26
+ 'CanHaveCustomer2',
27
+ 'CanRevertNoShow',
28
+ 'CanUndoCheckin',
29
+ 'CancellationID',
30
+ 'Customer',
31
+ 'Customer2',
32
+ 'Customer2ID',
33
+ 'CustomerID',
34
+ 'CustomerLastName',
35
+ 'CustomerMobilePhone',
36
+ 'CustomerWorkPhone',
37
+ 'DateBooked',
38
+ 'DateNoShow',
39
+ 'Employee',
40
+ 'EmployeeFirstName',
41
+ 'EmployeeLastName',
42
+ 'GroupID',
43
+ 'GroupName',
44
+ 'GroupNumber',
45
+ 'GroupTypeID',
46
+ 'IsCancelledOrNoShow',
47
+ 'IsCheckedInInService',
48
+ 'IsPartOfClassPackageBooking',
49
+ 'IsPreBookedAtPastCheckout',
50
+ 'IsRecurring',
51
+ 'IsWebBooking',
52
+ 'Notes',
53
+ 'OrderID',
54
+ 'OrderStatusID',
55
+ 'PackageID',
56
+ 'PaymentID',
57
+ 'PaymentItemID',
58
+ 'PrimaryAppointmentTreatmentID',
59
+ 'RecurrenceID',
60
+ 'Room',
61
+ 'Source',
62
+ 'Treatment',
63
+ 'TreatmentName',
64
+ 'Type',
65
+ 'IsHeld',
66
+ 'HoldForMinutes',
67
+ 'HeldSince',
68
+ 'IsServiceComplete',
69
+ 'IsCheckout',
70
+ 'DateCheckIn',
71
+ 'IsFromWaitList',
72
+ 'IsFromClassWaitList',
73
+ 'CustomerRecordTypeID',
74
+ 'CustomerParentID'
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,51 @@
1
+ module Booker
2
+ module Models
3
+ class AppointmentTreatment < Model
4
+ attr_accessor 'AppointmentID',
5
+ 'DynamicPrice',
6
+ 'EndDateTime',
7
+ 'ID',
8
+ 'StartDateTime',
9
+ 'ChildID',
10
+ 'ChildName',
11
+ 'AllowChangeStartTime',
12
+ 'DynamicPriceID',
13
+ 'Employee',
14
+ 'Employee2FullName',
15
+ 'Employee2ID',
16
+ 'EmployeeFirstName',
17
+ 'EmployeeFullName',
18
+ 'EmployeeID',
19
+ 'EmployeeLastName',
20
+ 'EmployeeRecoveryDuration',
21
+ 'EmployeeTypeID',
22
+ 'EmployeeWasRequested',
23
+ 'FinishStartDateTime',
24
+ 'FinishTimeAppliedToEmployee',
25
+ 'FinishTimeAppliedToRoom',
26
+ 'FinishTimeDuration',
27
+ 'FinishTimeOriginalDuration',
28
+ 'ProcessingStartDateTime',
29
+ 'ProcessingTimeAppliedToRoom',
30
+ 'ProcessingTimeAppliedToEmployee',
31
+ 'ProcessingTimeDuration',
32
+ 'ProcessingTimeOriginalDuration',
33
+ 'RequiresProcessingTime',
34
+ 'Room',
35
+ 'RoomID',
36
+ 'RoomName',
37
+ 'RoomRecoveryDuration',
38
+ 'StartTimeDuration',
39
+ 'StartTimeOriginalDuration',
40
+ 'TagPrice',
41
+ 'Treatment',
42
+ 'TreatmentDuration',
43
+ 'TreatmentID',
44
+ 'TreatmentIsForCouples',
45
+ 'TreatmentName',
46
+ 'ClassInstanceID',
47
+ 'IsDurationOverridden'
48
+ end
49
+ end
50
+ end
51
+