{
  "openapi": "3.0.4",
  "info": {
    "title": "Rotageek API v1",
    "description": "Hello World! This web page documents the APIs that Rotageek currently supports and also allows you to test run this functionality. To be able to access this functionality, you need to be set up with Rotageek account and to use your username and password to retrieve an access_token. This can be done by performing a POST operation to the /api/v1/auth endpoint with your username and password (see the Auth section below) and using the access_token in the Authorization field in the following format 'BEARER <access_token>'. Please use the contact details below for any questions that you may have!",
    "contact": {
      "name": "Rotageek",
      "email": "office@rotageek.com"
    },
    "version": "1.0"
  },
  "paths": {
    "/api/v1/audits/{entityType}/{entityId}": {
      "get": {
        "tags": [
          "Audits"
        ],
        "summary": "Retrieve paginated audit logs for an entity",
        "operationId": "Audits_GetAuditTrail",
        "parameters": [
          {
            "name": "entityType",
            "in": "path",
            "description": "Type of entity being queried",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AuditEntityRootType"
            }
          },
          {
            "name": "entityId",
            "in": "path",
            "description": "External identifier of the entity",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for results. Default: CreatedDate",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AuditLogSortField"
            }
          },
          {
            "name": "StartDate",
            "in": "query",
            "description": "Start of the timestamp filter range (UTC). When provided, only audit logs on or after this value are returned.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "description": "End of the timestamp filter range (UTC). When provided, only audit logs on or before this value are returned.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.AuditLogResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.AuditLogResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.AuditLogResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth": {
      "post": {
        "tags": [
          "Auth"
        ],
        "summary": "OAuth2 token endpoint. Supports the `password` and `refresh_token` grant types.",
        "operationId": "Auth_Token",
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "grant_type": {
                    "enum": [
                      "password",
                      "refresh_token"
                    ],
                    "type": "string"
                  },
                  "username": {
                    "type": "string"
                  },
                  "password": {
                    "type": "string",
                    "format": "password"
                  },
                  "refresh_token": {
                    "type": "string"
                  }
                }
              },
              "encoding": {
                "grant_type": {
                  "style": "form"
                },
                "username": {
                  "style": "form"
                },
                "password": {
                  "style": "form"
                },
                "refresh_token": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/budget/{locationId}/{type}": {
      "get": {
        "tags": [
          "Budget"
        ],
        "summary": "Retrieve paginated budget record list for location",
        "description": "Retrieves a paginated budget record list for location filtered by parameters",
        "operationId": "Budget_GetBudgets",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "path",
            "description": "Type of budget record to be retrieved i.e. Money or Hours",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetType"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records are to be fetched.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: budget start date",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetRecordSortField"
            }
          },
          {
            "name": "To",
            "in": "query",
            "description": "End date from which records be fetched. Default: no end date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "TaskIds",
            "in": "query",
            "description": "List of task ids to filter budget query by i.e. the budget record needs to be associated with all task ids specified in this filter.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated budget records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.BudgetModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.BudgetModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.BudgetModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "Budget"
        ],
        "summary": "Add (or update - if an exact match exists) budget records",
        "description": "Add or update money or hours budget records for location",
        "operationId": "Budget_AddOrUpdate",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "path",
            "description": "Type of budget record to be saved i.e. Money or Hours",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetType"
            }
          }
        ],
        "requestBody": {
          "description": "Budget data to be saved",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "List of budget records that were successfully saved",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/contracttypes": {
      "get": {
        "tags": [
          "ContractTypes"
        ],
        "summary": "Get contract types for current group",
        "operationId": "ContractTypes_GetContractTypes",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ContractTypeResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ContractTypeResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ContractTypeResponseModel"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/demand/{locationId}": {
      "get": {
        "tags": [
          "Demand"
        ],
        "summary": "Retrieves raw explicit demand",
        "description": "Retrieves raw explicit demand that has been uploaded into the system for location and a given date range",
        "operationId": "Demand_GetRawDemand",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records are to be fetched",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date from which records are to be fetched",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Raw explicit demand records",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "Demand"
        ],
        "summary": "Add or update explicit demand",
        "description": "Add or update explicit demand records for a given location",
        "operationId": "Demand_AddOrUpdate",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Demand data to be saved",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "List of demand records that were successfully saved",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DayDemandModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/demand/adjusted/{locationId}": {
      "get": {
        "tags": [
          "Demand"
        ],
        "summary": "Retrieves adjusted demand",
        "description": "Retrieves adjusted demand values that has been calculated for location and a given date range",
        "operationId": "Demand_GetAdjustedDemand",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records are to be fetched",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date from which records are to be fetched",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Adjusted demand data",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AdjustedDemandResultModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AdjustedDemandResultModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AdjustedDemandResultModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/gaps/assign": {
      "post": {
        "tags": [
          "Gaps"
        ],
        "summary": "Assign an existing gap to a user. If the user does not exist, it will be created as part of this process.",
        "operationId": "Gaps_AssignGap",
        "requestBody": {
          "description": "AssignGapModel",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AssignGapModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AssignGapModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AssignGapModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AssignGapModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/gaps/unassign": {
      "post": {
        "tags": [
          "Gaps"
        ],
        "summary": "Unassign a user from a Gap, given the gap's external id and the user's external id.",
        "operationId": "Gaps_UnassignGap",
        "requestBody": {
          "description": "UnassignGapModel",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UnassignGapModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UnassignGapModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UnassignGapModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UnassignGapModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/gaps/locations": {
      "get": {
        "tags": [
          "Gaps"
        ],
        "summary": "Retrieve a paginated list of gap records for the given location",
        "description": "Retrieves a paginated list of gap records for the location filtered by parameters",
        "operationId": "Gaps_ListLocationRecords",
        "parameters": [
          {
            "name": "locationIds",
            "in": "query",
            "description": "Target location ids",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: Scheduler record start time",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.GapRecordSortField"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-5000).",
            "schema": {
              "maximum": 5000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records be fetched. Default: no start date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date until which record will be fetched. Default: no end date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "addTasks",
            "in": "query",
            "description": "Load tasks for gaps. Default: false",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated schedule records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.GapRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.GapRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.GapRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/holidayentitlements/users/{userId}/dataset1": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Returns Data Set 1 (Holiday Allowance Control) for the specified user.\nIncludes employee reference, leave accrual YTD, carried over leave, total leave,\ndays taken YTD, leave balance YTD, and reporting period.",
        "operationId": "HolidayEntitlements_GetDataSet1",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The employee's external identifier (CompanyId).",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "referenceDate",
            "in": "query",
            "description": "Optional reference date (YYYY-MM-DD). Defaults to today.\nAll YTD calculations run from the leave year start to this date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/holidayentitlements/users/{userId}/dataset2": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Returns Data Set 2 (Help Desk and Payroll Support) for the specified user.\nIncludes all Data Set 1 fields (including carried over leave and total leave)\nplus days booked future, projected additional accrual, total projected entitlement,\ncontractual leave entitlement, accrual rate, hours worked YTD, average hours (52-week),\nand average days per week.",
        "operationId": "HolidayEntitlements_GetDataSet2",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "The employee's external identifier (CompanyId).",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "referenceDate",
            "in": "query",
            "description": "Optional reference date (YYYY-MM-DD). Defaults to today.\nAll YTD calculations run from the leave year start to this date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/holidayentitlements/users/dataset1": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Returns pre-calculated Data Set 1 (Holiday Allowance Control) for all users in the caller's group, paginated.\nReads from the CalculatedLeaveEntitlement table — no real-time calculation.\nResults are sorted by employee reference (CompanyId) ascending.",
        "operationId": "HolidayEntitlements_GetAllUsersDataSet1",
        "parameters": [
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-1000). Default: 500",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/holidayentitlements/users/dataset2": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Returns pre-calculated Data Set 2 (Help Desk and Payroll Support) for all users in the caller's group, paginated.\nReads from the CalculatedLeaveEntitlement table — no real-time calculation.\nResults are sorted by employee reference (CompanyId) ascending.",
        "operationId": "HolidayEntitlements_GetAllUsersDataSet2",
        "parameters": [
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-1000). Default: 500",
            "schema": {
              "maximum": 1000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/leaveallowances/settings/{locationId}": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Get leave allowance settings",
        "description": "Get leave allowance settings",
        "operationId": "LeaveAllowances_GetSettings",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Unique id of the location",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Updated leave request",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v2.LeaveAllowanceSettingsResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v2.LeaveAllowanceSettingsResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v2.LeaveAllowanceSettingsResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/leave/requests": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Retrieve paginated leave requests list",
        "description": "Retrieves a paginated leave requests list filtered by parameters",
        "operationId": "LeaveRequests_ListLeaveRequests",
        "parameters": [
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: Request start date",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestSortField"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          },
          {
            "name": "leaveYear",
            "in": "query",
            "description": "Leave year (format: yyyy) from which requests will be fetched. If leave year is specified from and to filter will be applied within leave year.\n            Default: no leave year filtering",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records be fetched. Default: no start date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date until which record will be fetched. Default: no end date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "includeOverlapping",
            "in": "query",
            "description": "When true, returns leave requests that overlap the from/to window\n            When false (default), only returns requests that start within the window.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated leave requests",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/leave/requests/users/{userId}": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Retrieve paginated leave requests list for user",
        "description": "Retrieves a paginated leave requests list for user filtered by parameters",
        "operationId": "LeaveRequests_ListUserLeaveRequests",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: Request start date",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestSortField"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          },
          {
            "name": "leaveYear",
            "in": "query",
            "description": "Leave year (format: yyyy) from which requests will be fetched. If leave year is specified from and to filter will be applied within leave year.\n            Default: no leave year filtering",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records be fetched. Default: no start date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date until which record will be fetched. Default: no end date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "includeOverlapping",
            "in": "query",
            "description": "When true, returns leave requests that overlap the from/to window.\n            When false (default), only returns requests that start within the window.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated leave requests",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Leave"
        ],
        "summary": "Create a leave request",
        "description": "Creates a new leave request",
        "operationId": "LeaveRequests_CreateLeaveRequest",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "CreateLeaveRequestModel",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLeaveRequestModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLeaveRequestModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLeaveRequestModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLeaveRequestModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created leave request",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/leave/requests/{id}": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Retrieve a leave request",
        "description": "Retrieves a leave request by the specified leave request id",
        "operationId": "LeaveRequests_GetLeaveRequest",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target leave request id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Leave request",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to a resource denied"
          },
          "404": {
            "description": "Leave request was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "patch": {
        "tags": [
          "Leave"
        ],
        "summary": "Update leave request",
        "description": "Updates leave request",
        "operationId": "LeaveRequests_UpdateLeaveRequest",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Unique id of the leave request to update",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "JSON patch model. Example: [{ \"op\": \"replace\", \"path\": \"/Response\", \"value\": \"string\" }] For more information refer to [http://jsonpatch.com/](http://jsonpatch.com/)",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated leave request",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/leave/types": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Retrieve leave types list",
        "description": "Retrieves a list of all leave types in the system",
        "operationId": "LeaveType_ListLeaveTypes",
        "responses": {
          "200": {
            "description": "Leave types list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RotaGeek.BL.Models.LeaveTypeResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RotaGeek.BL.Models.LeaveTypeResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RotaGeek.BL.Models.LeaveTypeResponseModel"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/leave/types/{id}": {
      "get": {
        "tags": [
          "Leave"
        ],
        "summary": "Retrieve a leave type",
        "description": "Retrieves a leave type by the specified leave type id",
        "operationId": "LeaveType_GetLeaveType",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target leave type id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Leave type",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.LeaveTypeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.LeaveTypeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.LeaveTypeResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Leave type was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/locations": {
      "get": {
        "tags": [
          "Locations"
        ],
        "summary": "Retrieve locations list",
        "description": "Retrieves a paginated locations list of all locations in the system",
        "operationId": "Locations_ListLocations",
        "parameters": [
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: Location name",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationSortField"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated locations list",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LocationItemListModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LocationItemListModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LocationItemListModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Locations"
        ],
        "summary": "Create a new location",
        "description": "Creates a new location in the system",
        "operationId": "Locations_CreateLocation",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLocationModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLocationModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLocationModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateLocationModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created location model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to create a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/locations/{locationId}/users": {
      "post": {
        "tags": [
          "Locations"
        ],
        "summary": "Assign number of users to the location",
        "description": "Assign any number of users to the specified location",
        "operationId": "Locations_AddUsers",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Users to add",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddUsersModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddUsersModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddUsersModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddUsersModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "List of users added to the location",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "get": {
        "tags": [
          "Locations"
        ],
        "summary": "List users in the location",
        "description": "List all users in the specified location",
        "operationId": "Locations_ListUsers",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated users list",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.UserIdResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.UserIdResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.UserIdResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/locations/{locationId}/users/{userId}": {
      "delete": {
        "tags": [
          "Locations"
        ],
        "summary": "Remove a user from the location",
        "description": "Removes a user from the location",
        "operationId": "Locations_RemoveUser",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "path",
            "description": "User id to remove",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User removed"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to delete a resource"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/": {
      "get": {
        "tags": [
          "Other"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/swagger/ui/index": {
      "get": {
        "tags": [
          "Other"
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/positions": {
      "get": {
        "tags": [
          "Positions"
        ],
        "summary": "Retrieve positions list",
        "description": "Retrieves a positions list of all positions in the system",
        "operationId": "Positions_ListPositions",
        "responses": {
          "200": {
            "description": "Positions list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Positions"
        ],
        "summary": "Create a new position",
        "description": "Creates a new position in the system",
        "operationId": "Positions_CreatePosition",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreatePositionModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreatePositionModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreatePositionModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreatePositionModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created position model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to create a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/positions/{id}": {
      "get": {
        "tags": [
          "Positions"
        ],
        "summary": "Retrieve position by id",
        "description": "Retrieves a position by the specified position id",
        "operationId": "Positions_GetPosition",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target position id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Position",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Position was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/sales/{locationId}/{type}": {
      "get": {
        "tags": [
          "SalesTotal"
        ],
        "summary": "Retrieve paginated sales record list for location",
        "description": "Retrieves a paginated sales record list for location filtered by parameters",
        "operationId": "SalesTotal_GetSales",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "path",
            "description": "Type of sales total to be retrieved i.e. Forecast or Actual",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalType"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records be fetched.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: sales total date",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalRecordSortField"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date from which records be fetched. Default: no end date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated sales records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "SalesTotal"
        ],
        "summary": "Add or update sales records for a location",
        "description": "Add or update actual or forecast sales records for location",
        "operationId": "SalesTotal_AddOrUpdate",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "path",
            "description": "Type of sales total to be saved i.e. Forecast or Actual",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalType"
            }
          }
        ],
        "requestBody": {
          "description": "Sales data to be saved",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "List of sales records that were successfully saved",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/schedule/users/{userId}": {
      "get": {
        "tags": [
          "Schedule"
        ],
        "summary": "Retrieve paginated schedule records for user",
        "description": "Retrieves a paginated list of schedule records for the user filtered by parameters",
        "operationId": "ScheduleRecords_ListUserShifts",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: Scheduler record start time",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordSortField"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "maximum": 5000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records be fetched. Default: no start date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date until which record will be fetched. Default: no end date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "recordType",
            "in": "query",
            "description": "Type of records (1: shift; 2: Leave) that should be fetched. Default: all types",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.RecordType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated schedule records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "User was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/schedule/locations/{locationId}": {
      "get": {
        "tags": [
          "Schedule"
        ],
        "summary": "Retrieve paginated schedule records for the location",
        "description": "Retrieves a paginated list of schedule records for the location filtered by parameters",
        "operationId": "ScheduleRecords_ListLocationRecords",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: Scheduler record start time",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordSortField"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "maximum": 5000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start date from which records be fetched. Default: no start date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End date until which record will be fetched. Default: no end date filtering",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "recordType",
            "in": "query",
            "description": "Type of records (1: shift; 2: Leave) that should be fetched. Default: all types",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.RecordType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated schedule records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "404": {
            "description": "Location was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/schedule/records/{recordId}": {
      "delete": {
        "tags": [
          "Schedule"
        ],
        "summary": "Delete a schedule record (shift) by its id",
        "description": "Deletes an existing shift by its public id. After the dedicated API permission and the two\n            API-specific guards (the record is a shift, and its timesheet is still open), the deletion is delegated to\n            the same scheduler business logic an in-app deletion uses, so the standard validations (scheduler\n            permission, location access, exception-report and clocked-in checks) and downstream actions (soft/hard\n            delete, employee notification and background processing) are identical to an in-app deletion.",
        "operationId": "ScheduleRecords_DeleteScheduleRecord",
        "parameters": [
          {
            "name": "recordId",
            "in": "path",
            "description": "Public id of the schedule record (shift) to delete",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "204": {
            "description": "Schedule record deleted"
          },
          "400": {
            "description": "recordId is invalid"
          },
          "401": {
            "description": "The caller cannot administer the record's location, or it is in a protected state (leave, a submitted or signed-off timesheet, clocked-in, exception report)"
          },
          "403": {
            "description": "The API account does not have the delete permission"
          },
          "404": {
            "description": "Schedule record was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/skills": {
      "get": {
        "tags": [
          "Skills"
        ],
        "summary": "List skills",
        "description": "Retrieves a skills list of all skills in the system",
        "operationId": "Skills_ListSkills",
        "responses": {
          "200": {
            "description": "Skills list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Skills"
        ],
        "summary": "Create a new skill",
        "description": "Creates a new skill in the system",
        "operationId": "Skills_CreateSkill",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateSkillModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateSkillModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateSkillModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.CreateSkillModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created skill model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to create a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/skills/{id}": {
      "get": {
        "tags": [
          "Skills"
        ],
        "summary": "Retrieve skill by id",
        "description": "Retrieves a skill by the specified skill id",
        "operationId": "Skills_GetSkill",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target skill id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Skill",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Skill was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/tasks": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "summary": "List tasks",
        "description": "Retrieves a tasks list of all tasks in the system",
        "operationId": "Tasks_ListTasks",
        "responses": {
          "200": {
            "description": "Tasks list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskListingModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskListingModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskListingModel"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Tasks"
        ],
        "summary": "Create a new task",
        "description": "Creates a new task in the system",
        "operationId": "Tasks_CreateTask",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created task model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to create a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/tasks/{id}": {
      "get": {
        "tags": [
          "Tasks"
        ],
        "summary": "Retrieve task by id",
        "description": "Retrieves a task by the specified task id",
        "operationId": "Tasks_GetTask",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target task id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Task",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Task was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "patch": {
        "tags": [
          "Tasks"
        ],
        "summary": "Update task",
        "description": "Updates task",
        "operationId": "Tasks_UpdateTask",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Unique id of the task to update",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "JSON patch model. Example: [{ \"op\": \"replace\", \"path\": \"/Response\", \"value\": \"string\" }] For more information refer to [http://jsonpatch.com/](http://jsonpatch.com/)",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated task",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TaskModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "delete": {
        "tags": [
          "Tasks"
        ],
        "summary": "Delete task",
        "description": "Deletes a specified task",
        "operationId": "Tasks_Delete",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target task id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK if task deleted"
          },
          "404": {
            "description": "Task was not found"
          }
        }
      }
    },
    "/api/v1/timesheets/locations/{locationId}/{weekStartDate}": {
      "get": {
        "tags": [
          "Timesheets"
        ],
        "summary": "Retrieve time sheet records list for the week",
        "description": "Retrieves a list of time sheet records for the specified week",
        "operationId": "Timesheets_GetTimeSheet",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "weekStartDate",
            "in": "path",
            "description": "Week start date",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "workerType",
            "in": "query",
            "description": "Optional filter for specifc types of shifts. The options are all, normal, bank and agency",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WorkerTypeFilter"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of time sheet records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "Timesheets"
        ],
        "summary": "Replace time sheet for the week",
        "description": "Replaces time sheet including all of its with the new model",
        "operationId": "Timesheets_UpdateTimeSheet",
        "parameters": [
          {
            "name": "locationId",
            "in": "path",
            "description": "Target location",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "weekStartDate",
            "in": "path",
            "description": "Week start date",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "requestBody": {
          "description": "NewTimeSheetModel",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated time sheet",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access to resource denied"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/availability": {
      "get": {
        "tags": [
          "UserAvailability"
        ],
        "summary": "Retrieve user's availability",
        "description": "Retrieve user's availability for the specified date range",
        "operationId": "UserAvailability_GetAvailability",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start of date range",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End of date range",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User availability",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to retrieve a resource"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "UserAvailability"
        ],
        "summary": "Update user's availability",
        "description": "Update user's availability for the specified date range",
        "operationId": "UserAvailability_UpdateAvailability",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Updated availability. Note that new availability data will replace existing data for the given date",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated user availability",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to update a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "delete": {
        "tags": [
          "UserAvailability"
        ],
        "summary": "Delete user's availability",
        "description": "Delete user's availability for the specified date range",
        "operationId": "UserAvailability_DeleteAvailability",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "Start of date range",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "End of date range (optional)",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to update a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/classifications": {
      "get": {
        "tags": [
          "UserClassifications"
        ],
        "summary": "Retrieves all user classifications for the specified user.",
        "description": "Retrieves all user classifications for the user, ordered by effective date. Can return multiple results with different effective dates.",
        "operationId": "UserClassifications_GetUserClassifications",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of user classification response models",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "UserClassifications"
        ],
        "summary": "Creates a user classification by FixedId and AwardCode, or records \"No Classification\" if both are omitted.",
        "description": "Creates a user classification matching the specified FixedId and AwardCode. FixedId and AwardCode\n            must be provided together: if both are null or omitted, the created record represents \"No Classification\"\n            for the effective date; providing only one of the two returns a 400 response.",
        "operationId": "UserClassifications_CreateUserClassification",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "User classification request model. FixedId and AwardCode must both be set to assign a classification, or both left null to record \"No Classification\".",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created user classification response model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid, including when only one of FixedId/AwardCode is provided"
          },
          "404": {
            "description": "User or classification not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "UserClassifications"
        ],
        "summary": "Updates or creates a user classification by effective date. If a record with the specified effective date exists, it is updated. If not found, a new record is created.",
        "description": "Updates or creates a user classification based on the effective date. If a record with the specified effective date exists, it is updated with the new classification. If not found, a new record is created.\n            FixedId and AwardCode must be provided together: if both are null or omitted, the record is updated (or created) to represent\n            \"No Classification\" for the effective date; providing only one of the two returns a 400 response.",
        "operationId": "UserClassifications_UpdateUserClassification",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "User classification request model. EffectiveFrom is used to identify the record to update or create. FixedId and AwardCode must both be set to assign a classification, or both left null to record \"No Classification\".",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated or created user classification response model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid, including when only one of FixedId/AwardCode is provided"
          },
          "404": {
            "description": "User or classification not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/classifications/{effectiveFrom}": {
      "delete": {
        "tags": [
          "UserClassifications"
        ],
        "summary": "Deletes a user classification by effective date.",
        "description": "Deletes a user classification that matches the specified effective date. The effective date is passed as a route parameter.",
        "operationId": "UserClassifications_DeleteUserClassification",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "effectiveFrom",
            "in": "path",
            "description": "The effective from date used to identify the classification record to delete.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Classification successfully deleted"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "User or classification not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/configurablefields": {
      "get": {
        "tags": [
          "UserConfigurableFields"
        ],
        "operationId": "UserConfigurableFields_GetAllConfigurableFieldsForUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Not authorized to perform the action"
          },
          "200": {
            "description": "Successfully return list of values configured for the user",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                  }
                }
              }
            }
          },
          "404": {
            "description": "User not found"
          }
        }
      }
    },
    "/api/v1/users/{userId}/configurablefields/{fieldName}": {
      "get": {
        "tags": [
          "UserConfigurableFields"
        ],
        "operationId": "UserConfigurableFields_GetConfigurableFieldValueForUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fieldName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Not authorized to perform the action"
          },
          "200": {
            "description": "Successfully return the value of the field requested for the user",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                }
              }
            }
          },
          "404": {
            "description": "User or field value not found"
          }
        }
      },
      "put": {
        "tags": [
          "UserConfigurableFields"
        ],
        "operationId": "UserConfigurableFields_UpsertConfigurableFieldValue",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fieldName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "string"
              }
            },
            "application/json": {
              "schema": {
                "type": "string"
              }
            },
            "text/json": {
              "schema": {
                "type": "string"
              }
            },
            "application/*+json": {
              "schema": {
                "type": "string"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Not authorized to perform the action"
          },
          "201": {
            "description": "Value created against user",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotaGeek.BL.Models.UserConfigurableFieldDto"
                }
              }
            }
          },
          "204": {
            "description": "Existing value successfully updated"
          },
          "404": {
            "description": "User or field value not found"
          }
        }
      },
      "delete": {
        "tags": [
          "UserConfigurableFields"
        ],
        "operationId": "UserConfigurableFields_DeleteConfigurableFieldValue",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fieldName",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Not authorized to perform the action"
          },
          "204": {
            "description": "Value successfully deleted"
          },
          "404": {
            "description": "User or field value not found"
          }
        }
      }
    },
    "/api/v1/users/{userId}/employeetypes": {
      "get": {
        "tags": [
          "UserEmployeeTypes"
        ],
        "summary": "Retrieves all user employee types for the specified user.",
        "description": "Retrieves all user employee types for the user, ordered by effective date. Can return multiple results with different effective dates and employee types (FullTime, PartTime, Casual).",
        "operationId": "UserEmployeeTypes_GetUserEmployeeType",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of user employee type response models",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "UserEmployeeTypes"
        ],
        "summary": "Creates a user employee type for the specified user.",
        "description": "Creates a user employee type matching the specified employee type string. Valid values: \"FullTime\", \"PartTime\", \"Casual\".",
        "operationId": "UserEmployeeTypes_CreateUserEmployeeType",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "User employee type request model. EmployeeType must be one of: \"FullTime\", \"PartTime\", \"Casual\".",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created user employee type DTO",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "UserEmployeeTypes"
        ],
        "summary": "Updates or creates a user employee type by effective date. If a record with the specified effective date exists, it is updated. If not found, a new record is created.",
        "description": "Updates or creates a user employee type based on the effective date. If a record with the specified effective date exists, it is updated with the new employee type. If not found, a new record is created. Valid employee type values: \"FullTime\", \"PartTime\", \"Casual\".",
        "operationId": "UserEmployeeTypes_UpdateUserEmployeeType",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "User employee type request model. EmployeeType must be one of: \"FullTime\", \"PartTime\", \"Casual\". EffectiveFrom is used to identify the record to update or create.",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated or created user employee type response model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/employeetypes/{effectiveFrom}": {
      "delete": {
        "tags": [
          "UserEmployeeTypes"
        ],
        "summary": "Deletes a user employee type by effective date.",
        "description": "Deletes a user employee type that matches the specified effective date. The effective date is passed as a route parameter.",
        "operationId": "UserEmployeeTypes_DeleteUserEmployeeType",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "effectiveFrom",
            "in": "path",
            "description": "The effective from date used to identify the employee type record to delete.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Employee type successfully deleted"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "User or employee type not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Retrieve users list",
        "description": "Retrieves a paginated users list of all users in the system",
        "operationId": "Users_ListUsers",
        "parameters": [
          {
            "name": "Sort",
            "in": "query",
            "description": "Sorting field for pages sorting. Default: User name",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserSortField"
            }
          },
          {
            "name": "UserId",
            "in": "query",
            "description": "Filter field to retrieve users with specified ID. Optional.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "LocationId",
            "in": "query",
            "description": "Filter field to retrieve users that have specified location ID assigned to them. Optional",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "LocationsFilteredUsingActivePrimaryLocation",
            "in": "query",
            "description": "When true, filters users by their active primary location instead of assigned locations. Default: false",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "description": "Zero based page number. Default: 0",
            "schema": {
              "maximum": 32767,
              "minimum": 0,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "description": "Number of records per page (1-50). Default: 30",
            "schema": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Order",
            "in": "query",
            "description": "Sorting order. Default: Ascending",
            "schema": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SortOrder"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated users list",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Users"
        ],
        "summary": "Create a new user",
        "description": "Creates a new user in the system",
        "operationId": "Users_CreateUser",
        "requestBody": {
          "description": "CreateUserRequestModel model",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.CreateUserRequestModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.CreateUserRequestModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.CreateUserRequestModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.CreateUserRequestModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created user model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to create a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Retrieve a user based on user id",
        "description": "Retrieves a user by the specified user id",
        "operationId": "Users_GetUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "UserId is not valid"
          },
          "404": {
            "description": "User was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "patch": {
        "tags": [
          "Users"
        ],
        "summary": "Update a user",
        "description": "Updates a user in the system",
        "operationId": "Users_UpdateUser",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "JSON patch model. Example: [{ \"op\": \"replace\", \"path\": \"/Email\", \"value\": \"name@email.com\" }] For more information refer to [http://jsonpatch.com/](http://jsonpatch.com/)",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated user model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to create a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/userId": {
      "put": {
        "tags": [
          "Users"
        ],
        "summary": "Update the user's external ID",
        "operationId": "Users_UpdateUserId",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "User's identifier",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Update request payload",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateUserIdModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateUserIdModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateUserIdModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateUserIdModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/users/{userId}/skills": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Retrieve user skills list",
        "description": "Retrieves a list of skills that belong to the specified user",
        "operationId": "Users_ListUserSkills",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Skills list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Users"
        ],
        "summary": "Assign skills to the user",
        "description": "Assigns specified skills to the user",
        "operationId": "Users_AddUserSkills",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "AddSkillsModel model",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddSkillsModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddSkillsModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddSkillsModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddSkillsModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "List of assigned skills",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/skills/{skillId}": {
      "delete": {
        "tags": [
          "Users"
        ],
        "summary": "Remove an assigned user skill",
        "description": "Removes a skill from the user",
        "operationId": "Users_RemoveUserSkill",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "skillId",
            "in": "path",
            "description": "Skill id to remove",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Skill removed"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/positions": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Retrieve user positions list",
        "description": "Retrieves a list of positions that belong to the specified user",
        "operationId": "Users_ListUserPositions",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Positions list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Users"
        ],
        "summary": "Assign positions to the user",
        "description": "Assigns specified positions to the user",
        "operationId": "Users_AddUserPositions",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "AddPositionsModel model",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddPositionsModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddPositionsModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddPositionsModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddPositionsModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "List of assigned positions",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/positions/{positionId}": {
      "delete": {
        "tags": [
          "Users"
        ],
        "summary": "Remove an assigned user position",
        "description": "Removes a position from the user",
        "operationId": "Users_RemoveUserPosition",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "positionId",
            "in": "path",
            "description": "Position id to remove",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Position removed"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/payrates": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Retrieve user pay rates list",
        "description": "Retrieves a list of pay rates that belong to the specified user",
        "operationId": "Users_ListUserPayRates",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Pay rates list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Users"
        ],
        "summary": "Add new pay rate records for the user",
        "description": "Adds new pay rates for the specified user",
        "operationId": "Users_AddUserPayRates",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "List os EffectivePayRateModel models",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Added pay rate records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/payrates/{effectiveFrom}": {
      "put": {
        "tags": [
          "Users"
        ],
        "summary": "Update user pay rate",
        "description": "Replaces a pay rate record of the specified user",
        "operationId": "Users_UpdateUserPayrate",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "effectiveFrom",
            "in": "path",
            "description": "Effective from date of pay rate record to replace",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "requestBody": {
          "description": "PayrollDataModel model",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayRateModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayRateModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayRateModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayRateModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated pay rate record",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "delete": {
        "tags": [
          "Users"
        ],
        "summary": "Remove a pay rate record from the user",
        "description": "Removes a pay rate from the specified user",
        "operationId": "Users_RemoveUserPayRate",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "effectiveFrom",
            "in": "path",
            "description": "Effective date of record that should be removed",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Pay rate record removed"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/leaveallowance": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Retrieve user leave allowance list",
        "description": "Retrieves a list of leave allowance that belong to the specified user",
        "operationId": "Users_ListUserLeaveAllowance",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Leave allowance list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Users"
        ],
        "summary": "Add new leave allowance records for the user",
        "description": "Adds new leave allowance for the specified user",
        "operationId": "Users_AddUserLeaveAllowance",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "List is EffectiveLeaveAllowanceModel models",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Added leave allowance records",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "Users"
        ],
        "summary": "Update user leave allowance",
        "description": "Replaces a leave allowance record of the specified user",
        "operationId": "Users_UpdateUserLeaveAllowance",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "PayrollDataModel model",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated leave allowance record",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/leaveallowance/{effectiveFrom}": {
      "delete": {
        "tags": [
          "Users"
        ],
        "summary": "Remove a leave allowance record from the user",
        "description": "Removes a leave allowance record from the specified user",
        "operationId": "Users_RemoveUserLeaveAllowance",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "effectiveFrom",
            "in": "path",
            "description": "Effective date of record that should be removed",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Leave allowance record removed"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/visa": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Assign user visa.",
        "operationId": "Users_GetUserVisas",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User visas list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "Users"
        ],
        "summary": "Assign user visa.",
        "operationId": "Users_AssignUserVisa",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "UserVisaModel model",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated user visa",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/visa/{visaTypeId}": {
      "delete": {
        "tags": [
          "Users"
        ],
        "summary": "Assign user visa.",
        "operationId": "Users_RemoveUserVisa",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "visaTypeId",
            "in": "path",
            "description": "Visa Type Id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Deleted user visa",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Resource not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/contracttypes": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Get user's contract types",
        "operationId": "Users_GetUserContractTypes",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Users"
        ],
        "summary": "Add contract types to user",
        "operationId": "Users_AddUserContractTypes",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Users"
        ],
        "summary": "Edit user's contract types",
        "operationId": "Users_EditUserContractTypes",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/users/{userId}/contracttypes/{effectiveFrom}": {
      "delete": {
        "tags": [
          "Users"
        ],
        "summary": "Remove a contract type from user",
        "operationId": "Users_RemoveUserContractType",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "effectiveFrom",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/users/{userId}/termtime": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Retrieve user term times list for the user",
        "operationId": "Users_GetUserTermTimes",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "User term times list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Term time or user not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "Users"
        ],
        "summary": "Add new term times for the user",
        "description": "Adds term times entry",
        "operationId": "Users_AddUserTermTime",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Term time request model",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeRequestModel"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeRequestModel"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeRequestModel"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeRequestModel"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Term time added",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Term time or user not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/termtime/{termTimeId}": {
      "patch": {
        "tags": [
          "Users"
        ],
        "summary": "Updates term times for a user",
        "description": "Updates the specified term time entry",
        "operationId": "Users_UpdateUserTermTime",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termTimeId",
            "in": "path",
            "description": "Term time identifier",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "JSON patch model. Example: [{ \"op\": \"replace\", \"path\": \"/StartDate\", \"value\": \"2025-09-01T00:00:00Z\" }] For more information refer to [http://jsonpatch.com/](http://jsonpatch.com/)",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.Operation"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Term time updated",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Term time or user not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "delete": {
        "tags": [
          "Users"
        ],
        "summary": "Remove a term time from a user",
        "description": "Deletes the specified term time entry",
        "operationId": "Users_RemoveUserTermTime",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termTimeId",
            "in": "path",
            "description": "Term time identifier",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Term time deleted"
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Term time or user not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/enddate/{proposedEndDate}/conflicts": {
      "get": {
        "tags": [
          "Users"
        ],
        "summary": "Preview conflicts for a proposed end date",
        "description": "Returns counts of future journals and leave requests that would be affected, plus signed-off timesheets that would be preserved.",
        "operationId": "Users_GetEndDateConflicts",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "proposedEndDate",
            "in": "path",
            "description": "The proposed end date to check for conflicts",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Conflict preview",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.EndDateConflictsResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.EndDateConflictsResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.EndDateConflictsResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "403": {
            "description": "Access denied"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/users/{userId}/enddate": {
      "put": {
        "tags": [
          "Users"
        ],
        "summary": "Update a user's end date with conflict resolution",
        "description": "Updates the user's end date and optionally resolves conflicts with future journals and leave requests",
        "operationId": "Users_UpdateEndDate",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "description": "Target user id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "End date update request",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateRequestModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateRequestModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateRequestModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateRequestModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated end date result",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "403": {
            "description": "Access denied"
          },
          "404": {
            "description": "User not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/version": {
      "get": {
        "tags": [
          "Version"
        ],
        "operationId": "Version_Index",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/api/v1/visatypes": {
      "get": {
        "tags": [
          "VisaTypes"
        ],
        "summary": "Gets a list of active Visa Types for the current group.",
        "operationId": "VisaTypes_GetVisaTypes",
        "responses": {
          "200": {
            "description": "List of Visa Types",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                  }
                }
              }
            }
          },
          "401": {
            "description": "You lack permissions to perform this action"
          }
        }
      },
      "post": {
        "tags": [
          "VisaTypes"
        ],
        "summary": "Creates a new Visa Type.",
        "operationId": "VisaTypes_CreateVisaType",
        "requestBody": {
          "description": "The model containing data for the new Visa Type.",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.CreateVisaTypeModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.CreateVisaTypeModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.CreateVisaTypeModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.CreateVisaTypeModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Visa type created",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              }
            }
          },
          "401": {
            "description": "You lack permissions to perform this action"
          },
          "400": {
            "description": "A visa type with the same external ID already exists"
          }
        }
      }
    },
    "/api/v1/visatypes/{externalId}": {
      "get": {
        "tags": [
          "VisaTypes"
        ],
        "summary": "Gets a specific Visa Type by its external ID.",
        "operationId": "VisaTypes_GetVisaTypeByExternalId",
        "parameters": [
          {
            "name": "externalId",
            "in": "path",
            "description": "The external ID of the Visa Type.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Visa type model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              }
            }
          },
          "404": {
            "description": "Visa type not found"
          },
          "401": {
            "description": "You lack permissions to perform this action"
          }
        }
      },
      "put": {
        "tags": [
          "VisaTypes"
        ],
        "summary": "Updates an existing Visa Type.",
        "operationId": "VisaTypes_UpdateVisaType",
        "parameters": [
          {
            "name": "externalId",
            "in": "path",
            "description": "The external ID of the Visa Type to update.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "The model containing updated data.",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.UpdateVisaTypeModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.UpdateVisaTypeModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.UpdateVisaTypeModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.UpdateVisaTypeModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Visa type updated",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel"
                }
              }
            }
          },
          "404": {
            "description": "Visa type not found"
          },
          "401": {
            "description": "You lack permissions to perform this action"
          }
        }
      },
      "delete": {
        "tags": [
          "VisaTypes"
        ],
        "summary": "Deactivates a Visa Type by its external ID.",
        "operationId": "VisaTypes_DeactivateVisaType",
        "parameters": [
          {
            "name": "externalId",
            "in": "path",
            "description": "The external ID of the Visa Type to deactivate.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "204": {
            "description": "Visa type deactivated"
          },
          "404": {
            "description": "Visa type not found"
          },
          "401": {
            "description": "You lack permissions to perform this action"
          }
        }
      }
    },
    "/api/v1/visatypes/{externalId}/reactivate": {
      "post": {
        "tags": [
          "VisaTypes"
        ],
        "summary": "Reactivates a Visa Type by its external ID.",
        "operationId": "VisaTypes_ReactivateVisaType",
        "parameters": [
          {
            "name": "externalId",
            "in": "path",
            "description": "The external ID of the Visa Type to reactivate.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "204": {
            "description": "Visa type reactivated"
          },
          "404": {
            "description": "Visa type not found"
          },
          "401": {
            "description": "You lack permissions to perform this action"
          }
        }
      }
    },
    "/api/v1/webhooks": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "summary": "List webhooks",
        "description": "Retrieves a webhooks list of all webhooks in the system",
        "operationId": "Webhooks_ListWebhooks",
        "responses": {
          "200": {
            "description": "Webhooks list",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                  }
                }
              },
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                  }
                }
              },
              "text/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "post": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Create a new webhook",
        "description": "Creates a new webhook in the system. For information how to consume and secure webhooks see <a href=\"/webhooks.html\">webhooks documentation</a>",
        "operationId": "Webhooks_AddWebhook",
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddWebhookModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddWebhookModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddWebhookModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AddWebhookModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created webhook model",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "401": {
            "description": "Access denied to create a resource"
          },
          "409": {
            "description": "Conflicting model values"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      }
    },
    "/api/v1/webhooks/{id}": {
      "get": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Retrieve skill by id",
        "description": "Retrieves a webhook by the specified webhook id",
        "operationId": "Webhooks_GetWebhook",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target webhook id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Webhook",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Webhook was not found"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "put": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Update webhook",
        "description": "Updates a specified webhook by replacing its url address",
        "operationId": "Webhooks_EditWebhook",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target webhook id to update",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "description": "Model containing new url address",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateWebhookModel"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateWebhookModel"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateWebhookModel"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UpdateWebhookModel"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated webhook",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel"
                }
              }
            }
          },
          "400": {
            "description": "Request parameters are invalid"
          },
          "404": {
            "description": "Webhook was not found"
          },
          "409": {
            "description": "Webhook with the same url already exists"
          },
          "500": {
            "description": "Internal Server Error"
          }
        }
      },
      "delete": {
        "tags": [
          "Webhooks"
        ],
        "summary": "Delete webhook",
        "description": "Deletes a specified webhook",
        "operationId": "Webhooks_DeleteWebhook",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Target webhook id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK if webhook deleted"
          },
          "404": {
            "description": "Webhook was not found"
          }
        }
      }
    },
    "/api/v1/webhooks-consumer/time-and-attendance": {
      "post": {
        "tags": [
          "WebhooksConsumer"
        ],
        "operationId": "WebhooksConsumer_TimeAndAttendance",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Microsoft.AspNetCore.JsonPatch.Operations.Operation": {
        "type": "object",
        "properties": {
          "operationType": {
            "$ref": "#/components/schemas/Microsoft.AspNetCore.JsonPatch.Operations.OperationType"
          },
          "path": {
            "type": "string",
            "nullable": true
          },
          "op": {
            "type": "string",
            "nullable": true
          },
          "from": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Microsoft.AspNetCore.JsonPatch.Operations.OperationType": {
        "enum": [
          "Add",
          "Remove",
          "Replace",
          "Move",
          "Copy",
          "Test",
          "Invalid"
        ],
        "type": "string"
      },
      "RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response": {
        "type": "object",
        "properties": {
          "employeeReference": {
            "type": "string",
            "nullable": true
          },
          "leaveAccrualYTD": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "leaveAccrualYTDNoFuture": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "carriedOverLeave": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "totalLeave": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "daysTakenYTD": {
            "type": "number",
            "format": "double"
          },
          "leaveBalanceYTD": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "reportingPeriod": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.ReportingPeriod"
          }
        },
        "additionalProperties": false
      },
      "RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response": {
        "type": "object",
        "properties": {
          "employeeReference": {
            "type": "string",
            "nullable": true
          },
          "leaveAccrualYTD": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "leaveAccrualYTDNoFuture": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "carriedOverLeave": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "totalLeave": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "daysTakenYTD": {
            "type": "number",
            "format": "double"
          },
          "leaveBalanceYTD": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "daysBookedFuture": {
            "type": "number",
            "format": "double"
          },
          "projectedAdditionalAccrual": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "totalProjectedEntitlement": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "contractualLeaveEntitlement": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue"
          },
          "leaveAccrualRate": {
            "type": "number",
            "format": "double"
          },
          "hoursWorkedYTD": {
            "type": "number",
            "format": "double"
          },
          "avgHours52Week": {
            "type": "number",
            "format": "double"
          },
          "avgDaysPerWeek": {
            "type": "number",
            "format": "double"
          },
          "reportingPeriod": {
            "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.ReportingPeriod"
          },
          "accruePerHourWorked": {
            "type": "boolean"
          },
          "avgDaysPerWeekInLookback": {
            "type": "number",
            "format": "double"
          },
          "daysWorkedYTD": {
            "type": "integer",
            "format": "int32"
          },
          "weeksInLookback": {
            "type": "integer",
            "format": "int32"
          },
          "leaveYearEndDate": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "RotaGeek.BL.Leave.CaffeNero.Dto.LeaveValue": {
        "type": "object",
        "properties": {
          "days": {
            "type": "number",
            "format": "double"
          },
          "hours": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "RotaGeek.BL.Leave.CaffeNero.Dto.ReportingPeriod": {
        "type": "object",
        "properties": {
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "RotaGeek.BL.Models.LeaveTypeResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Leave type id",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Leave type name",
            "nullable": true
          },
          "isUnpaid": {
            "type": "boolean",
            "description": "Indicates whether leaves of this type are unpaid"
          },
          "payrollCode": {
            "type": "string",
            "description": "Payroll code associated with this leave type",
            "nullable": true
          },
          "requestable": {
            "type": "boolean",
            "description": "Indicates whether users can request this leave type"
          },
          "hasAllowance": {
            "type": "boolean",
            "description": "Indicates whether the leave type has an allowance"
          },
          "isTypeId": {
            "type": "integer",
            "description": "Leave type category (maps to RotaGeek.Core.Enums.IsTypeId)",
            "format": "int32",
            "nullable": true
          },
          "balanceManagedExternally": {
            "type": "boolean",
            "description": "When true, the balance for this leave type is sourced from an external system (e.g.\nKeyPay) rather than calculated within RotaGeek. Integrators sending stored balances via\n`POST /v2/users/{userId}/leavebalances` can use this flag to discover which leave\ntypes accept external balance ingestion."
          }
        },
        "additionalProperties": false,
        "description": "Container for leave type response object"
      },
      "RotaGeek.BL.Models.UserConfigurableFieldDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RotaGeek.Core.Enums.WorkerType": {
        "enum": [
          "Substantive",
          "Bank",
          "Agency"
        ],
        "type": "string"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AddPositionsModel": {
        "type": "object",
        "properties": {
          "positionIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Collection of positions id's to add",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Object container for position id's to add"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AddSkillsModel": {
        "type": "object",
        "properties": {
          "skillIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Collection of skill id's to add",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Object container for skill id's to add"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AddUsersModel": {
        "type": "object",
        "properties": {
          "userIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Collection of user id's to add",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Object container for user id's to add"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AddWebhookModel": {
        "required": [
          "secret",
          "url"
        ],
        "type": "object",
        "properties": {
          "eventName": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookEventName"
          },
          "url": {
            "maxLength": 255,
            "minLength": 4,
            "type": "string",
            "description": "Url to which webhook request will be sent"
          },
          "secret": {
            "maxLength": 128,
            "minLength": 8,
            "type": "string",
            "description": "Secret that will be used to validate webhook request"
          }
        },
        "additionalProperties": false,
        "description": "Object container for a new webhook model"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AdjustedDayDemandModel": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Date for demand data",
            "format": "date-time"
          },
          "taskId": {
            "type": "string",
            "description": "ID of associated task",
            "nullable": true
          },
          "demand": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AdjustedDemandModel"
            },
            "description": "Demand data",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for adjusted demand data for a specific date / task combination"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AdjustedDemandModel": {
        "type": "object",
        "properties": {
          "time": {
            "type": "string",
            "description": "Time stamp",
            "format": "date-span"
          },
          "people": {
            "type": "integer",
            "description": "Value of the demand figure",
            "format": "int32"
          },
          "type": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DemandType"
          }
        },
        "additionalProperties": false,
        "description": "Container for demand value for a specific time frame"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AdjustedDemandResultModel": {
        "type": "object",
        "properties": {
          "demand": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AdjustedDayDemandModel"
            },
            "description": "Demand values segmented by task",
            "nullable": true
          },
          "flexibleDemand": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.FlexibleDemandModel"
            },
            "description": "Flexible demand values. This refers to demand for work that needs to be done at a specific\ndate range but not at any particular time.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for result of query for adjusted demand"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AssignGapModel": {
        "type": "object",
        "properties": {
          "gapId": {
            "type": "string",
            "description": "Unique identifier for the gap to fill",
            "nullable": true
          },
          "cost": {
            "type": "number",
            "description": "Cost of the shift (in monetary terms)",
            "format": "double",
            "nullable": true
          },
          "workerType": {
            "$ref": "#/components/schemas/RotaGeek.Core.Enums.WorkerType"
          },
          "user": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.GapUserModel"
          }
        },
        "additionalProperties": false,
        "description": "Object container for a gap assignment action"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AuditAction": {
        "enum": [
          "Created",
          "Updated",
          "Deleted",
          "Initialized"
        ],
        "type": "string",
        "description": "Describes the type of action recorded in an audit log"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AuditDeltaModel": {
        "type": "object",
        "properties": {
          "propertyName": {
            "type": "string",
            "description": "Name of the property changed",
            "nullable": true
          },
          "oldValue": {
            "description": "Previous value",
            "nullable": true
          },
          "newValue": {
            "description": "New value",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Details of a change captured in an audit log"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AuditEntityRootType": {
        "enum": [
          "User"
        ],
        "type": "string",
        "description": "Supported entity types for audit trail queries"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AuditEntitySubType": {
        "enum": [
          "User",
          "UserAnnualLeaveCarriedOver",
          "UserConfigurableField",
          "UserContractedHours",
          "UserContractType",
          "UserLeaveAllowance",
          "UserLeaveTypeAllowance",
          "UserLocation",
          "UserPayRate",
          "UserPosition",
          "UserPrimaryLocation",
          "UserReadOnlyLocation",
          "UserSkill",
          "UserTermTime",
          "UserVisa",
          "UserWorkingDay"
        ],
        "type": "string"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AuditLogSortField": {
        "enum": [
          "CreatedDateUtc"
        ],
        "type": "string",
        "description": "Fields that audit logs can be ordered by"
      },
      "Rotageek.AspNetCore.PublicApi.Models.Availability": {
        "enum": [
          "Available",
          "NotAvailable",
          "Prefer",
          "PreferNot"
        ],
        "type": "string"
      },
      "Rotageek.AspNetCore.PublicApi.Models.AvailabilityModel": {
        "type": "object",
        "properties": {
          "start": {
            "type": "string",
            "description": "Start of availability",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "End of availability",
            "format": "date-time"
          },
          "type": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.Availability"
          }
        },
        "additionalProperties": false,
        "description": "Container for availability for a specific date/time range"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+Comment": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "description": "Unique if of user who left this comment",
            "nullable": true
          },
          "text": {
            "type": "string",
            "description": "Comment content",
            "nullable": true
          },
          "date": {
            "type": "string",
            "description": "Date when comment was made",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Container for comment information of time sheet record object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+GeoCoordinatesModel": {
        "type": "object",
        "properties": {
          "longitude": {
            "type": "number",
            "description": "Longitude component of position",
            "format": "float"
          },
          "latitude": {
            "type": "number",
            "description": "Latitude component of position",
            "format": "float"
          }
        },
        "additionalProperties": false,
        "description": "Container for geo coordinates positional information"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeAndAttendanceExceptionModel": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Exception type - This can be Early / Late Clock In / Out.",
            "nullable": true
          },
          "reason": {
            "type": "string",
            "description": "Exception reason",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for time and attendance exception information"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeSheetAdjustmentReasonsModel": {
        "type": "object",
        "properties": {
          "startAdjustmentReason": {
            "type": "string",
            "description": "The reason selected for adjusting the start time",
            "nullable": true
          },
          "startAdjustedByUserId": {
            "type": "string",
            "description": "User identifier of the person who made the start time adjustment",
            "nullable": true
          },
          "endAdjustmentReason": {
            "type": "string",
            "description": "The reason selected for adjusting the end time",
            "nullable": true
          },
          "endAdjustedByUserId": {
            "type": "string",
            "description": "User identifier of the person who made the end time adjustment",
            "nullable": true
          },
          "breakAdjustmentReason": {
            "type": "string",
            "description": "The reason selected for adjusting the unpaid break duration",
            "nullable": true
          },
          "breakAdjustedByUserId": {
            "type": "string",
            "description": "User identifier of the person who made the unpaid break duration adjustment",
            "nullable": true
          },
          "deleteAdjustmentReason": {
            "type": "string",
            "description": "The reason selected for deleting a time sheet entry",
            "nullable": true
          },
          "deleteAdjustedByUserId": {
            "type": "string",
            "description": "User identifier of the person who deleted the time sheet entry",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for reasons for manager adjustments to a time sheet entry"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeSheetLeaveDataResponseModel": {
        "type": "object",
        "properties": {
          "leaveRequestId": {
            "type": "string",
            "description": "Leave request unique id",
            "nullable": true
          },
          "leaveRequestDuration": {
            "type": "number",
            "description": "Total leave request duration",
            "format": "double",
            "nullable": true
          },
          "leaveTypeId": {
            "type": "string",
            "description": "Leave type id",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for leave information of time sheet record object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BudgetModel": {
        "type": "object",
        "properties": {
          "start": {
            "type": "string",
            "description": "Start of date range for budget figure",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "End of date range for budget figure",
            "format": "date-time"
          },
          "value": {
            "type": "number",
            "description": "Value of the budget figure",
            "format": "double"
          },
          "taskIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of task id(s) associated with this budget entry",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for budget figures for a specific date range"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BudgetRecordSortField": {
        "enum": [
          "Start",
          "End",
          "Value"
        ],
        "type": "string",
        "description": "Describes possible fields for budget list ordering"
      },
      "Rotageek.AspNetCore.PublicApi.Models.BudgetType": {
        "enum": [
          "Money",
          "Hours"
        ],
        "type": "string",
        "description": "Describes the variations of budget figures supported"
      },
      "Rotageek.AspNetCore.PublicApi.Models.CreateLeaveRequestModel": {
        "required": [
          "leaveTypeId"
        ],
        "type": "object",
        "properties": {
          "start": {
            "type": "string",
            "description": "Leave request start date",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "Leave request end date",
            "format": "date-time"
          },
          "startAllDay": {
            "type": "boolean",
            "description": "Indicates whether leave request start day is a whole day"
          },
          "endAllDay": {
            "type": "boolean",
            "description": "Indicates whether leave request end day is a whole day"
          },
          "leaveTypeId": {
            "minLength": 1,
            "type": "string",
            "description": "Leave type id of this leave request"
          },
          "status": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestStatus"
          },
          "leaveDays": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveDayModel"
            },
            "description": "Duration of each leave day in hours. If a day is not specified then it will be treated as having a duration of 0.",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "description": "Leave request notes",
            "nullable": true
          },
          "response": {
            "type": "string",
            "description": "Leave request response from manager",
            "nullable": true
          },
          "id": {
            "type": "string",
            "description": "New unique leave request id (max length: 36)",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for leave request creation object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.CreateLocationModel": {
        "required": [
          "id",
          "name",
          "region"
        ],
        "type": "object",
        "properties": {
          "id": {
            "minLength": 1,
            "type": "string",
            "description": "New unique location id (max length: 250)"
          },
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string",
            "description": "Name of the new location (max length: 200)"
          },
          "region": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationRegion"
          },
          "addressLine1": {
            "maxLength": 200,
            "type": "string",
            "description": "Address line 1 of the new location (max length: 200)",
            "nullable": true
          },
          "addressLine2": {
            "maxLength": 200,
            "type": "string",
            "description": "Address line 2 of the new location (max length: 200)",
            "nullable": true
          },
          "town": {
            "maxLength": 200,
            "type": "string",
            "description": "Town of the new location (max length: 200)",
            "nullable": true
          },
          "country": {
            "maxLength": 200,
            "type": "string",
            "description": "Country of the new location (max length: 200)",
            "nullable": true
          },
          "postcode": {
            "maxLength": 10,
            "type": "string",
            "description": "Post code of the new location (max length: 10)",
            "nullable": true
          },
          "hierarchy": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "description": "A sequence (non-ordered) of cluster item specified as \"tier-name\": \"cluster-name\"\nExample:\n{\n    \"Country\": \"England\",\n    \"City\": \"London\",\n    \"Area\": \"West End\"\n}",
            "nullable": true
          },
          "coordinates": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationCoordinates"
          }
        },
        "additionalProperties": false,
        "description": "Object container for location creation"
      },
      "Rotageek.AspNetCore.PublicApi.Models.CreatePositionModel": {
        "required": [
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "minLength": 1,
            "type": "string",
            "description": "New unique position id (max length: 100)"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string",
            "description": "Name of the new position (max length: 100)"
          }
        },
        "additionalProperties": false,
        "description": "Object container for position creation"
      },
      "Rotageek.AspNetCore.PublicApi.Models.CreateSkillModel": {
        "required": [
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "minLength": 1,
            "type": "string",
            "description": "New unique skill id (max length: 36)"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string",
            "description": "Name of the new skill (max length: 100)"
          }
        },
        "additionalProperties": false,
        "description": "Object container for skill creation"
      },
      "Rotageek.AspNetCore.PublicApi.Models.DayDemandModel": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Date for demand data",
            "format": "date-time"
          },
          "taskId": {
            "type": "string",
            "description": "ID of associated task",
            "nullable": true
          },
          "demand": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.DemandModel"
            },
            "description": "Demand data",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for demand data for a specific date / task combination"
      },
      "Rotageek.AspNetCore.PublicApi.Models.DemandModel": {
        "type": "object",
        "properties": {
          "time": {
            "type": "string",
            "description": "Time stamp",
            "format": "date-span"
          },
          "people": {
            "type": "integer",
            "description": "Value of the demand figure",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Container for demand value for a specific time frame"
      },
      "Rotageek.AspNetCore.PublicApi.Models.DemandType": {
        "enum": [
          "Target",
          "Minimum",
          "Maximum"
        ],
        "type": "string",
        "description": "Describes the type of adjusted demand values"
      },
      "Rotageek.AspNetCore.PublicApi.Models.EffectivePayRateModel": {
        "required": [
          "effectiveFrom",
          "payRate",
          "payType"
        ],
        "type": "object",
        "properties": {
          "payType": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayType"
          },
          "payRate": {
            "type": "number",
            "description": "Pay rate per pay type unit",
            "format": "double"
          },
          "effectiveFrom": {
            "type": "string",
            "description": "Date from which pay rate is effective",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Object container for user pay rate with effective date"
      },
      "Rotageek.AspNetCore.PublicApi.Models.EmployeeTypeResponseModel": {
        "type": "object",
        "properties": {
          "employeeType": {
            "type": "string",
            "description": "The employee type as a string. Valid values: \"FullTime\", \"PartTime\", \"Casual\".",
            "nullable": true
          },
          "effectiveFrom": {
            "type": "string",
            "description": "The effective from date for this employee type.",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response model for user employee type information."
      },
      "Rotageek.AspNetCore.PublicApi.Models.FlexibleDemandModel": {
        "type": "object",
        "properties": {
          "start": {
            "type": "string",
            "description": "Start date of flexible demand requirement",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "End date of flexible demand requirement",
            "format": "date-time"
          },
          "taskId": {
            "type": "string",
            "description": "ID of associated task",
            "nullable": true
          },
          "targetHours": {
            "type": "number",
            "description": "Number of hours required",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Container for flexible demand value for a specific date range / task combination"
      },
      "Rotageek.AspNetCore.PublicApi.Models.GapRecordResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique ID for this gap record",
            "nullable": true
          },
          "lastUpdated": {
            "type": "string",
            "description": "Date when this record was created",
            "format": "date-time"
          },
          "start": {
            "type": "string",
            "description": "Start date on the record",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "End date on the record",
            "format": "date-time"
          },
          "locationId": {
            "type": "string",
            "description": "Unique location id associated with the record",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "description": "Any notes associated with this gap",
            "nullable": true
          },
          "quantity": {
            "type": "integer",
            "description": "The number of gaps needed for this record",
            "format": "int32"
          },
          "isCritical": {
            "type": "boolean",
            "description": "Is this gap shift marked as critical?"
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ScheduleTaskResponseModel"
            },
            "description": "Tasks that are associated with this record",
            "nullable": true
          },
          "passiveTasks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Passive tasks that are associated with this record",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container object for gap record"
      },
      "Rotageek.AspNetCore.PublicApi.Models.GapRecordSortField": {
        "enum": [
          "LocationId",
          "StartTime"
        ],
        "type": "string",
        "description": "Describes possible fields for location list ordering"
      },
      "Rotageek.AspNetCore.PublicApi.Models.GapUserModel": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "description": "Unique identifier for the user",
            "nullable": true
          },
          "locationId": {
            "type": "string",
            "description": "Unique identifier for the user's primary location",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "description": "User first name",
            "nullable": true
          },
          "surname": {
            "type": "string",
            "description": "User surname",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Object container for the user to assign the gap to"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveAllowanceModel": {
        "required": [
          "accruePerHourWorked",
          "rate"
        ],
        "type": "object",
        "properties": {
          "effectiveFrom": {
            "type": "string",
            "description": "Date from which leave allowance is effective",
            "format": "date-time",
            "nullable": true
          },
          "rate": {
            "type": "number",
            "description": "Leave allowance rate per type unit",
            "format": "double"
          },
          "accruePerHourWorked": {
            "type": "boolean",
            "description": "Type of leave allowance allocation (false : Fixed; true : Accrued)"
          }
        },
        "additionalProperties": false,
        "description": "Object container for user leave allowance with effective date"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveDataModel": {
        "type": "object",
        "properties": {
          "leaveRequestUnit": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestUnit"
          },
          "workingHoursInADay": {
            "type": "number",
            "description": "The regular hours in a working day for the user",
            "format": "double"
          },
          "leaveAccruePerHour": {
            "type": "boolean",
            "description": "Flag indicating whether this user accrues annual leave per hour worked"
          },
          "annualLeaveAllowance": {
            "type": "number",
            "description": "The current annual leave entitlement for the user (by the unit defined in LeaveRequestUnit if not accrued)",
            "format": "double",
            "nullable": true
          },
          "studyLeaveAllowance": {
            "type": "number",
            "description": "The current study leave entitlement for the user (by the unit defined in LeaveRequestUnit)",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container object for user leave settings"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveDayModel": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Leave day date",
            "format": "date-time"
          },
          "duration": {
            "type": "number",
            "description": "Leave duration in this leave day",
            "format": "float"
          }
        },
        "additionalProperties": false,
        "description": "Container for leave request day response object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveReasonModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "secondaryCode": {
            "type": "string",
            "description": "The code a payroll provider knows this reason by, where one is configured. Shorter and\nless expressive than Rotageek.AspNetCore.PublicApi.Models.LeaveReasonModel.Code because payroll systems cap the field — Micropay\nat ten characters — so an integration that has to name the reason to a payroll system\nshould prefer this and fall back to Rotageek.AspNetCore.PublicApi.Models.LeaveReasonModel.Code. Null when none is set.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Leave request id",
            "nullable": true
          },
          "start": {
            "type": "string",
            "description": "Leave request start date",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "Leave request end date",
            "format": "date-time"
          },
          "startAllDay": {
            "type": "boolean",
            "description": "Indicates whether leave request start day is a whole day"
          },
          "endAllDay": {
            "type": "boolean",
            "description": "Indicates whether leave request end day is a whole day"
          },
          "leaveTypeId": {
            "type": "string",
            "description": "Leave type id of this leave request",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "description": "Leave request notes",
            "nullable": true
          },
          "response": {
            "type": "string",
            "description": "Leave request response comment",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestStatus"
          },
          "createdOn": {
            "type": "string",
            "description": "Date when the request has been created",
            "format": "date-time"
          },
          "duration": {
            "type": "number",
            "description": "Leave duration in working hours",
            "format": "double"
          },
          "userId": {
            "type": "string",
            "description": "Requester unique id",
            "nullable": true
          },
          "leaveDays": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveDayModel"
            },
            "description": "Collection of leave days of this leave request",
            "nullable": true
          },
          "leaveTypeSecondaryCode": {
            "type": "string",
            "description": "The code a payroll provider knows this leave type by, its accrual type, where one is\nconfigured. Shorter and less expressive than Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel.LeaveTypeId because payroll\nsystems cap the field, Micropay at ten characters, so an integration that has to name the\nleave type to a payroll system should prefer this and fall back to Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel.LeaveTypeId.\nNull when none is set.",
            "nullable": true
          },
          "leaveReason": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveReasonModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for leave request response object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveRequestSortField": {
        "enum": [
          "Id",
          "Start",
          "End",
          "UserId",
          "Duration",
          "TypeId"
        ],
        "type": "string",
        "description": "Describes possible fields for location list ordering"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveRequestStatus": {
        "enum": [
          "Outstanding",
          "Approved",
          "Rejected",
          "Cancelled"
        ],
        "type": "string",
        "description": "Describes the leave request status"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LeaveRequestUnit": {
        "enum": [
          "Day",
          "Hour"
        ],
        "type": "string",
        "description": "Describes leave request unit"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet1Response"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response, RotaGeek.BL, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RotaGeek.BL.Leave.CaffeNero.Dto.CaffeNeroDataSet2Response"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.BudgetModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BudgetModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.GapRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.GapRecordResponseModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestResponseModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.LocationItemListModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationItemListModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.UserIdResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserIdResponseModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.AuditLogResponseModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.AuditLogResponseModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ListWrapperModel`1[[Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel, Rotageek.AspNetCore.PublicApi, Version=2026.10.9.7962, Culture=neutral, PublicKeyToken=null]]": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel"
            },
            "description": "Collection of items returned from the request",
            "nullable": true
          },
          "pagination": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PaginationModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for pagination information and items collection"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LocationCoordinates": {
        "type": "object",
        "properties": {
          "latitude": {
            "maximum": 90,
            "minimum": -90,
            "type": "number",
            "description": "Location latitude. Valid range -90 to 90.",
            "format": "double"
          },
          "longitude": {
            "maximum": 180,
            "minimum": -180,
            "type": "number",
            "description": "Location longitude. Valid range -180 to 180.",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.LocationItemListModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique location id",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Location name",
            "nullable": true
          },
          "postcode": {
            "type": "string",
            "description": "Location post code",
            "nullable": true
          },
          "costCentre": {
            "type": "string",
            "description": "Cost centre associated with the location. May be null or empty when no cost centre is set.",
            "nullable": true
          },
          "hierarchy": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "description": "A sequence (non-ordered) of cluster item specified as \"tier-name\": \"cluster-name\"\nExample:\n{\n    \"Country\": \"England\",\n    \"City\": \"London\",\n    \"Area\": \"West End\"\n}",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Location object container"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LocationRegion": {
        "enum": [
          "England",
          "Scotland",
          "NorthernIreland",
          "Wales",
          "AustraliaMelbourne",
          "Ireland",
          "Germany",
          "Netherlands",
          "HongKong"
        ],
        "type": "string",
        "description": "Describes available regions for the location"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LocationResponseModel": {
        "required": [
          "id",
          "name",
          "region"
        ],
        "type": "object",
        "properties": {
          "id": {
            "minLength": 1,
            "type": "string",
            "description": "Location id"
          },
          "name": {
            "minLength": 1,
            "type": "string",
            "description": "Location name"
          },
          "region": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationRegion"
          },
          "addressLine1": {
            "type": "string",
            "description": "Location first address line",
            "nullable": true
          },
          "addressLine2": {
            "type": "string",
            "description": "Location second address line",
            "nullable": true
          },
          "town": {
            "type": "string",
            "description": "Location town",
            "nullable": true
          },
          "country": {
            "type": "string",
            "description": "Location country",
            "nullable": true
          },
          "postcode": {
            "type": "string",
            "description": "Location post code",
            "nullable": true
          },
          "hierarchy": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "nullable": true
            },
            "description": "A sequence (non-ordered) of cluster item specified as \"tier-name\": \"cluster-name\"\nExample:\n{\n    \"Country\": \"England\",\n    \"City\": \"London\",\n    \"Area\": \"West End\"\n}",
            "nullable": true
          },
          "coordinates": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LocationCoordinates"
          }
        },
        "additionalProperties": false,
        "description": "Container for location response object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.LocationSortField": {
        "enum": [
          "Name",
          "Id",
          "Postcode"
        ],
        "type": "string",
        "description": "Describes possible fields for location list ordering"
      },
      "Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetEntryModel": {
        "type": "object",
        "properties": {
          "clockInException": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeAndAttendanceExceptionModel"
          },
          "clockOutException": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeAndAttendanceExceptionModel"
          },
          "comments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+Comment"
            },
            "description": "List of comments for this time sheet entry",
            "nullable": true
          },
          "leaveData": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetEntryModel+TimeSheetLeaveDataRequestModel"
          },
          "approved": {
            "type": "boolean",
            "description": "Flag whether this time sheet record was approved by a supervisor"
          },
          "clockInTime": {
            "type": "string",
            "description": "Shift clock-in time",
            "format": "date-time",
            "nullable": true
          },
          "clockOutTime": {
            "type": "string",
            "description": "Shift clock-out time",
            "format": "date-time",
            "nullable": true
          },
          "adjustmentReasons": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeSheetAdjustmentReasonsModel"
          },
          "scheduleRecordId": {
            "type": "string",
            "description": "ID of the associated schedule record (if any)",
            "nullable": true
          },
          "userId": {
            "type": "string",
            "description": "Target user id",
            "nullable": true
          },
          "startTime": {
            "type": "string",
            "description": "Actual shift start time",
            "format": "date-time"
          },
          "clockInCoordinates": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+GeoCoordinatesModel"
          },
          "endTime": {
            "type": "string",
            "description": "Actual shift end time",
            "format": "date-time"
          },
          "clockOutCoordinates": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+GeoCoordinatesModel"
          },
          "breakDuration": {
            "type": "integer",
            "description": "Actual break duration",
            "format": "int32"
          },
          "isLeave": {
            "type": "boolean",
            "description": "Flag which indicates whether this time sheet entry is associated with a shift or leave"
          },
          "employeeMissing": {
            "type": "boolean",
            "description": "Flag which indicates whether the user clocked into the shift associated with this time sheet entry",
            "nullable": true
          },
          "payrollCodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayrollData"
            },
            "description": "List of associated payroll codes",
            "nullable": true
          },
          "locationId": {
            "type": "string",
            "description": "ID of worked location",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for time sheet entry record object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetEntryModel+TimeSheetLeaveDataRequestModel": {
        "required": [
          "leaveRequestDuration",
          "leaveRequestId"
        ],
        "type": "object",
        "properties": {
          "leaveRequestId": {
            "minLength": 1,
            "type": "string",
            "description": "Leave request unique id"
          },
          "leaveRequestDuration": {
            "maximum": 24,
            "minimum": 0,
            "type": "number",
            "description": "Total leave request duration",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Container for leave information of time sheet record object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetModel": {
        "type": "object",
        "properties": {
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.NewTimeSheetEntryModel"
            },
            "description": "List of entries in this time sheet",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for new time sheet object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.PaginationModel": {
        "type": "object",
        "properties": {
          "pageNumber": {
            "type": "integer",
            "description": "Current number of the requested page (zero based)",
            "format": "int32"
          },
          "pageSizeRequested": {
            "type": "integer",
            "description": "Number of items that were requested",
            "format": "int32"
          },
          "itemsCount": {
            "type": "integer",
            "description": "Number of items fetched",
            "format": "int32"
          },
          "hasMore": {
            "type": "boolean",
            "description": "Flag informing that there are more records then was fetched with this request"
          }
        },
        "additionalProperties": false,
        "description": "Container object for pagination information"
      },
      "Rotageek.AspNetCore.PublicApi.Models.PayRateModel": {
        "required": [
          "payRate",
          "payType"
        ],
        "type": "object",
        "properties": {
          "payType": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayType"
          },
          "payRate": {
            "type": "number",
            "description": "Pay rate per pay type unit",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Container for user pay rate model"
      },
      "Rotageek.AspNetCore.PublicApi.Models.PayType": {
        "enum": [
          "Annum",
          "Hours"
        ],
        "type": "string",
        "description": "Describes pay type of user payroll"
      },
      "Rotageek.AspNetCore.PublicApi.Models.PayrollData": {
        "type": "object",
        "properties": {
          "payrollCodeId": {
            "type": "string",
            "description": "Associated payroll code",
            "nullable": true
          },
          "duration": {
            "type": "integer",
            "description": "Duration of this payroll",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for payroll data of time sheet record object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.PositionResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Position unique id",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Position name",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Position container object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.RecordType": {
        "enum": [
          "Shift",
          "Leave"
        ],
        "type": "string",
        "description": "Describes record type in the scheduler"
      },
      "Rotageek.AspNetCore.PublicApi.Models.SalesTotalModel": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Reference date for sales figure",
            "format": "date-time"
          },
          "total": {
            "type": "number",
            "description": "Value of the sales figure",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Container for sales figures for a specific date"
      },
      "Rotageek.AspNetCore.PublicApi.Models.SalesTotalRecordSortField": {
        "enum": [
          "Date",
          "Total"
        ],
        "type": "string",
        "description": "Describes possible fields for sales total list ordering"
      },
      "Rotageek.AspNetCore.PublicApi.Models.SalesTotalType": {
        "enum": [
          "Forecast",
          "Actual"
        ],
        "type": "string",
        "description": "Describes the variations of sales figures supported"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique ID for this schedule record",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Record name",
            "nullable": true
          },
          "userId": {
            "type": "string",
            "description": "Employee unique id associated with the record",
            "nullable": true
          },
          "createdOn": {
            "type": "string",
            "description": "Date when this record was created",
            "format": "date-time"
          },
          "start": {
            "type": "string",
            "description": "Start date on the record",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "End date on the record",
            "format": "date-time"
          },
          "locationId": {
            "type": "string",
            "description": "Unique location id associated with the record",
            "nullable": true
          },
          "payrollCode": {
            "type": "string",
            "description": "Payroll code assigned to the record",
            "nullable": true
          },
          "recordType": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.RecordType"
          },
          "breakDuration": {
            "type": "number",
            "description": "If the record is a shift - total break duration of the shift i.e. paid + unpaid breaks",
            "format": "double",
            "nullable": true
          },
          "paidBreakDuration": {
            "type": "number",
            "description": "If the record is a shift - total paid break duration",
            "format": "double",
            "nullable": true
          },
          "unpaidBreakDuration": {
            "type": "number",
            "description": "If the record is a shift - total unpaid break duration",
            "format": "double",
            "nullable": true
          },
          "leaveRequestId": {
            "type": "string",
            "description": "If the record is a leave - unique leave request id associated with the record",
            "nullable": true
          },
          "leaveTypeId": {
            "type": "string",
            "description": "If the record is a leave - leave type id associated with the record",
            "nullable": true
          },
          "journalSource": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.SourceOfJournal"
          },
          "amendedAfterAutoschedule": {
            "type": "boolean",
            "description": "If this entry was from the autoscheduler, this flag indicates whether it was changed afterwards",
            "nullable": true
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.ScheduleTaskResponseModel"
            },
            "description": "Tasks that are associated with this record i.e. if it is a shift",
            "nullable": true
          },
          "lastModifiedAt": {
            "type": "string",
            "description": "When the record is last modified at (in UTC).",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container object for schedule record"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ScheduleRecordSortField": {
        "enum": [
          "Name",
          "UserId",
          "LocationId",
          "StartTime"
        ],
        "type": "string",
        "description": "Describes possible fields for location list ordering"
      },
      "Rotageek.AspNetCore.PublicApi.Models.ScheduleTaskResponseModel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the task",
            "nullable": true
          },
          "start": {
            "type": "string",
            "description": "Task start",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "description": "Task end",
            "format": "date-time"
          },
          "locationId": {
            "type": "string",
            "description": "Unique location id associated with this task",
            "nullable": true
          },
          "room": {
            "type": "string",
            "description": "Name of room this task is to be performed in (if applicable)",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container object for a task record"
      },
      "Rotageek.AspNetCore.PublicApi.Models.SkillResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Skill unique id",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Skill name",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for skill response object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.SortOrder": {
        "enum": [
          "Ascending",
          "Descending"
        ],
        "type": "string",
        "description": "Describes items sort order"
      },
      "Rotageek.AspNetCore.PublicApi.Models.SourceOfJournal": {
        "enum": [
          "Scheduler",
          "AutoScheduler",
          "Gap",
          "ExternalGap",
          "Imported",
          "Pattern"
        ],
        "type": "string",
        "description": "Describes the source of the schedule entry"
      },
      "Rotageek.AspNetCore.PublicApi.Models.TaskListingModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Task unique id",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Task name",
            "nullable": true
          },
          "colour": {
            "type": "string",
            "description": "Task colour",
            "nullable": true
          },
          "passive": {
            "type": "boolean",
            "description": "Task setting: passive"
          },
          "excludeFromDashboard": {
            "type": "boolean",
            "description": "Task setting: exclude from dashboard"
          },
          "outOfContract": {
            "type": "boolean",
            "description": "Task setting: out of contract"
          },
          "protectFromReRoster": {
            "type": "boolean",
            "description": "Task setting: protect task from re-roster"
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.TaskModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Task unique id",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Task name",
            "nullable": true
          },
          "colour": {
            "type": "string",
            "description": "Task colour",
            "nullable": true
          },
          "passive": {
            "type": "boolean",
            "description": "Task setting: passive"
          },
          "excludeFromDashboard": {
            "type": "boolean",
            "description": "Task setting: exclude from dashboard"
          },
          "outOfContract": {
            "type": "boolean",
            "description": "Task setting: out of contract"
          },
          "protectFromReRoster": {
            "type": "boolean",
            "description": "Task setting: protect task from re-roster"
          },
          "locationIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Task associated Locations",
            "nullable": true
          },
          "skillIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Task associated Skills",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.TimeSheetEntryAmendmentModel": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "description": "Target user id",
            "nullable": true
          },
          "locationId": {
            "type": "string",
            "description": "ID of worked location",
            "nullable": true
          },
          "startTime": {
            "type": "string",
            "description": "Actual shift start time",
            "format": "date-time"
          },
          "endTime": {
            "type": "string",
            "description": "Actual shift end time",
            "format": "date-time"
          },
          "breakDuration": {
            "type": "integer",
            "description": "Actual break duration",
            "format": "int32"
          },
          "employeeMissing": {
            "type": "boolean",
            "description": "Flag which indicates whether the user clocked into the shift associated with this time sheet entry",
            "nullable": true
          },
          "payrollCodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayrollData"
            },
            "description": "List of associated payroll codes",
            "nullable": true
          },
          "inactive": {
            "type": "boolean",
            "description": "If set to true, this amendment removes / deletes the original time sheet entry"
          },
          "standalone": {
            "type": "boolean",
            "description": "Flags whether this amendment is standalone i.e. a new, backdated time sheet entry"
          },
          "approved": {
            "type": "boolean",
            "description": "Flag whether this amendment record was approved by a supervisor"
          },
          "isLeave": {
            "type": "boolean",
            "description": "Flag which indicates whether this amendment record is associated with a shift or leave"
          },
          "timeSheetEntry": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetEntryResponseModel"
          }
        },
        "additionalProperties": false,
        "description": "Container for time sheet entry amendment record object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.TimeSheetEntryResponseModel": {
        "type": "object",
        "properties": {
          "clockInException": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeAndAttendanceExceptionModel"
          },
          "clockOutException": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeAndAttendanceExceptionModel"
          },
          "comments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+Comment"
            },
            "description": "List of comments for this time sheet entry",
            "nullable": true
          },
          "leaveData": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeSheetLeaveDataResponseModel"
          },
          "approved": {
            "type": "boolean",
            "description": "Flag whether this time sheet record was approved by a supervisor"
          },
          "clockInTime": {
            "type": "string",
            "description": "Shift clock-in time",
            "format": "date-time",
            "nullable": true
          },
          "clockOutTime": {
            "type": "string",
            "description": "Shift clock-out time",
            "format": "date-time",
            "nullable": true
          },
          "adjustmentReasons": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+TimeSheetAdjustmentReasonsModel"
          },
          "scheduleRecordId": {
            "type": "string",
            "description": "ID of the associated schedule record (if any)",
            "nullable": true
          },
          "userId": {
            "type": "string",
            "description": "Target user id",
            "nullable": true
          },
          "startTime": {
            "type": "string",
            "description": "Actual shift start time",
            "format": "date-time"
          },
          "clockInCoordinates": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+GeoCoordinatesModel"
          },
          "endTime": {
            "type": "string",
            "description": "Actual shift end time",
            "format": "date-time"
          },
          "clockOutCoordinates": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.BaseTimeSheetEntryModel+GeoCoordinatesModel"
          },
          "breakDuration": {
            "type": "integer",
            "description": "Actual break duration",
            "format": "int32"
          },
          "isLeave": {
            "type": "boolean",
            "description": "Flag which indicates whether this time sheet entry is associated with a shift or leave"
          },
          "employeeMissing": {
            "type": "boolean",
            "description": "Flag which indicates whether the user clocked into the shift associated with this time sheet entry",
            "nullable": true
          },
          "payrollCodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayrollData"
            },
            "description": "List of associated payroll codes",
            "nullable": true
          },
          "locationId": {
            "type": "string",
            "description": "ID of worked location",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.TimeSheetResponseModel": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetStatus"
          },
          "startDate": {
            "type": "string",
            "description": "Time sheet start date",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "description": "Time sheet end date",
            "format": "date-time"
          },
          "updatedOn": {
            "type": "string",
            "description": "Date and time this time sheet",
            "format": "date-time",
            "nullable": true
          },
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetEntryResponseModel"
            },
            "description": "List of entries in this time sheet",
            "nullable": true
          },
          "amendments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.TimeSheetEntryAmendmentModel"
            },
            "description": "List of amendments of entries from previous weeks in this time sheet",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.TimeSheetStatus": {
        "enum": [
          "Created",
          "Submitted",
          "SignedOff"
        ],
        "type": "string",
        "description": "Describes the time sheet status"
      },
      "Rotageek.AspNetCore.PublicApi.Models.UnassignGapModel": {
        "type": "object",
        "properties": {
          "gapId": {
            "type": "string",
            "description": "External ID of the gap we want to unassign the user from",
            "nullable": true
          },
          "userId": {
            "type": "string",
            "description": "External ID of the user we want to unassign from the gap",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Object container for the unassign gap action"
      },
      "Rotageek.AspNetCore.PublicApi.Models.UpdateUserIdModel": {
        "required": [
          "userId"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "minLength": 1,
            "type": "string",
            "description": "User's external ID"
          }
        },
        "additionalProperties": false,
        "description": "Container for update user external ID request payload"
      },
      "Rotageek.AspNetCore.PublicApi.Models.UpdateWebhookModel": {
        "required": [
          "url"
        ],
        "type": "object",
        "properties": {
          "url": {
            "maxLength": 255,
            "minLength": 4,
            "type": "string",
            "description": "New url to which webhook request will be sent"
          }
        },
        "additionalProperties": false,
        "description": "Container for webhook update object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.UserAccessLevel": {
        "enum": [
          "Administrator",
          "Supervisor",
          "Employee"
        ],
        "type": "string",
        "description": "Describes the user access level in the system"
      },
      "Rotageek.AspNetCore.PublicApi.Models.UserClassificationRequestModel": {
        "required": [
          "effectiveFrom"
        ],
        "type": "object",
        "properties": {
          "fixedId": {
            "type": "integer",
            "description": "The fixed identifier of the classification. Must be supplied together with AwardCode, or left null\ntogether with AwardCode to record \"No Classification\" for the effective date.",
            "format": "int32",
            "nullable": true
          },
          "awardCode": {
            "maxLength": 50,
            "minLength": 0,
            "type": "string",
            "description": "The award code associated with the classification. Must be supplied together with FixedId, or left\nnull together with FixedId to record \"No Classification\" for the effective date.",
            "nullable": true
          },
          "effectiveFrom": {
            "type": "string",
            "description": "The date from which this classification applies. Required; must be on or after the user's\nemployee start date.",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Request model for creating or updating a user classification by FixedId and AwardCode.\nFixedId and AwardCode together identify the classification to assign and must be provided as a pair:\nomitting or nulling both records \"No Classification\" for the effective date, while providing only\none of the two is rejected with a 400 response."
      },
      "Rotageek.AspNetCore.PublicApi.Models.UserClassificationResponseModel": {
        "type": "object",
        "properties": {
          "fixedId": {
            "type": "integer",
            "description": "The fixed identifier of the classification.",
            "format": "int32",
            "nullable": true
          },
          "awardCode": {
            "type": "string",
            "description": "The award code associated with the classification.",
            "nullable": true
          },
          "effectiveFrom": {
            "type": "string",
            "description": "The effective from date for this classification.\nAlways populated in the response.",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Response model for user classification information."
      },
      "Rotageek.AspNetCore.PublicApi.Models.UserEmployeeTypeRequestModel": {
        "required": [
          "employeeType"
        ],
        "type": "object",
        "properties": {
          "employeeType": {
            "maxLength": 50,
            "minLength": 0,
            "type": "string",
            "description": "The employee type as a string. Valid values: \"FullTime\", \"PartTime\", \"Casual\"."
          },
          "effectiveFrom": {
            "type": "string",
            "description": "The effective from date for this employee type. Allow nullable",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request model for creating or updating a user employee type by string enum value."
      },
      "Rotageek.AspNetCore.PublicApi.Models.UserIdResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique user id",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.UserSortField": {
        "enum": [
          "Username",
          "UserId",
          "Email",
          "Firstname",
          "Surname"
        ],
        "type": "string",
        "description": "Describes possible fields for user list ordering"
      },
      "Rotageek.AspNetCore.PublicApi.Models.WebhookEventName": {
        "enum": [
          "SchedulerApproved",
          "UsersChanged",
          "TimeSheetSignedOff",
          "GapsChanged",
          "PayrollTriggered",
          "LeaveUpdated",
          "WorkedScheduleUpdated",
          "UserPayRateChanged"
        ],
        "type": "string",
        "description": "Describes webhook event type of webhook payload"
      },
      "Rotageek.AspNetCore.PublicApi.Models.WebhookResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique webhook id",
            "format": "uuid"
          },
          "eventName": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.WebhookEventName"
          },
          "url": {
            "type": "string",
            "description": "Url to which webhook request will be sent",
            "nullable": true
          },
          "secret": {
            "type": "string",
            "description": "Secret that will be used to validate webhook request",
            "nullable": true
          },
          "createdOn": {
            "type": "string",
            "description": "Date when the webhook has been created",
            "format": "date-time"
          },
          "updatedOn": {
            "type": "string",
            "description": "Date when the webhook has been updated",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container for webhook response object"
      },
      "Rotageek.AspNetCore.PublicApi.Models.WorkerTypeFilter": {
        "enum": [
          "All",
          "Normal",
          "Bank",
          "Agency"
        ],
        "type": "string"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.AuditLogResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier of the audit log",
            "format": "uuid"
          },
          "timestampUtc": {
            "type": "string",
            "description": "Timestamp of the audit entry (UTC)",
            "format": "date-time"
          },
          "action": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AuditAction"
          },
          "entityId": {
            "type": "string",
            "description": "Identifier of the entity affected",
            "nullable": true
          },
          "entityType": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AuditEntitySubType"
          },
          "actingUserId": {
            "type": "string",
            "description": "User who performed the action",
            "nullable": true
          },
          "deltas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.AuditDeltaModel"
            },
            "description": "List of deltas describing the change",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Audit log entry returned from the API\nFor example, the change is to add a new contract type to a user (effective dated)\nThe audit log response would be:\nAction: Created\nEntityId: null (user contract type has no external id) \nThe deltas would be:\nPropertyName: ContractTypeId\nOldValue: CT_7\",\nPropertyName: EffectiveFrom\nOldValue: \"2025-07-11T14:48:38.815Z\","
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.ConflictCountModel": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of items",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Count wrapper for conflict items"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.ConflictsModel": {
        "type": "object",
        "properties": {
          "futureJournals": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ConflictCountModel"
          },
          "futureLeaveRequests": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ConflictCountModel"
          },
          "spanningLeaveRequests": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ConflictCountModel"
          },
          "signedOffTimesheetEntries": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ConflictCountModel"
          }
        },
        "additionalProperties": false,
        "description": "Detailed conflict counts"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.ContractTypeResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response model for contract type"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.CreateUserRequestModel": {
        "required": [
          "firstname",
          "surname"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique user id (max length: 36)",
            "nullable": true
          },
          "username": {
            "maxLength": 256,
            "minLength": 6,
            "type": "string",
            "description": "User name in the system (max length: 200)",
            "nullable": true
          },
          "firstname": {
            "maxLength": 200,
            "minLength": 2,
            "type": "string",
            "description": "User first name"
          },
          "preferredName": {
            "type": "string",
            "description": "User preferred name. Optional.",
            "nullable": true
          },
          "surname": {
            "maxLength": 200,
            "minLength": 2,
            "type": "string",
            "description": "User surname name"
          },
          "email": {
            "maxLength": 200,
            "minLength": 0,
            "type": "string",
            "description": "User email address",
            "nullable": true
          },
          "phone": {
            "maxLength": 200,
            "minLength": 0,
            "type": "string",
            "description": "User phone number (mobile)",
            "format": "tel",
            "nullable": true
          },
          "accessLevel": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserAccessLevel"
          },
          "employeeStartDate": {
            "type": "string",
            "description": "Employment start date for the user",
            "format": "date-time",
            "nullable": true
          },
          "employeeEndDate": {
            "type": "string",
            "description": "Employment end date for the user",
            "format": "date-time",
            "nullable": true
          },
          "sendExternalEmails": {
            "type": "boolean",
            "description": "Indicates that the user will receive emails from RotaGeek"
          },
          "sendExternalSMS": {
            "type": "boolean",
            "description": "OBSELETE - SMS functionality is retired from RotaGeek. This field no-longer maps to the user",
            "deprecated": true
          },
          "sendAdminUpdateAlerts": {
            "type": "boolean",
            "description": "User gets alerts about changes to all staff"
          },
          "sendLeaveAdminAlerts": {
            "type": "boolean",
            "description": "User gets alerts about leave requests (can be enabled only when Leave feature is enabled)"
          },
          "sendTimesheetAlerts": {
            "type": "boolean",
            "description": "User gets alerts about time sheets"
          },
          "dateOfBirth": {
            "type": "string",
            "description": "Date of birth for the user",
            "format": "date-time",
            "nullable": true
          },
          "position": {
            "type": "string",
            "description": "Position to which user should be assigned after user creation",
            "nullable": true
          },
          "locations": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Locations to which user should be assigned after user creation",
            "nullable": true
          },
          "positions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Positions to which user should be assigned after user creation",
            "nullable": true
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Skills that user should be assigned after creation",
            "nullable": true
          },
          "payrollSettings": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayRateModel"
          },
          "leaveSettings": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveDataModel"
          },
          "primaryLocation": {
            "type": "string",
            "description": "The user's primary location identifier",
            "nullable": true
          },
          "contractedHours": {
            "type": "number",
            "description": "Latest contracted hours for the user",
            "format": "double"
          },
          "excludeFromScheduler": {
            "type": "boolean",
            "description": "This user is excluded from scheduler",
            "deprecated": true
          }
        },
        "additionalProperties": false,
        "description": "Container object for user creation data"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.EndDateConflictResolution": {
        "enum": [
          "ConvertToGaps",
          "DeleteAll"
        ],
        "type": "string",
        "description": "Conflict resolution strategy when updating user end date"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.EndDateConflictsResponseModel": {
        "type": "object",
        "properties": {
          "hasConflicts": {
            "type": "boolean",
            "description": "Whether any conflicts exist"
          },
          "conflicts": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ConflictsModel"
          }
        },
        "additionalProperties": false,
        "description": "Response model for end date conflicts preview"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.LeaveDataResponseModel": {
        "type": "object",
        "properties": {
          "leaveRequestUnit": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.LeaveRequestUnit"
          },
          "workingHoursInADay": {
            "type": "number",
            "description": "The regular hours in a working day for the user",
            "format": "double"
          },
          "leaveAccruePerHour": {
            "type": "boolean",
            "description": "Flag indicating whether this user accrues annual leave per hour worked"
          },
          "annualLeaveAllowance": {
            "type": "number",
            "description": "The current annual leave entitlement for the user (by the unit defined in LeaveRequestUnit if not accrued)",
            "format": "double",
            "nullable": true
          },
          "studyLeaveAllowance": {
            "type": "number",
            "description": "The current study leave entitlement for the user (by the unit defined in LeaveRequestUnit)",
            "format": "double",
            "nullable": true
          },
          "percentOfHoursWorked": {
            "type": "number",
            "description": "Percent of hours worked for leave accrue",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Container object for user leave settings"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.ResolvedConflictsModel": {
        "type": "object",
        "properties": {
          "journalsConvertedToGaps": {
            "type": "integer",
            "description": "Number of journals converted to unfilled gaps",
            "format": "int32"
          },
          "journalsDeleted": {
            "type": "integer",
            "description": "Number of journals deleted",
            "format": "int32"
          },
          "leaveRequestsCancelled": {
            "type": "integer",
            "description": "Number of leave requests cancelled (started after end date)",
            "format": "int32"
          },
          "leaveRequestsTruncated": {
            "type": "integer",
            "description": "Number of leave requests truncated (spanned across end date)",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Summary of conflicts resolved during end date update"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateRequestModel": {
        "type": "object",
        "properties": {
          "endDate": {
            "type": "string",
            "description": "The new end date for the user. Set to null to clear the end date (reactivate user).",
            "format": "date-time",
            "nullable": true
          },
          "conflictResolution": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.EndDateConflictResolution"
          }
        },
        "additionalProperties": false,
        "description": "Request model for updating a user's end date"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UpdateEndDateResponseModel": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "description": "The external user ID",
            "nullable": true
          },
          "previousEndDate": {
            "type": "string",
            "description": "The user's previous end date before this update",
            "format": "date-time",
            "nullable": true
          },
          "newEndDate": {
            "type": "string",
            "description": "The user's new end date after this update",
            "format": "date-time",
            "nullable": true
          },
          "conflictResolution": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.EndDateConflictResolution"
          },
          "resolvedConflicts": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.ResolvedConflictsModel"
          }
        },
        "additionalProperties": false,
        "description": "Response model for end date update operation"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UserContractTypeModel": {
        "required": [
          "contractTypeId",
          "effectiveFrom"
        ],
        "type": "object",
        "properties": {
          "contractTypeId": {
            "minLength": 1,
            "type": "string",
            "description": "Contract type identifier"
          },
          "effectiveFrom": {
            "type": "string",
            "description": "Effective from date",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Contract type assignment model"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UserListItemModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "User unique id",
            "nullable": true
          },
          "username": {
            "type": "string",
            "description": "Username",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "description": "User first name",
            "nullable": true
          },
          "surname": {
            "type": "string",
            "description": "User surname",
            "nullable": true
          },
          "email": {
            "type": "string",
            "description": "User email",
            "nullable": true
          },
          "isActive": {
            "type": "boolean",
            "description": "User Status"
          },
          "skillIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Skills",
            "nullable": true
          },
          "positionIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Positions",
            "nullable": true
          },
          "primaryLocation": {
            "type": "string",
            "description": "Primary location",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Object container for compact user information"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UserResponseModel": {
        "required": [
          "firstname",
          "surname"
        ],
        "type": "object",
        "properties": {
          "username": {
            "maxLength": 256,
            "minLength": 6,
            "type": "string",
            "description": "User name in the system (max length: 200)",
            "nullable": true
          },
          "firstname": {
            "maxLength": 200,
            "minLength": 2,
            "type": "string",
            "description": "User first name"
          },
          "preferredName": {
            "type": "string",
            "description": "User preferred name. Optional.",
            "nullable": true
          },
          "surname": {
            "maxLength": 200,
            "minLength": 2,
            "type": "string",
            "description": "User surname name"
          },
          "email": {
            "maxLength": 200,
            "minLength": 0,
            "type": "string",
            "description": "User email address",
            "nullable": true
          },
          "phone": {
            "maxLength": 200,
            "minLength": 0,
            "type": "string",
            "description": "User phone number (mobile)",
            "format": "tel",
            "nullable": true
          },
          "accessLevel": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.UserAccessLevel"
          },
          "employeeStartDate": {
            "type": "string",
            "description": "Employment start date for the user",
            "format": "date-time",
            "nullable": true
          },
          "employeeEndDate": {
            "type": "string",
            "description": "Employment end date for the user",
            "format": "date-time",
            "nullable": true
          },
          "sendExternalEmails": {
            "type": "boolean",
            "description": "Indicates that the user will receive emails from RotaGeek"
          },
          "sendExternalSMS": {
            "type": "boolean",
            "description": "OBSELETE - SMS functionality is retired from RotaGeek. This field no-longer maps to the user",
            "deprecated": true
          },
          "sendAdminUpdateAlerts": {
            "type": "boolean",
            "description": "User gets alerts about changes to all staff"
          },
          "sendLeaveAdminAlerts": {
            "type": "boolean",
            "description": "User gets alerts about leave requests (can be enabled only when Leave feature is enabled)"
          },
          "sendTimesheetAlerts": {
            "type": "boolean",
            "description": "User gets alerts about time sheets"
          },
          "dateOfBirth": {
            "type": "string",
            "description": "Date of birth for the user",
            "format": "date-time",
            "nullable": true
          },
          "position": {
            "type": "string",
            "description": "Position to which user should be assigned after user creation",
            "nullable": true
          },
          "id": {
            "type": "string",
            "description": "Unique user id",
            "nullable": true
          },
          "isActive": {
            "type": "boolean",
            "description": "Flag that indicates that the user is active (can use the system)"
          },
          "payrollSettings": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.PayRateModel"
          },
          "leaveSettings": {
            "$ref": "#/components/schemas/Rotageek.AspNetCore.PublicApi.Models.v1.LeaveDataResponseModel"
          },
          "primaryLocation": {
            "type": "string",
            "description": "The user's primary location identifier",
            "nullable": true
          },
          "contractedHours": {
            "type": "number",
            "description": "Latest contracted hours for the user",
            "format": "double"
          },
          "excludeFromScheduler": {
            "type": "boolean",
            "description": "This user is excluded from scheduler",
            "deprecated": true
          }
        },
        "additionalProperties": false,
        "description": "Container object for user"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeRequestModel": {
        "required": [
          "endDate",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Request model for creating or updating a user term time"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UserTermTimeResponseModel": {
        "required": [
          "endDate",
          "startDate"
        ],
        "type": "object",
        "properties": {
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          },
          "id": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response model representing a user term time"
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.UserVisaModel": {
        "required": [
          "visaTypeId"
        ],
        "type": "object",
        "properties": {
          "visaTypeId": {
            "minLength": 1,
            "type": "string",
            "description": "The unique identifier for Visa Type. Required."
          },
          "expiryDate": {
            "type": "string",
            "description": "Expiration date. Required when Visa type requires one.",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.CreateVisaTypeModel": {
        "required": [
          "expires",
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "maxLength": 50,
            "minLength": 0,
            "type": "string",
            "description": "The unique identifier for the Visa Type. Required."
          },
          "name": {
            "maxLength": 100,
            "minLength": 0,
            "type": "string",
            "description": "The name of the Visa Type. Required."
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "description": "A description of the Visa Type. Optional.",
            "nullable": true
          },
          "expires": {
            "type": "boolean",
            "description": "Indicates whether this visa type requires an expiration date. Required."
          }
        },
        "additionalProperties": false,
        "description": "Model for creating a new Visa Type."
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.UpdateVisaTypeModel": {
        "required": [
          "expires",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 0,
            "type": "string",
            "description": "The name of the Visa Type. Required."
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "description": "A description of the Visa Type. Optional.",
            "nullable": true
          },
          "expires": {
            "type": "boolean",
            "description": "Indicates whether this visa type requires an expiration date. Required."
          }
        },
        "additionalProperties": false,
        "description": "Model for updating an existing Visa Type."
      },
      "Rotageek.AspNetCore.PublicApi.Models.v1.VisaTypes.VisaTypeResponseModel": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier for the Visa Type in the Public API.",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "The name of the Visa Type.",
            "nullable": true
          },
          "description": {
            "type": "string",
            "description": "A description of the Visa Type.",
            "nullable": true
          },
          "expires": {
            "type": "boolean",
            "description": "Indicates whether this visa type has an expiration date."
          },
          "active": {
            "type": "boolean",
            "description": "Indicates whether the Visa Type is currently active."
          }
        },
        "additionalProperties": false,
        "description": "Represents a Visa Type in the Public API."
      },
      "Rotageek.AspNetCore.PublicApi.Models.v2.LeaveAllowanceSettingsResponseModel": {
        "type": "object",
        "properties": {
          "yearStartDate": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "description": "Paste the JWT access token returned by POST /api/v1/auth. Swagger adds the 'Bearer ' prefix automatically.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      },
      "oauth2": {
        "type": "oauth2",
        "description": "OAuth2 Password Grant",
        "flows": {
          "password": {
            "tokenUrl": "/api/v1/auth",
            "scopes": { }
          }
        }
      }
    }
  },
  "security": [
    {
      "Bearer": [ ]
    }
  ],
  "tags": [
    {
      "name": "Audits"
    },
    {
      "name": "Auth",
      "description": "Authentication endpoint for obtaining and refreshing access tokens."
    },
    {
      "name": "Budget"
    },
    {
      "name": "ContractTypes"
    },
    {
      "name": "Demand"
    },
    {
      "name": "Gaps"
    },
    {
      "name": "Leave",
      "description": "Holiday entitlement endpoints. The {userId} route parameter is the employee's external identifier."
    },
    {
      "name": "Locations"
    },
    {
      "name": "Other"
    },
    {
      "name": "Positions"
    },
    {
      "name": "SalesTotal"
    },
    {
      "name": "Schedule"
    },
    {
      "name": "Skills"
    },
    {
      "name": "Tasks"
    },
    {
      "name": "Timesheets"
    },
    {
      "name": "UserAvailability"
    },
    {
      "name": "UserClassifications"
    },
    {
      "name": "UserConfigurableFields"
    },
    {
      "name": "UserEmployeeTypes"
    },
    {
      "name": "Users"
    },
    {
      "name": "Version"
    },
    {
      "name": "VisaTypes"
    },
    {
      "name": "Webhooks"
    },
    {
      "name": "WebhooksConsumer"
    }
  ]
}