booker_ruby 1.14.0 → 2.0.0

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/lib/booker/client.rb +154 -49
  3. data/lib/booker/errors.rb +6 -2
  4. data/lib/booker/model.rb +84 -0
  5. data/lib/booker/v4.1/availability.rb +21 -0
  6. data/lib/booker/v4.1/booking.rb +87 -0
  7. data/lib/booker/v4.1/merchant.rb +55 -0
  8. data/lib/booker/v4/business_client.rb +9 -0
  9. data/lib/booker/v4/business_rest.rb +88 -0
  10. data/lib/booker/v4/common_rest.rb +21 -0
  11. data/lib/booker/v4/customer_client.rb +15 -0
  12. data/lib/booker/v4/customer_rest.rb +15 -0
  13. data/lib/booker/v4/models/address.rb +14 -0
  14. data/lib/booker/v4/models/appointment.rb +79 -0
  15. data/lib/booker/v4/models/appointment_treatment.rb +53 -0
  16. data/lib/booker/v4/models/available_time.rb +15 -0
  17. data/lib/booker/v4/models/business_type.rb +7 -0
  18. data/lib/booker/v4/models/category.rb +7 -0
  19. data/lib/booker/v4/models/class_instance.rb +27 -0
  20. data/lib/booker/v4/models/country.rb +21 -0
  21. data/lib/booker/v4/models/current_price.rb +7 -0
  22. data/lib/booker/v4/models/customer.rb +54 -0
  23. data/lib/booker/v4/models/customer_2.rb +7 -0
  24. data/lib/booker/v4/models/customer_record_type.rb +7 -0
  25. data/lib/booker/v4/models/discount.rb +7 -0
  26. data/lib/booker/v4/models/dynamic_price.rb +13 -0
  27. data/lib/booker/v4/models/employee.rb +12 -0
  28. data/lib/booker/v4/models/feature_settings.rb +9 -0
  29. data/lib/booker/v4/models/final_total.rb +7 -0
  30. data/lib/booker/v4/models/gender.rb +7 -0
  31. data/lib/booker/v4/models/itinerary_time_slot.rb +9 -0
  32. data/lib/booker/v4/models/itinerary_time_slots_list.rb +9 -0
  33. data/lib/booker/v4/models/location.rb +40 -0
  34. data/lib/booker/v4/models/location_day_schedule.rb +20 -0
  35. data/lib/booker/v4/models/model.rb +78 -0
  36. data/lib/booker/v4/models/multi_service_availability_result.rb +9 -0
  37. data/lib/booker/v4/models/notification_settings.rb +14 -0
  38. data/lib/booker/v4/models/online_booking_settings.rb +25 -0
  39. data/lib/booker/v4/models/original_price.rb +7 -0
  40. data/lib/booker/v4/models/payment_method.rb +7 -0
  41. data/lib/booker/v4/models/preferred_staff_gender.rb +7 -0
  42. data/lib/booker/v4/models/price.rb +10 -0
  43. data/lib/booker/v4/models/receipt_display_price.rb +7 -0
  44. data/lib/booker/v4/models/room.rb +14 -0
  45. data/lib/booker/v4/models/shipping_address.rb +7 -0
  46. data/lib/booker/v4/models/source.rb +7 -0
  47. data/lib/booker/v4/models/spa.rb +7 -0
  48. data/lib/booker/v4/models/spa_employee_availability_search_item.rb +13 -0
  49. data/lib/booker/v4/models/status.rb +7 -0
  50. data/lib/booker/v4/models/sub_category.rb +7 -0
  51. data/lib/booker/v4/models/tag_price.rb +7 -0
  52. data/lib/booker/v4/models/teacher.rb +7 -0
  53. data/lib/booker/v4/models/teacher_2.rb +7 -0
  54. data/lib/booker/v4/models/time_zone.rb +10 -0
  55. data/lib/booker/v4/models/treatment.rb +21 -0
  56. data/lib/booker/v4/models/treatment_time_slot.rb +7 -0
  57. data/lib/booker/v4/models/type.rb +10 -0
  58. data/lib/booker/v4/models/user.rb +75 -0
  59. data/lib/booker/v4/request_helper.rb +33 -0
  60. data/lib/booker/v5/availability.rb +45 -0
  61. data/lib/booker/v5/models/availability.rb +18 -0
  62. data/lib/booker/v5/models/availability_result.rb +12 -0
  63. data/lib/booker/v5/models/location_hour.rb +16 -0
  64. data/lib/booker/v5/models/model.rb +9 -0
  65. data/lib/booker/v5/models/service.rb +13 -0
  66. data/lib/booker/v5/models/service_category.rb +11 -0
  67. data/lib/booker/version.rb +1 -1
  68. data/lib/booker_ruby.rb +70 -52
  69. metadata +80 -54
  70. data/lib/booker/business_client.rb +0 -22
  71. data/lib/booker/business_rest.rb +0 -112
  72. data/lib/booker/common_rest.rb +0 -43
  73. data/lib/booker/customer_client.rb +0 -17
  74. data/lib/booker/customer_rest.rb +0 -53
  75. data/lib/booker/models/address.rb +0 -12
  76. data/lib/booker/models/appointment.rb +0 -77
  77. data/lib/booker/models/appointment_treatment.rb +0 -51
  78. data/lib/booker/models/available_time.rb +0 -13
  79. data/lib/booker/models/business_type.rb +0 -5
  80. data/lib/booker/models/category.rb +0 -5
  81. data/lib/booker/models/class_instance.rb +0 -25
  82. data/lib/booker/models/country.rb +0 -19
  83. data/lib/booker/models/current_price.rb +0 -5
  84. data/lib/booker/models/customer.rb +0 -52
  85. data/lib/booker/models/customer_2.rb +0 -5
  86. data/lib/booker/models/customer_record_type.rb +0 -5
  87. data/lib/booker/models/discount.rb +0 -5
  88. data/lib/booker/models/dynamic_price.rb +0 -11
  89. data/lib/booker/models/employee.rb +0 -10
  90. data/lib/booker/models/feature_settings.rb +0 -7
  91. data/lib/booker/models/final_total.rb +0 -5
  92. data/lib/booker/models/gender.rb +0 -5
  93. data/lib/booker/models/itinerary_time_slot.rb +0 -7
  94. data/lib/booker/models/itinerary_time_slots_list.rb +0 -7
  95. data/lib/booker/models/location.rb +0 -38
  96. data/lib/booker/models/location_day_schedule.rb +0 -18
  97. data/lib/booker/models/model.rb +0 -150
  98. data/lib/booker/models/multi_service_availability_result.rb +0 -7
  99. data/lib/booker/models/notification_settings.rb +0 -12
  100. data/lib/booker/models/online_booking_settings.rb +0 -23
  101. data/lib/booker/models/original_price.rb +0 -5
  102. data/lib/booker/models/payment_method.rb +0 -5
  103. data/lib/booker/models/preferred_staff_gender.rb +0 -5
  104. data/lib/booker/models/price.rb +0 -8
  105. data/lib/booker/models/receipt_display_price.rb +0 -5
  106. data/lib/booker/models/room.rb +0 -12
  107. data/lib/booker/models/shipping_address.rb +0 -5
  108. data/lib/booker/models/source.rb +0 -5
  109. data/lib/booker/models/spa.rb +0 -5
  110. data/lib/booker/models/spa_employee_availability_search_item.rb +0 -11
  111. data/lib/booker/models/status.rb +0 -5
  112. data/lib/booker/models/sub_category.rb +0 -5
  113. data/lib/booker/models/tag_price.rb +0 -5
  114. data/lib/booker/models/teacher.rb +0 -5
  115. data/lib/booker/models/teacher_2.rb +0 -5
  116. data/lib/booker/models/time_zone.rb +0 -8
  117. data/lib/booker/models/treatment.rb +0 -19
  118. data/lib/booker/models/treatment_time_slot.rb +0 -5
  119. data/lib/booker/models/type.rb +0 -8
  120. data/lib/booker/models/user.rb +0 -73
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class CurrentPrice < Price; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,54 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Customer < Model
5
+ attr_accessor 'CustomerID',
6
+ 'GUID',
7
+ 'Address',
8
+ 'AllowReceiveEmails',
9
+ 'AllowReceiveSMS',
10
+ 'SendEmail',
11
+ 'CellPhone', # Returned when using FindCustomers
12
+ 'CreditCard',
13
+ 'Email',
14
+ 'FirstName',
15
+ 'HasActiveMembership',
16
+ 'HomePhone',
17
+ 'MobilePhone', # Set this when making an appointment
18
+ 'MobilePhoneCarrierID',
19
+ 'LastName',
20
+ 'WorkPhone',
21
+ 'WorkPhoneExt',
22
+ 'ShippingAddress',
23
+ 'CustomerRecordType',
24
+ 'DateOfBirth',
25
+ 'Gender',
26
+ 'GenderID',
27
+ 'HasMembership',
28
+ 'HasPastMembership',
29
+ 'IsNewCustomer',
30
+ 'LoyaltyPoints',
31
+ 'LocationID',
32
+ 'LocationName',
33
+ 'NumberOfReferrals',
34
+ 'PreferredStaffGender',
35
+ 'EmergencyContactName',
36
+ 'EmergencyContactPhone',
37
+ 'EmergencyContactRelationship',
38
+ 'IsActive',
39
+ 'Occupation',
40
+ 'PreferredStaffMemberID',
41
+ 'ReferredByCustomerID'
42
+
43
+ def self.from_list(array)
44
+ if array.any? && array.first['Customer']
45
+ flattened = array.map{|a| a['Customer'].merge('CustomerID' => a['CustomerID'])}
46
+ super(flattened)
47
+ else
48
+ super
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Customer2 < Customer; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class CustomerRecordType < Type; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Discount < Price; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class DynamicPrice < Model
5
+ attr_accessor 'Discount',
6
+ 'FinalPrice',
7
+ 'OriginalPrice',
8
+ 'ReceiptDisplayPrice',
9
+ 'OriginalTagPrice'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Employee < Model
5
+ attr_accessor 'ID',
6
+ 'FirstName',
7
+ 'LastName',
8
+ 'Gender'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class FeatureSettings < Model
5
+ attr_accessor 'UseFrederick', 'UsePromote'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class FinalTotal < Price; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Gender < Type; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class ItineraryTimeSlot < Model
5
+ attr_accessor 'TreatmentTimeSlots'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class ItineraryTimeSlotsList < Model
5
+ attr_accessor 'ItineraryTimeSlots'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Location < Model
5
+ ACCOUNT_STATUSES = [
6
+ nil,
7
+ 'Implementation',
8
+ 'Demo',
9
+ 'LiveNoCharge',
10
+ 'Live',
11
+ 'Terminated',
12
+ 'ChargeNotLive'
13
+ ].map(&:freeze).freeze
14
+
15
+ attr_accessor 'ID',
16
+ 'AccountName',
17
+ 'BusinessName',
18
+ 'BusinessType',
19
+ 'EmailAddress',
20
+ 'Address',
21
+ 'Phone',
22
+ 'TimeZone',
23
+ 'WebSite',
24
+ 'IsDistributionPartner',
25
+ 'EncryptedLocationID',
26
+ 'BrandAccountName',
27
+ 'LogoUrl',
28
+ 'BusinessType',
29
+ 'FirstName',
30
+ 'LastName',
31
+ 'CurrencyCode',
32
+ 'Status'
33
+
34
+ def status_name
35
+ self.Status ? ACCOUNT_STATUSES[self.Status] : nil
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,20 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class LocationDaySchedule < Model
5
+ attr_accessor 'Weekday',
6
+ 'StartTime',
7
+ 'EndTime'
8
+
9
+ def self.from_hash(hash)
10
+ model = super
11
+ model.Weekday = to_wday(model.Weekday)
12
+ strftime_format = '%T'
13
+ model.StartTime = model.StartTime.try(:strftime, strftime_format)
14
+ model.EndTime = model.EndTime.try(:strftime, strftime_format)
15
+ model
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,78 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Model < Booker::Model
5
+ CONSTANTIZE_MODULE = Booker::V4::Models
6
+
7
+ # Booker's API hands you back all time as if the business is in server time.
8
+ # First load the time in server time, then return the same hours and minutes in current time zone.
9
+ def self.time_from_booker_datetime(booker_datetime)
10
+ timestamp = booker_datetime[/\/Date\((.\d+)[\-\+]/, 1].to_i / 1000.to_f
11
+
12
+ original_tz = Time.zone
13
+ begin
14
+ # Booker's server is always EST
15
+ Time.zone = Booker::Client::BOOKER_SERVER_TIMEZONE
16
+
17
+ booker_time = Time.zone.at(timestamp)
18
+ ensure
19
+ Time.zone = original_tz
20
+ end
21
+
22
+ # Convert it back to location time without changing hours and minutes
23
+ Time.zone.parse(booker_time.strftime('%Y-%m-%d %H:%M:%S'))
24
+ end
25
+
26
+ # Booker's API requires times to be sent in as if the business is in Eastern Time!
27
+ def self.time_to_booker_datetime(time)
28
+ original_tz = Time.zone
29
+
30
+ begin
31
+ # Booker's server is always EST
32
+ Time.zone = Booker::Client::BOOKER_SERVER_TIMEZONE
33
+ timestamp = (Time.zone.parse(time.strftime("%Y-%m-%dT%H:%M:%S")).to_f * 1000).to_i
34
+ ensure
35
+ Time.zone = original_tz
36
+ end
37
+
38
+ "/Date(#{timestamp})/"
39
+ end
40
+
41
+ def self.timezone_from_booker_timezone(booker_timezone_name)
42
+ normalized_booker_timezone_name = Booker::Helpers::ActiveSupport.to_active_support(booker_timezone_name)
43
+ return normalized_booker_timezone_name if normalized_booker_timezone_name.present?
44
+
45
+ begin
46
+ Booker::Helpers::LoggingHelper.log_issue(
47
+ 'Unable to find time zone name using Booker::Helpers::ActiveSupport.to_active_support',
48
+ booker_timezone_name: booker_timezone_name
49
+ )
50
+ rescue
51
+ end
52
+
53
+ timezone_from_booker_offset!(booker_timezone_name)
54
+ end
55
+
56
+ def self.timezone_from_booker_offset!(booker_timezone_name)
57
+ booker_offset_match = booker_timezone_name.scan(/(\A)(.*)(?=\))/).first
58
+
59
+ if booker_offset_match.present?
60
+ booker_offset = booker_offset_match.delete_if { |match| match.blank? }.first
61
+
62
+ if booker_offset
63
+ booker_timezone_map_key = Booker::Helpers::ActiveSupport.booker_timezone_names.find do |key|
64
+ key.start_with?(booker_offset)
65
+ end
66
+
67
+ return Booker::Helpers::ActiveSupport.to_active_support(booker_timezone_map_key) if booker_timezone_map_key
68
+ end
69
+ end
70
+
71
+ raise Booker::Error
72
+ end
73
+
74
+ def self.to_wday(booker_wday); Date.parse(booker_wday).wday; end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,9 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class MultiServiceAvailabilityResult < Model
5
+ attr_accessor 'ItineraryTimeSlotsLists'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class NotificationSettings < Model
5
+ attr_accessor 'NotificationsEmail',
6
+ 'NotifyAdminOnAppointmentOtherEvent',
7
+ 'SendAppointmentReminders',
8
+ 'SendConfirmationAfterBooking',
9
+ 'SendNoticeHoursBeforeAppointment',
10
+ 'NotifyServiceProviderOnAppointmentOtherEvent'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class OnlineBookingSettings < Model
5
+ attr_accessor 'NewAppointmentCutOffInterval',
6
+ 'PaymentMethods',
7
+ 'PreAuthorizeCreditCard',
8
+ 'PreferredAppointmentTimes',
9
+ 'RequirePaymentInformation',
10
+ 'AppointmentStartTimeInterval',
11
+ 'SelectTechnician',
12
+ 'SelectTechnicianGender',
13
+ 'AllowCancelAppointments',
14
+ 'MaximumResultsPerDay',
15
+ 'UsePreferredAppointmentTimes',
16
+ 'RequireCustomerGender',
17
+ 'RequireStreetAddress',
18
+ 'GoogleAnalyticsCode',
19
+ 'BillingAddressRequired',
20
+ 'BackgroundImageUrl',
21
+ 'BusinessLogoUrl'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class OriginalPrice < Price; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class PaymentMethod < Type; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class PreferredStaffGender < Gender; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Price < Model
5
+ attr_accessor 'Amount',
6
+ 'CurrencyCode'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class ReceiptDisplayPrice < Price; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Room < Model
5
+ attr_accessor 'Capacity',
6
+ 'Description',
7
+ 'ID',
8
+ 'LocationID',
9
+ 'Name',
10
+ 'Treatments'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class ShippingAddress < Address; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Booker
2
+ module V4
3
+ module Models
4
+ class Source < Type; end
5
+ end
6
+ end
7
+ end