github.com/schmorrison/Zoho@v1.1.4/shifts/availability.go (about) 1 package shifts 2 3 import ( 4 "fmt" 5 6 zoho "github.com/schmorrison/Zoho" 7 ) 8 9 // GetAllShifts returns a list of all shifts 10 // https://www.zoho.com/shifts/api/v1/shifts-api/#get-all-shifts 11 func (s *API) GetAllShifts(params map[string]zoho.Parameter) (data GetShiftsResponse, err error) { 12 endpoint := zoho.Endpoint{ 13 Name: "GetAllShifts", 14 URL: fmt.Sprintf( 15 "https://shifts.zoho.%s/api/v1/%s/%s", 16 s.ZohoTLD, 17 s.OrganizationID, 18 shiftsModule, 19 ), 20 Method: zoho.HTTPGet, 21 ResponseData: &GetShiftsResponse{}, 22 URLParameters: map[string]zoho.Parameter{ 23 "start_date": "", // yyyy-mm-dd 24 "end_date": "", // yyyy-mm-dd 25 "schedules": "", 26 "job_sites": "", 27 "positions": "", 28 "employees": "", 29 "status": "", // published, unpublished 30 }, 31 } 32 33 if len(params) > 0 { 34 for k, v := range params { 35 endpoint.URLParameters[k] = v 36 } 37 } 38 39 if endpoint.URLParameters["start_date"] == "" || endpoint.URLParameters["end_date"] == "" { 40 return GetShiftsResponse{}, fmt.Errorf( 41 "failed to retrieve shifts: start_date and end_date are required search parameters", 42 ) 43 } 44 45 err = s.Zoho.HTTPRequest(&endpoint) 46 if err != nil { 47 return GetShiftsResponse{}, fmt.Errorf("failed to retrieve shifts: %s", err) 48 } 49 50 if v, ok := endpoint.ResponseData.(*GetShiftsResponse); ok { 51 return *v, nil 52 } 53 54 return GetShiftsResponse{}, fmt.Errorf("data retrieved was not 'GetShiftsResponse'") 55 } 56 57 type GetShiftsResponse struct { 58 Shifts []struct { 59 ID string `json:"id,omitempty"` 60 StartTime *Time `json:"start_time,omitempty"` 61 EndTime *Time `json:"end_time,omitempty"` 62 EmployeeID string `json:"employee_id,omitempty"` 63 Count int `json:"count,omitempty"` 64 ScheduleID string `json:"schedule_id,omitempty"` 65 PositionID string `json:"position_id,omitempty"` 66 JobSiteID string `json:"job_site_id,omitempty"` 67 Duration float64 `json:"duration,omitempty"` 68 BreakDuration float64 `json:"break_duration,omitempty"` 69 Notes string `json:"notes,omitempty"` 70 IsPublished bool `json:"is_published,omitempty"` 71 IsConfirmed bool `json:"is_confirmed,omitempty"` 72 Breaks []struct { 73 BreakID string `json:"break_id,omitempty"` 74 DurationMins int `json:"duration_mins,omitempty"` 75 StartTime *Time `json:"start_time,omitempty"` 76 EndTime *Time `json:"end_time,omitempty"` 77 IsPaid bool `json:"is_paid,omitempty"` 78 } `json:"breaks,omitempty"` 79 } `json:"shifts,omitempty"` 80 } 81 82 // CreateShift adds a new record to the list of shifts 83 // https://www.zoho.com/shifts/api/v1/shifts-api/#create-a-shift 84 func (s *API) CreateShift(request CreateShiftRequest) (data CreateShiftResponse, err error) { 85 endpoint := zoho.Endpoint{ 86 Name: "CreateShift", 87 URL: fmt.Sprintf( 88 "https://shifts.zoho.%s/api/v1/%s/%s", 89 s.ZohoTLD, 90 s.OrganizationID, 91 shiftsModule, 92 ), 93 Method: zoho.HTTPPost, 94 ResponseData: &CreateShiftResponse{}, 95 RequestBody: request, 96 } 97 98 if request.StartTime.IsZero() || request.EndTime.IsZero() || request.ScheduleID == "" || 99 request.PositionID == "" { 100 return CreateShiftResponse{}, fmt.Errorf( 101 "failed to create shift: start_time, end_time, schedule_id, and position_id are required fields", 102 ) 103 } 104 105 err = s.Zoho.HTTPRequest(&endpoint) 106 if err != nil { 107 return CreateShiftResponse{}, fmt.Errorf("failed to create shift: %s", err) 108 } 109 110 if v, ok := endpoint.ResponseData.(*CreateShiftResponse); ok { 111 return *v, nil 112 } 113 114 return CreateShiftResponse{}, fmt.Errorf("data retrieved was not 'CreateShiftResponse'") 115 } 116 117 type CreateShiftRequest struct { 118 StartTime *Time `json:"start_time"` // required 119 EndTime *Time `json:"end_time"` // required 120 EmployeeID string `json:"employee_id,omitempty"` // empty creates an open shift 121 Count int `json:"count,omitempty"` 122 ScheduleID string `json:"schedule_id"` // required 123 PositionID string `json:"position_id"` // required 124 JobSiteID string `json:"job_site_id,omitempty"` 125 Notes string `json:"notes,omitempty"` 126 Breaks []struct { 127 BreakID string `json:"break_id,omitempty"` 128 DurationMins int `json:"duration_mins,omitempty"` 129 StartTime *Time `json:"start_time,omitempty"` 130 EndTime *Time `json:"end_time,omitempty"` 131 } `json:"breaks,omitempty"` 132 } 133 134 type CreateShiftResponse struct { 135 ID string `json:"id,omitempty"` 136 StartTime *Time `json:"start_time,omitempty"` 137 EndTime *Time `json:"end_time,omitempty"` 138 EmployeeID string `json:"employee_id,omitempty"` 139 Count int `json:"count,omitempty"` 140 ScheduleID string `json:"schedule_id,omitempty"` 141 PositionID string `json:"position_id,omitempty"` 142 JobSiteID string `json:"job_site_id,omitempty"` 143 Duration float64 `json:"duration,omitempty"` 144 BreakDuration float64 `json:"break_duration,omitempty"` 145 Notes string `json:"notes,omitempty"` 146 IsPublished bool `json:"is_published,omitempty"` 147 IsConfirmed bool `json:"is_confirmed,omitempty"` 148 Breaks []struct { 149 BreakID string `json:"break_id,omitempty"` 150 DurationMins int `json:"duration_mins,omitempty"` 151 StartTime *Time `json:"start_time,omitempty"` 152 EndTime *Time `json:"end_time,omitempty"` 153 IsPaid bool `json:"is_paid,omitempty"` 154 } `json:"breaks,omitempty"` 155 } 156 157 // GetShift retrieves the shift record with the given ID 158 // https://www.zoho.com/shifts/api/v1/shifts-api/#get-a-shift 159 func (s *API) GetShift(id string) (data GetShiftResponse, err error) { 160 endpoint := zoho.Endpoint{ 161 Name: "GetShift", 162 URL: fmt.Sprintf( 163 "https://shifts.zoho.%s/api/v1/%s/%s/%s", 164 s.ZohoTLD, 165 s.OrganizationID, 166 shiftsModule, 167 id, 168 ), 169 Method: zoho.HTTPGet, 170 ResponseData: &GetShiftResponse{}, 171 } 172 173 err = s.Zoho.HTTPRequest(&endpoint) 174 if err != nil { 175 return GetShiftResponse{}, fmt.Errorf("failed to retrieve shift with id: %s", err) 176 } 177 178 if v, ok := endpoint.ResponseData.(*GetShiftResponse); ok { 179 return *v, nil 180 } 181 182 return GetShiftResponse{}, fmt.Errorf("data returned was not 'GetShiftResponse'") 183 } 184 185 type GetShiftResponse struct { 186 ID string `json:"id,omitempty"` 187 StartTime *Time `json:"start_time,omitempty"` 188 EndTime *Time `json:"end_time,omitempty"` 189 EmployeeID string `json:"employee_id,omitempty"` 190 Count int `json:"count,omitempty"` 191 ScheduleID string `json:"schedule_id,omitempty"` 192 PositionID string `json:"position_id,omitempty"` 193 JobSiteID string `json:"job_site_id,omitempty"` 194 Duration float64 `json:"duration,omitempty"` 195 BreakDuration float64 `json:"break_duration,omitempty"` 196 Notes string `json:"notes,omitempty"` 197 IsPublished bool `json:"is_published,omitempty"` 198 IsConfirmed bool `json:"is_confirmed,omitempty"` 199 Breaks []struct { 200 BreakID string `json:"break_id,omitempty"` 201 DurationMins int `json:"duration_mins,omitempty"` 202 StartTime *Time `json:"start_time,omitempty"` 203 EndTime *Time `json:"end_time,omitempty"` 204 IsPaid bool `json:"is_paid,omitempty"` 205 } `json:"breaks,omitempty"` 206 } 207 208 // UpdateShift modifies the shift with the given ID 209 // https://www.zoho.com/shifts/api/v1/shifts-api/#update-a-shift 210 func (s *API) UpdateShift( 211 id string, 212 request UpdateShiftRequest, 213 ) (data UpdateShiftResponse, err error) { 214 endpoint := zoho.Endpoint{ 215 Name: "UpdateShift", 216 URL: fmt.Sprintf( 217 "https://shifts.zoho.%s/api/v1/%s/%s/%s", 218 s.ZohoTLD, 219 s.OrganizationID, 220 shiftsModule, 221 id, 222 ), 223 Method: zoho.HTTPPut, 224 ResponseData: &UpdateShiftResponse{}, 225 RequestBody: request, 226 } 227 228 err = s.Zoho.HTTPRequest(&endpoint) 229 if err != nil { 230 return UpdateShiftResponse{}, fmt.Errorf("failed to update shift: %s", err) 231 } 232 233 if v, ok := endpoint.ResponseData.(*UpdateShiftResponse); ok { 234 return *v, nil 235 } 236 237 return UpdateShiftResponse{}, fmt.Errorf("data retrieved was not 'UpdateShiftResponse'") 238 } 239 240 type UpdateShiftRequest struct { 241 StartTime *Time `json:"start_time,omitempty"` 242 EndTime *Time `json:"end_time,omitempty"` 243 EmployeeID string `json:"employee_id,omitempty"` // empty creates an open shift 244 Count int `json:"count,omitempty"` 245 ScheduleID string `json:"schedule_id,omitempty"` 246 PositionID string `json:"position_id,omitempty"` 247 JobSiteID string `json:"job_site_id,omitempty"` 248 Notes string `json:"notes,omitempty"` 249 Breaks []struct { 250 BreakID string `json:"break_id,omitempty"` 251 DurationMins int `json:"duration_mins,omitempty"` 252 StartTime *Time `json:"start_time,omitempty"` 253 EndTime *Time `json:"end_time,omitempty"` 254 } `json:"breaks,omitempty"` 255 } 256 257 type UpdateShiftResponse struct { 258 ID string `json:"id,omitempty"` 259 StartTime *Time `json:"start_time,omitempty"` 260 EndTime *Time `json:"end_time,omitempty"` 261 EmployeeID string `json:"employee_id,omitempty"` 262 Count int `json:"count,omitempty"` 263 ScheduleID string `json:"schedule_id,omitempty"` 264 PositionID string `json:"position_id,omitempty"` 265 JobSiteID string `json:"job_site_id,omitempty"` 266 Duration float64 `json:"duration,omitempty"` 267 BreakDuration float64 `json:"break_duration,omitempty"` 268 Notes string `json:"notes,omitempty"` 269 IsPublished bool `json:"is_published,omitempty"` 270 IsConfirmed bool `json:"is_confirmed,omitempty"` 271 Breaks []struct { 272 BreakID string `json:"break_id,omitempty"` 273 DurationMins int `json:"duration_mins,omitempty"` 274 StartTime *Time `json:"start_time,omitempty"` 275 EndTime *Time `json:"end_time,omitempty"` 276 IsPaid bool `json:"is_paid,omitempty"` 277 } `json:"breaks,omitempty"` 278 } 279 280 // DeleteShift deletes the shift record with the given ID 281 // https://www.zoho.com/shifts/api/v1/shifts-api/#delete-a-shift 282 func (s *API) DeleteShift(id string) (data DeleteShiftResponse, err error) { 283 endpoint := zoho.Endpoint{ 284 Name: "DeleteShift", 285 URL: fmt.Sprintf( 286 "https://shifts.zoho.%s/api/v1/%s/%s/%s", 287 s.ZohoTLD, 288 s.OrganizationID, 289 shiftsModule, 290 id, 291 ), 292 Method: zoho.HTTPDelete, 293 ResponseData: &DeleteShiftResponse{}, 294 } 295 296 err = s.Zoho.HTTPRequest(&endpoint) 297 if err != nil { 298 return DeleteShiftResponse{}, fmt.Errorf("failed to delete shift with id: %s", err) 299 } 300 301 if v, ok := endpoint.ResponseData.(*DeleteShiftResponse); ok { 302 return *v, nil 303 } 304 305 return DeleteShiftResponse{}, fmt.Errorf("data returned was not 'DeleteShiftResponse'") 306 } 307 308 type DeleteShiftResponse struct { 309 Message string `json:"message,omitempty"` 310 } 311 312 // GetAllAvailabilities returns a list of all employee availabilities 313 // https://www.zoho.com/shifts/api/v1/availability-api/#get-all-availabilities 314 func (s *API) GetAllAvailabilities( 315 params map[string]zoho.Parameter, 316 ) (data GetAvailabilitiesResponse, err error) { 317 endpoint := zoho.Endpoint{ 318 Name: "GetAllAvailabilities", 319 URL: fmt.Sprintf( 320 "https://shifts.zoho.%s/api/v1/%s/%s", 321 s.ZohoTLD, 322 s.OrganizationID, 323 availabilityModule, 324 ), 325 Method: zoho.HTTPGet, 326 ResponseData: &GetAvailabilitiesResponse{}, 327 URLParameters: map[string]zoho.Parameter{ 328 "start_date": "", // yyyy-mm-dd 329 "end_date": "", // yyyy-mm-dd 330 "employees": "", 331 }, 332 } 333 334 if len(params) > 0 { 335 for k, v := range params { 336 endpoint.URLParameters[k] = v 337 } 338 } 339 340 if endpoint.URLParameters["start_date"] == "" || endpoint.URLParameters["end_date"] == "" { 341 return GetAvailabilitiesResponse{}, fmt.Errorf( 342 "failed to retreive availabilities: start_date and end_date are required fields", 343 ) 344 } 345 346 err = s.Zoho.HTTPRequest(&endpoint) 347 if err != nil { 348 return GetAvailabilitiesResponse{}, fmt.Errorf("failed to retrieve availabilities: %s", err) 349 } 350 if v, ok := endpoint.ResponseData.(*GetAvailabilitiesResponse); ok { 351 return *v, nil 352 } 353 return GetAvailabilitiesResponse{}, fmt.Errorf( 354 "data retrieved was not 'GetAvailabilitiesResponse'", 355 ) 356 } 357 358 type GetAvailabilitiesResponse struct { 359 Availabilities []struct { 360 ID string `json:"id,omitempty"` 361 EmployeeID string `json:"employee_id,omitempty"` 362 StartTime *Time `json:"start_time"` 363 EndTime *Time `json:"end_time"` 364 Preference string `json:"preference,omitempty"` 365 Notes string `json:"notes,omitempty"` 366 } `json:"availabilities,omitempty"` 367 } 368 369 // CreateAvailability adds a new record to the list of available shifts 370 // https://www.zoho.com/shifts/api/v1/availability-api/#create-an-availability 371 func (s *API) CreateAvailability( 372 request CreateAvailabilityRequest, 373 ) (data CreateAvailabilityResponse, err error) { 374 endpoint := zoho.Endpoint{ 375 Name: "CreateAvailability", 376 URL: fmt.Sprintf( 377 "https://shifts.zoho.%s/api/v1/%s/%s", 378 s.ZohoTLD, 379 s.OrganizationID, 380 availabilityModule, 381 ), 382 Method: zoho.HTTPPost, 383 ResponseData: &CreateAvailabilityResponse{}, 384 RequestBody: request, 385 } 386 387 if request.StartTime.IsZero() || request.EndTime.IsZero() || request.EmployeeID == "" || 388 request.Preference == "" { 389 return CreateAvailabilityResponse{}, fmt.Errorf( 390 "failed to create availability: start_time, end_time, employee_id, and preference are required fields", 391 ) 392 } 393 394 err = s.Zoho.HTTPRequest(&endpoint) 395 if err != nil { 396 return CreateAvailabilityResponse{}, fmt.Errorf("failed to create an availability: %s", err) 397 } 398 399 if v, ok := endpoint.ResponseData.(*CreateAvailabilityResponse); ok { 400 return *v, nil 401 } 402 403 return CreateAvailabilityResponse{}, fmt.Errorf( 404 "data retrieved was not 'CreateAvailabilityResponse'", 405 ) 406 } 407 408 type CreateAvailabilityRequest struct { 409 EmployeeID string `json:"employee_id"` // required 410 StartTime *Time `json:"start_time"` // required 411 EndTime *Time `json:"end_time"` // required 412 Preference string `json:"preference"` // required: preferred, unavailable 413 Notes string `json:"notes,omitempty"` 414 } 415 416 type CreateAvailabilityResponse struct { 417 ID string `json:"id,omitempty"` 418 EmployeeID string `json:"employee_id,omitempty"` 419 StartTime *Time `json:"start_time,omitempty"` 420 EndTime *Time `json:"end_time,omitempty"` 421 Preference string `json:"preference,omitempty"` 422 Notes string `json:"notes,omitempty"` 423 } 424 425 // UpdateAvailability modifies the availability with the given ID 426 // https://www.zoho.com/shifts/api/v1/availability-api/#update-an-availability 427 func (s *API) UpdateAvailability( 428 id string, 429 request UpdateAvailabilityRequest, 430 ) (data UpdateAvailabilityResponse, err error) { 431 endpoint := zoho.Endpoint{ 432 Name: "UpdateAvailability", 433 URL: fmt.Sprintf( 434 "https://shifts.zoho.%s/api/v1/%s/%s/%s", 435 s.ZohoTLD, 436 s.OrganizationID, 437 availabilityModule, 438 id, 439 ), 440 Method: zoho.HTTPPut, 441 ResponseData: &UpdateAvailabilityResponse{}, 442 RequestBody: request, 443 } 444 445 err = s.Zoho.HTTPRequest(&endpoint) 446 if err != nil { 447 return UpdateAvailabilityResponse{}, fmt.Errorf("failed to update availability: %s", err) 448 } 449 450 if v, ok := endpoint.ResponseData.(*UpdateAvailabilityResponse); ok { 451 return *v, nil 452 } 453 454 return UpdateAvailabilityResponse{}, fmt.Errorf( 455 "data retrieved was not 'UpdateAvailabilityResponse'", 456 ) 457 } 458 459 type UpdateAvailabilityRequest struct { 460 ID string `json:"id,omitempty"` 461 EmployeeID string `json:"employee_id,omitempty"` 462 StartTime *Time `json:"start_time,omitempty"` 463 EndTime *Time `json:"end_time,omitempty"` 464 Preference string `json:"preference,omitempty"` // preferred, unavailable 465 Notes string `json:"notes,omitempty"` 466 } 467 468 type UpdateAvailabilityResponse struct { 469 EmployeeID string `json:"employee_id,omitempty"` 470 StartTime *Time `json:"start_time,omitempty"` 471 EndTime *Time `json:"end_time,omitempty"` 472 Preference string `json:"preference,omitempty"` 473 Notes string `json:"notes,omitempty"` 474 } 475 476 // DeleteAvailability deletes the availability record with the given ID 477 // https://www.zoho.com/shifts/api/v1/availability-api/#delete-an-availability 478 func (s *API) DeleteAvailability(id string) (data DeleteAvailabilityResponse, err error) { 479 endpoint := zoho.Endpoint{ 480 Name: "DeleteAvailability", 481 URL: fmt.Sprintf( 482 "https://shifts.zoho.%s/api/v1/%s/%s/%s", 483 s.ZohoTLD, 484 s.OrganizationID, 485 availabilityModule, 486 id, 487 ), 488 Method: zoho.HTTPDelete, 489 ResponseData: &DeleteAvailabilityResponse{}, 490 } 491 492 err = s.Zoho.HTTPRequest(&endpoint) 493 if err != nil { 494 return DeleteAvailabilityResponse{}, fmt.Errorf( 495 "failed to delete availability with id: %s", 496 err, 497 ) 498 } 499 500 if v, ok := endpoint.ResponseData.(*DeleteAvailabilityResponse); ok { 501 return *v, nil 502 } 503 504 return DeleteAvailabilityResponse{}, fmt.Errorf( 505 "data returned was not 'DeletAavailabilityResponse'", 506 ) 507 } 508 509 type DeleteAvailabilityResponse struct { 510 Message string `json:"message,omitempty"` 511 }