booker_ruby 1.14.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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