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  }