Skip to main content

ghl_models/v3/
calendars.rs

1//! `calendars` data models for GoHighLevel API V3 (94 types).
2//!
3//! Generated from HighLevel's official OpenAPI spec for the
4//! **Calendars** module. Every endpoint that uses these types, with its
5//! parameters, required scopes and enum values, is documented in the
6//! [`calendars` API reference](https://github.com/Shahroz/ghl-rs/blob/main/docs/api/calendars.md).
7//!
8//! Enable with `features = ["calendars"]`.
9// @generated by xtask/generate_models.py — do not edit by hand.
10// Source: https://github.com/GoHighLevel/highlevel-api-docs
11// Doc comments are HighLevel's own field descriptions, reflowed verbatim, so
12// they aren't held to rustdoc's markdown conventions.
13#![allow(
14    missing_docs,
15    clippy::doc_lazy_continuation,
16    clippy::doc_overindented_list_items
17)]
18
19use serde::{Deserialize, Serialize};
20
21/// `AllGroupsSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
22#[derive(Debug, Clone, Default, Serialize, Deserialize)]
23pub struct AllGroupsSuccessfulResponseDTO {
24    #[serde(default, skip_serializing_if = "Vec::is_empty")]
25    pub groups: Vec<GroupDTO>,
26}
27
28/// `AppointmentCreateSchema` from the GoHighLevel OpenAPI spec.
29#[derive(Debug, Clone, Default, Serialize, Deserialize)]
30pub struct AppointmentCreateSchema {
31    /// Title
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub title: Option<String>,
34    /// Meeting location type. - If `address` is provided in the request body, the
35    /// `meetingLocationType` defaults to **custom**.
36    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `ms_teams`, `google`.
37    #[serde(
38        rename = "meetingLocationType",
39        default,
40        skip_serializing_if = "Option::is_none"
41    )]
42    pub meeting_location_type: Option<String>,
43    /// The unique identifier for the meeting location. - This value can be found in
44    /// `calendar.locationConfigurations`or `calendar.teamMembers[].locationConfigurations`
45    #[serde(
46        rename = "meetingLocationId",
47        default,
48        skip_serializing_if = "Option::is_none"
49    )]
50    pub meeting_location_id: Option<String>,
51    /// Flag to override location config - **false** - If only `meetingLocationId` is provided -
52    /// **true** - If only `meetingLocationType` is provided
53    #[serde(
54        rename = "overrideLocationConfig",
55        default,
56        skip_serializing_if = "Option::is_none"
57    )]
58    pub override_location_config: Option<bool>,
59    /// Allowed values: `new`, `confirmed`, `cancelled`, `showed`, `noshow`, `invalid`,
60    /// `completed`, `active`.
61    #[serde(
62        rename = "appointmentStatus",
63        default,
64        skip_serializing_if = "Option::is_none"
65    )]
66    pub appointment_status: Option<String>,
67    /// Assigned User Id
68    #[serde(
69        rename = "assignedUserId",
70        default,
71        skip_serializing_if = "Option::is_none"
72    )]
73    pub assigned_user_id: Option<String>,
74    /// Appointment Description
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub description: Option<String>,
77    /// Appointment Address
78    #[serde(default, skip_serializing_if = "Option::is_none")]
79    pub address: Option<String>,
80    /// If set to true, the minimum scheduling notice and date range would be ignored
81    #[serde(
82        rename = "ignoreDateRange",
83        default,
84        skip_serializing_if = "Option::is_none"
85    )]
86    pub ignore_date_range: Option<bool>,
87    /// If set to false, the automations will not run. Defaults to true
88    #[serde(rename = "toNotify", default, skip_serializing_if = "Option::is_none")]
89    pub to_notify: Option<bool>,
90    /// If true the time slot validation would be avoided for any appointment creation (even the
91    /// ignoreDateRange)
92    #[serde(
93        rename = "ignoreFreeSlotValidation",
94        default,
95        skip_serializing_if = "Option::is_none"
96    )]
97    pub ignore_free_slot_validation: Option<bool>,
98    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not
99    /// required, instance ids are calculated on the basis of startTime of the event. The rrule
100    /// only be applied if ignoreFreeSlotValidation is true.
101    #[serde(default, skip_serializing_if = "Option::is_none")]
102    pub rrule: Option<String>,
103    /// Calendar Id
104    /// Required by the API.
105    #[serde(rename = "calendarId")]
106    pub calendar_id: String,
107    /// Location Id
108    /// Required by the API.
109    #[serde(rename = "locationId")]
110    pub location_id: String,
111    /// Contact Id
112    /// Required by the API.
113    #[serde(rename = "contactId")]
114    pub contact_id: String,
115    /// Start Time
116    /// Required by the API.
117    #[serde(rename = "startTime")]
118    pub start_time: String,
119    /// End Time
120    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
121    pub end_time: Option<String>,
122}
123
124/// `AppointmentEditSchema` from the GoHighLevel OpenAPI spec.
125#[derive(Debug, Clone, Default, Serialize, Deserialize)]
126pub struct AppointmentEditSchema {
127    /// Title
128    #[serde(default, skip_serializing_if = "Option::is_none")]
129    pub title: Option<String>,
130    /// Meeting location type. - If `address` is provided in the request body, the
131    /// `meetingLocationType` defaults to **custom**.
132    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `ms_teams`, `google`.
133    #[serde(
134        rename = "meetingLocationType",
135        default,
136        skip_serializing_if = "Option::is_none"
137    )]
138    pub meeting_location_type: Option<String>,
139    /// The unique identifier for the meeting location. - This value can be found in
140    /// `calendar.locationConfigurations`or `calendar.teamMembers[].locationConfigurations`
141    #[serde(
142        rename = "meetingLocationId",
143        default,
144        skip_serializing_if = "Option::is_none"
145    )]
146    pub meeting_location_id: Option<String>,
147    /// Flag to override location config - **false** - If only `meetingLocationId` is provided -
148    /// **true** - If only `meetingLocationType` is provided
149    #[serde(
150        rename = "overrideLocationConfig",
151        default,
152        skip_serializing_if = "Option::is_none"
153    )]
154    pub override_location_config: Option<bool>,
155    /// Allowed values: `new`, `confirmed`, `cancelled`, `showed`, `noshow`, `invalid`,
156    /// `completed`, `active`.
157    #[serde(
158        rename = "appointmentStatus",
159        default,
160        skip_serializing_if = "Option::is_none"
161    )]
162    pub appointment_status: Option<String>,
163    /// Assigned User Id
164    #[serde(
165        rename = "assignedUserId",
166        default,
167        skip_serializing_if = "Option::is_none"
168    )]
169    pub assigned_user_id: Option<String>,
170    /// Appointment Description
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub description: Option<String>,
173    /// Appointment Address
174    #[serde(default, skip_serializing_if = "Option::is_none")]
175    pub address: Option<String>,
176    /// If set to true, the minimum scheduling notice and date range would be ignored
177    #[serde(
178        rename = "ignoreDateRange",
179        default,
180        skip_serializing_if = "Option::is_none"
181    )]
182    pub ignore_date_range: Option<bool>,
183    /// If set to false, the automations will not run. Defaults to true
184    #[serde(rename = "toNotify", default, skip_serializing_if = "Option::is_none")]
185    pub to_notify: Option<bool>,
186    /// If true the time slot validation would be avoided for any appointment creation (even the
187    /// ignoreDateRange)
188    #[serde(
189        rename = "ignoreFreeSlotValidation",
190        default,
191        skip_serializing_if = "Option::is_none"
192    )]
193    pub ignore_free_slot_validation: Option<bool>,
194    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not
195    /// required, instance ids are calculated on the basis of startTime of the event. The rrule
196    /// only be applied if ignoreFreeSlotValidation is true.
197    #[serde(default, skip_serializing_if = "Option::is_none")]
198    pub rrule: Option<String>,
199    /// Calendar Id
200    #[serde(
201        rename = "calendarId",
202        default,
203        skip_serializing_if = "Option::is_none"
204    )]
205    pub calendar_id: Option<String>,
206    /// Start Time
207    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
208    pub start_time: Option<String>,
209    /// End Time
210    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
211    pub end_time: Option<String>,
212}
213
214/// `AppointmentSchemaResponse` from the GoHighLevel OpenAPI spec.
215#[derive(Debug, Clone, Default, Serialize, Deserialize)]
216pub struct AppointmentSchemaResponse {
217    /// Calendar Id
218    /// Required by the API.
219    /// (Optional here so responses that omit it still parse.)
220    #[serde(
221        rename = "calendarId",
222        default,
223        skip_serializing_if = "Option::is_none"
224    )]
225    pub calendar_id: Option<String>,
226    /// Location Id
227    /// Required by the API.
228    /// (Optional here so responses that omit it still parse.)
229    #[serde(
230        rename = "locationId",
231        default,
232        skip_serializing_if = "Option::is_none"
233    )]
234    pub location_id: Option<String>,
235    /// Contact Id
236    /// Required by the API.
237    /// (Optional here so responses that omit it still parse.)
238    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
239    pub contact_id: Option<String>,
240    /// Start Time
241    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
242    pub start_time: Option<String>,
243    /// End Time
244    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
245    pub end_time: Option<String>,
246    /// Title
247    #[serde(default, skip_serializing_if = "Option::is_none")]
248    pub title: Option<String>,
249    /// Meeting Location Type
250    #[serde(
251        rename = "meetingLocationType",
252        default,
253        skip_serializing_if = "Option::is_none"
254    )]
255    pub meeting_location_type: Option<String>,
256    /// Allowed values: `new`, `confirmed`, `cancelled`, `showed`, `noshow`, `invalid`,
257    /// `active`, `completed`.
258    #[serde(
259        rename = "appointmentStatus",
260        default,
261        skip_serializing_if = "Option::is_none"
262    )]
263    pub appointment_status: Option<String>,
264    /// Assigned User Id
265    #[serde(
266        rename = "assignedUserId",
267        default,
268        skip_serializing_if = "Option::is_none"
269    )]
270    pub assigned_user_id: Option<String>,
271    /// Appointment Address
272    #[serde(default, skip_serializing_if = "Option::is_none")]
273    pub address: Option<String>,
274    /// true if the event is recurring otherwise false
275    #[serde(
276        rename = "isRecurring",
277        default,
278        skip_serializing_if = "Option::is_none"
279    )]
280    pub is_recurring: Option<bool>,
281    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events
282    #[serde(default, skip_serializing_if = "Option::is_none")]
283    pub rrule: Option<String>,
284    /// Date Added
285    /// Required by the API.
286    /// (Optional here so responses that omit it still parse.)
287    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
288    pub date_added: Option<String>,
289    /// Date Updated
290    /// Required by the API.
291    /// (Optional here so responses that omit it still parse.)
292    #[serde(
293        rename = "dateUpdated",
294        default,
295        skip_serializing_if = "Option::is_none"
296    )]
297    pub date_updated: Option<String>,
298    /// Id
299    /// Required by the API.
300    /// (Optional here so responses that omit it still parse.)
301    #[serde(default, skip_serializing_if = "Option::is_none")]
302    pub id: Option<String>,
303}
304
305/// `Availability` from the GoHighLevel OpenAPI spec.
306#[derive(Debug, Clone, Default, Serialize, Deserialize)]
307pub struct Availability {
308    /// Formulate the date string in the format of ` T00:00:00.000Z`.
309    /// Required by the API.
310    /// (Optional here so responses that omit it still parse.)
311    #[serde(default, skip_serializing_if = "Option::is_none")]
312    pub date: Option<String>,
313    /// Required by the API.
314    /// (Optional here so responses that omit it still parse.)
315    #[serde(default, skip_serializing_if = "Vec::is_empty")]
316    pub hours: Vec<Hour>,
317    #[serde(default, skip_serializing_if = "Option::is_none")]
318    pub deleted: Option<bool>,
319}
320
321/// `BlockSlotCreateRequestDTO` from the GoHighLevel OpenAPI spec.
322#[derive(Debug, Clone, Default, Serialize, Deserialize)]
323pub struct BlockSlotCreateRequestDTO {
324    /// Title
325    #[serde(default, skip_serializing_if = "Option::is_none")]
326    pub title: Option<String>,
327    /// Either calendarId or assignedUserId can be set, not both.
328    /// Required by the API.
329    #[serde(rename = "calendarId")]
330    pub calendar_id: String,
331    /// Either calendarId or assignedUserId can be set, not both.
332    #[serde(
333        rename = "assignedUserId",
334        default,
335        skip_serializing_if = "Option::is_none"
336    )]
337    pub assigned_user_id: Option<String>,
338    /// Location Id
339    /// Required by the API.
340    #[serde(rename = "locationId")]
341    pub location_id: String,
342    /// Start Time
343    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
344    pub start_time: Option<String>,
345    /// End Time
346    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
347    pub end_time: Option<String>,
348}
349
350/// `BlockSlotEditRequestDTO` from the GoHighLevel OpenAPI spec.
351#[derive(Debug, Clone, Default, Serialize, Deserialize)]
352pub struct BlockSlotEditRequestDTO {
353    /// Title
354    #[serde(default, skip_serializing_if = "Option::is_none")]
355    pub title: Option<String>,
356    /// Either calendarId or assignedUserId can be set, not both.
357    /// Required by the API.
358    #[serde(rename = "calendarId")]
359    pub calendar_id: String,
360    /// Either calendarId or assignedUserId can be set, not both.
361    #[serde(
362        rename = "assignedUserId",
363        default,
364        skip_serializing_if = "Option::is_none"
365    )]
366    pub assigned_user_id: Option<String>,
367    /// Location Id
368    /// Required by the API.
369    #[serde(rename = "locationId")]
370    pub location_id: String,
371    /// Start Time
372    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
373    pub start_time: Option<String>,
374    /// End Time
375    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
376    pub end_time: Option<String>,
377}
378
379/// `BlockedSlotSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
380#[derive(Debug, Clone, Default, Serialize, Deserialize)]
381pub struct BlockedSlotSuccessfulResponseDto {
382    /// Id
383    /// Required by the API.
384    /// (Optional here so responses that omit it still parse.)
385    #[serde(default, skip_serializing_if = "Option::is_none")]
386    pub id: Option<String>,
387    /// Location Id
388    /// Required by the API.
389    /// (Optional here so responses that omit it still parse.)
390    #[serde(
391        rename = "locationId",
392        default,
393        skip_serializing_if = "Option::is_none"
394    )]
395    pub location_id: Option<String>,
396    /// Title
397    /// Required by the API.
398    /// (Optional here so responses that omit it still parse.)
399    #[serde(default, skip_serializing_if = "Option::is_none")]
400    pub title: Option<String>,
401    /// Start Time
402    /// Required by the API.
403    /// (Optional here so responses that omit it still parse.)
404    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
405    pub start_time: Option<serde_json::Value>,
406    /// End Time
407    /// Required by the API.
408    /// (Optional here so responses that omit it still parse.)
409    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
410    pub end_time: Option<serde_json::Value>,
411    /// Calendar id
412    #[serde(
413        rename = "calendarId",
414        default,
415        skip_serializing_if = "Option::is_none"
416    )]
417    pub calendar_id: Option<String>,
418    /// Assigned User Id
419    #[serde(
420        rename = "assignedUserId",
421        default,
422        skip_serializing_if = "Option::is_none"
423    )]
424    pub assigned_user_id: Option<String>,
425}
426
427/// `CalendarByIdSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
428#[derive(Debug, Clone, Default, Serialize, Deserialize)]
429pub struct CalendarByIdSuccessfulResponseDTO {
430    /// Required by the API.
431    /// (Optional here so responses that omit it still parse.)
432    #[serde(default, skip_serializing_if = "Option::is_none")]
433    pub calendar: Option<CalendarDTO>,
434}
435
436/// `CalendarCreateDTO` from the GoHighLevel OpenAPI spec.
437#[derive(Debug, Clone, Default, Serialize, Deserialize)]
438pub struct CalendarCreateDTO {
439    /// Should the created calendar be active or draft
440    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
441    pub is_active: Option<bool>,
442    /// 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
443    #[serde(default, skip_serializing_if = "Vec::is_empty")]
444    pub notifications: Vec<CalendarNotification>,
445    /// Required by the API.
446    #[serde(rename = "locationId")]
447    pub location_id: String,
448    /// Group Id
449    #[serde(rename = "groupId", default, skip_serializing_if = "Option::is_none")]
450    pub group_id: Option<String>,
451    /// Team members are required for calendars of type: Round Robin, Collective, Class,
452    /// Service. Personal calendar must have exactly one team member.
453    #[serde(rename = "teamMembers", default, skip_serializing_if = "Vec::is_empty")]
454    pub team_members: Vec<TeamMember>,
455    /// Allowed values: `RoundRobin_OptimizeForAvailability`,
456    /// `RoundRobin_OptimizeForEqualDistribution`.
457    #[serde(rename = "eventType", default, skip_serializing_if = "Option::is_none")]
458    pub event_type: Option<String>,
459    /// Required by the API.
460    pub name: String,
461    #[serde(default, skip_serializing_if = "Option::is_none")]
462    pub description: Option<String>,
463    #[serde(default, skip_serializing_if = "Option::is_none")]
464    pub slug: Option<String>,
465    #[serde(
466        rename = "widgetSlug",
467        default,
468        skip_serializing_if = "Option::is_none"
469    )]
470    pub widget_slug: Option<String>,
471    /// Allowed values: `round_robin`, `event`, `class_booking`, `collective`,
472    /// `service_booking`, `personal`.
473    #[serde(
474        rename = "calendarType",
475        default,
476        skip_serializing_if = "Option::is_none"
477    )]
478    pub calendar_type: Option<String>,
479    /// Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
480    /// Allowed values: `default`, `classic`.
481    #[serde(
482        rename = "widgetType",
483        default,
484        skip_serializing_if = "Option::is_none"
485    )]
486    pub widget_type: Option<String>,
487    #[serde(
488        rename = "eventTitle",
489        default,
490        skip_serializing_if = "Option::is_none"
491    )]
492    pub event_title: Option<String>,
493    #[serde(
494        rename = "eventColor",
495        default,
496        skip_serializing_if = "Option::is_none"
497    )]
498    pub event_color: Option<String>,
499    /// 🚨 Deprecated! Use `locationConfigurations.location` or
500    /// `teamMembers[].locationConfigurations.location` instead.
501    #[serde(
502        rename = "meetingLocation",
503        default,
504        skip_serializing_if = "Option::is_none"
505    )]
506    pub meeting_location: Option<String>,
507    /// Meeting location configuration for event calendar
508    #[serde(
509        rename = "locationConfigurations",
510        default,
511        skip_serializing_if = "Vec::is_empty"
512    )]
513    pub location_configurations: Vec<LocationConfiguration>,
514    /// This controls the duration of the meeting
515    #[serde(
516        rename = "slotDuration",
517        default,
518        skip_serializing_if = "Option::is_none"
519    )]
520    pub slot_duration: Option<f64>,
521    /// Unit for slot duration.
522    /// Allowed values: `mins`, `hours`.
523    #[serde(
524        rename = "slotDurationUnit",
525        default,
526        skip_serializing_if = "Option::is_none"
527    )]
528    pub slot_duration_unit: Option<String>,
529    /// Slot interval reflects the amount of time the between booking slots that will be shown
530    /// in the calendar.
531    #[serde(
532        rename = "slotInterval",
533        default,
534        skip_serializing_if = "Option::is_none"
535    )]
536    pub slot_interval: Option<f64>,
537    /// Unit for slot interval.
538    /// Allowed values: `mins`, `hours`.
539    #[serde(
540        rename = "slotIntervalUnit",
541        default,
542        skip_serializing_if = "Option::is_none"
543    )]
544    pub slot_interval_unit: Option<String>,
545    /// Slot-Buffer is additional time that can be added after an appointment, allowing for
546    /// extra time to wrap up
547    #[serde(
548        rename = "slotBuffer",
549        default,
550        skip_serializing_if = "Option::is_none"
551    )]
552    pub slot_buffer: Option<f64>,
553    /// Unit for slot buffer.
554    /// Allowed values: `mins`, `hours`.
555    #[serde(
556        rename = "slotBufferUnit",
557        default,
558        skip_serializing_if = "Option::is_none"
559    )]
560    pub slot_buffer_unit: Option<String>,
561    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
562    /// extra time to get ready
563    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
564    pub pre_buffer: Option<f64>,
565    /// Unit for pre-buffer.
566    /// Allowed values: `mins`, `hours`.
567    #[serde(
568        rename = "preBufferUnit",
569        default,
570        skip_serializing_if = "Option::is_none"
571    )]
572    pub pre_buffer_unit: Option<String>,
573    /// Maximum bookings per slot (per user). Maximum seats per slot in case of Class Booking
574    /// Calendar.
575    #[serde(
576        rename = "appoinmentPerSlot",
577        default,
578        skip_serializing_if = "Option::is_none"
579    )]
580    pub appoinment_per_slot: Option<f64>,
581    /// Number of appointments that can be booked for a given day
582    #[serde(
583        rename = "appoinmentPerDay",
584        default,
585        skip_serializing_if = "Option::is_none"
586    )]
587    pub appoinment_per_day: Option<f64>,
588    /// Minimum scheduling notice for events
589    #[serde(
590        rename = "allowBookingAfter",
591        default,
592        skip_serializing_if = "Option::is_none"
593    )]
594    pub allow_booking_after: Option<f64>,
595    /// Unit for minimum scheduling notice
596    /// Allowed values: `hours`, `days`, `weeks`, `months`, `mins`.
597    #[serde(
598        rename = "allowBookingAfterUnit",
599        default,
600        skip_serializing_if = "Option::is_none"
601    )]
602    pub allow_booking_after_unit: Option<String>,
603    /// Minimum number of days/weeks/months for which to allow booking events
604    #[serde(
605        rename = "allowBookingFor",
606        default,
607        skip_serializing_if = "Option::is_none"
608    )]
609    pub allow_booking_for: Option<f64>,
610    /// Unit for controlling the duration for which booking would be allowed for
611    /// Allowed values: `days`, `weeks`, `months`.
612    #[serde(
613        rename = "allowBookingForUnit",
614        default,
615        skip_serializing_if = "Option::is_none"
616    )]
617    pub allow_booking_for_unit: Option<String>,
618    /// While we will support this property for backward compatibility, it is recommended to use
619    /// 'Availability' APIs instead.
620    #[serde(rename = "openHours", default, skip_serializing_if = "Vec::is_empty")]
621    pub open_hours: Vec<OpenHour>,
622    /// Enable recurring appointments for the calendars. Please note that only one member should
623    /// be added in the calendar to enable this
624    #[serde(
625        rename = "enableRecurring",
626        default,
627        skip_serializing_if = "Option::is_none"
628    )]
629    pub enable_recurring: Option<bool>,
630    #[serde(default, skip_serializing_if = "Option::is_none")]
631    pub recurring: Option<Recurring>,
632    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
633    pub form_id: Option<String>,
634    #[serde(
635        rename = "stickyContact",
636        default,
637        skip_serializing_if = "Option::is_none"
638    )]
639    pub sticky_contact: Option<bool>,
640    #[serde(
641        rename = "isLivePaymentMode",
642        default,
643        skip_serializing_if = "Option::is_none"
644    )]
645    pub is_live_payment_mode: Option<bool>,
646    #[serde(
647        rename = "autoConfirm",
648        default,
649        skip_serializing_if = "Option::is_none"
650    )]
651    pub auto_confirm: Option<bool>,
652    #[serde(
653        rename = "shouldSendAlertEmailsToAssignedMember",
654        default,
655        skip_serializing_if = "Option::is_none"
656    )]
657    pub should_send_alert_emails_to_assigned_member: Option<bool>,
658    #[serde(
659        rename = "alertEmail",
660        default,
661        skip_serializing_if = "Option::is_none"
662    )]
663    pub alert_email: Option<String>,
664    #[serde(
665        rename = "googleInvitationEmails",
666        default,
667        skip_serializing_if = "Option::is_none"
668    )]
669    pub google_invitation_emails: Option<bool>,
670    #[serde(
671        rename = "allowReschedule",
672        default,
673        skip_serializing_if = "Option::is_none"
674    )]
675    pub allow_reschedule: Option<bool>,
676    #[serde(
677        rename = "allowCancellation",
678        default,
679        skip_serializing_if = "Option::is_none"
680    )]
681    pub allow_cancellation: Option<bool>,
682    #[serde(
683        rename = "shouldAssignContactToTeamMember",
684        default,
685        skip_serializing_if = "Option::is_none"
686    )]
687    pub should_assign_contact_to_team_member: Option<bool>,
688    #[serde(
689        rename = "shouldSkipAssigningContactForExisting",
690        default,
691        skip_serializing_if = "Option::is_none"
692    )]
693    pub should_skip_assigning_contact_for_existing: Option<bool>,
694    #[serde(default, skip_serializing_if = "Option::is_none")]
695    pub notes: Option<String>,
696    #[serde(rename = "pixelId", default, skip_serializing_if = "Option::is_none")]
697    pub pixel_id: Option<String>,
698    /// Allowed values: `RedirectURL`, `ThankYouMessage`.
699    #[serde(
700        rename = "formSubmitType",
701        default,
702        skip_serializing_if = "Option::is_none"
703    )]
704    pub form_submit_type: Option<String>,
705    #[serde(
706        rename = "formSubmitRedirectURL",
707        default,
708        skip_serializing_if = "Option::is_none"
709    )]
710    pub form_submit_redirect_url: Option<String>,
711    #[serde(
712        rename = "formSubmitThanksMessage",
713        default,
714        skip_serializing_if = "Option::is_none"
715    )]
716    pub form_submit_thanks_message: Option<String>,
717    /// While we will support this property for backward compatibility, it is not required
718    /// anymore.
719    /// Allowed values: `0`, `1`.
720    #[serde(
721        rename = "availabilityType",
722        default,
723        skip_serializing_if = "Option::is_none"
724    )]
725    pub availability_type: Option<String>,
726    /// While we will support this property for backward compatibility, it is recommended to use
727    /// 'Availability' APIs instead.
728    #[serde(default, skip_serializing_if = "Vec::is_empty")]
729    pub availabilities: Vec<Availability>,
730    /// Allowed values: `count_only`, `collect_detail`.
731    #[serde(rename = "guestType", default, skip_serializing_if = "Option::is_none")]
732    pub guest_type: Option<String>,
733    #[serde(
734        rename = "consentLabel",
735        default,
736        skip_serializing_if = "Option::is_none"
737    )]
738    pub consent_label: Option<String>,
739    #[serde(
740        rename = "calendarCoverImage",
741        default,
742        skip_serializing_if = "Option::is_none"
743    )]
744    pub calendar_cover_image: Option<String>,
745    /// Look Busy Configuration
746    #[serde(
747        rename = "lookBusyConfig",
748        default,
749        skip_serializing_if = "Option::is_none"
750    )]
751    pub look_busy_config: Option<LookBusyConfiguration>,
752}
753
754/// `CalendarDTO` from the GoHighLevel OpenAPI spec.
755#[derive(Debug, Clone, Default, Serialize, Deserialize)]
756pub struct CalendarDTO {
757    /// Should the created calendar be active or draft
758    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
759    pub is_active: Option<bool>,
760    /// 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
761    #[serde(default, skip_serializing_if = "Vec::is_empty")]
762    pub notifications: Vec<CalendarNotification>,
763    /// Required by the API.
764    /// (Optional here so responses that omit it still parse.)
765    #[serde(
766        rename = "locationId",
767        default,
768        skip_serializing_if = "Option::is_none"
769    )]
770    pub location_id: Option<String>,
771    /// Group Id
772    #[serde(rename = "groupId", default, skip_serializing_if = "Option::is_none")]
773    pub group_id: Option<String>,
774    /// Team members are for calendars of type: Round Robin, Collective, Class, Service.
775    /// Personal calendar must have exactly one team member.
776    #[serde(rename = "teamMembers", default, skip_serializing_if = "Vec::is_empty")]
777    pub team_members: Vec<TeamMemberResponse>,
778    /// Allowed values: `RoundRobin_OptimizeForAvailability`,
779    /// `RoundRobin_OptimizeForEqualDistribution`.
780    #[serde(rename = "eventType", default, skip_serializing_if = "Option::is_none")]
781    pub event_type: Option<String>,
782    /// Required by the API.
783    /// (Optional here so responses that omit it still parse.)
784    #[serde(default, skip_serializing_if = "Option::is_none")]
785    pub name: Option<String>,
786    #[serde(default, skip_serializing_if = "Option::is_none")]
787    pub description: Option<String>,
788    #[serde(default, skip_serializing_if = "Option::is_none")]
789    pub slug: Option<String>,
790    #[serde(
791        rename = "widgetSlug",
792        default,
793        skip_serializing_if = "Option::is_none"
794    )]
795    pub widget_slug: Option<String>,
796    /// Allowed values: `round_robin`, `event`, `class_booking`, `collective`,
797    /// `service_booking`, `personal`.
798    #[serde(
799        rename = "calendarType",
800        default,
801        skip_serializing_if = "Option::is_none"
802    )]
803    pub calendar_type: Option<String>,
804    /// Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
805    /// Allowed values: `default`, `classic`.
806    #[serde(
807        rename = "widgetType",
808        default,
809        skip_serializing_if = "Option::is_none"
810    )]
811    pub widget_type: Option<String>,
812    #[serde(
813        rename = "eventTitle",
814        default,
815        skip_serializing_if = "Option::is_none"
816    )]
817    pub event_title: Option<String>,
818    #[serde(
819        rename = "eventColor",
820        default,
821        skip_serializing_if = "Option::is_none"
822    )]
823    pub event_color: Option<String>,
824    /// 🚨 Deprecated! Use `locationConfigurations.location` or
825    /// `teamMembers[].locationConfigurations.location` instead.
826    #[serde(
827        rename = "meetingLocation",
828        default,
829        skip_serializing_if = "Option::is_none"
830    )]
831    pub meeting_location: Option<String>,
832    /// Meeting location configuration for event calendar
833    #[serde(
834        rename = "locationConfigurations",
835        default,
836        skip_serializing_if = "Vec::is_empty"
837    )]
838    pub location_configurations: Vec<LocationConfigurationResponse>,
839    /// This controls the duration of the meeting
840    #[serde(
841        rename = "slotDuration",
842        default,
843        skip_serializing_if = "Option::is_none"
844    )]
845    pub slot_duration: Option<f64>,
846    /// Unit for slot duration.
847    /// Allowed values: `mins`, `hours`.
848    #[serde(
849        rename = "slotDurationUnit",
850        default,
851        skip_serializing_if = "Option::is_none"
852    )]
853    pub slot_duration_unit: Option<String>,
854    /// Slot interval reflects the amount of time the between booking slots that will be shown
855    /// in the calendar.
856    #[serde(
857        rename = "slotInterval",
858        default,
859        skip_serializing_if = "Option::is_none"
860    )]
861    pub slot_interval: Option<f64>,
862    /// Unit for slot interval.
863    /// Allowed values: `mins`, `hours`.
864    #[serde(
865        rename = "slotIntervalUnit",
866        default,
867        skip_serializing_if = "Option::is_none"
868    )]
869    pub slot_interval_unit: Option<String>,
870    /// Slot-Buffer is additional time that can be added after an appointment, allowing for
871    /// extra time to wrap up
872    #[serde(
873        rename = "slotBuffer",
874        default,
875        skip_serializing_if = "Option::is_none"
876    )]
877    pub slot_buffer: Option<f64>,
878    /// Unit for slot buffer.
879    /// Allowed values: `mins`, `hours`.
880    #[serde(
881        rename = "slotBufferUnit",
882        default,
883        skip_serializing_if = "Option::is_none"
884    )]
885    pub slot_buffer_unit: Option<String>,
886    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
887    /// extra time to get ready
888    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
889    pub pre_buffer: Option<f64>,
890    /// Unit for pre-buffer.
891    /// Allowed values: `mins`, `hours`.
892    #[serde(
893        rename = "preBufferUnit",
894        default,
895        skip_serializing_if = "Option::is_none"
896    )]
897    pub pre_buffer_unit: Option<String>,
898    /// Maximum bookings per slot (per user). Maximum seats per slot in case of Class Booking
899    /// Calendar.
900    #[serde(
901        rename = "appoinmentPerSlot",
902        default,
903        skip_serializing_if = "Option::is_none"
904    )]
905    pub appoinment_per_slot: Option<f64>,
906    /// Number of appointments that can be booked for a given day
907    #[serde(
908        rename = "appoinmentPerDay",
909        default,
910        skip_serializing_if = "Option::is_none"
911    )]
912    pub appoinment_per_day: Option<f64>,
913    /// Minimum scheduling notice for events
914    #[serde(
915        rename = "allowBookingAfter",
916        default,
917        skip_serializing_if = "Option::is_none"
918    )]
919    pub allow_booking_after: Option<f64>,
920    /// Unit for minimum scheduling notice
921    /// Allowed values: `hours`, `days`, `weeks`, `months`, `mins`.
922    #[serde(
923        rename = "allowBookingAfterUnit",
924        default,
925        skip_serializing_if = "Option::is_none"
926    )]
927    pub allow_booking_after_unit: Option<String>,
928    /// Minimum number of days/weeks/months for which to allow booking events
929    #[serde(
930        rename = "allowBookingFor",
931        default,
932        skip_serializing_if = "Option::is_none"
933    )]
934    pub allow_booking_for: Option<f64>,
935    /// Unit for controlling the duration for which booking would be allowed for
936    /// Allowed values: `days`, `weeks`, `months`.
937    #[serde(
938        rename = "allowBookingForUnit",
939        default,
940        skip_serializing_if = "Option::is_none"
941    )]
942    pub allow_booking_for_unit: Option<String>,
943    /// While we will support this property for backward compatibility, it is recommended to use
944    /// 'Availability' APIs instead.
945    #[serde(rename = "openHours", default, skip_serializing_if = "Vec::is_empty")]
946    pub open_hours: Vec<OpenHour>,
947    /// Enable recurring appointments for the calendars. Please note that only one member should
948    /// be added in the calendar to enable this
949    #[serde(
950        rename = "enableRecurring",
951        default,
952        skip_serializing_if = "Option::is_none"
953    )]
954    pub enable_recurring: Option<bool>,
955    #[serde(default, skip_serializing_if = "Option::is_none")]
956    pub recurring: Option<Recurring>,
957    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
958    pub form_id: Option<String>,
959    #[serde(
960        rename = "stickyContact",
961        default,
962        skip_serializing_if = "Option::is_none"
963    )]
964    pub sticky_contact: Option<bool>,
965    #[serde(
966        rename = "isLivePaymentMode",
967        default,
968        skip_serializing_if = "Option::is_none"
969    )]
970    pub is_live_payment_mode: Option<bool>,
971    #[serde(
972        rename = "autoConfirm",
973        default,
974        skip_serializing_if = "Option::is_none"
975    )]
976    pub auto_confirm: Option<bool>,
977    #[serde(
978        rename = "shouldSendAlertEmailsToAssignedMember",
979        default,
980        skip_serializing_if = "Option::is_none"
981    )]
982    pub should_send_alert_emails_to_assigned_member: Option<bool>,
983    #[serde(
984        rename = "alertEmail",
985        default,
986        skip_serializing_if = "Option::is_none"
987    )]
988    pub alert_email: Option<String>,
989    #[serde(
990        rename = "googleInvitationEmails",
991        default,
992        skip_serializing_if = "Option::is_none"
993    )]
994    pub google_invitation_emails: Option<bool>,
995    #[serde(
996        rename = "allowReschedule",
997        default,
998        skip_serializing_if = "Option::is_none"
999    )]
1000    pub allow_reschedule: Option<bool>,
1001    #[serde(
1002        rename = "allowCancellation",
1003        default,
1004        skip_serializing_if = "Option::is_none"
1005    )]
1006    pub allow_cancellation: Option<bool>,
1007    #[serde(
1008        rename = "shouldAssignContactToTeamMember",
1009        default,
1010        skip_serializing_if = "Option::is_none"
1011    )]
1012    pub should_assign_contact_to_team_member: Option<bool>,
1013    #[serde(
1014        rename = "shouldSkipAssigningContactForExisting",
1015        default,
1016        skip_serializing_if = "Option::is_none"
1017    )]
1018    pub should_skip_assigning_contact_for_existing: Option<bool>,
1019    #[serde(default, skip_serializing_if = "Option::is_none")]
1020    pub notes: Option<String>,
1021    #[serde(rename = "pixelId", default, skip_serializing_if = "Option::is_none")]
1022    pub pixel_id: Option<String>,
1023    /// Allowed values: `RedirectURL`, `ThankYouMessage`.
1024    #[serde(
1025        rename = "formSubmitType",
1026        default,
1027        skip_serializing_if = "Option::is_none"
1028    )]
1029    pub form_submit_type: Option<String>,
1030    #[serde(
1031        rename = "formSubmitRedirectURL",
1032        default,
1033        skip_serializing_if = "Option::is_none"
1034    )]
1035    pub form_submit_redirect_url: Option<String>,
1036    #[serde(
1037        rename = "formSubmitThanksMessage",
1038        default,
1039        skip_serializing_if = "Option::is_none"
1040    )]
1041    pub form_submit_thanks_message: Option<String>,
1042    /// While we will support this property for backward compatibility, it is not required
1043    /// anymore.
1044    /// Allowed values: `0`, `1`.
1045    #[serde(
1046        rename = "availabilityType",
1047        default,
1048        skip_serializing_if = "Option::is_none"
1049    )]
1050    pub availability_type: Option<String>,
1051    /// While we will support this property for backward compatibility, it is recommended to use
1052    /// 'Availability' APIs instead.
1053    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1054    pub availabilities: Vec<Availability>,
1055    /// Allowed values: `count_only`, `collect_detail`.
1056    #[serde(rename = "guestType", default, skip_serializing_if = "Option::is_none")]
1057    pub guest_type: Option<String>,
1058    #[serde(
1059        rename = "consentLabel",
1060        default,
1061        skip_serializing_if = "Option::is_none"
1062    )]
1063    pub consent_label: Option<String>,
1064    #[serde(
1065        rename = "calendarCoverImage",
1066        default,
1067        skip_serializing_if = "Option::is_none"
1068    )]
1069    pub calendar_cover_image: Option<String>,
1070    /// Look Busy Configuration
1071    #[serde(
1072        rename = "lookBusyConfig",
1073        default,
1074        skip_serializing_if = "Option::is_none"
1075    )]
1076    pub look_busy_config: Option<LookBusyConfiguration>,
1077    /// Required by the API.
1078    /// (Optional here so responses that omit it still parse.)
1079    #[serde(default, skip_serializing_if = "Option::is_none")]
1080    pub id: Option<String>,
1081}
1082
1083/// `CalendarDeleteSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
1084#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1085pub struct CalendarDeleteSuccessfulResponseDTO {
1086    /// Success
1087    /// Required by the API.
1088    /// (Optional here so responses that omit it still parse.)
1089    #[serde(default, skip_serializing_if = "Option::is_none")]
1090    pub success: Option<bool>,
1091}
1092
1093/// `CalendarEventDTO` from the GoHighLevel OpenAPI spec.
1094#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1095pub struct CalendarEventDTO {
1096    /// Event Id or Instance id for a recurring event
1097    /// Required by the API.
1098    /// (Optional here so responses that omit it still parse.)
1099    #[serde(default, skip_serializing_if = "Option::is_none")]
1100    pub id: Option<String>,
1101    /// Calendar Event address
1102    #[serde(default, skip_serializing_if = "Option::is_none")]
1103    pub address: Option<String>,
1104    /// Calendar Event title
1105    /// Required by the API.
1106    /// (Optional here so responses that omit it still parse.)
1107    #[serde(default, skip_serializing_if = "Option::is_none")]
1108    pub title: Option<String>,
1109    /// Calendar ID
1110    /// Required by the API.
1111    /// (Optional here so responses that omit it still parse.)
1112    #[serde(
1113        rename = "calendarId",
1114        default,
1115        skip_serializing_if = "Option::is_none"
1116    )]
1117    pub calendar_id: Option<String>,
1118    /// Location ID
1119    /// Required by the API.
1120    /// (Optional here so responses that omit it still parse.)
1121    #[serde(
1122        rename = "locationId",
1123        default,
1124        skip_serializing_if = "Option::is_none"
1125    )]
1126    pub location_id: Option<String>,
1127    /// Contact ID
1128    /// Required by the API.
1129    /// (Optional here so responses that omit it still parse.)
1130    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
1131    pub contact_id: Option<String>,
1132    /// Group ID
1133    /// Required by the API.
1134    /// (Optional here so responses that omit it still parse.)
1135    #[serde(rename = "groupId", default, skip_serializing_if = "Option::is_none")]
1136    pub group_id: Option<String>,
1137    /// Appointment Status
1138    /// Required by the API.
1139    /// (Optional here so responses that omit it still parse.)
1140    #[serde(
1141        rename = "appointmentStatus",
1142        default,
1143        skip_serializing_if = "Option::is_none"
1144    )]
1145    pub appointment_status: Option<String>,
1146    /// AssignedUser - the primary owner of an appointment
1147    /// Required by the API.
1148    /// (Optional here so responses that omit it still parse.)
1149    #[serde(
1150        rename = "assignedUserId",
1151        default,
1152        skip_serializing_if = "Option::is_none"
1153    )]
1154    pub assigned_user_id: Option<String>,
1155    /// Users - the secondary owners of an appointment.
1156    /// Required by the API.
1157    /// (Optional here so responses that omit it still parse.)
1158    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1159    pub users: Vec<String>,
1160    /// Notes
1161    #[serde(default, skip_serializing_if = "Option::is_none")]
1162    pub notes: Option<String>,
1163    /// Description
1164    #[serde(default, skip_serializing_if = "Option::is_none")]
1165    pub description: Option<String>,
1166    /// true if the event is recurring otherwise false
1167    #[serde(
1168        rename = "isRecurring",
1169        default,
1170        skip_serializing_if = "Option::is_none"
1171    )]
1172    pub is_recurring: Option<bool>,
1173    /// RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not
1174    /// required, instance ids are calculated on the basis of startTime of the event.
1175    #[serde(default, skip_serializing_if = "Option::is_none")]
1176    pub rrule: Option<String>,
1177    /// Tells if a calendar event has been deleted
1178    #[serde(default, skip_serializing_if = "Option::is_none")]
1179    pub deleted: Option<bool>,
1180    /// Start Time
1181    /// Required by the API.
1182    /// (Optional here so responses that omit it still parse.)
1183    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
1184    pub start_time: Option<serde_json::Value>,
1185    /// End Time
1186    /// Required by the API.
1187    /// (Optional here so responses that omit it still parse.)
1188    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
1189    pub end_time: Option<serde_json::Value>,
1190    /// Date Added
1191    /// Required by the API.
1192    /// (Optional here so responses that omit it still parse.)
1193    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
1194    pub date_added: Option<serde_json::Value>,
1195    /// Date Updated
1196    /// Required by the API.
1197    /// (Optional here so responses that omit it still parse.)
1198    #[serde(
1199        rename = "dateUpdated",
1200        default,
1201        skip_serializing_if = "Option::is_none"
1202    )]
1203    pub date_updated: Option<serde_json::Value>,
1204    /// Ids of associated resources rooms and/or equipments
1205    #[serde(
1206        rename = "assignedResources",
1207        default,
1208        skip_serializing_if = "Vec::is_empty"
1209    )]
1210    pub assigned_resources: Vec<String>,
1211    /// Appointment booked by metadata
1212    #[serde(rename = "createdBy", default, skip_serializing_if = "Option::is_none")]
1213    pub created_by: Option<CreatedOrUpdatedBy>,
1214    /// Master event id for a recurring instance
1215    #[serde(
1216        rename = "masterEventId",
1217        default,
1218        skip_serializing_if = "Option::is_none"
1219    )]
1220    pub master_event_id: Option<String>,
1221}
1222
1223/// `CalendarNotification` from the GoHighLevel OpenAPI spec.
1224#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1225pub struct CalendarNotification {
1226    /// Calendar Notification
1227    /// Allowed values: `email`.
1228    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
1229    pub type_: Option<String>,
1230    /// Required by the API.
1231    /// (Optional here so responses that omit it still parse.)
1232    #[serde(
1233        rename = "shouldSendToContact",
1234        default,
1235        skip_serializing_if = "Option::is_none"
1236    )]
1237    pub should_send_to_contact: Option<bool>,
1238    /// Required by the API.
1239    /// (Optional here so responses that omit it still parse.)
1240    #[serde(
1241        rename = "shouldSendToGuest",
1242        default,
1243        skip_serializing_if = "Option::is_none"
1244    )]
1245    pub should_send_to_guest: Option<bool>,
1246    /// Required by the API.
1247    /// (Optional here so responses that omit it still parse.)
1248    #[serde(
1249        rename = "shouldSendToUser",
1250        default,
1251        skip_serializing_if = "Option::is_none"
1252    )]
1253    pub should_send_to_user: Option<bool>,
1254    /// Required by the API.
1255    /// (Optional here so responses that omit it still parse.)
1256    #[serde(
1257        rename = "shouldSendToSelectedUsers",
1258        default,
1259        skip_serializing_if = "Option::is_none"
1260    )]
1261    pub should_send_to_selected_users: Option<bool>,
1262    /// Comma separated emails
1263    /// Required by the API.
1264    /// (Optional here so responses that omit it still parse.)
1265    #[serde(
1266        rename = "selectedUsers",
1267        default,
1268        skip_serializing_if = "Option::is_none"
1269    )]
1270    pub selected_users: Option<String>,
1271}
1272
1273/// `CalendarNotificationDeleteResponseDTO` from the GoHighLevel OpenAPI spec.
1274#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1275pub struct CalendarNotificationDeleteResponseDTO {
1276    /// Result of delete/update operation
1277    /// Required by the API.
1278    /// (Optional here so responses that omit it still parse.)
1279    #[serde(default, skip_serializing_if = "Option::is_none")]
1280    pub message: Option<String>,
1281}
1282
1283/// `CalendarNotificationResponseDTO` from the GoHighLevel OpenAPI spec.
1284#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1285pub struct CalendarNotificationResponseDTO {
1286    /// Notification ID
1287    #[serde(rename = "_id", default, skip_serializing_if = "Option::is_none")]
1288    pub id: Option<String>,
1289    /// Allowed values: `contact`, `guest`, `assignedUser`, `emails`, `phoneNumbers`,
1290    /// `business`.
1291    #[serde(
1292        rename = "receiverType",
1293        default,
1294        skip_serializing_if = "Option::is_none"
1295    )]
1296    pub receiver_type: Option<String>,
1297    #[serde(
1298        rename = "additionalEmailIds",
1299        default,
1300        skip_serializing_if = "Vec::is_empty"
1301    )]
1302    pub additional_email_ids: Vec<String>,
1303    #[serde(
1304        rename = "additionalPhoneNumbers",
1305        default,
1306        skip_serializing_if = "Vec::is_empty"
1307    )]
1308    pub additional_phone_numbers: Vec<String>,
1309    /// Allowed values: `email`, `inApp`, `sms`, `whatsapp`.
1310    #[serde(default, skip_serializing_if = "Option::is_none")]
1311    pub channel: Option<String>,
1312    /// Allowed values: `booked`, `confirmation`, `cancellation`, `reminder`, `followup`,
1313    /// `reschedule`.
1314    #[serde(
1315        rename = "notificationType",
1316        default,
1317        skip_serializing_if = "Option::is_none"
1318    )]
1319    pub notification_type: Option<String>,
1320    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1321    pub is_active: Option<bool>,
1322    #[serde(
1323        rename = "additionalWhatsappNumbers",
1324        default,
1325        skip_serializing_if = "Vec::is_empty"
1326    )]
1327    pub additional_whatsapp_numbers: Vec<String>,
1328    #[serde(
1329        rename = "templateId",
1330        default,
1331        skip_serializing_if = "Option::is_none"
1332    )]
1333    pub template_id: Option<String>,
1334    #[serde(default, skip_serializing_if = "Option::is_none")]
1335    pub body: Option<String>,
1336    #[serde(default, skip_serializing_if = "Option::is_none")]
1337    pub subject: Option<String>,
1338    #[serde(rename = "afterTime", default, skip_serializing_if = "Vec::is_empty")]
1339    pub after_time: Vec<SchedulesDTO>,
1340    #[serde(rename = "beforeTime", default, skip_serializing_if = "Vec::is_empty")]
1341    pub before_time: Vec<SchedulesDTO>,
1342    #[serde(
1343        rename = "selectedUsers",
1344        default,
1345        skip_serializing_if = "Vec::is_empty"
1346    )]
1347    pub selected_users: Vec<String>,
1348    #[serde(default, skip_serializing_if = "Option::is_none")]
1349    pub deleted: Option<bool>,
1350}
1351
1352/// `CalendarResourceByIdResponseDTO` from the GoHighLevel OpenAPI spec.
1353#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1354pub struct CalendarResourceByIdResponseDTO {
1355    /// Location ID of the resource
1356    /// Required by the API.
1357    /// (Optional here so responses that omit it still parse.)
1358    #[serde(
1359        rename = "locationId",
1360        default,
1361        skip_serializing_if = "Option::is_none"
1362    )]
1363    pub location_id: Option<String>,
1364    /// Name of the resource
1365    /// Required by the API.
1366    /// (Optional here so responses that omit it still parse.)
1367    #[serde(default, skip_serializing_if = "Option::is_none")]
1368    pub name: Option<String>,
1369    /// Allowed values: `equipments`, `rooms`.
1370    /// Required by the API.
1371    /// (Optional here so responses that omit it still parse.)
1372    #[serde(
1373        rename = "resourceType",
1374        default,
1375        skip_serializing_if = "Option::is_none"
1376    )]
1377    pub resource_type: Option<String>,
1378    /// Whether the resource is active
1379    /// Required by the API.
1380    /// (Optional here so responses that omit it still parse.)
1381    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1382    pub is_active: Option<bool>,
1383    /// Description of the resource
1384    #[serde(default, skip_serializing_if = "Option::is_none")]
1385    pub description: Option<String>,
1386    /// Quantity of the resource
1387    #[serde(default, skip_serializing_if = "Option::is_none")]
1388    pub quantity: Option<f64>,
1389    /// Indicates if the resource is out of service
1390    #[serde(
1391        rename = "outOfService",
1392        default,
1393        skip_serializing_if = "Option::is_none"
1394    )]
1395    pub out_of_service: Option<f64>,
1396    /// Capacity of the resource
1397    #[serde(default, skip_serializing_if = "Option::is_none")]
1398    pub capacity: Option<f64>,
1399    /// Calendar IDs
1400    /// Required by the API.
1401    /// (Optional here so responses that omit it still parse.)
1402    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
1403    pub calendar_ids: Vec<String>,
1404}
1405
1406/// `CalendarResourceResponseDTO` from the GoHighLevel OpenAPI spec.
1407#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1408pub struct CalendarResourceResponseDTO {
1409    /// Location ID of the resource
1410    /// Required by the API.
1411    /// (Optional here so responses that omit it still parse.)
1412    #[serde(
1413        rename = "locationId",
1414        default,
1415        skip_serializing_if = "Option::is_none"
1416    )]
1417    pub location_id: Option<String>,
1418    /// Name of the resource
1419    /// Required by the API.
1420    /// (Optional here so responses that omit it still parse.)
1421    #[serde(default, skip_serializing_if = "Option::is_none")]
1422    pub name: Option<String>,
1423    /// Allowed values: `equipments`, `rooms`.
1424    /// Required by the API.
1425    /// (Optional here so responses that omit it still parse.)
1426    #[serde(
1427        rename = "resourceType",
1428        default,
1429        skip_serializing_if = "Option::is_none"
1430    )]
1431    pub resource_type: Option<String>,
1432    /// Whether the resource is active
1433    /// Required by the API.
1434    /// (Optional here so responses that omit it still parse.)
1435    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1436    pub is_active: Option<bool>,
1437    /// Description of the resource
1438    #[serde(default, skip_serializing_if = "Option::is_none")]
1439    pub description: Option<String>,
1440    /// Quantity of the resource
1441    #[serde(default, skip_serializing_if = "Option::is_none")]
1442    pub quantity: Option<f64>,
1443    /// Indicates if the resource is out of service
1444    #[serde(
1445        rename = "outOfService",
1446        default,
1447        skip_serializing_if = "Option::is_none"
1448    )]
1449    pub out_of_service: Option<f64>,
1450    /// Capacity of the resource
1451    #[serde(default, skip_serializing_if = "Option::is_none")]
1452    pub capacity: Option<f64>,
1453}
1454
1455/// `CalendarUpdateDTO` from the GoHighLevel OpenAPI spec.
1456#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1457pub struct CalendarUpdateDTO {
1458    /// 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
1459    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1460    pub notifications: Vec<CalendarNotification>,
1461    /// Group Id
1462    #[serde(rename = "groupId", default, skip_serializing_if = "Option::is_none")]
1463    pub group_id: Option<String>,
1464    /// Team members are required for calendars of type: Round Robin, Collective, Class,
1465    /// Service. Personal calendar must have exactly one team member.
1466    #[serde(rename = "teamMembers", default, skip_serializing_if = "Vec::is_empty")]
1467    pub team_members: Vec<TeamMember>,
1468    /// Allowed values: `RoundRobin_OptimizeForAvailability`,
1469    /// `RoundRobin_OptimizeForEqualDistribution`.
1470    #[serde(rename = "eventType", default, skip_serializing_if = "Option::is_none")]
1471    pub event_type: Option<String>,
1472    #[serde(default, skip_serializing_if = "Option::is_none")]
1473    pub name: Option<String>,
1474    #[serde(default, skip_serializing_if = "Option::is_none")]
1475    pub description: Option<String>,
1476    #[serde(default, skip_serializing_if = "Option::is_none")]
1477    pub slug: Option<String>,
1478    #[serde(
1479        rename = "widgetSlug",
1480        default,
1481        skip_serializing_if = "Option::is_none"
1482    )]
1483    pub widget_slug: Option<String>,
1484    /// Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
1485    /// Allowed values: `default`, `classic`.
1486    #[serde(
1487        rename = "widgetType",
1488        default,
1489        skip_serializing_if = "Option::is_none"
1490    )]
1491    pub widget_type: Option<String>,
1492    #[serde(
1493        rename = "eventTitle",
1494        default,
1495        skip_serializing_if = "Option::is_none"
1496    )]
1497    pub event_title: Option<String>,
1498    #[serde(
1499        rename = "eventColor",
1500        default,
1501        skip_serializing_if = "Option::is_none"
1502    )]
1503    pub event_color: Option<String>,
1504    /// Meeting location configuration for event calendar
1505    #[serde(
1506        rename = "locationConfigurations",
1507        default,
1508        skip_serializing_if = "Vec::is_empty"
1509    )]
1510    pub location_configurations: Vec<LocationConfiguration>,
1511    /// 🚨 Deprecated! Use `locationConfigurations.location` or
1512    /// `teamMembers[].locationConfigurations.location` instead.
1513    #[serde(
1514        rename = "meetingLocation",
1515        default,
1516        skip_serializing_if = "Option::is_none"
1517    )]
1518    pub meeting_location: Option<String>,
1519    /// This controls the duration of the meeting
1520    #[serde(
1521        rename = "slotDuration",
1522        default,
1523        skip_serializing_if = "Option::is_none"
1524    )]
1525    pub slot_duration: Option<f64>,
1526    /// Unit for slot duration.
1527    /// Allowed values: `mins`, `hours`.
1528    #[serde(
1529        rename = "slotDurationUnit",
1530        default,
1531        skip_serializing_if = "Option::is_none"
1532    )]
1533    pub slot_duration_unit: Option<String>,
1534    /// Unit for pre-buffer.
1535    /// Allowed values: `mins`, `hours`.
1536    #[serde(
1537        rename = "preBufferUnit",
1538        default,
1539        skip_serializing_if = "Option::is_none"
1540    )]
1541    pub pre_buffer_unit: Option<String>,
1542    /// Slot interval reflects the amount of time the between booking slots that will be shown
1543    /// in the calendar.
1544    #[serde(
1545        rename = "slotInterval",
1546        default,
1547        skip_serializing_if = "Option::is_none"
1548    )]
1549    pub slot_interval: Option<f64>,
1550    /// Unit for slot interval.
1551    /// Allowed values: `mins`, `hours`.
1552    #[serde(
1553        rename = "slotIntervalUnit",
1554        default,
1555        skip_serializing_if = "Option::is_none"
1556    )]
1557    pub slot_interval_unit: Option<String>,
1558    /// Slot-Buffer is additional time that can be added after an appointment, allowing for
1559    /// extra time to wrap up
1560    #[serde(
1561        rename = "slotBuffer",
1562        default,
1563        skip_serializing_if = "Option::is_none"
1564    )]
1565    pub slot_buffer: Option<f64>,
1566    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
1567    /// extra time to get ready
1568    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
1569    pub pre_buffer: Option<f64>,
1570    #[serde(
1571        rename = "appoinmentPerSlot",
1572        default,
1573        skip_serializing_if = "Option::is_none"
1574    )]
1575    pub appoinment_per_slot: Option<f64>,
1576    /// Number of appointments that can be booked for a given day
1577    #[serde(
1578        rename = "appoinmentPerDay",
1579        default,
1580        skip_serializing_if = "Option::is_none"
1581    )]
1582    pub appoinment_per_day: Option<f64>,
1583    /// Minimum scheduling notice for events
1584    #[serde(
1585        rename = "allowBookingAfter",
1586        default,
1587        skip_serializing_if = "Option::is_none"
1588    )]
1589    pub allow_booking_after: Option<f64>,
1590    /// Unit for minimum scheduling notice
1591    /// Allowed values: `hours`, `days`, `weeks`, `months`, `mins`.
1592    #[serde(
1593        rename = "allowBookingAfterUnit",
1594        default,
1595        skip_serializing_if = "Option::is_none"
1596    )]
1597    pub allow_booking_after_unit: Option<String>,
1598    /// Minimum number of days/weeks/months for which to allow booking events
1599    #[serde(
1600        rename = "allowBookingFor",
1601        default,
1602        skip_serializing_if = "Option::is_none"
1603    )]
1604    pub allow_booking_for: Option<f64>,
1605    /// Unit for controlling the duration for which booking would be allowed for
1606    /// Allowed values: `days`, `weeks`, `months`.
1607    #[serde(
1608        rename = "allowBookingForUnit",
1609        default,
1610        skip_serializing_if = "Option::is_none"
1611    )]
1612    pub allow_booking_for_unit: Option<String>,
1613    /// While we will support this property for backward compatibility, it is recommended to use
1614    /// 'Availability' APIs instead.
1615    #[serde(rename = "openHours", default, skip_serializing_if = "Vec::is_empty")]
1616    pub open_hours: Vec<OpenHour>,
1617    /// Enable recurring appointments for the calendars. Please note that only one member should
1618    /// be added in the calendar to enable this
1619    #[serde(
1620        rename = "enableRecurring",
1621        default,
1622        skip_serializing_if = "Option::is_none"
1623    )]
1624    pub enable_recurring: Option<bool>,
1625    #[serde(default, skip_serializing_if = "Option::is_none")]
1626    pub recurring: Option<Recurring>,
1627    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
1628    pub form_id: Option<String>,
1629    #[serde(
1630        rename = "stickyContact",
1631        default,
1632        skip_serializing_if = "Option::is_none"
1633    )]
1634    pub sticky_contact: Option<bool>,
1635    #[serde(
1636        rename = "isLivePaymentMode",
1637        default,
1638        skip_serializing_if = "Option::is_none"
1639    )]
1640    pub is_live_payment_mode: Option<bool>,
1641    #[serde(
1642        rename = "autoConfirm",
1643        default,
1644        skip_serializing_if = "Option::is_none"
1645    )]
1646    pub auto_confirm: Option<bool>,
1647    #[serde(
1648        rename = "shouldSendAlertEmailsToAssignedMember",
1649        default,
1650        skip_serializing_if = "Option::is_none"
1651    )]
1652    pub should_send_alert_emails_to_assigned_member: Option<bool>,
1653    #[serde(
1654        rename = "alertEmail",
1655        default,
1656        skip_serializing_if = "Option::is_none"
1657    )]
1658    pub alert_email: Option<String>,
1659    #[serde(
1660        rename = "googleInvitationEmails",
1661        default,
1662        skip_serializing_if = "Option::is_none"
1663    )]
1664    pub google_invitation_emails: Option<bool>,
1665    #[serde(
1666        rename = "allowReschedule",
1667        default,
1668        skip_serializing_if = "Option::is_none"
1669    )]
1670    pub allow_reschedule: Option<bool>,
1671    #[serde(
1672        rename = "allowCancellation",
1673        default,
1674        skip_serializing_if = "Option::is_none"
1675    )]
1676    pub allow_cancellation: Option<bool>,
1677    #[serde(
1678        rename = "shouldAssignContactToTeamMember",
1679        default,
1680        skip_serializing_if = "Option::is_none"
1681    )]
1682    pub should_assign_contact_to_team_member: Option<bool>,
1683    #[serde(
1684        rename = "shouldSkipAssigningContactForExisting",
1685        default,
1686        skip_serializing_if = "Option::is_none"
1687    )]
1688    pub should_skip_assigning_contact_for_existing: Option<bool>,
1689    #[serde(default, skip_serializing_if = "Option::is_none")]
1690    pub notes: Option<String>,
1691    #[serde(rename = "pixelId", default, skip_serializing_if = "Option::is_none")]
1692    pub pixel_id: Option<String>,
1693    /// Allowed values: `RedirectURL`, `ThankYouMessage`.
1694    #[serde(
1695        rename = "formSubmitType",
1696        default,
1697        skip_serializing_if = "Option::is_none"
1698    )]
1699    pub form_submit_type: Option<String>,
1700    #[serde(
1701        rename = "formSubmitRedirectURL",
1702        default,
1703        skip_serializing_if = "Option::is_none"
1704    )]
1705    pub form_submit_redirect_url: Option<String>,
1706    #[serde(
1707        rename = "formSubmitThanksMessage",
1708        default,
1709        skip_serializing_if = "Option::is_none"
1710    )]
1711    pub form_submit_thanks_message: Option<String>,
1712    /// While we will support this property for backward compatibility, it is not required
1713    /// anymore.
1714    /// Allowed values: `0`, `1`.
1715    #[serde(
1716        rename = "availabilityType",
1717        default,
1718        skip_serializing_if = "Option::is_none"
1719    )]
1720    pub availability_type: Option<String>,
1721    /// While we will support this property for backward compatibility, it is recommended to use
1722    /// 'Availability' APIs instead.
1723    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1724    pub availabilities: Vec<UpdateAvailability>,
1725    /// Allowed values: `count_only`, `collect_detail`.
1726    #[serde(rename = "guestType", default, skip_serializing_if = "Option::is_none")]
1727    pub guest_type: Option<String>,
1728    #[serde(
1729        rename = "consentLabel",
1730        default,
1731        skip_serializing_if = "Option::is_none"
1732    )]
1733    pub consent_label: Option<String>,
1734    #[serde(
1735        rename = "calendarCoverImage",
1736        default,
1737        skip_serializing_if = "Option::is_none"
1738    )]
1739    pub calendar_cover_image: Option<String>,
1740    /// Look Busy Configuration
1741    #[serde(
1742        rename = "lookBusyConfig",
1743        default,
1744        skip_serializing_if = "Option::is_none"
1745    )]
1746    pub look_busy_config: Option<LookBusyConfiguration>,
1747    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1748    pub is_active: Option<bool>,
1749}
1750
1751/// `CalendarsGetSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
1752#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1753pub struct CalendarsGetSuccessfulResponseDTO {
1754    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1755    pub calendars: Vec<CalendarDTO>,
1756}
1757
1758/// `CreateBookingServiceDTO` from the GoHighLevel OpenAPI spec.
1759#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1760pub struct CreateBookingServiceDTO {
1761    /// Service ID
1762    /// Required by the API.
1763    pub id: String,
1764    /// Staff ID
1765    #[serde(rename = "staffId", default, skip_serializing_if = "Option::is_none")]
1766    pub staff_id: Option<String>,
1767    /// Position
1768    #[serde(default, skip_serializing_if = "Option::is_none")]
1769    pub position: Option<f64>,
1770    /// Add-ons
1771    #[serde(rename = "addOns", default, skip_serializing_if = "Vec::is_empty")]
1772    pub add_ons: Vec<ServiceAddOnDTO>,
1773}
1774
1775/// `CreateCalendarNotificationDTO` from the GoHighLevel OpenAPI spec.
1776#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1777pub struct CreateCalendarNotificationDTO {
1778    /// notification recipient type
1779    /// Allowed values: `contact`, `guest`, `assignedUser`, `emails`, `phoneNumbers`,
1780    /// `business`.
1781    /// Required by the API.
1782    #[serde(rename = "receiverType")]
1783    pub receiver_type: String,
1784    /// Notification channel
1785    /// Allowed values: `email`, `inApp`, `sms`, `whatsapp`.
1786    /// Required by the API.
1787    pub channel: String,
1788    /// Notification type
1789    /// Allowed values: `booked`, `confirmation`, `cancellation`, `reminder`, `followup`,
1790    /// `reschedule`.
1791    /// Required by the API.
1792    #[serde(rename = "notificationType")]
1793    pub notification_type: String,
1794    /// Is the notification active
1795    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
1796    pub is_active: Option<bool>,
1797    /// Template ID for email notification. Not necessary for in-App notification
1798    #[serde(
1799        rename = "templateId",
1800        default,
1801        skip_serializing_if = "Option::is_none"
1802    )]
1803    pub template_id: Option<String>,
1804    /// Body for email notification. Not necessary for in-App notification
1805    #[serde(default, skip_serializing_if = "Option::is_none")]
1806    pub body: Option<String>,
1807    /// Subject for email notification. Not necessary for in-App notification
1808    #[serde(default, skip_serializing_if = "Option::is_none")]
1809    pub subject: Option<String>,
1810    /// Specifies the time after which the follow-up notification should be sent. This is not
1811    /// required for other notification types.
1812    #[serde(rename = "afterTime", default, skip_serializing_if = "Vec::is_empty")]
1813    pub after_time: Vec<SchedulesDTO>,
1814    /// Specifies the time before which the reminder notification should be sent. This is not
1815    /// required for other notification types.
1816    #[serde(rename = "beforeTime", default, skip_serializing_if = "Vec::is_empty")]
1817    pub before_time: Vec<SchedulesDTO>,
1818    /// Additional email addresses to receive notifications.
1819    #[serde(
1820        rename = "additionalEmailIds",
1821        default,
1822        skip_serializing_if = "Vec::is_empty"
1823    )]
1824    pub additional_email_ids: Vec<String>,
1825    /// Additional phone numbers to receive notifications.
1826    #[serde(
1827        rename = "additionalPhoneNumbers",
1828        default,
1829        skip_serializing_if = "Vec::is_empty"
1830    )]
1831    pub additional_phone_numbers: Vec<String>,
1832    /// Selected users for in-App and business email notifications. Supports user IDs and
1833    /// special keyword "sub_account_admin"
1834    #[serde(
1835        rename = "selectedUsers",
1836        default,
1837        skip_serializing_if = "Vec::is_empty"
1838    )]
1839    pub selected_users: Vec<String>,
1840    /// from address for email notification
1841    #[serde(
1842        rename = "fromAddress",
1843        default,
1844        skip_serializing_if = "Option::is_none"
1845    )]
1846    pub from_address: Option<String>,
1847    /// from name for email/sms notification
1848    #[serde(rename = "fromName", default, skip_serializing_if = "Option::is_none")]
1849    pub from_name: Option<String>,
1850    /// from number for sms notification
1851    #[serde(
1852        rename = "fromNumber",
1853        default,
1854        skip_serializing_if = "Option::is_none"
1855    )]
1856    pub from_number: Option<String>,
1857}
1858
1859/// `CreateCalendarResourceDTO` from the GoHighLevel OpenAPI spec.
1860#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1861pub struct CreateCalendarResourceDTO {
1862    /// Required by the API.
1863    #[serde(rename = "locationId")]
1864    pub location_id: String,
1865    /// Required by the API.
1866    pub name: String,
1867    /// Required by the API.
1868    pub description: String,
1869    /// Quantity of the equipment.
1870    /// Required by the API.
1871    pub quantity: f64,
1872    /// Quantity of the out of service equipment.
1873    /// Required by the API.
1874    #[serde(rename = "outOfService")]
1875    pub out_of_service: f64,
1876    /// Capacity of the room.
1877    /// Required by the API.
1878    pub capacity: f64,
1879    /// Service calendar IDs to be mapped with the resource. One equipment can only be mapped
1880    /// with one service calendar. One room can be mapped with multiple service calendars.
1881    /// Required by the API.
1882    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
1883    pub calendar_ids: Vec<String>,
1884}
1885
1886/// `CreateEventCalendarScheduleDTO` from the GoHighLevel OpenAPI spec.
1887#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1888pub struct CreateEventCalendarScheduleDTO {
1889    /// Schedule rules defining when the schedule is active
1890    /// Required by the API.
1891    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1892    pub rules: Vec<ScheduleRuleDTO>,
1893    /// Timezone for the schedule (IANA timezone identifier)
1894    /// Required by the API.
1895    pub timezone: String,
1896}
1897
1898/// `CreateOrUpdateServiceBookingResponseDTO` from the GoHighLevel OpenAPI spec.
1899#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1900pub struct CreateOrUpdateServiceBookingResponseDTO {
1901    /// Booking ID
1902    /// Required by the API.
1903    /// (Optional here so responses that omit it still parse.)
1904    #[serde(rename = "bookingId", default, skip_serializing_if = "Option::is_none")]
1905    pub booking_id: Option<String>,
1906    /// Location ID
1907    /// Required by the API.
1908    /// (Optional here so responses that omit it still parse.)
1909    #[serde(
1910        rename = "locationId",
1911        default,
1912        skip_serializing_if = "Option::is_none"
1913    )]
1914    pub location_id: Option<String>,
1915    /// Contact ID
1916    /// Required by the API.
1917    /// (Optional here so responses that omit it still parse.)
1918    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
1919    pub contact_id: Option<String>,
1920    /// Service Location ID
1921    /// Required by the API.
1922    /// (Optional here so responses that omit it still parse.)
1923    #[serde(
1924        rename = "serviceLocationId",
1925        default,
1926        skip_serializing_if = "Option::is_none"
1927    )]
1928    pub service_location_id: Option<String>,
1929    /// Service Booking Title
1930    /// Required by the API.
1931    /// (Optional here so responses that omit it still parse.)
1932    #[serde(default, skip_serializing_if = "Option::is_none")]
1933    pub title: Option<String>,
1934    /// Start Time
1935    /// Required by the API.
1936    /// (Optional here so responses that omit it still parse.)
1937    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
1938    pub start_time: Option<String>,
1939    /// End Time
1940    /// Required by the API.
1941    /// (Optional here so responses that omit it still parse.)
1942    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
1943    pub end_time: Option<String>,
1944    /// Services
1945    /// Required by the API.
1946    /// (Optional here so responses that omit it still parse.)
1947    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1948    pub services: Vec<ServiceDTO>,
1949    /// Timezone
1950    /// Required by the API.
1951    /// (Optional here so responses that omit it still parse.)
1952    #[serde(default, skip_serializing_if = "Option::is_none")]
1953    pub timezone: Option<String>,
1954    /// Status
1955    /// Required by the API.
1956    /// (Optional here so responses that omit it still parse.)
1957    #[serde(default, skip_serializing_if = "Option::is_none")]
1958    pub status: Option<String>,
1959    /// Tells if the booking is deleted
1960    /// Required by the API.
1961    /// (Optional here so responses that omit it still parse.)
1962    #[serde(default, skip_serializing_if = "Option::is_none")]
1963    pub deleted: Option<bool>,
1964    /// Date Added
1965    /// Required by the API.
1966    /// (Optional here so responses that omit it still parse.)
1967    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
1968    pub date_added: Option<String>,
1969    /// Date Updated
1970    /// Required by the API.
1971    /// (Optional here so responses that omit it still parse.)
1972    #[serde(
1973        rename = "dateUpdated",
1974        default,
1975        skip_serializing_if = "Option::is_none"
1976    )]
1977    pub date_updated: Option<String>,
1978    /// Booking booked by metadata
1979    /// Required by the API.
1980    /// (Optional here so responses that omit it still parse.)
1981    #[serde(rename = "createdBy", default, skip_serializing_if = "Option::is_none")]
1982    pub created_by: Option<CreatedOrUpdatedBy>,
1983    /// Meeting Location (If service location is an ask the booker, then the meeting location is
1984    /// used for the booking)
1985    #[serde(
1986        rename = "meetingLocation",
1987        default,
1988        skip_serializing_if = "Option::is_none"
1989    )]
1990    pub meeting_location: Option<String>,
1991    /// Optional informative or warning messages (e.g. meeting location ignored for
1992    /// non-ask-booker locations)
1993    #[serde(default, skip_serializing_if = "Vec::is_empty")]
1994    pub messages: Vec<Vec<serde_json::Value>>,
1995}
1996
1997/// `CreatePublicServiceBookingDTO` from the GoHighLevel OpenAPI spec.
1998#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1999pub struct CreatePublicServiceBookingDTO {
2000    /// Location ID
2001    /// Required by the API.
2002    #[serde(rename = "locationId")]
2003    pub location_id: String,
2004    /// Contact ID
2005    /// Required by the API.
2006    #[serde(rename = "contactId")]
2007    pub contact_id: String,
2008    /// Start Time
2009    /// Required by the API.
2010    #[serde(rename = "startTime")]
2011    pub start_time: String,
2012    /// End Time
2013    /// Required by the API.
2014    #[serde(rename = "endTime")]
2015    pub end_time: String,
2016    /// Timezone
2017    /// Required by the API.
2018    pub timezone: String,
2019    /// Services
2020    /// Required by the API.
2021    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2022    pub services: Vec<CreateBookingServiceDTO>,
2023    /// Service Location ID (If not provided, then the default service location will be used)
2024    #[serde(
2025        rename = "serviceLocationId",
2026        default,
2027        skip_serializing_if = "Option::is_none"
2028    )]
2029    pub service_location_id: Option<String>,
2030    /// Meeting Location (If service location is an ask the booker, then the meeting location is
2031    /// required)
2032    #[serde(
2033        rename = "meetingLocation",
2034        default,
2035        skip_serializing_if = "Option::is_none"
2036    )]
2037    pub meeting_location: Option<String>,
2038    /// Service Booking Title
2039    #[serde(default, skip_serializing_if = "Option::is_none")]
2040    pub title: Option<String>,
2041    /// Status. (If not provided, the status configured in Service Global Settings will be
2042    /// used.)
2043    /// Allowed values: `confirmed`, `new`.
2044    #[serde(default, skip_serializing_if = "Option::is_none")]
2045    pub status: Option<String>,
2046}
2047
2048/// `CreateScheduleDTO` from the GoHighLevel OpenAPI spec.
2049#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2050pub struct CreateScheduleDTO {
2051    /// Schedule rules defining when the schedule is active
2052    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2053    pub rules: Vec<ScheduleRuleDTO>,
2054    /// Timezone for the schedule (IANA timezone identifier)
2055    /// Required by the API.
2056    pub timezone: String,
2057    /// Location ID where this schedule applies
2058    /// Required by the API.
2059    #[serde(rename = "locationId")]
2060    pub location_id: String,
2061    /// Human-readable name for the schedule
2062    /// Required by the API.
2063    pub name: String,
2064    /// User ID associated with the schedule
2065    /// Required by the API.
2066    #[serde(rename = "userId")]
2067    pub user_id: String,
2068    /// Calendar IDs associated with the schedule
2069    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
2070    pub calendar_ids: Vec<String>,
2071}
2072
2073/// `CreateServiceDTO` from the GoHighLevel OpenAPI spec.
2074#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2075pub struct CreateServiceDTO {
2076    /// Location ID
2077    /// Required by the API.
2078    #[serde(rename = "locationId")]
2079    pub location_id: String,
2080    /// Service name
2081    /// Required by the API.
2082    pub name: String,
2083    /// Unique URL-friendly identifier
2084    /// Required by the API.
2085    pub slug: String,
2086    /// Assigned staff members (at least one required)
2087    /// Required by the API.
2088    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2089    pub staff: Vec<StaffDTO>,
2090    /// Service description
2091    #[serde(default, skip_serializing_if = "Option::is_none")]
2092    pub description: Option<String>,
2093    /// Service event color (hex)
2094    #[serde(
2095        rename = "eventColor",
2096        default,
2097        skip_serializing_if = "Option::is_none"
2098    )]
2099    pub event_color: Option<String>,
2100    /// Service cover image URL
2101    #[serde(
2102        rename = "coverImage",
2103        default,
2104        skip_serializing_if = "Option::is_none"
2105    )]
2106    pub cover_image: Option<String>,
2107    /// Service category ID (uses default category if not provided)
2108    #[serde(
2109        rename = "serviceCategoryId",
2110        default,
2111        skip_serializing_if = "Option::is_none"
2112    )]
2113    pub service_category_id: Option<String>,
2114    /// Payment details (default amount is 0, currency configured in Service Global Settings is
2115    /// used.)
2116    #[serde(default, skip_serializing_if = "Option::is_none")]
2117    pub payment: Option<PaymentDTO>,
2118    /// This controls the duration of the appointment
2119    #[serde(
2120        rename = "serviceDuration",
2121        default,
2122        skip_serializing_if = "Option::is_none"
2123    )]
2124    pub service_duration: Option<f64>,
2125    /// Duration unit
2126    /// Allowed values: `mins`, `hours`.
2127    #[serde(
2128        rename = "serviceDurationUnit",
2129        default,
2130        skip_serializing_if = "Option::is_none"
2131    )]
2132    pub service_duration_unit: Option<String>,
2133    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
2134    /// extra time to get ready
2135    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
2136    pub pre_buffer: Option<f64>,
2137    /// Pre-buffer unit
2138    /// Allowed values: `mins`, `hours`.
2139    #[serde(
2140        rename = "preBufferUnit",
2141        default,
2142        skip_serializing_if = "Option::is_none"
2143    )]
2144    pub pre_buffer_unit: Option<String>,
2145    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
2146    /// time to wrap up
2147    #[serde(
2148        rename = "postBuffer",
2149        default,
2150        skip_serializing_if = "Option::is_none"
2151    )]
2152    pub post_buffer: Option<f64>,
2153    /// Post-buffer unit
2154    /// Allowed values: `mins`, `hours`.
2155    #[serde(
2156        rename = "postBufferUnit",
2157        default,
2158        skip_serializing_if = "Option::is_none"
2159    )]
2160    pub post_buffer_unit: Option<String>,
2161    /// Whether service is private (not shown publicly)
2162    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
2163    pub is_private: Option<bool>,
2164    /// Custom form ID (will be used to display the custom form on the booking page, if only one
2165    /// service is selected)
2166    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
2167    pub form_id: Option<String>,
2168    /// Service variations (pass empty array for no variations)
2169    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2170    pub variations: Vec<CreateServiceVariationDTO>,
2171}
2172
2173/// `CreateServiceLocationDTO` from the GoHighLevel OpenAPI spec.
2174#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2175pub struct CreateServiceLocationDTO {
2176    /// Location ID
2177    /// Required by the API.
2178    #[serde(rename = "locationId")]
2179    pub location_id: String,
2180    /// Location name
2181    /// Required by the API.
2182    pub name: String,
2183    /// URL-friendly slug identifier
2184    /// Required by the API.
2185    pub slug: String,
2186    /// Phone number
2187    #[serde(default, skip_serializing_if = "Option::is_none")]
2188    pub phone: Option<String>,
2189    /// Use a full street address when locationType is offline. Use a user-facing label when
2190    /// locationType is ask_booker.
2191    #[serde(default, skip_serializing_if = "Option::is_none")]
2192    pub address: Option<String>,
2193    /// URL of the cover image for this service location
2194    #[serde(
2195        rename = "coverImage",
2196        default,
2197        skip_serializing_if = "Option::is_none"
2198    )]
2199    pub cover_image: Option<String>,
2200    /// Location type
2201    /// Allowed values: `offline`, `ask_booker`.
2202    #[serde(
2203        rename = "locationType",
2204        default,
2205        skip_serializing_if = "Option::is_none"
2206    )]
2207    pub location_type: Option<String>,
2208}
2209
2210/// `CreateServiceVariationDTO` from the GoHighLevel OpenAPI spec.
2211#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2212pub struct CreateServiceVariationDTO {
2213    /// This controls the duration of the appointment
2214    #[serde(
2215        rename = "serviceDuration",
2216        default,
2217        skip_serializing_if = "Option::is_none"
2218    )]
2219    pub service_duration: Option<f64>,
2220    /// Duration unit
2221    /// Allowed values: `mins`, `hours`.
2222    #[serde(
2223        rename = "serviceDurationUnit",
2224        default,
2225        skip_serializing_if = "Option::is_none"
2226    )]
2227    pub service_duration_unit: Option<String>,
2228    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
2229    /// extra time to get ready
2230    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
2231    pub pre_buffer: Option<f64>,
2232    /// Pre-buffer unit
2233    /// Allowed values: `mins`, `hours`.
2234    #[serde(
2235        rename = "preBufferUnit",
2236        default,
2237        skip_serializing_if = "Option::is_none"
2238    )]
2239    pub pre_buffer_unit: Option<String>,
2240    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
2241    /// time to wrap up
2242    #[serde(
2243        rename = "postBuffer",
2244        default,
2245        skip_serializing_if = "Option::is_none"
2246    )]
2247    pub post_buffer: Option<f64>,
2248    /// Post-buffer unit
2249    /// Allowed values: `mins`, `hours`.
2250    #[serde(
2251        rename = "postBufferUnit",
2252        default,
2253        skip_serializing_if = "Option::is_none"
2254    )]
2255    pub post_buffer_unit: Option<String>,
2256    /// Payment details
2257    #[serde(default, skip_serializing_if = "Option::is_none")]
2258    pub payment: Option<PaymentDTO>,
2259    /// Variation name
2260    /// Required by the API.
2261    pub name: String,
2262}
2263
2264/// `CreatedOrUpdatedBy` from the GoHighLevel OpenAPI spec.
2265#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2266pub struct CreatedOrUpdatedBy {
2267    /// The ID of the user who created or updated the appointment
2268    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
2269    pub user_id: Option<String>,
2270    /// The source of the appointment
2271    /// Required by the API.
2272    /// (Optional here so responses that omit it still parse.)
2273    #[serde(default, skip_serializing_if = "Option::is_none")]
2274    pub source: Option<String>,
2275}
2276
2277/// `DeleteAppointmentSchema` from the GoHighLevel OpenAPI spec.
2278#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2279pub struct DeleteAppointmentSchema {
2280    /// The spec defines no fields for this schema.
2281    #[serde(flatten)]
2282    pub extra: serde_json::Map<String, serde_json::Value>,
2283}
2284
2285/// `DeleteEventSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2286#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2287pub struct DeleteEventSuccessfulResponseDto {
2288    #[serde(default, skip_serializing_if = "Option::is_none")]
2289    pub succeeded: Option<bool>,
2290}
2291
2292/// `DeleteNoteSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2293#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2294pub struct DeleteNoteSuccessfulResponseDto {
2295    #[serde(default, skip_serializing_if = "Option::is_none")]
2296    pub success: Option<bool>,
2297}
2298
2299/// `DeleteServiceBookingResponseDTO` from the GoHighLevel OpenAPI spec.
2300#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2301pub struct DeleteServiceBookingResponseDTO {
2302    /// Indicates if the deletion was successful
2303    /// Required by the API.
2304    /// (Optional here so responses that omit it still parse.)
2305    #[serde(default, skip_serializing_if = "Option::is_none")]
2306    pub success: Option<bool>,
2307    /// Response message
2308    /// Required by the API.
2309    /// (Optional here so responses that omit it still parse.)
2310    #[serde(default, skip_serializing_if = "Option::is_none")]
2311    pub message: Option<String>,
2312}
2313
2314/// `DeleteServiceLocationResponseDTO` from the GoHighLevel OpenAPI spec.
2315#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2316pub struct DeleteServiceLocationResponseDTO {
2317    /// Success
2318    /// Required by the API.
2319    /// (Optional here so responses that omit it still parse.)
2320    #[serde(default, skip_serializing_if = "Option::is_none")]
2321    pub success: Option<bool>,
2322    /// Success message
2323    #[serde(default, skip_serializing_if = "Option::is_none")]
2324    pub message: Option<String>,
2325}
2326
2327/// `DeleteServiceResponseDTO` from the GoHighLevel OpenAPI spec.
2328#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2329pub struct DeleteServiceResponseDTO {
2330    /// Success
2331    /// Required by the API.
2332    /// (Optional here so responses that omit it still parse.)
2333    #[serde(default, skip_serializing_if = "Option::is_none")]
2334    pub success: Option<bool>,
2335    /// Success message
2336    #[serde(default, skip_serializing_if = "Option::is_none")]
2337    pub message: Option<String>,
2338}
2339
2340/// `EventCalendarScheduleResponseDTO` from the GoHighLevel OpenAPI spec.
2341#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2342pub struct EventCalendarScheduleResponseDTO {
2343    /// Timezone for the schedule (IANA timezone identifier)
2344    /// Required by the API.
2345    /// (Optional here so responses that omit it still parse.)
2346    #[serde(default, skip_serializing_if = "Option::is_none")]
2347    pub timezone: Option<String>,
2348    /// Schedule rules defining when the schedule is active
2349    /// Required by the API.
2350    /// (Optional here so responses that omit it still parse.)
2351    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2352    pub rules: Vec<ScheduleRuleDTO>,
2353    /// Calendar ID associated with the schedule
2354    /// Required by the API.
2355    /// (Optional here so responses that omit it still parse.)
2356    #[serde(
2357        rename = "calendarId",
2358        default,
2359        skip_serializing_if = "Option::is_none"
2360    )]
2361    pub calendar_id: Option<String>,
2362    /// Information about who created the schedule
2363    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
2364    pub date_added: Option<String>,
2365    /// Information about who last updated the schedule
2366    #[serde(
2367        rename = "dateUpdated",
2368        default,
2369        skip_serializing_if = "Option::is_none"
2370    )]
2371    pub date_updated: Option<String>,
2372}
2373
2374/// `EventCalendarScheduleWrapperDTO` from the GoHighLevel OpenAPI spec.
2375#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2376pub struct EventCalendarScheduleWrapperDTO {
2377    /// The event calendar schedule
2378    /// Required by the API.
2379    /// (Optional here so responses that omit it still parse.)
2380    #[serde(default, skip_serializing_if = "Option::is_none")]
2381    pub schedule: Option<EventCalendarScheduleResponseDTO>,
2382}
2383
2384/// `GetAllSchedulesResponseDTO` from the GoHighLevel OpenAPI spec.
2385#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2386pub struct GetAllSchedulesResponseDTO {
2387    /// Array of schedules
2388    /// Required by the API.
2389    /// (Optional here so responses that omit it still parse.)
2390    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2391    pub schedules: Vec<ScheduleObjectResponseDTO>,
2392}
2393
2394/// `GetCalendarEventSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2395#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2396pub struct GetCalendarEventSuccessfulResponseDTO {
2397    #[serde(default, skip_serializing_if = "Option::is_none")]
2398    pub event: Option<CalendarEventDTO>,
2399}
2400
2401/// `GetCalendarEventsSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2402#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2403pub struct GetCalendarEventsSuccessfulResponseDTO {
2404    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2405    pub events: Vec<CalendarEventDTO>,
2406}
2407
2408/// `GetCreateUpdateNoteSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2409#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2410pub struct GetCreateUpdateNoteSuccessfulResponseDto {
2411    #[serde(default, skip_serializing_if = "Option::is_none")]
2412    pub note: Option<GetNoteSchema>,
2413}
2414
2415/// `GetNoteSchema` from the GoHighLevel OpenAPI spec.
2416#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2417pub struct GetNoteSchema {
2418    #[serde(default, skip_serializing_if = "Option::is_none")]
2419    pub id: Option<String>,
2420    #[serde(default, skip_serializing_if = "Option::is_none")]
2421    pub body: Option<String>,
2422    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
2423    pub user_id: Option<String>,
2424    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
2425    pub date_added: Option<String>,
2426    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
2427    pub contact_id: Option<String>,
2428    #[serde(rename = "createdBy", default, skip_serializing_if = "Option::is_none")]
2429    pub created_by: Option<NoteCreatedBySchema>,
2430}
2431
2432/// `GetNotesListSuccessfulResponseDto` from the GoHighLevel OpenAPI spec.
2433#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2434pub struct GetNotesListSuccessfulResponseDto {
2435    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2436    pub notes: Vec<GetNoteSchema>,
2437    #[serde(rename = "hasMore", default, skip_serializing_if = "Option::is_none")]
2438    pub has_more: Option<bool>,
2439}
2440
2441/// `GroupCreateDTO` from the GoHighLevel OpenAPI spec.
2442#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2443pub struct GroupCreateDTO {
2444    /// Required by the API.
2445    #[serde(rename = "locationId")]
2446    pub location_id: String,
2447    /// Required by the API.
2448    pub name: String,
2449    /// Required by the API.
2450    pub description: String,
2451    /// Required by the API.
2452    pub slug: String,
2453    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
2454    pub is_active: Option<bool>,
2455}
2456
2457/// `GroupCreateSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2458#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2459pub struct GroupCreateSuccessfulResponseDTO {
2460    #[serde(default, skip_serializing_if = "Option::is_none")]
2461    pub group: Option<GroupDTO>,
2462}
2463
2464/// `GroupDTO` from the GoHighLevel OpenAPI spec.
2465#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2466pub struct GroupDTO {
2467    /// Required by the API.
2468    /// (Optional here so responses that omit it still parse.)
2469    #[serde(
2470        rename = "locationId",
2471        default,
2472        skip_serializing_if = "Option::is_none"
2473    )]
2474    pub location_id: Option<String>,
2475    /// Required by the API.
2476    /// (Optional here so responses that omit it still parse.)
2477    #[serde(default, skip_serializing_if = "Option::is_none")]
2478    pub name: Option<String>,
2479    /// Required by the API.
2480    /// (Optional here so responses that omit it still parse.)
2481    #[serde(default, skip_serializing_if = "Option::is_none")]
2482    pub description: Option<String>,
2483    /// Required by the API.
2484    /// (Optional here so responses that omit it still parse.)
2485    #[serde(default, skip_serializing_if = "Option::is_none")]
2486    pub slug: Option<String>,
2487    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
2488    pub is_active: Option<bool>,
2489    #[serde(default, skip_serializing_if = "Option::is_none")]
2490    pub id: Option<String>,
2491}
2492
2493/// `GroupStatusUpdateParams` from the GoHighLevel OpenAPI spec.
2494#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2495pub struct GroupStatusUpdateParams {
2496    /// Is Active?
2497    /// Required by the API.
2498    #[serde(rename = "isActive")]
2499    pub is_active: bool,
2500}
2501
2502/// `GroupSuccessfulResponseDTO` from the GoHighLevel OpenAPI spec.
2503#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2504pub struct GroupSuccessfulResponseDTO {
2505    /// Success
2506    #[serde(default, skip_serializing_if = "Option::is_none")]
2507    pub success: Option<bool>,
2508}
2509
2510/// `GroupUpdateDTO` from the GoHighLevel OpenAPI spec.
2511#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2512pub struct GroupUpdateDTO {
2513    /// Required by the API.
2514    pub name: String,
2515    /// Required by the API.
2516    pub description: String,
2517    /// Required by the API.
2518    pub slug: String,
2519}
2520
2521/// `Hour` from the GoHighLevel OpenAPI spec.
2522#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2523pub struct Hour {
2524    /// Required by the API.
2525    /// (Optional here so responses that omit it still parse.)
2526    #[serde(rename = "openHour", default, skip_serializing_if = "Option::is_none")]
2527    pub open_hour: Option<f64>,
2528    /// Required by the API.
2529    /// (Optional here so responses that omit it still parse.)
2530    #[serde(
2531        rename = "openMinute",
2532        default,
2533        skip_serializing_if = "Option::is_none"
2534    )]
2535    pub open_minute: Option<f64>,
2536    /// Required by the API.
2537    /// (Optional here so responses that omit it still parse.)
2538    #[serde(rename = "closeHour", default, skip_serializing_if = "Option::is_none")]
2539    pub close_hour: Option<f64>,
2540    /// Required by the API.
2541    /// (Optional here so responses that omit it still parse.)
2542    #[serde(
2543        rename = "closeMinute",
2544        default,
2545        skip_serializing_if = "Option::is_none"
2546    )]
2547    pub close_minute: Option<f64>,
2548}
2549
2550/// `LocationConfiguration` from the GoHighLevel OpenAPI spec.
2551#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2552pub struct LocationConfiguration {
2553    /// Type of meeting location. zoom_conference/google_conference/ms_teams_conference is not
2554    /// supported in event calendar type
2555    /// Allowed values: `custom`, `zoom_conference`, `google_conference`, `inbound_call`,
2556    /// `outbound_call`, `physical`, `booker`, `ms_teams_conference`.
2557    /// Required by the API.
2558    pub kind: String,
2559    /// Address for meeting location. Not applicable on "zoom_conference", "google_conference"
2560    /// and "ms_teams_conference" kind
2561    #[serde(default, skip_serializing_if = "Option::is_none")]
2562    pub location: Option<String>,
2563}
2564
2565/// `LocationConfigurationResponse` from the GoHighLevel OpenAPI spec.
2566#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2567pub struct LocationConfigurationResponse {
2568    /// Type of meeting location. zoom_conference/google_conference/ms_teams_conference is not
2569    /// supported in event calendar type
2570    /// Allowed values: `custom`, `zoom_conference`, `google_conference`, `inbound_call`,
2571    /// `outbound_call`, `physical`, `booker`, `ms_teams_conference`.
2572    /// Required by the API.
2573    /// (Optional here so responses that omit it still parse.)
2574    #[serde(default, skip_serializing_if = "Option::is_none")]
2575    pub kind: Option<String>,
2576    /// Address for meeting location. Not applicable on "zoom_conference", "google_conference"
2577    /// and "ms_teams_conference" kind
2578    #[serde(default, skip_serializing_if = "Option::is_none")]
2579    pub location: Option<String>,
2580    /// Unique ID used to select a specific meeting location
2581    #[serde(rename = "meetingId", default, skip_serializing_if = "Option::is_none")]
2582    pub meeting_id: Option<String>,
2583}
2584
2585/// `LookBusyConfiguration` from the GoHighLevel OpenAPI spec.
2586#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2587pub struct LookBusyConfiguration {
2588    /// Apply Look Busy
2589    /// Required by the API.
2590    /// (Optional here so responses that omit it still parse.)
2591    #[serde(default, skip_serializing_if = "Option::is_none")]
2592    pub enabled: Option<bool>,
2593    /// Percentage of slots that will be hidden
2594    /// Required by the API.
2595    /// (Optional here so responses that omit it still parse.)
2596    #[serde(
2597        rename = "LookBusyPercentage",
2598        default,
2599        skip_serializing_if = "Option::is_none"
2600    )]
2601    pub look_busy_percentage: Option<f64>,
2602}
2603
2604/// `NoteCreatedBySchema` from the GoHighLevel OpenAPI spec.
2605#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2606pub struct NoteCreatedBySchema {
2607    #[serde(default, skip_serializing_if = "Option::is_none")]
2608    pub id: Option<String>,
2609    #[serde(default, skip_serializing_if = "Option::is_none")]
2610    pub name: Option<String>,
2611}
2612
2613/// `NotesDTO` from the GoHighLevel OpenAPI spec.
2614#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2615pub struct NotesDTO {
2616    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
2617    pub user_id: Option<String>,
2618    /// Note body
2619    /// Required by the API.
2620    pub body: String,
2621}
2622
2623/// `OpenHour` from the GoHighLevel OpenAPI spec.
2624#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2625pub struct OpenHour {
2626    /// Required by the API.
2627    /// (Optional here so responses that omit it still parse.)
2628    #[serde(
2629        rename = "daysOfTheWeek",
2630        default,
2631        skip_serializing_if = "Vec::is_empty"
2632    )]
2633    pub days_of_the_week: Vec<f64>,
2634    /// Required by the API.
2635    /// (Optional here so responses that omit it still parse.)
2636    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2637    pub hours: Vec<Hour>,
2638}
2639
2640/// `PaymentDTO` from the GoHighLevel OpenAPI spec.
2641#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2642pub struct PaymentDTO {
2643    /// Service price
2644    #[serde(default, skip_serializing_if = "Option::is_none")]
2645    pub amount: Option<f64>,
2646    /// Deposit amount or percentage value
2647    #[serde(default, skip_serializing_if = "Option::is_none")]
2648    pub deposit: Option<f64>,
2649    /// Deposit type
2650    /// Allowed values: `percentage`, `amount`.
2651    #[serde(
2652        rename = "depositType",
2653        default,
2654        skip_serializing_if = "Option::is_none"
2655    )]
2656    pub deposit_type: Option<String>,
2657}
2658
2659/// `Recurring` from the GoHighLevel OpenAPI spec.
2660#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2661pub struct Recurring {
2662    /// Allowed values: `DAILY`, `WEEKLY`, `MONTHLY`.
2663    #[serde(default, skip_serializing_if = "Option::is_none")]
2664    pub freq: Option<String>,
2665    /// Number of recurrences
2666    #[serde(default, skip_serializing_if = "Option::is_none")]
2667    pub count: Option<f64>,
2668    /// This setting contols what to do incase a recurring slot is unavailable
2669    /// Allowed values: `skip`, `continue`, `book_next`.
2670    #[serde(
2671        rename = "bookingOption",
2672        default,
2673        skip_serializing_if = "Option::is_none"
2674    )]
2675    pub booking_option: Option<String>,
2676    /// This setting contols what to do incase a recurring slot is unavailable
2677    /// Allowed values: `confirmed`, `new`.
2678    #[serde(
2679        rename = "bookingOverlapDefaultStatus",
2680        default,
2681        skip_serializing_if = "Option::is_none"
2682    )]
2683    pub booking_overlap_default_status: Option<String>,
2684}
2685
2686/// `ResourceDeleteResponseDTO` from the GoHighLevel OpenAPI spec.
2687#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2688pub struct ResourceDeleteResponseDTO {
2689    /// Success
2690    #[serde(default, skip_serializing_if = "Option::is_none")]
2691    pub success: Option<bool>,
2692}
2693
2694/// `ScheduleIntervalDTO` from the GoHighLevel OpenAPI spec.
2695#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2696pub struct ScheduleIntervalDTO {
2697    /// Start time in HH:MM format (24-hour format)
2698    /// Required by the API.
2699    /// (Optional here so responses that omit it still parse.)
2700    #[serde(rename = "from", default, skip_serializing_if = "Option::is_none")]
2701    pub from_: Option<String>,
2702    /// End time in HH:MM format (24-hour format)
2703    /// Required by the API.
2704    /// (Optional here so responses that omit it still parse.)
2705    #[serde(default, skip_serializing_if = "Option::is_none")]
2706    pub to: Option<String>,
2707}
2708
2709/// `ScheduleObjectResponseDTO` from the GoHighLevel OpenAPI spec.
2710#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2711pub struct ScheduleObjectResponseDTO {
2712    /// Unique identifier for the schedule
2713    /// Required by the API.
2714    /// (Optional here so responses that omit it still parse.)
2715    #[serde(default, skip_serializing_if = "Option::is_none")]
2716    pub id: Option<String>,
2717    /// Human-readable name for the schedule
2718    /// Required by the API.
2719    /// (Optional here so responses that omit it still parse.)
2720    #[serde(default, skip_serializing_if = "Option::is_none")]
2721    pub name: Option<String>,
2722    /// Location ID where this schedule applies
2723    /// Required by the API.
2724    /// (Optional here so responses that omit it still parse.)
2725    #[serde(
2726        rename = "locationId",
2727        default,
2728        skip_serializing_if = "Option::is_none"
2729    )]
2730    pub location_id: Option<String>,
2731    /// Schedule rules defining when the schedule is active
2732    /// Required by the API.
2733    /// (Optional here so responses that omit it still parse.)
2734    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2735    pub rules: Vec<ScheduleRuleDTO>,
2736    /// Timezone for the schedule (IANA timezone identifier)
2737    /// Required by the API.
2738    /// (Optional here so responses that omit it still parse.)
2739    #[serde(default, skip_serializing_if = "Option::is_none")]
2740    pub timezone: Option<String>,
2741    /// ISO date string when the schedule was created
2742    /// Required by the API.
2743    /// (Optional here so responses that omit it still parse.)
2744    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
2745    pub date_added: Option<String>,
2746    /// ISO date string when the schedule was last updated
2747    /// Required by the API.
2748    /// (Optional here so responses that omit it still parse.)
2749    #[serde(
2750        rename = "dateUpdated",
2751        default,
2752        skip_serializing_if = "Option::is_none"
2753    )]
2754    pub date_updated: Option<String>,
2755    /// User ID associated with the schedule
2756    /// Required by the API.
2757    /// (Optional here so responses that omit it still parse.)
2758    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
2759    pub user_id: Option<String>,
2760    /// Calendar IDs associated with the schedule
2761    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
2762    pub calendar_ids: Vec<String>,
2763    /// Whether the schedule has been deleted
2764    /// Required by the API.
2765    /// (Optional here so responses that omit it still parse.)
2766    #[serde(default, skip_serializing_if = "Option::is_none")]
2767    pub deleted: Option<bool>,
2768}
2769
2770/// `ScheduleResponseDTO` from the GoHighLevel OpenAPI spec.
2771#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2772pub struct ScheduleResponseDTO {
2773    /// Schedule
2774    /// Required by the API.
2775    /// (Optional here so responses that omit it still parse.)
2776    #[serde(default, skip_serializing_if = "Option::is_none")]
2777    pub schedule: Option<ScheduleObjectResponseDTO>,
2778}
2779
2780/// `ScheduleRuleDTO` from the GoHighLevel OpenAPI spec.
2781#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2782pub struct ScheduleRuleDTO {
2783    /// Type of schedule rule - weekday (recurring) or date (specific date)
2784    /// Allowed values: `wday`, `date`.
2785    /// Required by the API.
2786    /// (Optional here so responses that omit it still parse.)
2787    #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
2788    pub type_: Option<String>,
2789    /// Time intervals for the rule (e.g., 9 AM to 5 PM)
2790    /// Required by the API.
2791    /// (Optional here so responses that omit it still parse.)
2792    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2793    pub intervals: Vec<ScheduleIntervalDTO>,
2794    /// Specific date in YYYY-MM-DD format (only for date-type rules)
2795    #[serde(default, skip_serializing_if = "Option::is_none")]
2796    pub date: Option<String>,
2797    /// Day of week (only for weekday-type rules)
2798    /// Allowed values: `sunday`, `monday`, `tuesday`, `wednesday`, `thursday`, `friday`,
2799    /// `saturday`.
2800    #[serde(default, skip_serializing_if = "Option::is_none")]
2801    pub day: Option<String>,
2802}
2803
2804/// `SchedulesDTO` from the GoHighLevel OpenAPI spec.
2805#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2806pub struct SchedulesDTO {
2807    #[serde(
2808        rename = "timeOffset",
2809        default,
2810        skip_serializing_if = "Option::is_none"
2811    )]
2812    pub time_offset: Option<f64>,
2813    #[serde(default, skip_serializing_if = "Option::is_none")]
2814    pub unit: Option<String>,
2815}
2816
2817/// `ServiceAddOnDTO` from the GoHighLevel OpenAPI spec.
2818#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2819pub struct ServiceAddOnDTO {
2820    /// Add-on ID
2821    /// Required by the API.
2822    pub id: String,
2823    /// Add-on quantity
2824    #[serde(default, skip_serializing_if = "Option::is_none")]
2825    pub quantity: Option<f64>,
2826    /// Add-on duration (in minutes)
2827    #[serde(default, skip_serializing_if = "Option::is_none")]
2828    pub duration: Option<f64>,
2829}
2830
2831/// `ServiceAddOnResponseDTO` from the GoHighLevel OpenAPI spec.
2832#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2833pub struct ServiceAddOnResponseDTO {
2834    /// Add-on ID
2835    /// Required by the API.
2836    /// (Optional here so responses that omit it still parse.)
2837    #[serde(default, skip_serializing_if = "Option::is_none")]
2838    pub id: Option<String>,
2839    /// Add-on quantity
2840    #[serde(default, skip_serializing_if = "Option::is_none")]
2841    pub quantity: Option<f64>,
2842}
2843
2844/// `ServiceBookingQueryDTO` from the GoHighLevel OpenAPI spec.
2845#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2846pub struct ServiceBookingQueryDTO {
2847    /// If true the time slot validation would be avoided for any booking creation/update (even
2848    /// the skipSchedulingNotice)
2849    #[serde(
2850        rename = "overrideAvailability",
2851        default,
2852        skip_serializing_if = "Option::is_none"
2853    )]
2854    pub override_availability: Option<bool>,
2855    /// If set to true, the minimum scheduling notice and date range would be ignored
2856    #[serde(
2857        rename = "skipSchedulingNotice",
2858        default,
2859        skip_serializing_if = "Option::is_none"
2860    )]
2861    pub skip_scheduling_notice: Option<bool>,
2862}
2863
2864/// `ServiceBookingResponseDTO` from the GoHighLevel OpenAPI spec.
2865#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2866pub struct ServiceBookingResponseDTO {
2867    /// Booking ID
2868    /// Required by the API.
2869    /// (Optional here so responses that omit it still parse.)
2870    #[serde(rename = "bookingId", default, skip_serializing_if = "Option::is_none")]
2871    pub booking_id: Option<String>,
2872    /// Location ID
2873    /// Required by the API.
2874    /// (Optional here so responses that omit it still parse.)
2875    #[serde(
2876        rename = "locationId",
2877        default,
2878        skip_serializing_if = "Option::is_none"
2879    )]
2880    pub location_id: Option<String>,
2881    /// Contact ID
2882    /// Required by the API.
2883    /// (Optional here so responses that omit it still parse.)
2884    #[serde(rename = "contactId", default, skip_serializing_if = "Option::is_none")]
2885    pub contact_id: Option<String>,
2886    /// Service Location ID
2887    /// Required by the API.
2888    /// (Optional here so responses that omit it still parse.)
2889    #[serde(
2890        rename = "serviceLocationId",
2891        default,
2892        skip_serializing_if = "Option::is_none"
2893    )]
2894    pub service_location_id: Option<String>,
2895    /// Service Booking Title
2896    /// Required by the API.
2897    /// (Optional here so responses that omit it still parse.)
2898    #[serde(default, skip_serializing_if = "Option::is_none")]
2899    pub title: Option<String>,
2900    /// Start Time
2901    /// Required by the API.
2902    /// (Optional here so responses that omit it still parse.)
2903    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
2904    pub start_time: Option<String>,
2905    /// End Time
2906    /// Required by the API.
2907    /// (Optional here so responses that omit it still parse.)
2908    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
2909    pub end_time: Option<String>,
2910    /// Services
2911    /// Required by the API.
2912    /// (Optional here so responses that omit it still parse.)
2913    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2914    pub services: Vec<ServiceDTO>,
2915    /// Timezone
2916    /// Required by the API.
2917    /// (Optional here so responses that omit it still parse.)
2918    #[serde(default, skip_serializing_if = "Option::is_none")]
2919    pub timezone: Option<String>,
2920    /// Status
2921    /// Required by the API.
2922    /// (Optional here so responses that omit it still parse.)
2923    #[serde(default, skip_serializing_if = "Option::is_none")]
2924    pub status: Option<String>,
2925    /// Tells if the booking is deleted
2926    /// Required by the API.
2927    /// (Optional here so responses that omit it still parse.)
2928    #[serde(default, skip_serializing_if = "Option::is_none")]
2929    pub deleted: Option<bool>,
2930    /// Date Added
2931    /// Required by the API.
2932    /// (Optional here so responses that omit it still parse.)
2933    #[serde(rename = "dateAdded", default, skip_serializing_if = "Option::is_none")]
2934    pub date_added: Option<String>,
2935    /// Date Updated
2936    /// Required by the API.
2937    /// (Optional here so responses that omit it still parse.)
2938    #[serde(
2939        rename = "dateUpdated",
2940        default,
2941        skip_serializing_if = "Option::is_none"
2942    )]
2943    pub date_updated: Option<String>,
2944    /// Booking booked by metadata
2945    /// Required by the API.
2946    /// (Optional here so responses that omit it still parse.)
2947    #[serde(rename = "createdBy", default, skip_serializing_if = "Option::is_none")]
2948    pub created_by: Option<CreatedOrUpdatedBy>,
2949    /// Meeting Location (If service location is an ask the booker, then the meeting location is
2950    /// used for the booking)
2951    #[serde(
2952        rename = "meetingLocation",
2953        default,
2954        skip_serializing_if = "Option::is_none"
2955    )]
2956    pub meeting_location: Option<String>,
2957}
2958
2959/// `ServiceBookingsListResponseDTO` from the GoHighLevel OpenAPI spec.
2960#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2961pub struct ServiceBookingsListResponseDTO {
2962    /// Service Bookings
2963    /// Required by the API.
2964    /// (Optional here so responses that omit it still parse.)
2965    #[serde(default, skip_serializing_if = "Vec::is_empty")]
2966    pub bookings: Vec<ServiceBookingResponseDTO>,
2967}
2968
2969/// `ServiceDTO` from the GoHighLevel OpenAPI spec.
2970#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2971pub struct ServiceDTO {
2972    /// Service ID
2973    /// Required by the API.
2974    /// (Optional here so responses that omit it still parse.)
2975    #[serde(default, skip_serializing_if = "Option::is_none")]
2976    pub id: Option<String>,
2977    /// Service Category ID
2978    /// Required by the API.
2979    /// (Optional here so responses that omit it still parse.)
2980    #[serde(
2981        rename = "serviceCategoryId",
2982        default,
2983        skip_serializing_if = "Option::is_none"
2984    )]
2985    pub service_category_id: Option<String>,
2986    /// Service Staff ID
2987    /// Required by the API.
2988    /// (Optional here so responses that omit it still parse.)
2989    #[serde(
2990        rename = "serviceStaffId",
2991        default,
2992        skip_serializing_if = "Option::is_none"
2993    )]
2994    pub service_staff_id: Option<String>,
2995    /// Service Start Time
2996    /// Required by the API.
2997    /// (Optional here so responses that omit it still parse.)
2998    #[serde(
2999        rename = "serviceStartTime",
3000        default,
3001        skip_serializing_if = "Option::is_none"
3002    )]
3003    pub service_start_time: Option<String>,
3004    /// Service End Time
3005    /// Required by the API.
3006    /// (Optional here so responses that omit it still parse.)
3007    #[serde(
3008        rename = "serviceEndTime",
3009        default,
3010        skip_serializing_if = "Option::is_none"
3011    )]
3012    pub service_end_time: Option<String>,
3013    /// Service Resources
3014    #[serde(
3015        rename = "serviceResources",
3016        default,
3017        skip_serializing_if = "Vec::is_empty"
3018    )]
3019    pub service_resources: Vec<ServiceResourceDTO>,
3020    /// Service Add-ons
3021    #[serde(
3022        rename = "serviceAddOns",
3023        default,
3024        skip_serializing_if = "Vec::is_empty"
3025    )]
3026    pub service_add_ons: Vec<ServiceAddOnResponseDTO>,
3027}
3028
3029/// `ServiceLocationListResponseDTO` from the GoHighLevel OpenAPI spec.
3030#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3031pub struct ServiceLocationListResponseDTO {
3032    /// List of service locations
3033    /// Required by the API.
3034    /// (Optional here so responses that omit it still parse.)
3035    #[serde(
3036        rename = "serviceLocations",
3037        default,
3038        skip_serializing_if = "Vec::is_empty"
3039    )]
3040    pub service_locations: Vec<ServiceLocationResponseDTO>,
3041}
3042
3043/// `ServiceLocationResponseDTO` from the GoHighLevel OpenAPI spec.
3044#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3045pub struct ServiceLocationResponseDTO {
3046    /// Service Location ID
3047    /// Required by the API.
3048    /// (Optional here so responses that omit it still parse.)
3049    #[serde(default, skip_serializing_if = "Option::is_none")]
3050    pub id: Option<String>,
3051    /// Location ID
3052    /// Required by the API.
3053    /// (Optional here so responses that omit it still parse.)
3054    #[serde(
3055        rename = "locationId",
3056        default,
3057        skip_serializing_if = "Option::is_none"
3058    )]
3059    pub location_id: Option<String>,
3060    /// Location name
3061    /// Required by the API.
3062    /// (Optional here so responses that omit it still parse.)
3063    #[serde(default, skip_serializing_if = "Option::is_none")]
3064    pub name: Option<String>,
3065    /// Unique URL-friendly identifier for the service location
3066    /// Required by the API.
3067    /// (Optional here so responses that omit it still parse.)
3068    #[serde(default, skip_serializing_if = "Option::is_none")]
3069    pub slug: Option<String>,
3070    /// Whether location is active
3071    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
3072    pub is_active: Option<bool>,
3073    /// Whether location is private (not shown publicly)
3074    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
3075    pub is_private: Option<bool>,
3076    /// URL of the cover image displayed for this location
3077    #[serde(
3078        rename = "coverImage",
3079        default,
3080        skip_serializing_if = "Option::is_none"
3081    )]
3082    pub cover_image: Option<String>,
3083    /// Location type
3084    /// Allowed values: `offline`, `ask_booker`.
3085    #[serde(
3086        rename = "locationType",
3087        default,
3088        skip_serializing_if = "Option::is_none"
3089    )]
3090    pub location_type: Option<String>,
3091    /// Use a full street address when locationType is offline. Use a user-facing label when
3092    /// locationType is ask_booker.
3093    #[serde(default, skip_serializing_if = "Option::is_none")]
3094    pub address: Option<String>,
3095    /// Contact phone number for the service location
3096    #[serde(default, skip_serializing_if = "Option::is_none")]
3097    pub phone: Option<String>,
3098}
3099
3100/// `ServiceResourceDTO` from the GoHighLevel OpenAPI spec.
3101#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3102pub struct ServiceResourceDTO {
3103    /// Resource ID
3104    /// Required by the API.
3105    /// (Optional here so responses that omit it still parse.)
3106    #[serde(default, skip_serializing_if = "Option::is_none")]
3107    pub id: Option<String>,
3108}
3109
3110/// `ServiceResponseDTO` from the GoHighLevel OpenAPI spec.
3111#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3112pub struct ServiceResponseDTO {
3113    /// Service ID
3114    /// Required by the API.
3115    /// (Optional here so responses that omit it still parse.)
3116    #[serde(default, skip_serializing_if = "Option::is_none")]
3117    pub id: Option<String>,
3118    /// Location ID
3119    /// Required by the API.
3120    /// (Optional here so responses that omit it still parse.)
3121    #[serde(
3122        rename = "locationId",
3123        default,
3124        skip_serializing_if = "Option::is_none"
3125    )]
3126    pub location_id: Option<String>,
3127    /// Service name
3128    /// Required by the API.
3129    /// (Optional here so responses that omit it still parse.)
3130    #[serde(default, skip_serializing_if = "Option::is_none")]
3131    pub name: Option<String>,
3132    /// Service description
3133    #[serde(default, skip_serializing_if = "Option::is_none")]
3134    pub description: Option<String>,
3135    /// Unique URL-friendly identifier
3136    #[serde(default, skip_serializing_if = "Option::is_none")]
3137    pub slug: Option<String>,
3138    /// Service event color (hex)
3139    #[serde(
3140        rename = "eventColor",
3141        default,
3142        skip_serializing_if = "Option::is_none"
3143    )]
3144    pub event_color: Option<String>,
3145    /// Service cover image URL
3146    #[serde(
3147        rename = "coverImage",
3148        default,
3149        skip_serializing_if = "Option::is_none"
3150    )]
3151    pub cover_image: Option<String>,
3152    /// Service category ID
3153    #[serde(
3154        rename = "serviceCategoryId",
3155        default,
3156        skip_serializing_if = "Option::is_none"
3157    )]
3158    pub service_category_id: Option<String>,
3159    /// Payment details
3160    #[serde(default, skip_serializing_if = "Option::is_none")]
3161    pub payment: Option<PaymentDTO>,
3162    /// This controls the duration of the appointment
3163    #[serde(
3164        rename = "serviceDuration",
3165        default,
3166        skip_serializing_if = "Option::is_none"
3167    )]
3168    pub service_duration: Option<f64>,
3169    /// Duration unit
3170    /// Allowed values: `mins`, `hours`.
3171    #[serde(
3172        rename = "serviceDurationUnit",
3173        default,
3174        skip_serializing_if = "Option::is_none"
3175    )]
3176    pub service_duration_unit: Option<String>,
3177    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
3178    /// extra time to get ready
3179    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
3180    pub pre_buffer: Option<f64>,
3181    /// Pre-buffer unit
3182    /// Allowed values: `mins`, `hours`.
3183    #[serde(
3184        rename = "preBufferUnit",
3185        default,
3186        skip_serializing_if = "Option::is_none"
3187    )]
3188    pub pre_buffer_unit: Option<String>,
3189    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
3190    /// time to wrap up
3191    #[serde(
3192        rename = "postBuffer",
3193        default,
3194        skip_serializing_if = "Option::is_none"
3195    )]
3196    pub post_buffer: Option<f64>,
3197    /// Post-buffer unit
3198    /// Allowed values: `mins`, `hours`.
3199    #[serde(
3200        rename = "postBufferUnit",
3201        default,
3202        skip_serializing_if = "Option::is_none"
3203    )]
3204    pub post_buffer_unit: Option<String>,
3205    /// Whether service is private (not shown publicly)
3206    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
3207    pub is_private: Option<bool>,
3208    /// Custom form ID (will be used to display the custom form on the booking page, if only one
3209    /// service is selected)
3210    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
3211    pub form_id: Option<String>,
3212    /// Service variations
3213    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3214    pub variations: Vec<ServiceVariationDTO>,
3215    /// Assigned staff members
3216    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3217    pub staff: Vec<StaffDTO>,
3218}
3219
3220/// `ServiceResponseWrapperDTO` from the GoHighLevel OpenAPI spec.
3221#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3222pub struct ServiceResponseWrapperDTO {
3223    /// Service details
3224    /// Required by the API.
3225    /// (Optional here so responses that omit it still parse.)
3226    #[serde(default, skip_serializing_if = "Option::is_none")]
3227    pub service: Option<ServiceResponseDTO>,
3228}
3229
3230/// `ServiceVariationDTO` from the GoHighLevel OpenAPI spec.
3231#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3232pub struct ServiceVariationDTO {
3233    /// Variation ID
3234    /// Required by the API.
3235    /// (Optional here so responses that omit it still parse.)
3236    #[serde(default, skip_serializing_if = "Option::is_none")]
3237    pub id: Option<String>,
3238    /// Variation name
3239    /// Required by the API.
3240    /// (Optional here so responses that omit it still parse.)
3241    #[serde(default, skip_serializing_if = "Option::is_none")]
3242    pub name: Option<String>,
3243    /// This controls the duration of the appointment
3244    #[serde(
3245        rename = "serviceDuration",
3246        default,
3247        skip_serializing_if = "Option::is_none"
3248    )]
3249    pub service_duration: Option<f64>,
3250    /// Duration unit
3251    /// Allowed values: `mins`, `hours`.
3252    #[serde(
3253        rename = "serviceDurationUnit",
3254        default,
3255        skip_serializing_if = "Option::is_none"
3256    )]
3257    pub service_duration_unit: Option<String>,
3258    /// Payment details
3259    #[serde(default, skip_serializing_if = "Option::is_none")]
3260    pub payment: Option<PaymentDTO>,
3261    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
3262    /// extra time to get ready
3263    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
3264    pub pre_buffer: Option<f64>,
3265    /// Pre-buffer unit
3266    /// Allowed values: `mins`, `hours`.
3267    #[serde(
3268        rename = "preBufferUnit",
3269        default,
3270        skip_serializing_if = "Option::is_none"
3271    )]
3272    pub pre_buffer_unit: Option<String>,
3273    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
3274    /// time to wrap up
3275    #[serde(
3276        rename = "postBuffer",
3277        default,
3278        skip_serializing_if = "Option::is_none"
3279    )]
3280    pub post_buffer: Option<f64>,
3281    /// Post-buffer unit
3282    /// Allowed values: `mins`, `hours`.
3283    #[serde(
3284        rename = "postBufferUnit",
3285        default,
3286        skip_serializing_if = "Option::is_none"
3287    )]
3288    pub post_buffer_unit: Option<String>,
3289}
3290
3291/// `ServicesListResponseDTO` from the GoHighLevel OpenAPI spec.
3292#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3293pub struct ServicesListResponseDTO {
3294    /// List of services
3295    /// Required by the API.
3296    /// (Optional here so responses that omit it still parse.)
3297    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3298    pub services: Vec<ServiceResponseDTO>,
3299}
3300
3301/// `SlotsSchema` from the GoHighLevel OpenAPI spec.
3302#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3303pub struct SlotsSchema {
3304    /// Required by the API.
3305    /// (Optional here so responses that omit it still parse.)
3306    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3307    pub slots: Vec<String>,
3308}
3309
3310/// `StaffDTO` from the GoHighLevel OpenAPI spec.
3311#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3312pub struct StaffDTO {
3313    /// Staff ID
3314    /// Required by the API.
3315    /// (Optional here so responses that omit it still parse.)
3316    #[serde(default, skip_serializing_if = "Option::is_none")]
3317    pub id: Option<String>,
3318}
3319
3320/// `TeamMember` from the GoHighLevel OpenAPI spec.
3321#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3322pub struct TeamMember {
3323    /// Required by the API.
3324    #[serde(rename = "userId")]
3325    pub user_id: String,
3326    /// Allowed values: `0`, `0.5`, `1`.
3327    #[serde(default, skip_serializing_if = "Option::is_none")]
3328    pub priority: Option<String>,
3329    /// 🚨 Deprecated! Use `locationConfigurations.kind` instead.
3330    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `teams`, `booker`.
3331    #[serde(
3332        rename = "meetingLocationType",
3333        default,
3334        skip_serializing_if = "Option::is_none"
3335    )]
3336    pub meeting_location_type: Option<String>,
3337    /// 🚨 Deprecated! Use `locationConfigurations.location` instead.
3338    #[serde(
3339        rename = "meetingLocation",
3340        default,
3341        skip_serializing_if = "Option::is_none"
3342    )]
3343    pub meeting_location: Option<String>,
3344    /// Marks a user as primary. This property is required in case of collective booking
3345    /// calendars. Only one user can be primary.
3346    #[serde(rename = "isPrimary", default, skip_serializing_if = "Option::is_none")]
3347    pub is_primary: Option<bool>,
3348    /// Meeting location configuration for event calendar. - *Multiple locations are allowed
3349    /// only when one team member is selected.* - *For **Class booking** and **Collective**
3350    /// calendars, only one location configuration is allowed for each team member.*
3351    #[serde(
3352        rename = "locationConfigurations",
3353        default,
3354        skip_serializing_if = "Vec::is_empty"
3355    )]
3356    pub location_configurations: Vec<LocationConfiguration>,
3357}
3358
3359/// `TeamMemberResponse` from the GoHighLevel OpenAPI spec.
3360#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3361pub struct TeamMemberResponse {
3362    /// Required by the API.
3363    /// (Optional here so responses that omit it still parse.)
3364    #[serde(rename = "userId", default, skip_serializing_if = "Option::is_none")]
3365    pub user_id: Option<String>,
3366    /// Allowed values: `0`, `0.5`, `1`.
3367    #[serde(default, skip_serializing_if = "Option::is_none")]
3368    pub priority: Option<String>,
3369    /// 🚨 Deprecated! Use `locationConfigurations.kind` instead.
3370    /// Allowed values: `custom`, `zoom`, `gmeet`, `phone`, `address`, `teams`, `booker`.
3371    #[serde(
3372        rename = "meetingLocationType",
3373        default,
3374        skip_serializing_if = "Option::is_none"
3375    )]
3376    pub meeting_location_type: Option<String>,
3377    /// 🚨 Deprecated! Use `locationConfigurations.location` instead.
3378    #[serde(
3379        rename = "meetingLocation",
3380        default,
3381        skip_serializing_if = "Option::is_none"
3382    )]
3383    pub meeting_location: Option<String>,
3384    /// Marks a user as primary. This property is required in case of collective booking
3385    /// calendars. Only one user can be primary.
3386    #[serde(rename = "isPrimary", default, skip_serializing_if = "Option::is_none")]
3387    pub is_primary: Option<bool>,
3388    /// Meeting location configurations
3389    #[serde(
3390        rename = "locationConfigurations",
3391        default,
3392        skip_serializing_if = "Vec::is_empty"
3393    )]
3394    pub location_configurations: Vec<LocationConfigurationResponse>,
3395}
3396
3397/// `UpdateAvailability` from the GoHighLevel OpenAPI spec.
3398#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3399pub struct UpdateAvailability {
3400    /// Formulate the date string in the format of ` T00:00:00.000Z`.
3401    /// Required by the API.
3402    pub date: String,
3403    /// Required by the API.
3404    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3405    pub hours: Vec<Hour>,
3406    #[serde(default, skip_serializing_if = "Option::is_none")]
3407    pub deleted: Option<bool>,
3408    /// The ID of the custom availability object. It is required while updating or deleting the
3409    /// existing custom date availability
3410    #[serde(default, skip_serializing_if = "Option::is_none")]
3411    pub id: Option<String>,
3412}
3413
3414/// `UpdateCalendarNotificationsDTO` from the GoHighLevel OpenAPI spec.
3415#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3416pub struct UpdateCalendarNotificationsDTO {
3417    /// Notification recipient type
3418    /// Allowed values: `contact`, `guest`, `assignedUser`, `emails`, `phoneNumbers`,
3419    /// `business`.
3420    #[serde(
3421        rename = "receiverType",
3422        default,
3423        skip_serializing_if = "Option::is_none"
3424    )]
3425    pub receiver_type: Option<String>,
3426    /// Additional email addresses to receive notifications.
3427    #[serde(
3428        rename = "additionalEmailIds",
3429        default,
3430        skip_serializing_if = "Vec::is_empty"
3431    )]
3432    pub additional_email_ids: Vec<String>,
3433    /// Additional phone numbers to receive notifications.
3434    #[serde(
3435        rename = "additionalPhoneNumbers",
3436        default,
3437        skip_serializing_if = "Vec::is_empty"
3438    )]
3439    pub additional_phone_numbers: Vec<String>,
3440    /// Selected users for in-App and business email notifications. Supports user IDs and
3441    /// special keyword "sub_account_admin"
3442    #[serde(
3443        rename = "selectedUsers",
3444        default,
3445        skip_serializing_if = "Vec::is_empty"
3446    )]
3447    pub selected_users: Vec<String>,
3448    /// Notification channel
3449    /// Allowed values: `email`, `inApp`, `sms`, `whatsapp`.
3450    #[serde(default, skip_serializing_if = "Option::is_none")]
3451    pub channel: Option<String>,
3452    /// Notification type
3453    /// Allowed values: `booked`, `confirmation`, `cancellation`, `reminder`, `followup`,
3454    /// `reschedule`.
3455    #[serde(
3456        rename = "notificationType",
3457        default,
3458        skip_serializing_if = "Option::is_none"
3459    )]
3460    pub notification_type: Option<String>,
3461    /// Is the notification active
3462    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
3463    pub is_active: Option<bool>,
3464    /// Marks the notification as deleted (soft delete)
3465    #[serde(default, skip_serializing_if = "Option::is_none")]
3466    pub deleted: Option<bool>,
3467    /// Template ID for email notification
3468    #[serde(
3469        rename = "templateId",
3470        default,
3471        skip_serializing_if = "Option::is_none"
3472    )]
3473    pub template_id: Option<String>,
3474    /// Body for email notification. Not necessary for in-App notification
3475    #[serde(default, skip_serializing_if = "Option::is_none")]
3476    pub body: Option<String>,
3477    /// Subject for email notification. Not necessary for in-App notification
3478    #[serde(default, skip_serializing_if = "Option::is_none")]
3479    pub subject: Option<String>,
3480    /// Specifies the time after which the follow-up notification should be sent. This is not
3481    /// required for other notification types.
3482    #[serde(rename = "afterTime", default, skip_serializing_if = "Vec::is_empty")]
3483    pub after_time: Vec<SchedulesDTO>,
3484    /// Specifies the time before which the reminder notification should be sent. This is not
3485    /// required for other notification types.
3486    #[serde(rename = "beforeTime", default, skip_serializing_if = "Vec::is_empty")]
3487    pub before_time: Vec<SchedulesDTO>,
3488    /// From address for email notification
3489    #[serde(
3490        rename = "fromAddress",
3491        default,
3492        skip_serializing_if = "Option::is_none"
3493    )]
3494    pub from_address: Option<String>,
3495    /// from number for sms notification
3496    #[serde(
3497        rename = "fromNumber",
3498        default,
3499        skip_serializing_if = "Option::is_none"
3500    )]
3501    pub from_number: Option<String>,
3502    /// From name for email/sms notification
3503    #[serde(rename = "fromName", default, skip_serializing_if = "Option::is_none")]
3504    pub from_name: Option<String>,
3505}
3506
3507/// `UpdateCalendarResourceDTO` from the GoHighLevel OpenAPI spec.
3508#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3509pub struct UpdateCalendarResourceDTO {
3510    #[serde(
3511        rename = "locationId",
3512        default,
3513        skip_serializing_if = "Option::is_none"
3514    )]
3515    pub location_id: Option<String>,
3516    #[serde(default, skip_serializing_if = "Option::is_none")]
3517    pub name: Option<String>,
3518    #[serde(default, skip_serializing_if = "Option::is_none")]
3519    pub description: Option<String>,
3520    /// Quantity of the equipment.
3521    #[serde(default, skip_serializing_if = "Option::is_none")]
3522    pub quantity: Option<f64>,
3523    /// Quantity of the out of service equipment.
3524    #[serde(
3525        rename = "outOfService",
3526        default,
3527        skip_serializing_if = "Option::is_none"
3528    )]
3529    pub out_of_service: Option<f64>,
3530    /// Capacity of the room.
3531    #[serde(default, skip_serializing_if = "Option::is_none")]
3532    pub capacity: Option<f64>,
3533    /// Service calendar IDs to be mapped with the resource. One equipment can only be mapped
3534    /// with one service calendar. One room can be mapped with multiple service calendars.
3535    #[serde(rename = "calendarIds", default, skip_serializing_if = "Vec::is_empty")]
3536    pub calendar_ids: Vec<String>,
3537    #[serde(rename = "isActive", default, skip_serializing_if = "Option::is_none")]
3538    pub is_active: Option<bool>,
3539}
3540
3541/// `UpdateEventCalendarScheduleDTO` from the GoHighLevel OpenAPI spec.
3542#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3543pub struct UpdateEventCalendarScheduleDTO {
3544    /// Updated schedule rules defining when the schedule is active
3545    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3546    pub rules: Vec<ScheduleRuleDTO>,
3547    /// Updated timezone for the schedule (IANA timezone identifier)
3548    #[serde(default, skip_serializing_if = "Option::is_none")]
3549    pub timezone: Option<String>,
3550}
3551
3552/// `UpdateScheduleDTO` from the GoHighLevel OpenAPI spec.
3553#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3554pub struct UpdateScheduleDTO {
3555    /// Human-readable name for the schedule
3556    #[serde(default, skip_serializing_if = "Option::is_none")]
3557    pub name: Option<String>,
3558    /// Updated schedule rules defining when the schedule is active
3559    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3560    pub rules: Vec<ScheduleRuleDTO>,
3561    /// Updated timezone for the schedule (IANA timezone identifier)
3562    #[serde(default, skip_serializing_if = "Option::is_none")]
3563    pub timezone: Option<String>,
3564}
3565
3566/// `UpdateServiceBookingDTO` from the GoHighLevel OpenAPI spec.
3567#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3568pub struct UpdateServiceBookingDTO {
3569    /// Service Location ID
3570    #[serde(
3571        rename = "serviceLocationId",
3572        default,
3573        skip_serializing_if = "Option::is_none"
3574    )]
3575    pub service_location_id: Option<String>,
3576    /// Meeting Location (If service location is an ask the booker, then the meeting location is
3577    /// required)
3578    #[serde(
3579        rename = "meetingLocation",
3580        default,
3581        skip_serializing_if = "Option::is_none"
3582    )]
3583    pub meeting_location: Option<String>,
3584    /// Title
3585    #[serde(default, skip_serializing_if = "Option::is_none")]
3586    pub title: Option<String>,
3587    /// Status
3588    /// Allowed values: `confirmed`, `cancelled`, `invalid`, `new`, `showed`, `no_show`.
3589    #[serde(default, skip_serializing_if = "Option::is_none")]
3590    pub status: Option<String>,
3591    /// Start Time
3592    #[serde(rename = "startTime", default, skip_serializing_if = "Option::is_none")]
3593    pub start_time: Option<String>,
3594    /// End Time
3595    #[serde(rename = "endTime", default, skip_serializing_if = "Option::is_none")]
3596    pub end_time: Option<String>,
3597    /// Timezone
3598    #[serde(default, skip_serializing_if = "Option::is_none")]
3599    pub timezone: Option<String>,
3600    /// If provided, services sent in the request will replace the existing services in the
3601    /// booking.
3602    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3603    pub services: Vec<CreateBookingServiceDTO>,
3604}
3605
3606/// `UpdateServiceDTO` from the GoHighLevel OpenAPI spec.
3607#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3608pub struct UpdateServiceDTO {
3609    /// Service name
3610    #[serde(default, skip_serializing_if = "Option::is_none")]
3611    pub name: Option<String>,
3612    /// Service description
3613    #[serde(default, skip_serializing_if = "Option::is_none")]
3614    pub description: Option<String>,
3615    /// Unique URL-friendly identifier
3616    #[serde(default, skip_serializing_if = "Option::is_none")]
3617    pub slug: Option<String>,
3618    /// Service event color (hex)
3619    #[serde(
3620        rename = "eventColor",
3621        default,
3622        skip_serializing_if = "Option::is_none"
3623    )]
3624    pub event_color: Option<String>,
3625    /// Service cover image URL
3626    #[serde(
3627        rename = "coverImage",
3628        default,
3629        skip_serializing_if = "Option::is_none"
3630    )]
3631    pub cover_image: Option<String>,
3632    /// Service category ID
3633    #[serde(
3634        rename = "serviceCategoryId",
3635        default,
3636        skip_serializing_if = "Option::is_none"
3637    )]
3638    pub service_category_id: Option<String>,
3639    /// Payment details (currency configured in Service Global Settings is used.)
3640    #[serde(default, skip_serializing_if = "Option::is_none")]
3641    pub payment: Option<PaymentDTO>,
3642    /// This controls the duration of the appointment
3643    #[serde(
3644        rename = "serviceDuration",
3645        default,
3646        skip_serializing_if = "Option::is_none"
3647    )]
3648    pub service_duration: Option<f64>,
3649    /// Duration unit
3650    /// Allowed values: `mins`, `hours`.
3651    #[serde(
3652        rename = "serviceDurationUnit",
3653        default,
3654        skip_serializing_if = "Option::is_none"
3655    )]
3656    pub service_duration_unit: Option<String>,
3657    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
3658    /// extra time to get ready
3659    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
3660    pub pre_buffer: Option<f64>,
3661    /// Pre-buffer unit
3662    /// Allowed values: `mins`, `hours`.
3663    #[serde(
3664        rename = "preBufferUnit",
3665        default,
3666        skip_serializing_if = "Option::is_none"
3667    )]
3668    pub pre_buffer_unit: Option<String>,
3669    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
3670    /// time to wrap up
3671    #[serde(
3672        rename = "postBuffer",
3673        default,
3674        skip_serializing_if = "Option::is_none"
3675    )]
3676    pub post_buffer: Option<f64>,
3677    /// Post-buffer unit
3678    /// Allowed values: `mins`, `hours`.
3679    #[serde(
3680        rename = "postBufferUnit",
3681        default,
3682        skip_serializing_if = "Option::is_none"
3683    )]
3684    pub post_buffer_unit: Option<String>,
3685    /// Whether service is private (not shown publicly)
3686    #[serde(rename = "isPrivate", default, skip_serializing_if = "Option::is_none")]
3687    pub is_private: Option<bool>,
3688    /// Custom form ID (will be used to display the custom form on the booking page, if only one
3689    /// service is selected)
3690    #[serde(rename = "formId", default, skip_serializing_if = "Option::is_none")]
3691    pub form_id: Option<String>,
3692    /// Assigned staff members
3693    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3694    pub staff: Vec<StaffDTO>,
3695    /// Service variations (an empty array removes all variations). Include an id to update an
3696    /// existing variation; omit the id to create a new one.
3697    #[serde(default, skip_serializing_if = "Vec::is_empty")]
3698    pub variations: Vec<UpdateServiceVariationDTO>,
3699}
3700
3701/// `UpdateServiceLocationDTO` from the GoHighLevel OpenAPI spec.
3702#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3703pub struct UpdateServiceLocationDTO {
3704    /// Location name
3705    #[serde(default, skip_serializing_if = "Option::is_none")]
3706    pub name: Option<String>,
3707    /// Updated URL-friendly slug identifier
3708    #[serde(default, skip_serializing_if = "Option::is_none")]
3709    pub slug: Option<String>,
3710    /// Updated contact phone number
3711    #[serde(default, skip_serializing_if = "Option::is_none")]
3712    pub phone: Option<String>,
3713    /// Use a full street address when locationType is offline. Use a user-facing label when
3714    /// locationType is ask_booker.
3715    #[serde(default, skip_serializing_if = "Option::is_none")]
3716    pub address: Option<String>,
3717    /// Updated URL of the cover image
3718    #[serde(
3719        rename = "coverImage",
3720        default,
3721        skip_serializing_if = "Option::is_none"
3722    )]
3723    pub cover_image: Option<String>,
3724    /// Location type
3725    /// Allowed values: `offline`, `ask_booker`.
3726    #[serde(
3727        rename = "locationType",
3728        default,
3729        skip_serializing_if = "Option::is_none"
3730    )]
3731    pub location_type: Option<String>,
3732}
3733
3734/// `UpdateServiceVariationDTO` from the GoHighLevel OpenAPI spec.
3735#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3736pub struct UpdateServiceVariationDTO {
3737    /// This controls the duration of the appointment
3738    #[serde(
3739        rename = "serviceDuration",
3740        default,
3741        skip_serializing_if = "Option::is_none"
3742    )]
3743    pub service_duration: Option<f64>,
3744    /// Duration unit
3745    /// Allowed values: `mins`, `hours`.
3746    #[serde(
3747        rename = "serviceDurationUnit",
3748        default,
3749        skip_serializing_if = "Option::is_none"
3750    )]
3751    pub service_duration_unit: Option<String>,
3752    /// Pre-Buffer is additional time that can be added before an appointment, allowing for
3753    /// extra time to get ready
3754    #[serde(rename = "preBuffer", default, skip_serializing_if = "Option::is_none")]
3755    pub pre_buffer: Option<f64>,
3756    /// Pre-buffer unit
3757    /// Allowed values: `mins`, `hours`.
3758    #[serde(
3759        rename = "preBufferUnit",
3760        default,
3761        skip_serializing_if = "Option::is_none"
3762    )]
3763    pub pre_buffer_unit: Option<String>,
3764    /// Post-buffer: Additional time that can be added after an appointment, allowing for extra
3765    /// time to wrap up
3766    #[serde(
3767        rename = "postBuffer",
3768        default,
3769        skip_serializing_if = "Option::is_none"
3770    )]
3771    pub post_buffer: Option<f64>,
3772    /// Post-buffer unit
3773    /// Allowed values: `mins`, `hours`.
3774    #[serde(
3775        rename = "postBufferUnit",
3776        default,
3777        skip_serializing_if = "Option::is_none"
3778    )]
3779    pub post_buffer_unit: Option<String>,
3780    /// Payment details
3781    #[serde(default, skip_serializing_if = "Option::is_none")]
3782    pub payment: Option<PaymentDTO>,
3783    /// Variation ID
3784    #[serde(default, skip_serializing_if = "Option::is_none")]
3785    pub id: Option<String>,
3786    /// Variation name
3787    #[serde(default, skip_serializing_if = "Option::is_none")]
3788    pub name: Option<String>,
3789}
3790
3791/// `ValidateGroupSlugPostBody` from the GoHighLevel OpenAPI spec.
3792#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3793pub struct ValidateGroupSlugPostBody {
3794    /// Location Id
3795    /// Required by the API.
3796    #[serde(rename = "locationId")]
3797    pub location_id: String,
3798    /// Slug
3799    /// Required by the API.
3800    pub slug: String,
3801}
3802
3803/// `ValidateGroupSlugSuccessResponseDTO` from the GoHighLevel OpenAPI spec.
3804#[derive(Debug, Clone, Default, Serialize, Deserialize)]
3805pub struct ValidateGroupSlugSuccessResponseDTO {
3806    /// Required by the API.
3807    /// (Optional here so responses that omit it still parse.)
3808    #[serde(default, skip_serializing_if = "Option::is_none")]
3809    pub available: Option<bool>,
3810}