crisphive 0.1.0 → 0.2.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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +90 -11
  3. data/crisphive.gemspec +5 -5
  4. data/lib/crisphive/api/business_skill_api.rb +154 -8
  5. data/lib/crisphive/api/customer_api.rb +15 -12
  6. data/lib/crisphive/api/job_request_business_api.rb +1002 -112
  7. data/lib/crisphive/api/job_types_api.rb +6 -2
  8. data/lib/crisphive/api/service_area_api.rb +6 -6
  9. data/lib/crisphive/api/technician_api.rb +510 -6
  10. data/lib/crisphive/api/vehicle_api.rb +6 -6
  11. data/lib/crisphive/api_client.rb +2 -2
  12. data/lib/crisphive/api_error.rb +2 -2
  13. data/lib/crisphive/configuration.rb +3 -3
  14. data/lib/crisphive/models/commit_emergency_reschedule200_response.rb +253 -0
  15. data/lib/crisphive/models/commit_job_request_move200_response.rb +253 -0
  16. data/lib/crisphive/models/create_customer200_response.rb +5 -2
  17. data/lib/crisphive/models/create_job_request200_response.rb +5 -2
  18. data/lib/crisphive/models/create_technician200_response.rb +253 -0
  19. data/lib/crisphive/models/customer.rb +2 -2
  20. data/lib/crisphive/models/customer_address.rb +2 -2
  21. data/lib/crisphive/models/customer_address_request.rb +11 -2
  22. data/lib/crisphive/models/customer_contact.rb +2 -2
  23. data/lib/crisphive/models/customer_create_request.rb +2 -2
  24. data/lib/crisphive/models/customer_create_response.rb +2 -2
  25. data/lib/crisphive/models/customer_list.rb +3 -3
  26. data/lib/crisphive/models/customer_list_item.rb +2 -2
  27. data/lib/crisphive/models/customer_profile.rb +2 -2
  28. data/lib/crisphive/models/customer_spending.rb +2 -2
  29. data/lib/crisphive/models/customer_tier_progress.rb +2 -2
  30. data/lib/crisphive/models/customer_update_request.rb +2 -2
  31. data/lib/crisphive/models/get_customer200_response.rb +5 -2
  32. data/lib/crisphive/models/get_job_request200_response.rb +5 -2
  33. data/lib/crisphive/models/get_job_request_timeline200_response.rb +5 -2
  34. data/lib/crisphive/models/get_job_type200_response.rb +5 -2
  35. data/lib/crisphive/models/get_service_area200_response.rb +5 -2
  36. data/lib/crisphive/models/get_technician200_response.rb +5 -2
  37. data/lib/crisphive/models/get_technician_schedule200_response.rb +253 -0
  38. data/lib/crisphive/models/get_vehicle200_response.rb +5 -2
  39. data/lib/crisphive/models/job_date.rb +5 -3
  40. data/lib/crisphive/models/job_date_business_range.rb +7 -3
  41. data/lib/crisphive/models/job_date_period.rb +2 -2
  42. data/lib/crisphive/models/job_date_period_entry.rb +4 -2
  43. data/lib/crisphive/models/job_request.rb +46 -6
  44. data/lib/crisphive/models/job_request_action_audit_by.rb +2 -2
  45. data/lib/crisphive/models/job_request_action_audit_entry.rb +3 -3
  46. data/lib/crisphive/models/job_request_action_summary.rb +2 -2
  47. data/lib/crisphive/models/job_request_address_summary.rb +2 -2
  48. data/lib/crisphive/models/job_request_archive_summary.rb +2 -2
  49. data/lib/crisphive/models/job_request_arrival_window.rb +4 -4
  50. data/lib/crisphive/models/job_request_assigned_vehicle.rb +2 -2
  51. data/lib/crisphive/models/job_request_assignment_summary.rb +2 -2
  52. data/lib/crisphive/models/job_request_attention_summary.rb +259 -0
  53. data/lib/crisphive/models/job_request_available_vehicle.rb +235 -0
  54. data/lib/crisphive/models/job_request_booking_windows.rb +2 -2
  55. data/lib/crisphive/models/job_request_buddy_slot_candidates.rb +239 -0
  56. data/lib/crisphive/models/job_request_business_time_range.rb +3 -3
  57. data/lib/crisphive/models/job_request_changes.rb +2 -2
  58. data/lib/crisphive/models/job_request_confirm_request.rb +245 -0
  59. data/lib/crisphive/models/job_request_create_request.rb +60 -6
  60. data/lib/crisphive/models/job_request_create_response.rb +2 -2
  61. data/lib/crisphive/models/job_request_crew_candidates.rb +227 -0
  62. data/lib/crisphive/models/job_request_crew_change.rb +299 -0
  63. data/lib/crisphive/models/job_request_crew_member.rb +7 -4
  64. data/lib/crisphive/models/job_request_crew_member_input.rb +284 -0
  65. data/lib/crisphive/models/job_request_crew_recommendation.rb +255 -0
  66. data/lib/crisphive/models/job_request_customer_summary.rb +2 -2
  67. data/lib/crisphive/models/job_request_day_windows.rb +3 -3
  68. data/lib/crisphive/models/job_request_emergency_candidate.rb +297 -0
  69. data/lib/crisphive/models/job_request_emergency_candidates.rb +311 -0
  70. data/lib/crisphive/models/job_request_emergency_candidates_request.rb +328 -0
  71. data/lib/crisphive/models/job_request_emergency_commit_request.rb +351 -0
  72. data/lib/crisphive/models/job_request_emergency_plan.rb +345 -0
  73. data/lib/crisphive/models/job_request_emergency_preview_request.rb +329 -0
  74. data/lib/crisphive/models/job_request_job_date_business_range_request.rb +3 -3
  75. data/lib/crisphive/models/job_request_job_date_period_request.rb +2 -2
  76. data/lib/crisphive/models/job_request_job_date_request.rb +3 -3
  77. data/lib/crisphive/models/job_request_lead_candidate.rb +311 -0
  78. data/lib/crisphive/models/job_request_list.rb +2 -2
  79. data/lib/crisphive/models/job_request_move_commit_req.rb +343 -0
  80. data/lib/crisphive/models/job_request_move_member.rb +299 -0
  81. data/lib/crisphive/models/job_request_move_plan.rb +377 -0
  82. data/lib/crisphive/models/job_request_move_preview_req.rb +290 -0
  83. data/lib/crisphive/models/job_request_move_warning.rb +311 -0
  84. data/lib/crisphive/models/job_request_period.rb +2 -2
  85. data/lib/crisphive/models/job_request_quote_request.rb +340 -0
  86. data/lib/crisphive/models/job_request_quote_summary.rb +2 -2
  87. data/lib/crisphive/models/job_request_rating_summary.rb +2 -2
  88. data/lib/crisphive/models/job_request_reschedule_day.rb +227 -0
  89. data/lib/crisphive/models/job_request_reschedule_move.rb +319 -0
  90. data/lib/crisphive/models/job_request_reschedule_reassignment.rb +339 -0
  91. data/lib/crisphive/models/job_request_schedule.rb +2 -2
  92. data/lib/crisphive/models/job_request_session.rb +8 -7
  93. data/lib/crisphive/models/job_request_skill_summary.rb +2 -2
  94. data/lib/crisphive/models/job_request_status_summary.rb +2 -2
  95. data/lib/crisphive/models/job_request_tech_candidate.rb +287 -0
  96. data/lib/crisphive/models/job_request_technician_info.rb +2 -2
  97. data/lib/crisphive/models/job_request_time_segments.rb +287 -0
  98. data/lib/crisphive/models/job_request_time_segments_business_time.rb +321 -0
  99. data/lib/crisphive/models/job_request_time_segments_day.rb +247 -0
  100. data/lib/crisphive/models/job_request_time_segments_slot.rb +375 -0
  101. data/lib/crisphive/models/job_request_time_segments_worker.rb +295 -0
  102. data/lib/crisphive/models/job_request_timeline.rb +2 -2
  103. data/lib/crisphive/models/job_request_timeline_action.rb +2 -2
  104. data/lib/crisphive/models/job_request_timeline_event.rb +2 -2
  105. data/lib/crisphive/models/job_request_update_priority_request.rb +295 -0
  106. data/lib/crisphive/models/job_type.rb +2 -2
  107. data/lib/crisphive/models/list_crew_candidates200_response.rb +253 -0
  108. data/lib/crisphive/models/list_customers200_response.rb +5 -2
  109. data/lib/crisphive/models/list_emergency_candidates200_response.rb +253 -0
  110. data/lib/crisphive/models/list_job_request_booking_windows200_response.rb +5 -2
  111. data/lib/crisphive/models/list_job_request_changes200_response.rb +5 -2
  112. data/lib/crisphive/models/list_job_requests200_response.rb +5 -2
  113. data/lib/crisphive/models/list_job_types200_response.rb +5 -2
  114. data/lib/crisphive/models/list_matching_slots200_response.rb +253 -0
  115. data/lib/crisphive/models/list_nearby_technicians200_response.rb +253 -0
  116. data/lib/crisphive/models/list_service_areas200_response.rb +5 -2
  117. data/lib/crisphive/models/list_skill_categories200_response.rb +5 -2
  118. data/lib/crisphive/models/list_skills200_response.rb +5 -2
  119. data/lib/crisphive/models/list_skills_by_category200_response.rb +5 -2
  120. data/lib/crisphive/models/list_technician_skills200_response.rb +253 -0
  121. data/lib/crisphive/models/list_technicians200_response.rb +5 -2
  122. data/lib/crisphive/models/list_vehicles200_response.rb +5 -2
  123. data/lib/crisphive/models/nearby_technician.rb +319 -0
  124. data/lib/crisphive/models/nearby_technicians.rb +237 -0
  125. data/lib/crisphive/models/pagination.rb +7 -2
  126. data/lib/crisphive/models/replace_technician_service_areas200_response.rb +253 -0
  127. data/lib/crisphive/models/response_envelope.rb +6 -2
  128. data/lib/crisphive/models/service_area.rb +2 -2
  129. data/lib/crisphive/models/service_area_list.rb +2 -2
  130. data/lib/crisphive/models/skill.rb +9 -2
  131. data/lib/crisphive/models/skill_by_category_list.rb +4 -2
  132. data/lib/crisphive/models/skill_category.rb +7 -2
  133. data/lib/crisphive/models/skill_category_list.rb +4 -2
  134. data/lib/crisphive/models/skill_list.rb +2 -2
  135. data/lib/crisphive/models/skill_summary.rb +2 -2
  136. data/lib/crisphive/models/technician.rb +2 -2
  137. data/lib/crisphive/models/technician_address.rb +2 -2
  138. data/lib/crisphive/models/technician_address_input.rb +408 -0
  139. data/lib/crisphive/models/technician_buddies_request.rb +236 -0
  140. data/lib/crisphive/models/technician_create_request.rb +600 -0
  141. data/lib/crisphive/models/technician_create_response.rb +215 -0
  142. data/lib/crisphive/models/technician_lead_ref.rb +2 -2
  143. data/lib/crisphive/models/technician_leads_request.rb +236 -0
  144. data/lib/crisphive/models/technician_list.rb +3 -3
  145. data/lib/crisphive/models/technician_schedule.rb +279 -0
  146. data/lib/crisphive/models/technician_schedule_block.rb +225 -0
  147. data/lib/crisphive/models/technician_schedule_session.rb +311 -0
  148. data/lib/crisphive/models/technician_service_area_ref.rb +2 -2
  149. data/lib/crisphive/models/technician_service_areas_request.rb +236 -0
  150. data/lib/crisphive/models/technician_service_areas_response.rb +217 -0
  151. data/lib/crisphive/models/technician_skill.rb +265 -0
  152. data/lib/crisphive/models/technician_skill_list.rb +227 -0
  153. data/lib/crisphive/models/technician_skills_request.rb +236 -0
  154. data/lib/crisphive/models/technician_status.rb +2 -2
  155. data/lib/crisphive/models/technician_update_request.rb +507 -0
  156. data/lib/crisphive/models/technician_vehicles_request.rb +236 -0
  157. data/lib/crisphive/models/vehicle.rb +26 -4
  158. data/lib/crisphive/models/vehicle_list.rb +2 -2
  159. data/lib/crisphive/models/vehicle_owner.rb +2 -2
  160. data/lib/crisphive/version.rb +3 -3
  161. data/lib/crisphive.rb +60 -2
  162. data/spec/spec_helper.rb +2 -2
  163. metadata +63 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ea71e345767c63c9580d0c9d27e917eac5b39841795b58a1168c8e087a8d750
4
- data.tar.gz: 6b6a8e958bec2b6bbd18780b48a9b9eeabc03639d65bd13ad71aab74f0b07713
3
+ metadata.gz: 71b2a478a83f8320f01b296506cbb17bd70b801b970e18a537af9473d9c9743b
4
+ data.tar.gz: 75572a02ef55d26a27e188166fca4d1d6231f248d4ed360daee199559a4592fb
5
5
  SHA512:
6
- metadata.gz: d1c0cb7cf0c4935756695f2d586d1cd8aa4a8134fef772137bb2825dbec04e253b824a49e6439a4ba93af6c71adf61834d500a4928eaadd1b120db80c341dbc8
7
- data.tar.gz: 944ca1a86086463ed7ebaa5ecd4afb886786c24c7d424ae5dc3a1cc5d6caa640cc461d114cab1aa98d2a2667d09698f16e10817ed5c94151a3989432f8f326f4
6
+ metadata.gz: 3eedb643d1a7a07cb41a29db6fc8403d303207e0140e6b8ed05295c98c0641a692244445eadd32e95b618b3dcff23e5954860a366daf9e8c98d457b1a803e628
7
+ data.tar.gz: da14ba0c96b235482afd9e9668e1851f8242ef1b1c073636317b4f166a68ad774aeb2588298eda494bff7231c6855dd07c6da53b15af5d351caac74f308505b6
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # crisphive
2
2
 
3
- Crisphive - the Ruby gem for the CrispHive Developer API
3
+ Crisphive - the Ruby gem for the Crisphive Developer API
4
4
 
5
- Public REST API for integrating CrispHive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test).
5
+ Public REST API for integrating Crisphive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test).
6
6
 
7
7
  **Key scopes (restricted keys).** A key is either *full-access* (can call every endpoint below) or *restricted* to a set of permission codes chosen at creation — the same codes as the dashboard permission grid (e.g. `customers_view`, `job_create`, `team_manage`). A restricted key calling an endpoint outside its scope gets `403`. The full code list is the permission catalog (`GET /permission/modules` on the dashboard API). Create, scope, and revoke keys from the business dashboard.
8
8
 
@@ -11,7 +11,7 @@ Every response is wrapped in the envelope `{ \"error_code\": 0, \"message\": \"S
11
11
  This SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
12
12
 
13
13
  - API version: 1.0
14
- - Package version: 0.1.0
14
+ - Package version: 0.2.0
15
15
  - Generator version: 7.11.0
16
16
  - Build package: org.openapitools.codegen.languages.RubyClientCodegen
17
17
 
@@ -28,16 +28,16 @@ gem build crisphive.gemspec
28
28
  Then either install the gem locally:
29
29
 
30
30
  ```shell
31
- gem install ./crisphive-0.1.0.gem
31
+ gem install ./crisphive-0.2.0.gem
32
32
  ```
33
33
 
34
- (for development, run `gem install --dev ./crisphive-0.1.0.gem` to install the development dependencies)
34
+ (for development, run `gem install --dev ./crisphive-0.2.0.gem` to install the development dependencies)
35
35
 
36
36
  or publish the gem to a gem hosting service, e.g. [RubyGems](https://rubygems.org/).
37
37
 
38
38
  Finally add this to the Gemfile:
39
39
 
40
- gem 'crisphive', '~> 0.1.0'
40
+ gem 'crisphive', '~> 0.2.0'
41
41
 
42
42
  ### Install from Git
43
43
 
@@ -63,7 +63,7 @@ require 'crisphive'
63
63
 
64
64
  # Setup authorization
65
65
  Crisphive.configure do |config|
66
- # Configure Bearer authorization (CrispHive secret key): ApiKeyAuth
66
+ # Configure Bearer authorization (Crisphive secret key): ApiKeyAuth
67
67
  config.access_token = 'YOUR_BEARER_TOKEN'
68
68
  # Configure a proc to get access tokens in lieu of the static access_token configuration
69
69
  config.access_token_getter = -> { 'YOUR TOKEN GETTER PROC' }
@@ -96,31 +96,55 @@ Class | Method | HTTP request | Description
96
96
  *Crisphive::BusinessSkillApi* | [**list_skill_categories**](docs/BusinessSkillApi.md#list_skill_categories) | **GET** /skill-categories | List skill categories
97
97
  *Crisphive::BusinessSkillApi* | [**list_skills**](docs/BusinessSkillApi.md#list_skills) | **GET** /skills | List all skills
98
98
  *Crisphive::BusinessSkillApi* | [**list_skills_by_category**](docs/BusinessSkillApi.md#list_skills_by_category) | **GET** /skill-categories/{id}/skills | List skills in a category
99
+ *Crisphive::BusinessSkillApi* | [**list_technician_skills**](docs/BusinessSkillApi.md#list_technician_skills) | **GET** /technicians/{id}/skills | List skills for a technician
100
+ *Crisphive::BusinessSkillApi* | [**replace_technician_skills**](docs/BusinessSkillApi.md#replace_technician_skills) | **PATCH** /technicians/{id}/skills | Replace a technician's skills
99
101
  *Crisphive::CustomerApi* | [**create_customer**](docs/CustomerApi.md#create_customer) | **POST** /customers | Create a customer
100
102
  *Crisphive::CustomerApi* | [**delete_customer**](docs/CustomerApi.md#delete_customer) | **DELETE** /customers/{id} | Delete a customer
101
103
  *Crisphive::CustomerApi* | [**get_customer**](docs/CustomerApi.md#get_customer) | **GET** /customers/{id} | Get a customer
102
104
  *Crisphive::CustomerApi* | [**list_customers**](docs/CustomerApi.md#list_customers) | **GET** /customers | List customers
103
105
  *Crisphive::CustomerApi* | [**update_customer**](docs/CustomerApi.md#update_customer) | **PUT** /customers/{id} | Update a customer
104
- *Crisphive::JobRequestBusinessApi* | [**create_job_request**](docs/JobRequestBusinessApi.md#create_job_request) | **POST** /job-requests | Create a job request (business actor)
106
+ *Crisphive::JobRequestBusinessApi* | [**commit_emergency_reschedule**](docs/JobRequestBusinessApi.md#commit_emergency_reschedule) | **POST** /job-requests/emergency/commit | Commit emergency insert + cascade reschedule
107
+ *Crisphive::JobRequestBusinessApi* | [**commit_job_request_move**](docs/JobRequestBusinessApi.md#commit_job_request_move) | **POST** /job-requests/{id}/move/commit | Commit a schedule-board job move
108
+ *Crisphive::JobRequestBusinessApi* | [**confirm_job_request**](docs/JobRequestBusinessApi.md#confirm_job_request) | **POST** /job-requests/{id}/confirm | Confirm a booking on behalf of the customer
109
+ *Crisphive::JobRequestBusinessApi* | [**create_job_request**](docs/JobRequestBusinessApi.md#create_job_request) | **POST** /job-requests | Create a job request
105
110
  *Crisphive::JobRequestBusinessApi* | [**get_job_request**](docs/JobRequestBusinessApi.md#get_job_request) | **GET** /job-requests/{id} | Get a job request
106
- *Crisphive::JobRequestBusinessApi* | [**get_job_request_timeline**](docs/JobRequestBusinessApi.md#get_job_request_timeline) | **GET** /job-requests/{id}/timeline | Job timeline (business surface — also serves tech via BusinessAuth)
107
- *Crisphive::JobRequestBusinessApi* | [**list_job_request_booking_windows**](docs/JobRequestBusinessApi.md#list_job_request_booking_windows) | **GET** /job-requests/booking-windows | Booking availability (business actor)
111
+ *Crisphive::JobRequestBusinessApi* | [**get_job_request_timeline**](docs/JobRequestBusinessApi.md#get_job_request_timeline) | **GET** /job-requests/{id}/timeline | Job timeline
112
+ *Crisphive::JobRequestBusinessApi* | [**get_technician_schedule**](docs/JobRequestBusinessApi.md#get_technician_schedule) | **GET** /technicians/{id}/schedule | One technician's real schedule (sessions + time off)
113
+ *Crisphive::JobRequestBusinessApi* | [**list_crew_candidates**](docs/JobRequestBusinessApi.md#list_crew_candidates) | **GET** /job-requests/{id}/crew-candidates | Matching crew candidates for a job
114
+ *Crisphive::JobRequestBusinessApi* | [**list_emergency_candidates**](docs/JobRequestBusinessApi.md#list_emergency_candidates) | **POST** /job-requests/emergency/candidates | Rank technicians for a P0 emergency insert
115
+ *Crisphive::JobRequestBusinessApi* | [**list_job_request_booking_windows**](docs/JobRequestBusinessApi.md#list_job_request_booking_windows) | **GET** /job-requests/booking-windows | Booking availability
108
116
  *Crisphive::JobRequestBusinessApi* | [**list_job_request_changes**](docs/JobRequestBusinessApi.md#list_job_request_changes) | **GET** /job-requests/changes | Poll for new & changed job requests (sync feed)
109
117
  *Crisphive::JobRequestBusinessApi* | [**list_job_requests**](docs/JobRequestBusinessApi.md#list_job_requests) | **GET** /job-requests | List job requests
118
+ *Crisphive::JobRequestBusinessApi* | [**list_matching_slots**](docs/JobRequestBusinessApi.md#list_matching_slots) | **GET** /job-requests/{id}/time-segments | Matching time slots for a quoted job
119
+ *Crisphive::JobRequestBusinessApi* | [**list_nearby_technicians**](docs/JobRequestBusinessApi.md#list_nearby_technicians) | **GET** /technicians/nearby | Find nearby feasible technicians (job-less location query)
120
+ *Crisphive::JobRequestBusinessApi* | [**preview_emergency_reschedule**](docs/JobRequestBusinessApi.md#preview_emergency_reschedule) | **POST** /job-requests/emergency/preview | Preview emergency insert + cascade reschedule
121
+ *Crisphive::JobRequestBusinessApi* | [**preview_job_request_move**](docs/JobRequestBusinessApi.md#preview_job_request_move) | **POST** /job-requests/{id}/move/preview | Preview a schedule-board job move
122
+ *Crisphive::JobRequestBusinessApi* | [**quote_job_request**](docs/JobRequestBusinessApi.md#quote_job_request) | **POST** /job-requests/{id}/quote | Fire quote (FIXED action — business)
123
+ *Crisphive::JobRequestBusinessApi* | [**update_job_priority**](docs/JobRequestBusinessApi.md#update_job_priority) | **PATCH** /job-requests/{id}/priority | Set job priority (scheduling staff)
110
124
  *Crisphive::JobTypesApi* | [**get_job_type**](docs/JobTypesApi.md#get_job_type) | **GET** /job-types/{id} | Get a job type
111
125
  *Crisphive::JobTypesApi* | [**list_job_types**](docs/JobTypesApi.md#list_job_types) | **GET** /job-types | List job types
112
126
  *Crisphive::ServiceAreaApi* | [**get_service_area**](docs/ServiceAreaApi.md#get_service_area) | **GET** /service-areas/{id} | Get a service area
113
127
  *Crisphive::ServiceAreaApi* | [**list_service_areas**](docs/ServiceAreaApi.md#list_service_areas) | **GET** /service-areas | List service areas
128
+ *Crisphive::TechnicianApi* | [**create_technician**](docs/TechnicianApi.md#create_technician) | **POST** /technicians | Add a technician
129
+ *Crisphive::TechnicianApi* | [**delete_technician**](docs/TechnicianApi.md#delete_technician) | **DELETE** /technicians/{id} | Remove a technician
114
130
  *Crisphive::TechnicianApi* | [**get_technician**](docs/TechnicianApi.md#get_technician) | **GET** /technicians/{id} | Get a technician
115
131
  *Crisphive::TechnicianApi* | [**list_technicians**](docs/TechnicianApi.md#list_technicians) | **GET** /technicians | List technicians
132
+ *Crisphive::TechnicianApi* | [**replace_technician_buddies**](docs/TechnicianApi.md#replace_technician_buddies) | **PUT** /technicians/{id}/buddies | Replace a technician's buddies
133
+ *Crisphive::TechnicianApi* | [**replace_technician_leads**](docs/TechnicianApi.md#replace_technician_leads) | **PUT** /technicians/{id}/leads | Replace a buddy's leaders (buddy side)
134
+ *Crisphive::TechnicianApi* | [**replace_technician_service_areas**](docs/TechnicianApi.md#replace_technician_service_areas) | **PUT** /technicians/{id}/service-areas | Replace a technician's service areas
135
+ *Crisphive::TechnicianApi* | [**replace_technician_vehicles**](docs/TechnicianApi.md#replace_technician_vehicles) | **PUT** /technicians/{id}/vehicles | Replace a technician's vehicles
136
+ *Crisphive::TechnicianApi* | [**update_technician**](docs/TechnicianApi.md#update_technician) | **PUT** /technicians/{id} | Update a technician
116
137
  *Crisphive::VehicleApi* | [**get_vehicle**](docs/VehicleApi.md#get_vehicle) | **GET** /vehicles/{id} | Get a vehicle
117
138
  *Crisphive::VehicleApi* | [**list_vehicles**](docs/VehicleApi.md#list_vehicles) | **GET** /vehicles | List vehicles
118
139
 
119
140
 
120
141
  ## Documentation for Models
121
142
 
143
+ - [Crisphive::CommitEmergencyReschedule200Response](docs/CommitEmergencyReschedule200Response.md)
144
+ - [Crisphive::CommitJobRequestMove200Response](docs/CommitJobRequestMove200Response.md)
122
145
  - [Crisphive::CreateCustomer200Response](docs/CreateCustomer200Response.md)
123
146
  - [Crisphive::CreateJobRequest200Response](docs/CreateJobRequest200Response.md)
147
+ - [Crisphive::CreateTechnician200Response](docs/CreateTechnician200Response.md)
124
148
  - [Crisphive::Customer](docs/Customer.md)
125
149
  - [Crisphive::CustomerAddress](docs/CustomerAddress.md)
126
150
  - [Crisphive::CustomerAddressRequest](docs/CustomerAddressRequest.md)
@@ -139,6 +163,7 @@ Class | Method | HTTP request | Description
139
163
  - [Crisphive::GetJobType200Response](docs/GetJobType200Response.md)
140
164
  - [Crisphive::GetServiceArea200Response](docs/GetServiceArea200Response.md)
141
165
  - [Crisphive::GetTechnician200Response](docs/GetTechnician200Response.md)
166
+ - [Crisphive::GetTechnicianSchedule200Response](docs/GetTechnicianSchedule200Response.md)
142
167
  - [Crisphive::GetVehicle200Response](docs/GetVehicle200Response.md)
143
168
  - [Crisphive::JobDate](docs/JobDate.md)
144
169
  - [Crisphive::JobDateBusinessRange](docs/JobDateBusinessRange.md)
@@ -153,42 +178,81 @@ Class | Method | HTTP request | Description
153
178
  - [Crisphive::JobRequestArrivalWindow](docs/JobRequestArrivalWindow.md)
154
179
  - [Crisphive::JobRequestAssignedVehicle](docs/JobRequestAssignedVehicle.md)
155
180
  - [Crisphive::JobRequestAssignmentSummary](docs/JobRequestAssignmentSummary.md)
181
+ - [Crisphive::JobRequestAttentionSummary](docs/JobRequestAttentionSummary.md)
182
+ - [Crisphive::JobRequestAvailableVehicle](docs/JobRequestAvailableVehicle.md)
156
183
  - [Crisphive::JobRequestBookingWindows](docs/JobRequestBookingWindows.md)
184
+ - [Crisphive::JobRequestBuddySlotCandidates](docs/JobRequestBuddySlotCandidates.md)
157
185
  - [Crisphive::JobRequestBusinessTimeRange](docs/JobRequestBusinessTimeRange.md)
158
186
  - [Crisphive::JobRequestChanges](docs/JobRequestChanges.md)
187
+ - [Crisphive::JobRequestConfirmRequest](docs/JobRequestConfirmRequest.md)
159
188
  - [Crisphive::JobRequestCreateRequest](docs/JobRequestCreateRequest.md)
160
189
  - [Crisphive::JobRequestCreateResponse](docs/JobRequestCreateResponse.md)
190
+ - [Crisphive::JobRequestCrewCandidates](docs/JobRequestCrewCandidates.md)
191
+ - [Crisphive::JobRequestCrewChange](docs/JobRequestCrewChange.md)
161
192
  - [Crisphive::JobRequestCrewMember](docs/JobRequestCrewMember.md)
193
+ - [Crisphive::JobRequestCrewMemberInput](docs/JobRequestCrewMemberInput.md)
194
+ - [Crisphive::JobRequestCrewRecommendation](docs/JobRequestCrewRecommendation.md)
162
195
  - [Crisphive::JobRequestCustomerSummary](docs/JobRequestCustomerSummary.md)
163
196
  - [Crisphive::JobRequestDayWindows](docs/JobRequestDayWindows.md)
197
+ - [Crisphive::JobRequestEmergencyCandidate](docs/JobRequestEmergencyCandidate.md)
198
+ - [Crisphive::JobRequestEmergencyCandidates](docs/JobRequestEmergencyCandidates.md)
199
+ - [Crisphive::JobRequestEmergencyCandidatesRequest](docs/JobRequestEmergencyCandidatesRequest.md)
200
+ - [Crisphive::JobRequestEmergencyCommitRequest](docs/JobRequestEmergencyCommitRequest.md)
201
+ - [Crisphive::JobRequestEmergencyPlan](docs/JobRequestEmergencyPlan.md)
202
+ - [Crisphive::JobRequestEmergencyPreviewRequest](docs/JobRequestEmergencyPreviewRequest.md)
164
203
  - [Crisphive::JobRequestJobDateBusinessRangeRequest](docs/JobRequestJobDateBusinessRangeRequest.md)
165
204
  - [Crisphive::JobRequestJobDatePeriodRequest](docs/JobRequestJobDatePeriodRequest.md)
166
205
  - [Crisphive::JobRequestJobDateRequest](docs/JobRequestJobDateRequest.md)
206
+ - [Crisphive::JobRequestLeadCandidate](docs/JobRequestLeadCandidate.md)
167
207
  - [Crisphive::JobRequestList](docs/JobRequestList.md)
208
+ - [Crisphive::JobRequestMoveCommitReq](docs/JobRequestMoveCommitReq.md)
209
+ - [Crisphive::JobRequestMoveMember](docs/JobRequestMoveMember.md)
210
+ - [Crisphive::JobRequestMovePlan](docs/JobRequestMovePlan.md)
211
+ - [Crisphive::JobRequestMovePreviewReq](docs/JobRequestMovePreviewReq.md)
212
+ - [Crisphive::JobRequestMoveWarning](docs/JobRequestMoveWarning.md)
168
213
  - [Crisphive::JobRequestPeriod](docs/JobRequestPeriod.md)
214
+ - [Crisphive::JobRequestQuoteRequest](docs/JobRequestQuoteRequest.md)
169
215
  - [Crisphive::JobRequestQuoteSummary](docs/JobRequestQuoteSummary.md)
170
216
  - [Crisphive::JobRequestRatingSummary](docs/JobRequestRatingSummary.md)
217
+ - [Crisphive::JobRequestRescheduleDay](docs/JobRequestRescheduleDay.md)
218
+ - [Crisphive::JobRequestRescheduleMove](docs/JobRequestRescheduleMove.md)
219
+ - [Crisphive::JobRequestRescheduleReassignment](docs/JobRequestRescheduleReassignment.md)
171
220
  - [Crisphive::JobRequestSchedule](docs/JobRequestSchedule.md)
172
221
  - [Crisphive::JobRequestSession](docs/JobRequestSession.md)
173
222
  - [Crisphive::JobRequestSkillSummary](docs/JobRequestSkillSummary.md)
174
223
  - [Crisphive::JobRequestStatusSummary](docs/JobRequestStatusSummary.md)
224
+ - [Crisphive::JobRequestTechCandidate](docs/JobRequestTechCandidate.md)
175
225
  - [Crisphive::JobRequestTechnicianInfo](docs/JobRequestTechnicianInfo.md)
226
+ - [Crisphive::JobRequestTimeSegments](docs/JobRequestTimeSegments.md)
227
+ - [Crisphive::JobRequestTimeSegmentsBusinessTime](docs/JobRequestTimeSegmentsBusinessTime.md)
228
+ - [Crisphive::JobRequestTimeSegmentsDay](docs/JobRequestTimeSegmentsDay.md)
229
+ - [Crisphive::JobRequestTimeSegmentsSlot](docs/JobRequestTimeSegmentsSlot.md)
230
+ - [Crisphive::JobRequestTimeSegmentsWorker](docs/JobRequestTimeSegmentsWorker.md)
176
231
  - [Crisphive::JobRequestTimeline](docs/JobRequestTimeline.md)
177
232
  - [Crisphive::JobRequestTimelineAction](docs/JobRequestTimelineAction.md)
178
233
  - [Crisphive::JobRequestTimelineEvent](docs/JobRequestTimelineEvent.md)
234
+ - [Crisphive::JobRequestUpdatePriorityRequest](docs/JobRequestUpdatePriorityRequest.md)
179
235
  - [Crisphive::JobType](docs/JobType.md)
236
+ - [Crisphive::ListCrewCandidates200Response](docs/ListCrewCandidates200Response.md)
180
237
  - [Crisphive::ListCustomers200Response](docs/ListCustomers200Response.md)
238
+ - [Crisphive::ListEmergencyCandidates200Response](docs/ListEmergencyCandidates200Response.md)
181
239
  - [Crisphive::ListJobRequestBookingWindows200Response](docs/ListJobRequestBookingWindows200Response.md)
182
240
  - [Crisphive::ListJobRequestChanges200Response](docs/ListJobRequestChanges200Response.md)
183
241
  - [Crisphive::ListJobRequests200Response](docs/ListJobRequests200Response.md)
184
242
  - [Crisphive::ListJobTypes200Response](docs/ListJobTypes200Response.md)
243
+ - [Crisphive::ListMatchingSlots200Response](docs/ListMatchingSlots200Response.md)
244
+ - [Crisphive::ListNearbyTechnicians200Response](docs/ListNearbyTechnicians200Response.md)
185
245
  - [Crisphive::ListServiceAreas200Response](docs/ListServiceAreas200Response.md)
186
246
  - [Crisphive::ListSkillCategories200Response](docs/ListSkillCategories200Response.md)
187
247
  - [Crisphive::ListSkills200Response](docs/ListSkills200Response.md)
188
248
  - [Crisphive::ListSkillsByCategory200Response](docs/ListSkillsByCategory200Response.md)
249
+ - [Crisphive::ListTechnicianSkills200Response](docs/ListTechnicianSkills200Response.md)
189
250
  - [Crisphive::ListTechnicians200Response](docs/ListTechnicians200Response.md)
190
251
  - [Crisphive::ListVehicles200Response](docs/ListVehicles200Response.md)
252
+ - [Crisphive::NearbyTechnician](docs/NearbyTechnician.md)
253
+ - [Crisphive::NearbyTechnicians](docs/NearbyTechnicians.md)
191
254
  - [Crisphive::Pagination](docs/Pagination.md)
255
+ - [Crisphive::ReplaceTechnicianServiceAreas200Response](docs/ReplaceTechnicianServiceAreas200Response.md)
192
256
  - [Crisphive::ResponseEnvelope](docs/ResponseEnvelope.md)
193
257
  - [Crisphive::ServiceArea](docs/ServiceArea.md)
194
258
  - [Crisphive::ServiceAreaList](docs/ServiceAreaList.md)
@@ -200,10 +264,25 @@ Class | Method | HTTP request | Description
200
264
  - [Crisphive::SkillSummary](docs/SkillSummary.md)
201
265
  - [Crisphive::Technician](docs/Technician.md)
202
266
  - [Crisphive::TechnicianAddress](docs/TechnicianAddress.md)
267
+ - [Crisphive::TechnicianAddressInput](docs/TechnicianAddressInput.md)
268
+ - [Crisphive::TechnicianBuddiesRequest](docs/TechnicianBuddiesRequest.md)
269
+ - [Crisphive::TechnicianCreateRequest](docs/TechnicianCreateRequest.md)
270
+ - [Crisphive::TechnicianCreateResponse](docs/TechnicianCreateResponse.md)
203
271
  - [Crisphive::TechnicianLeadRef](docs/TechnicianLeadRef.md)
272
+ - [Crisphive::TechnicianLeadsRequest](docs/TechnicianLeadsRequest.md)
204
273
  - [Crisphive::TechnicianList](docs/TechnicianList.md)
274
+ - [Crisphive::TechnicianSchedule](docs/TechnicianSchedule.md)
275
+ - [Crisphive::TechnicianScheduleBlock](docs/TechnicianScheduleBlock.md)
276
+ - [Crisphive::TechnicianScheduleSession](docs/TechnicianScheduleSession.md)
205
277
  - [Crisphive::TechnicianServiceAreaRef](docs/TechnicianServiceAreaRef.md)
278
+ - [Crisphive::TechnicianServiceAreasRequest](docs/TechnicianServiceAreasRequest.md)
279
+ - [Crisphive::TechnicianServiceAreasResponse](docs/TechnicianServiceAreasResponse.md)
280
+ - [Crisphive::TechnicianSkill](docs/TechnicianSkill.md)
281
+ - [Crisphive::TechnicianSkillList](docs/TechnicianSkillList.md)
282
+ - [Crisphive::TechnicianSkillsRequest](docs/TechnicianSkillsRequest.md)
206
283
  - [Crisphive::TechnicianStatus](docs/TechnicianStatus.md)
284
+ - [Crisphive::TechnicianUpdateRequest](docs/TechnicianUpdateRequest.md)
285
+ - [Crisphive::TechnicianVehiclesRequest](docs/TechnicianVehiclesRequest.md)
207
286
  - [Crisphive::Vehicle](docs/Vehicle.md)
208
287
  - [Crisphive::VehicleList](docs/VehicleList.md)
209
288
  - [Crisphive::VehicleOwner](docs/VehicleOwner.md)
@@ -215,5 +294,5 @@ Class | Method | HTTP request | Description
215
294
  Authentication schemes defined for the API:
216
295
  ### ApiKeyAuth
217
296
 
218
- - **Type**: Bearer authentication (CrispHive secret key)
297
+ - **Type**: Bearer authentication (Crisphive secret key)
219
298
 
data/crisphive.gemspec CHANGED
@@ -1,9 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  =begin
4
- #CrispHive Developer API
4
+ #Crisphive Developer API
5
5
 
6
- #Public REST API for integrating CrispHive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test). **Key scopes (restricted keys).** A key is either *full-access* (can call every endpoint below) or *restricted* to a set of permission codes chosen at creation — the same codes as the dashboard permission grid (e.g. `customers_view`, `job_create`, `team_manage`). A restricted key calling an endpoint outside its scope gets `403`. The full code list is the permission catalog (`GET /permission/modules` on the dashboard API). Create, scope, and revoke keys from the business dashboard. Every response is wrapped in the envelope `{ \"error_code\": 0, \"message\": \"Success\", \"data\": <payload> }`.
6
+ #Public REST API for integrating Crisphive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test). **Key scopes (restricted keys).** A key is either *full-access* (can call every endpoint below) or *restricted* to a set of permission codes chosen at creation — the same codes as the dashboard permission grid (e.g. `customers_view`, `job_create`, `team_manage`). A restricted key calling an endpoint outside its scope gets `403`. The full code list is the permission catalog (`GET /permission/modules` on the dashboard API). Create, scope, and revoke keys from the business dashboard. Every response is wrapped in the envelope `{ \"error_code\": 0, \"message\": \"Success\", \"data\": <payload> }`.
7
7
 
8
8
  The version of the OpenAPI document: 1.0
9
9
 
@@ -19,11 +19,11 @@ Gem::Specification.new do |s|
19
19
  s.name = "crisphive"
20
20
  s.version = Crisphive::VERSION
21
21
  s.platform = Gem::Platform::RUBY
22
- s.authors = ["CrispHive"]
22
+ s.authors = ["Crisphive"]
23
23
  s.email = ["developer@crisphive.com"]
24
24
  s.homepage = "https://docs.crisphive.com"
25
- s.summary = "Official Ruby SDK for the CrispHive API"
26
- s.description = "Official Ruby SDK for the CrispHive API. Typed access to the public /v1 API - customers, bookings, catalog, team and fleet."
25
+ s.summary = "Official Ruby SDK for the Crisphive API"
26
+ s.description = "Official Ruby SDK for the Crisphive API. Typed access to the public /v1 API - customers, bookings, catalog, team and fleet."
27
27
  s.license = "MIT"
28
28
  s.required_ruby_version = ">= 2.7"
29
29
  s.metadata = { "source_code_uri" => "https://github.com/crisphive/crisphive-ruby", "documentation_uri" => "https://docs.crisphive.com" }
@@ -1,7 +1,7 @@
1
1
  =begin
2
- #CrispHive Developer API
2
+ #Crisphive Developer API
3
3
 
4
- #Public REST API for integrating CrispHive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test). **Key scopes (restricted keys).** A key is either *full-access* (can call every endpoint below) or *restricted* to a set of permission codes chosen at creation — the same codes as the dashboard permission grid (e.g. `customers_view`, `job_create`, `team_manage`). A restricted key calling an endpoint outside its scope gets `403`. The full code list is the permission catalog (`GET /permission/modules` on the dashboard API). Create, scope, and revoke keys from the business dashboard. Every response is wrapped in the envelope `{ \"error_code\": 0, \"message\": \"Success\", \"data\": <payload> }`.
4
+ #Public REST API for integrating Crisphive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test). **Key scopes (restricted keys).** A key is either *full-access* (can call every endpoint below) or *restricted* to a set of permission codes chosen at creation — the same codes as the dashboard permission grid (e.g. `customers_view`, `job_create`, `team_manage`). A restricted key calling an endpoint outside its scope gets `403`. The full code list is the permission catalog (`GET /permission/modules` on the dashboard API). Create, scope, and revoke keys from the business dashboard. Every response is wrapped in the envelope `{ \"error_code\": 0, \"message\": \"Success\", \"data\": <payload> }`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0
7
7
 
@@ -20,7 +20,7 @@ module Crisphive
20
20
  @api_client = api_client
21
21
  end
22
22
  # List skill categories
23
- # Returns paginated skill categories for the current business, ordered alphabetically.
23
+ # Returns paginated skill categories how the business groups technician qualifications by trade or specialty (e.g. HVAC, plumbing, electrical) — ordered alphabetically.
24
24
  # @param [Hash] opts the optional parameters
25
25
  # @option opts [Integer] :page Page number (default: 1)
26
26
  # @option opts [Integer] :limit Page size (default: 15, max: 1000)
@@ -31,7 +31,7 @@ module Crisphive
31
31
  end
32
32
 
33
33
  # List skill categories
34
- # Returns paginated skill categories for the current business, ordered alphabetically.
34
+ # Returns paginated skill categories how the business groups technician qualifications by trade or specialty (e.g. HVAC, plumbing, electrical) — ordered alphabetically.
35
35
  # @param [Hash] opts the optional parameters
36
36
  # @option opts [Integer] :page Page number (default: 1)
37
37
  # @option opts [Integer] :limit Page size (default: 15, max: 1000)
@@ -83,7 +83,7 @@ module Crisphive
83
83
  end
84
84
 
85
85
  # List all skills
86
- # Returns the flat list of all active skills for the current business across every category. Use this to discover the skill UUIDs accepted in `skill_ids` when creating a job request. (For a category-grouped view, use GET /skill-categories and GET /skill-categories/{id}/skills.)
86
+ # Returns the flat list of all active technician skills / qualifications for the current business the vocabulary the dispatch engine uses for skill-based matching when assigning technicians and crews. Use it to discover the skill UUIDs accepted in `skill_ids` when creating a job request. (For a category-grouped view, use GET /skill-categories and GET /skill-categories/{id}/skills.)
87
87
  # @param [Hash] opts the optional parameters
88
88
  # @return [ListSkills200Response]
89
89
  def list_skills(opts = {})
@@ -92,7 +92,7 @@ module Crisphive
92
92
  end
93
93
 
94
94
  # List all skills
95
- # Returns the flat list of all active skills for the current business across every category. Use this to discover the skill UUIDs accepted in &#x60;skill_ids&#x60; when creating a job request. (For a category-grouped view, use GET /skill-categories and GET /skill-categories/{id}/skills.)
95
+ # Returns the flat list of all active technician skills / qualifications for the current business the vocabulary the dispatch engine uses for skill-based matching when assigning technicians and crews. Use it to discover the skill UUIDs accepted in &#x60;skill_ids&#x60; when creating a job request. (For a category-grouped view, use GET /skill-categories and GET /skill-categories/{id}/skills.)
96
96
  # @param [Hash] opts the optional parameters
97
97
  # @return [Array<(ListSkills200Response, Integer, Hash)>] ListSkills200Response data, response status code and response headers
98
98
  def list_skills_with_http_info(opts = {})
@@ -140,7 +140,7 @@ module Crisphive
140
140
  end
141
141
 
142
142
  # List skills in a category
143
- # Returns paginated skills belonging to the given category, ordered alphabetically. The `members` field on each skill is the count of active technicians currently assigned to it.
143
+ # Returns paginated skills (technician qualifications/certifications) belonging to the given trade/specialty category, ordered alphabetically. The `members` field on each skill is the count of active technicians currently holding it — a quick capacity check per capability.
144
144
  # @param id [String] Skill category ID (UUID)
145
145
  # @param [Hash] opts the optional parameters
146
146
  # @option opts [Integer] :page Page number (default: 1)
@@ -152,7 +152,7 @@ module Crisphive
152
152
  end
153
153
 
154
154
  # List skills in a category
155
- # Returns paginated skills belonging to the given category, ordered alphabetically. The &#x60;members&#x60; field on each skill is the count of active technicians currently assigned to it.
155
+ # Returns paginated skills (technician qualifications/certifications) belonging to the given trade/specialty category, ordered alphabetically. The &#x60;members&#x60; field on each skill is the count of active technicians currently holding it — a quick capacity check per capability.
156
156
  # @param id [String] Skill category ID (UUID)
157
157
  # @param [Hash] opts the optional parameters
158
158
  # @option opts [Integer] :page Page number (default: 1)
@@ -207,5 +207,151 @@ module Crisphive
207
207
  end
208
208
  return data, status_code, headers
209
209
  end
210
+
211
+ # List skills for a technician
212
+ # Returns paginated skills assigned to the technician. By default (`eligible_only` omitted or `true`) only active skills are returned — pass `eligible_only=false` to include inactive skills.
213
+ # @param id [String] Technician ID — business_user_profiles.id (UUID)
214
+ # @param [Hash] opts the optional parameters
215
+ # @option opts [Boolean] :eligible_only true (default) &#x3D; active skills only; false &#x3D; all assigned skills including inactive
216
+ # @option opts [Integer] :page Page number (default: 1)
217
+ # @option opts [Integer] :limit Page size (default: 15, max: 1000)
218
+ # @return [ListTechnicianSkills200Response]
219
+ def list_technician_skills(id, opts = {})
220
+ data, _status_code, _headers = list_technician_skills_with_http_info(id, opts)
221
+ data
222
+ end
223
+
224
+ # List skills for a technician
225
+ # Returns paginated skills assigned to the technician. By default (&#x60;eligible_only&#x60; omitted or &#x60;true&#x60;) only active skills are returned — pass &#x60;eligible_only&#x3D;false&#x60; to include inactive skills.
226
+ # @param id [String] Technician ID — business_user_profiles.id (UUID)
227
+ # @param [Hash] opts the optional parameters
228
+ # @option opts [Boolean] :eligible_only true (default) &#x3D; active skills only; false &#x3D; all assigned skills including inactive
229
+ # @option opts [Integer] :page Page number (default: 1)
230
+ # @option opts [Integer] :limit Page size (default: 15, max: 1000)
231
+ # @return [Array<(ListTechnicianSkills200Response, Integer, Hash)>] ListTechnicianSkills200Response data, response status code and response headers
232
+ def list_technician_skills_with_http_info(id, opts = {})
233
+ if @api_client.config.debugging
234
+ @api_client.config.logger.debug 'Calling API: BusinessSkillApi.list_technician_skills ...'
235
+ end
236
+ # verify the required parameter 'id' is set
237
+ if @api_client.config.client_side_validation && id.nil?
238
+ fail ArgumentError, "Missing the required parameter 'id' when calling BusinessSkillApi.list_technician_skills"
239
+ end
240
+ # resource path
241
+ local_var_path = '/technicians/{id}/skills'.sub('{' + 'id' + '}', CGI.escape(id.to_s))
242
+
243
+ # query parameters
244
+ query_params = opts[:query_params] || {}
245
+ query_params[:'eligible_only'] = opts[:'eligible_only'] if !opts[:'eligible_only'].nil?
246
+ query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil?
247
+ query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
248
+
249
+ # header parameters
250
+ header_params = opts[:header_params] || {}
251
+ # HTTP header 'Accept' (if needed)
252
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
253
+
254
+ # form parameters
255
+ form_params = opts[:form_params] || {}
256
+
257
+ # http body (model)
258
+ post_body = opts[:debug_body]
259
+
260
+ # return_type
261
+ return_type = opts[:debug_return_type] || 'ListTechnicianSkills200Response'
262
+
263
+ # auth_names
264
+ auth_names = opts[:debug_auth_names] || ['ApiKeyAuth']
265
+
266
+ new_options = opts.merge(
267
+ :operation => :"BusinessSkillApi.list_technician_skills",
268
+ :header_params => header_params,
269
+ :query_params => query_params,
270
+ :form_params => form_params,
271
+ :body => post_body,
272
+ :auth_names => auth_names,
273
+ :return_type => return_type
274
+ )
275
+
276
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
277
+ if @api_client.config.debugging
278
+ @api_client.config.logger.debug "API called: BusinessSkillApi#list_technician_skills\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
279
+ end
280
+ return data, status_code, headers
281
+ end
282
+
283
+ # Replace a technician's skills
284
+ # Sets the technician's full skill set in one call (replace semantics): skills not in the list are removed, new ones added. Pass an empty list to clear all. All skills must be active and belong to the business — on SKILL_NOT_FOUND (404) the `data` field contains `{\"missing_ids\": [\"uuid\", ...]}`; on SKILL_INACTIVE (409) it contains `{\"inactive_ids\": [\"uuid\", ...]}`.
285
+ # @param id [String] Technician ID — business_user_profiles.id (UUID)
286
+ # @param technician_skills_request [TechnicianSkillsRequest] Full list of skill_ids (business_skills.id), 0–100 UUIDs
287
+ # @param [Hash] opts the optional parameters
288
+ # @return [ResponseEnvelope]
289
+ def replace_technician_skills(id, technician_skills_request, opts = {})
290
+ data, _status_code, _headers = replace_technician_skills_with_http_info(id, technician_skills_request, opts)
291
+ data
292
+ end
293
+
294
+ # Replace a technician&#39;s skills
295
+ # Sets the technician&#39;s full skill set in one call (replace semantics): skills not in the list are removed, new ones added. Pass an empty list to clear all. All skills must be active and belong to the business — on SKILL_NOT_FOUND (404) the &#x60;data&#x60; field contains &#x60;{\&quot;missing_ids\&quot;: [\&quot;uuid\&quot;, ...]}&#x60;; on SKILL_INACTIVE (409) it contains &#x60;{\&quot;inactive_ids\&quot;: [\&quot;uuid\&quot;, ...]}&#x60;.
296
+ # @param id [String] Technician ID — business_user_profiles.id (UUID)
297
+ # @param technician_skills_request [TechnicianSkillsRequest] Full list of skill_ids (business_skills.id), 0–100 UUIDs
298
+ # @param [Hash] opts the optional parameters
299
+ # @return [Array<(ResponseEnvelope, Integer, Hash)>] ResponseEnvelope data, response status code and response headers
300
+ def replace_technician_skills_with_http_info(id, technician_skills_request, opts = {})
301
+ if @api_client.config.debugging
302
+ @api_client.config.logger.debug 'Calling API: BusinessSkillApi.replace_technician_skills ...'
303
+ end
304
+ # verify the required parameter 'id' is set
305
+ if @api_client.config.client_side_validation && id.nil?
306
+ fail ArgumentError, "Missing the required parameter 'id' when calling BusinessSkillApi.replace_technician_skills"
307
+ end
308
+ # verify the required parameter 'technician_skills_request' is set
309
+ if @api_client.config.client_side_validation && technician_skills_request.nil?
310
+ fail ArgumentError, "Missing the required parameter 'technician_skills_request' when calling BusinessSkillApi.replace_technician_skills"
311
+ end
312
+ # resource path
313
+ local_var_path = '/technicians/{id}/skills'.sub('{' + 'id' + '}', CGI.escape(id.to_s))
314
+
315
+ # query parameters
316
+ query_params = opts[:query_params] || {}
317
+
318
+ # header parameters
319
+ header_params = opts[:header_params] || {}
320
+ # HTTP header 'Accept' (if needed)
321
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
322
+ # HTTP header 'Content-Type'
323
+ content_type = @api_client.select_header_content_type(['application/json'])
324
+ if !content_type.nil?
325
+ header_params['Content-Type'] = content_type
326
+ end
327
+
328
+ # form parameters
329
+ form_params = opts[:form_params] || {}
330
+
331
+ # http body (model)
332
+ post_body = opts[:debug_body] || @api_client.object_to_http_body(technician_skills_request)
333
+
334
+ # return_type
335
+ return_type = opts[:debug_return_type] || 'ResponseEnvelope'
336
+
337
+ # auth_names
338
+ auth_names = opts[:debug_auth_names] || ['ApiKeyAuth']
339
+
340
+ new_options = opts.merge(
341
+ :operation => :"BusinessSkillApi.replace_technician_skills",
342
+ :header_params => header_params,
343
+ :query_params => query_params,
344
+ :form_params => form_params,
345
+ :body => post_body,
346
+ :auth_names => auth_names,
347
+ :return_type => return_type
348
+ )
349
+
350
+ data, status_code, headers = @api_client.call_api(:PATCH, local_var_path, new_options)
351
+ if @api_client.config.debugging
352
+ @api_client.config.logger.debug "API called: BusinessSkillApi#replace_technician_skills\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
353
+ end
354
+ return data, status_code, headers
355
+ end
210
356
  end
211
357
  end
@@ -1,7 +1,7 @@
1
1
  =begin
2
- #CrispHive Developer API
2
+ #Crisphive Developer API
3
3
 
4
- #Public REST API for integrating CrispHive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test). **Key scopes (restricted keys).** A key is either *full-access* (can call every endpoint below) or *restricted* to a set of permission codes chosen at creation — the same codes as the dashboard permission grid (e.g. `customers_view`, `job_create`, `team_manage`). A restricted key calling an endpoint outside its scope gets `403`. The full code list is the permission catalog (`GET /permission/modules` on the dashboard API). Create, scope, and revoke keys from the business dashboard. Every response is wrapped in the envelope `{ \"error_code\": 0, \"message\": \"Success\", \"data\": <payload> }`.
4
+ #Public REST API for integrating Crisphive from your own backend. Authenticate every request with a secret API key as a Bearer token (`Authorization: Bearer chsk_live_…`). The key prefix selects the data environment: `chsk_live_…` → production (live), `chsk_test_…` → sandbox (isolated test). **Key scopes (restricted keys).** A key is either *full-access* (can call every endpoint below) or *restricted* to a set of permission codes chosen at creation — the same codes as the dashboard permission grid (e.g. `customers_view`, `job_create`, `team_manage`). A restricted key calling an endpoint outside its scope gets `403`. The full code list is the permission catalog (`GET /permission/modules` on the dashboard API). Create, scope, and revoke keys from the business dashboard. Every response is wrapped in the envelope `{ \"error_code\": 0, \"message\": \"Success\", \"data\": <payload> }`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0
7
7
 
@@ -20,9 +20,10 @@ module Crisphive
20
20
  @api_client = api_client
21
21
  end
22
22
  # Create a customer
23
- # Adds a new customer record to the current business. Address (street, city, postal_code, ...) and coordinates (latitude/longitude) live under the nested `address` object. service_area_id must be a valid service area UUID belonging to this business.
23
+ # Creates a customer record the client/account profile a job request (work order) is booked against; use it to import or sync customers from your own CRM, website lead form or intake flow. Address (street, city, postal_code, ...) and coordinates (latitude/longitude) live under the nested `address` object. service_area_id must be a valid service area UUID belonging to this business.
24
24
  # @param customer_create_request [CustomerCreateRequest] Customer details
25
25
  # @param [Hash] opts the optional parameters
26
+ # @option opts [String] :idempotency_key Unique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE.
26
27
  # @return [CreateCustomer200Response]
27
28
  def create_customer(customer_create_request, opts = {})
28
29
  data, _status_code, _headers = create_customer_with_http_info(customer_create_request, opts)
@@ -30,9 +31,10 @@ module Crisphive
30
31
  end
31
32
 
32
33
  # Create a customer
33
- # Adds a new customer record to the current business. Address (street, city, postal_code, ...) and coordinates (latitude/longitude) live under the nested &#x60;address&#x60; object. service_area_id must be a valid service area UUID belonging to this business.
34
+ # Creates a customer record the client/account profile a job request (work order) is booked against; use it to import or sync customers from your own CRM, website lead form or intake flow. Address (street, city, postal_code, ...) and coordinates (latitude/longitude) live under the nested &#x60;address&#x60; object. service_area_id must be a valid service area UUID belonging to this business.
34
35
  # @param customer_create_request [CustomerCreateRequest] Customer details
35
36
  # @param [Hash] opts the optional parameters
37
+ # @option opts [String] :idempotency_key Unique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different body returns 422 IDEMPOTENCY_KEY_REUSE.
36
38
  # @return [Array<(CreateCustomer200Response, Integer, Hash)>] CreateCustomer200Response data, response status code and response headers
37
39
  def create_customer_with_http_info(customer_create_request, opts = {})
38
40
  if @api_client.config.debugging
@@ -57,6 +59,7 @@ module Crisphive
57
59
  if !content_type.nil?
58
60
  header_params['Content-Type'] = content_type
59
61
  end
62
+ header_params[:'Idempotency-Key'] = opts[:'idempotency_key'] if !opts[:'idempotency_key'].nil?
60
63
 
61
64
  # form parameters
62
65
  form_params = opts[:form_params] || {}
@@ -88,7 +91,7 @@ module Crisphive
88
91
  end
89
92
 
90
93
  # Delete a customer
91
- # Soft-deletes a customer record.
94
+ # Soft-deletes a customer record, removing it from the active customer directory; existing bookings keep their customer snapshot.
92
95
  # @param id [String] Customer ID
93
96
  # @param [Hash] opts the optional parameters
94
97
  # @return [ResponseEnvelope]
@@ -98,7 +101,7 @@ module Crisphive
98
101
  end
99
102
 
100
103
  # Delete a customer
101
- # Soft-deletes a customer record.
104
+ # Soft-deletes a customer record, removing it from the active customer directory; existing bookings keep their customer snapshot.
102
105
  # @param id [String] Customer ID
103
106
  # @param [Hash] opts the optional parameters
104
107
  # @return [Array<(ResponseEnvelope, Integer, Hash)>] ResponseEnvelope data, response status code and response headers
@@ -151,7 +154,7 @@ module Crisphive
151
154
  end
152
155
 
153
156
  # Get a customer
154
- # Returns the full profile, contact details and spending summary. contact.preferred_technician includes {id, name}. contact.service_area includes {id, name}. contact.address.latitude / contact.address.longitude are null if no coordinates saved.
157
+ # Returns the full customer record: profile, contact details, tier and lifetime spending summary — a 360° client view for support, upsell or CRM enrichment. contact.preferred_technician includes {id, name}. contact.service_area includes {id, name}. contact.address.latitude / contact.address.longitude are null if no coordinates saved.
155
158
  # @param id [String] Customer ID (UUID)
156
159
  # @param [Hash] opts the optional parameters
157
160
  # @return [GetCustomer200Response]
@@ -161,7 +164,7 @@ module Crisphive
161
164
  end
162
165
 
163
166
  # Get a customer
164
- # Returns the full profile, contact details and spending summary. contact.preferred_technician includes {id, name}. contact.service_area includes {id, name}. contact.address.latitude / contact.address.longitude are null if no coordinates saved.
167
+ # Returns the full customer record: profile, contact details, tier and lifetime spending summary — a 360° client view for support, upsell or CRM enrichment. contact.preferred_technician includes {id, name}. contact.service_area includes {id, name}. contact.address.latitude / contact.address.longitude are null if no coordinates saved.
165
168
  # @param id [String] Customer ID (UUID)
166
169
  # @param [Hash] opts the optional parameters
167
170
  # @return [Array<(GetCustomer200Response, Integer, Hash)>] GetCustomer200Response data, response status code and response headers
@@ -214,7 +217,7 @@ module Crisphive
214
217
  end
215
218
 
216
219
  # List customers
217
- # Returns a paginated, searchable list of customers for the current business.
220
+ # Returns a paginated, searchable directory of the business's customer records — the customer database (CRM) behind every booking and work order. Supports the `since`/`next_since` cursor for incremental sync into an external CRM, ERP or marketing tool.
218
221
  # @param [Hash] opts the optional parameters
219
222
  # @option opts [String] :q Search name, UID, phone, email
220
223
  # @option opts [Array<String>] :tier Filter by tier: regular|vip (repeatable)
@@ -231,7 +234,7 @@ module Crisphive
231
234
  end
232
235
 
233
236
  # List customers
234
- # Returns a paginated, searchable list of customers for the current business.
237
+ # Returns a paginated, searchable directory of the business&#39;s customer records — the customer database (CRM) behind every booking and work order. Supports the &#x60;since&#x60;/&#x60;next_since&#x60; cursor for incremental sync into an external CRM, ERP or marketing tool.
235
238
  # @param [Hash] opts the optional parameters
236
239
  # @option opts [String] :q Search name, UID, phone, email
237
240
  # @option opts [Array<String>] :tier Filter by tier: regular|vip (repeatable)
@@ -295,7 +298,7 @@ module Crisphive
295
298
  end
296
299
 
297
300
  # Update a customer
298
- # Replaces mutable fields on a customer record. Pass service_area_id=\"\" to clear the service area. Address fields (including latitude/longitude) live under the nested `address` object.
301
+ # Replaces mutable fields on a customer record — two-way CRM sync friendly (push changes from your system of record). Pass service_area_id=\"\" to clear the service area. Address fields (including latitude/longitude) live under the nested `address` object.
299
302
  # @param id [String] Customer ID (UUID)
300
303
  # @param customer_update_request [CustomerUpdateRequest] Fields to update
301
304
  # @param [Hash] opts the optional parameters
@@ -306,7 +309,7 @@ module Crisphive
306
309
  end
307
310
 
308
311
  # Update a customer
309
- # Replaces mutable fields on a customer record. Pass service_area_id&#x3D;\&quot;\&quot; to clear the service area. Address fields (including latitude/longitude) live under the nested &#x60;address&#x60; object.
312
+ # Replaces mutable fields on a customer record — two-way CRM sync friendly (push changes from your system of record). Pass service_area_id&#x3D;\&quot;\&quot; to clear the service area. Address fields (including latitude/longitude) live under the nested &#x60;address&#x60; object.
310
313
  # @param id [String] Customer ID (UUID)
311
314
  # @param customer_update_request [CustomerUpdateRequest] Fields to update
312
315
  # @param [Hash] opts the optional parameters