{
  "openapi": "3.0.1",
  "info": {
    "title": "SoftLanding.ApiService | office",
    "version": "1.0.0"
  },
  "paths": {
    "/office/teachers": {
      "get": {
        "tags": [
          "Teacher (Office)"
        ],
        "summary": "List teachers (office).",
        "description": "Returns the full teacher records (office view â€” not row-restricted), each as a `TeacherGet` with\npersonal and contact details, address, the complete employment/insurance/tax and payment data (AHV,\nALV, NBU, KTG, BVG, Quellensteuer, IBAN, flat salary), teaching capabilities, teaching and spoken\nlanguages with levels, children, weekly availability and absence periods, and completed trainings.\nSoft-deleted teachers are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches first name, last name, address, city and private email), `lessonsToChildren`,\n`challengingStudents`, `teachingLanguageId` (with an optional `teachingLanguageMinLevel`),\n`spokenLanguageId` (with an optional `spokenLanguageMinLevel`) and `inactive`.\n\n`inactive` is the retirement state: `false` lists only the teachers who can still be given new\ncourses and lessons (what the assignment pickers ask for), `true` only the retired ones, and\nomitting it lists both. It is a plain flag on the teacher, not a lifecycle status.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetTeachersOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "LessonsToChildren",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ChallengingStudents",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "TeachingLanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "TeachingLanguageMinLevel",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfETeachingLevel"
            }
          },
          {
            "name": "SpokenLanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SpokenLanguageMinLevel",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfETeachingLevel"
            }
          },
          {
            "name": "AccountStatus",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfEAccountStatus"
            }
          },
          {
            "name": "Inactive",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Teacher (Office)"
        ],
        "summary": "Create a teacher.",
        "description": "Creates a new teacher from the `TeacherPost` body and returns the created `TeacherGet` with its\ngenerated id. Note that the work email is immutable after creation. Returns `400` with validation\ndetails if the body is invalid.",
        "operationId": "CreateTeacherOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teachers/{id}": {
      "get": {
        "tags": [
          "Teacher (Office)"
        ],
        "summary": "Get a single teacher by id.",
        "description": "Returns a single teacher by its id as a `TeacherGet`, including the full employment, languages,\navailability and training details. Returns `404` if no teacher with that id exists.",
        "operationId": "GetTeacherOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Teacher (Office)"
        ],
        "summary": "Partially update a teacher.",
        "description": "Partially updates an existing teacher: only the fields present in the `TeacherPatch` body are changed,\nthe rest stay as they are. Returns the updated `TeacherGet`. `404` if it does not exist; `400` on\nvalidation errors, `409` if the email is already in use by another teacher or by a login of the\nother portal.\n\n`inactive` is how a teacher is retired: they take on no NEW course or lesson (the pickers stop\noffering them) while everything they already hold stays with them. This is the intended way to\nremove a teacher from service â€” deleting one who still holds a course or a lesson is refused.",
        "operationId": "UpdateTeacherOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Teacher (Office)"
        ],
        "summary": "Delete a teacher (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a teacher. By default this is a soft delete â€” the teacher is hidden from normal listings but\ncan be restored; pass `?hard=true` to remove them permanently. Returns `204`, or `404` if they do\nnot exist.\n\nA teacher who is still ASSIGNED cannot be deleted at all, neither soft nor hard: being the main or\nan additional teacher of a course, or holding a lesson, is answered with `409` naming what blocks\nit (soft-deleted courses and lessons count too â€” they can be restored). Deleting them would change\nwho taught what, which the salaries and every billed position are based on. Retire them with\n`PATCH { \"inactive\": true }` instead: they keep their courses and lessons and are no longer offered\nfor new assignments.",
        "operationId": "DeleteTeacherOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teachers/{id}/resend-invitation": {
      "post": {
        "tags": [
          "Teacher (Office)"
        ],
        "summary": "Re-send the teacher's password-setup mail.",
        "description": "Triggers the onboarding (\"magic link\") mail again for a teacher who has not completed sign-up, and\nrepairs a provisioning run that did not finish â€” a missing login account or a missing realm role is\ncreated on the way, which is how a teacher whose `accountStatus` reads `Failed` is fixed.\n\nReturns `204` on success. `404` if no such teacher exists, `400` if the teacher has no email\naddress, `409` if the account already completed onboarding (a forgotten password is reset by the\nuser through the sign-in page, not from here) or if the email belongs to a login of the other\nportal, and `503` when no identity provider is configured for this environment.",
        "operationId": "ResendTeacherInvitationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teachers/{id}/restore": {
      "post": {
        "tags": [
          "Teacher (Office)"
        ],
        "summary": "Restore a soft-deleted teacher.",
        "description": "Restores a previously soft-deleted teacher so they appear in normal listings again. Returns `204`,\nor `404` if no such teacher exists.",
        "operationId": "RestoreTeacherOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/locations": {
      "get": {
        "tags": [
          "Location (Office)"
        ],
        "summary": "List locations (office).",
        "description": "Returns all locations in the system (office view — not row-restricted), each as a `LocationGet`.\nA location is a teaching venue with a name, address, and optional arrival and parking instructions.\nSoft-deleted locations are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches name, description, city, street and postal code) and by `cantonId` (the Swiss canton,\nresolvable via the matching `/lookups/...` endpoint).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetLocationsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CantonId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LocationGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LocationGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Location (Office)"
        ],
        "summary": "Create a location.",
        "description": "Creates a new location from the `LocationPost` body (name and address, with optional arrival and\nparking notes) and returns the created `LocationGet` with its generated id. Returns `400` with\nvalidation details if the body is invalid.",
        "operationId": "CreateLocationOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LocationPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/locations/{id}": {
      "get": {
        "tags": [
          "Location (Office)"
        ],
        "summary": "Get a single location by id.",
        "description": "Returns a single location by its id as a `LocationGet`, including its address and arrival/parking\ninformation. Returns `404` if no location with that id exists.",
        "operationId": "GetLocationOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Location (Office)"
        ],
        "summary": "Partially update a location.",
        "description": "Partially updates an existing location: only the fields present in the `LocationPatch` body are\nchanged, the rest stay as they are. Returns the updated `LocationGet`. Returns `404` if the location\ndoes not exist and `400` on validation errors.",
        "operationId": "UpdateLocationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LocationPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Location (Office)"
        ],
        "summary": "Delete a location (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a location. By default this is a soft delete — the location is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the\nlocation does not exist.",
        "operationId": "DeleteLocationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/locations/{id}/restore": {
      "post": {
        "tags": [
          "Location (Office)"
        ],
        "summary": "Restore a soft-deleted location.",
        "description": "Restores a previously soft-deleted location so it appears in normal listings again. Returns `204`,\nor `404` if no such location exists.",
        "operationId": "RestoreLocationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/rooms": {
      "get": {
        "tags": [
          "Room (Office)"
        ],
        "summary": "List rooms (office).",
        "description": "Returns all rooms (office view — not row-restricted), each as a `RoomGet` with its name, size in\nsquare meters, maximum student capacity, operational status and the location it belongs to.\nSoft-deleted rooms are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches the room name), `statusId` (resolvable via the room-status lookup), `locationId`, and the\n`minSizeInSquareMeters`/`maxSizeInSquareMeters` and `minMaxStudents`/`maxMaxStudents` ranges.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetRoomsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "LocationId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "MinSizeInSquareMeters",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxSizeInSquareMeters",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MinMaxStudents",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "MaxMaxStudents",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RoomGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RoomGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Room (Office)"
        ],
        "summary": "Create a room.",
        "description": "Creates a new room from the `RoomPost` body (including the location it belongs to) and returns the\ncreated `RoomGet` with its generated id. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateRoomOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoomPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoomGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/rooms/{id}": {
      "get": {
        "tags": [
          "Room (Office)"
        ],
        "summary": "Get a single room by id.",
        "description": "Returns a single room by its id as a `RoomGet`. Returns `404` if no room with that id exists.",
        "operationId": "GetRoomOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoomGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Room (Office)"
        ],
        "summary": "Partially update a room.",
        "description": "Partially updates an existing room: only the fields present in the `RoomPatch` body are changed, the\nrest stay as they are. Returns the updated `RoomGet`. `404` if it does not exist; `400` on validation\nerrors.",
        "operationId": "UpdateRoomOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoomPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoomGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Room (Office)"
        ],
        "summary": "Delete a room (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a room. By default this is a soft delete — the room is hidden from normal listings but can be\nrestored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if it does not exist.",
        "operationId": "DeleteRoomOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/rooms/{id}/restore": {
      "post": {
        "tags": [
          "Room (Office)"
        ],
        "summary": "Restore a soft-deleted room.",
        "description": "Restores a previously soft-deleted room so it appears in normal listings again. Returns `204`,\nor `404` if no such room exists.",
        "operationId": "RestoreRoomOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/materials": {
      "get": {
        "tags": [
          "Material (Office)"
        ],
        "summary": "List materials (office).",
        "description": "Returns all materials in the system (office view — not row-restricted), each as a `MaterialGet`.\nA material is a teaching resource (e.g. a book) with a title, ISBN, language, difficulty level,\ntype, price, citizenship-preparation suitability and current stock amount. Soft-deleted materials\nare excluded unless you pass `showRemoved=true`. Filter with `searchTerm` (matches title,\ndescription and ISBN) and by `languageId`, `levelId`, `typeId` and `citizenship`; the enum ids come\nfrom the matching `/lookups/...` endpoints.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetMaterialsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "LanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "LevelId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "TypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Citizenship",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MaterialGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MaterialGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Material (Office)"
        ],
        "summary": "Create a material.",
        "description": "Creates a new material from the `MaterialPost` body and returns the created `MaterialGet` with its\ngenerated id. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateMaterialOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaterialPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaterialGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/materials/{id}": {
      "get": {
        "tags": [
          "Material (Office)"
        ],
        "summary": "Get a single material by id.",
        "description": "Returns a single material by its id as a `MaterialGet`. Returns `404` if no material with that id\nexists.",
        "operationId": "GetMaterialOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaterialGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Material (Office)"
        ],
        "summary": "Partially update a material.",
        "description": "Partially updates an existing material: only the fields present in the `MaterialPatch` body are\nchanged, the rest stay as they are (e.g. adjusting the stock amount or price). Returns the updated\n`MaterialGet`. Returns `404` if the material does not exist and `400` on validation errors.",
        "operationId": "UpdateMaterialOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MaterialPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaterialGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Material (Office)"
        ],
        "summary": "Delete a material (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a material. By default this is a soft delete — the material is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the\nmaterial does not exist.",
        "operationId": "DeleteMaterialOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/materials/{id}/restore": {
      "post": {
        "tags": [
          "Material (Office)"
        ],
        "summary": "Restore a soft-deleted material.",
        "description": "Restores a previously soft-deleted material so it appears in normal listings again. Returns `204`,\nor `404` if no such material exists.",
        "operationId": "RestoreMaterialOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/training-courses": {
      "get": {
        "tags": [
          "TrainingCourse (Office)"
        ],
        "summary": "List training courses (office).",
        "description": "Returns all training courses that teachers can complete (office view — not row-restricted), each as a\n`TrainingCourseGet` with its name and the number of points awarded for completing it.\nSoft-deleted training courses are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches the name) and the `minPoints`/`maxPoints` range.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetTrainingCoursesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "MinPoints",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "MaxPoints",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TrainingCourseGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TrainingCourseGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "TrainingCourse (Office)"
        ],
        "summary": "Create a training course.",
        "description": "Creates a new training course from the `TrainingCoursePost` body (name and points) and returns the\ncreated `TrainingCourseGet` with its generated id. Returns `400` with validation details if the body\nis invalid.",
        "operationId": "CreateTrainingCourseOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingCoursePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingCourseGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/training-courses/{id}": {
      "get": {
        "tags": [
          "TrainingCourse (Office)"
        ],
        "summary": "Get a single training course by id.",
        "description": "Returns a single training course by its id as a `TrainingCourseGet`. Returns `404` if no training\ncourse with that id exists.",
        "operationId": "GetTrainingCourseOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingCourseGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "TrainingCourse (Office)"
        ],
        "summary": "Partially update a training course.",
        "description": "Partially updates an existing training course: only the fields present in the `TrainingCoursePatch`\nbody are changed, the rest stay as they are. Returns the updated `TrainingCourseGet`. `404` if it does\nnot exist; `400` on validation errors.",
        "operationId": "UpdateTrainingCourseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingCoursePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingCourseGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "TrainingCourse (Office)"
        ],
        "summary": "Delete a training course (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a training course. By default this is a soft delete — the training course is hidden from\nnormal listings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or\n`404` if it does not exist.",
        "operationId": "DeleteTrainingCourseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/training-courses/{id}/restore": {
      "post": {
        "tags": [
          "TrainingCourse (Office)"
        ],
        "summary": "Restore a soft-deleted training course.",
        "description": "Restores a previously soft-deleted training course so it appears in normal listings again. Returns\n`204`, or `404` if no such training course exists.",
        "operationId": "RestoreTrainingCourseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/lessons": {
      "get": {
        "tags": [
          "Lesson (Office)"
        ],
        "summary": "List lessons (office).",
        "description": "Returns all lessons in the system (office view — not row-restricted), each as a `LessonGet`.\nA lesson is a single scheduled session within a course: its date and start/end times, the course it\nbelongs to, the ONE teacher holding it, attendance records, homework, the computed teaching salary and\noptional travel allowance, and its cancelled/invoiced flags. Soft-deleted lessons are excluded\nunless you pass `showRemoved=true`. Filter with `searchTerm` (matches the course display and\nhomework descriptions) and by `courseId`, `roomId`, a `dateFrom`/`dateTo` range, `isCancelled`,\n`isInvoiced`, `customerId` (lessons whose course has an enrolled student of that customer) and\n`withoutPackageOrder` (lessons not billed against a package).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetLessonsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "RoomId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "DateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "DateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "IsCancelled",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "IsInvoiced",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LessonGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LessonGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Lesson (Office)"
        ],
        "summary": "Create a lesson.",
        "description": "Creates a new lesson from the `LessonPost` body (the owning course, date, times and its teacher) and returns the created `LessonGet` with its generated id. `teacherId` names the ONE teacher who holds it and must be a teacher of\nthe owning course (its main teacher or one of its additional teachers) — otherwise the request is\nrejected with `400`. Returns `400` with validation details if the body is invalid.\n\n`roomId` is optional and unusual: left unset the lesson takes place in the COURSE's room, which is\nthe normal case. Set it only for a session that has to move; an unknown room is a `400`.",
        "operationId": "CreateLessonOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LessonPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LessonGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/lessons/{id}": {
      "get": {
        "tags": [
          "Lesson (Office)"
        ],
        "summary": "Get a single lesson by id.",
        "description": "Returns a single lesson by its id as a `LessonGet`, including its teacher, attendance records and homework. Returns `404` if no lesson with that id exists.",
        "operationId": "GetLessonOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LessonGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Lesson (Office)"
        ],
        "summary": "Partially update a lesson.",
        "description": "Partially updates an existing lesson: only the fields present in the `LessonPatch` body are changed,\nthe rest stay as they are. Returns the updated `LessonGet`. The teacher is changed with `teacherId`, which REPLACES the assignment (a lesson has\nexactly one); it must be a teacher of the lesson's course (main or additional) — otherwise the request\nis rejected with `400`. Returns `404` if the\nlesson does not exist and `400` on validation errors.\n\nThe room of a single lesson is set with `roomId` and cleared with `removeRoom`, which returns it to\nthe COURSE's room rather than leaving the lesson without one. An unknown room is a `400`.",
        "operationId": "UpdateLessonOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LessonPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LessonGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Lesson (Office)"
        ],
        "summary": "Delete a lesson (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a lesson. By default this is a soft delete — the lesson is hidden from normal listings but\ncan be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the lesson\ndoes not exist.",
        "operationId": "DeleteLessonOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/lessons/{id}/restore": {
      "post": {
        "tags": [
          "Lesson (Office)"
        ],
        "summary": "Restore a soft-deleted lesson.",
        "description": "Restores a previously soft-deleted lesson so it appears in normal listings again. Returns `204`,\nor `404` if no such lesson exists.",
        "operationId": "RestoreLessonOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/attendance-documents": {
      "post": {
        "tags": [
          "AttendanceDocument (Office)"
        ],
        "summary": "Upload an absence document (multipart/form-data).",
        "description": "Stores the file and returns its `id`, `fileName` and `sizeBytes`. Put that id on the attendance record\nas `absenceDocumentId` in the following lesson `PATCH`.\n\nThe document is stored UNATTACHED on purpose: while the user is picking the file, the attendance record\nmay not exist yet (a lesson's rows are written by the lesson patch), so requiring the record here would\nmake the normal case impossible.\n\nAccepts PDF, JPEG and PNG up to 10 MB. An empty file, a larger one or another type is `400`. The bytes\nare stored in the database — the API's filesystem is ephemeral and per-instance, so a path would\nsurvive neither a redeploy nor a second replica.",
        "operationId": "UploadAttendanceDocumentOffice",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "required": [
                  "file"
                ],
                "type": "object",
                "properties": {
                  "file": {
                    "$ref": "#/components/schemas/IFormFile"
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UploadedDocument"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/attendance-documents/{id}": {
      "get": {
        "tags": [
          "AttendanceDocument (Office)"
        ],
        "summary": "Download an absence document.",
        "description": "Streams the stored file with its original name and content type. Returns `404` if no document with that\nid exists.",
        "operationId": "DownloadAttendanceDocumentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "AttendanceDocument (Office)"
        ],
        "summary": "Permanently delete a stored absence document.",
        "description": "Removes the stored file. Any attendance record referencing it keeps its excused status and simply loses\nthe document (the foreign key is `SET NULL`) — deleting a certificate must not silently undo the\nattendance decision that was made on it.\n\nReturns `204`, or `404` if no document with that id exists.",
        "operationId": "DeleteAttendanceDocumentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/courses": {
      "get": {
        "tags": [
          "Course (Office)"
        ],
        "summary": "List courses (office).",
        "description": "Returns all courses in the system (office view — not row-restricted), each as a `CourseGet` with\nits type (group or private), status, subject/language, teaching level, schedule (start/end dates\nand weekly slots), assigned teacher and room, enrolled students, required materials and the price\nper lesson. Soft-deleted courses are excluded unless you pass `showRemoved=true`. Filter with\n`searchTerm` (matches name and description) and by `courseTypeId`/`courseTypeIds`, `statusId`,\n`subjectId`, `levelId`, `roomId`, `teacherId` (matches courses where the teacher is the MAIN or an\nADDITIONAL teacher), `customerId` (courses with an enrolled student of that customer), start/end\ndate ranges and `isForChildren`. Enum-based filter ids come from the matching `/lookups/...`\nendpoints. Each `CourseGet` carries `teacherId`/`teacher` (the main teacher) plus `teacherIds`/\n`teachers` (ALL teachers of the course = main ∪ additional).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetCoursesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CourseTypeIds",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SubjectId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "LevelId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "RoomId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "TeacherId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StartDateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "StartDateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "EndDateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "EndDateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "IsForChildren",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "MinStudentsFrom",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "MinStudentsTo",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CourseGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CourseGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Course (Office)"
        ],
        "summary": "Create a course.",
        "description": "Creates a new course from the `CoursePost` body and returns the created `CourseGet` with its\ngenerated id. `teacherId` is the main (primary responsible) teacher; `additionalTeacherIds` assigns\nfurther teachers to the course (the main teacher need not be repeated). The price is captured from\nthe price table at creation time and stored on the course, so later price-table changes do not\naffect it. Returns `400` with validation details if the body is invalid (e.g. duplicate additional\nteacher ids, or the main teacher repeated among the additional teachers).",
        "operationId": "CreateCourseOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CoursePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/courses/{id}": {
      "get": {
        "tags": [
          "Course (Office)"
        ],
        "summary": "Get a single course by id.",
        "description": "Returns a single course by its id as a `CourseGet`, including its schedule, assigned teacher and\nroom, enrolled students, required materials and enrollment requests. Returns `404` if no course\nwith that id exists.",
        "operationId": "GetCourseOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Course (Office)"
        ],
        "summary": "Partially update a course (the price is VERSIONED, and FROZEN once billed).",
        "description": "Partially updates an existing course: only the fields present in the `CoursePatch` body are changed,\nthe rest stay as they are. Returns the updated `CourseGet`. `teacherId` changes the MAIN teacher;\n`additionalTeacherIdsToAdd`/`additionalTeacherIdsToRemove` manage the additional teachers.\nRemoving a teacher (or replacing the main teacher) is rejected with `400` if that teacher is still\nassigned to any lesson of this course — reassign those lessons first.\n\n**`price` is versioned.** A change opens a new validity period from `effectiveFrom`, which defaults to\nTOMORROW — so the course read back today still reports the OLD price, and lessons before that day keep\nthe amount they were billed at. `effectiveFrom` may not fall into a past month, and a stichtag of today\nor earlier is RETROACTIVE and needs `confirmRetroactive: true`; both are `400`.\n\n**`price` is FROZEN once the course has been billed** — that is, once an invoice item exists for any of\nits lessons (`isPriceLocked` on `CourseGet` reports this). The invoice item stores the amount it was\ncharged with, so re-pricing the course would make a recalculation disagree with what was invoiced:\nsuch a change is refused with `409`. A patch carrying the UNCHANGED price still succeeds, and every\nother field of a billed course stays editable.\n\nReturns `404` if the course does not exist, `400` on validation errors and `409` when the price is\nfrozen.",
        "operationId": "UpdateCourseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CoursePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Course (Office)"
        ],
        "summary": "Delete a course (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a course. By default this is a soft delete — the course is hidden from normal listings but\ncan be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the course\ndoes not exist.",
        "operationId": "DeleteCourseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/courses/{id}/price-history": {
      "get": {
        "tags": [
          "Course (Office)"
        ],
        "summary": "Preisverlauf of a course's price per lesson — the amounts billing charged.",
        "description": "Returns the validity periods of THIS course's price per lesson as `PriceVersionGet` entries, newest\nfirst: what the amount was, from which day (`validFrom`, inclusive) until which day (`validUntil`,\nEXCLUSIVE — null means still in force), who changed it and why.\n\n**This is the price invoices are built from.** A billable position (one student at one lesson) is\ncharged the amount that was valid on the DAY of that lesson, so this history is the audit trail behind\nevery invoice line. The first period starts at the earlier of the course's start date and its creation\nday, so every lesson of the course is covered.\n\nExactly one entry has `isCurrent=true`; `isScheduled=true` marks a change announced for a future day.\nFilter with `onDay` (at most one entry — \"what did this course cost on that day\") and `validFromMin`;\n`searchTerm`/`showRemoved` are ignored. Supports the usual `Range`/`orderBy`/`desc` pagination\n(`206` + `Content-Range`, `416` on a bad range). Returns `404` if no course with that id exists.",
        "operationId": "GetCoursePriceHistoryForCourseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ValidFromMin",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "OnDay",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PriceVersionGet"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PriceVersionGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/office/courses/{id}/restore": {
      "post": {
        "tags": [
          "Course (Office)"
        ],
        "summary": "Restore a soft-deleted course.",
        "description": "Restores a previously soft-deleted course so it appears in normal listings again. Returns `204`,\nor `404` if no such course exists.",
        "operationId": "RestoreCourseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/course-prices": {
      "get": {
        "tags": [
          "CoursePrice (Office)"
        ],
        "summary": "List course prices (office).",
        "description": "Returns all course-price entries (office view — not row-restricted), each as a `CoursePriceGet`.\nThese make up the pricing matrix: a price per lesson keyed by teaching level, course type and\nwhether the course is for children. Rows can be standard level rows or custom product rows (with\ntheir own product name). New courses copy their price from this matrix at creation time. Soft-deleted\nentries are excluded unless you pass `showRemoved=true`. Filter with `searchTerm` (matches the\ndescription) and by `levelId`, `courseTypeId`, `isForChildren` and a `priceMin`/`priceMax` range;\nthe enum ids come from the matching `/lookups/...` endpoints.\n\nPrices are VERSIONED. Each row reports the amount valid TODAY together with `effectiveFrom` (the day\nthat amount started to apply) and, when a change is already announced, `pendingChangeFrom` and\n`pendingChangeAmount`. Pass **`asOf=YYYY-MM-DD`** to see the matrix as it was — or, with a future day,\nas it WILL be: only cells that had a price on that day are returned, each reporting the amount that\napplied then. Because a cell removed since then still had a price on a past day, `asOf` includes\nsoft-deleted cells regardless of `showRemoved`, and `priceMin`/`priceMax` then apply to that day's\namount. `asOf` is honoured here only; reading a single row by id always reports today.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetCoursePricesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "LevelId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CourseTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "IsForChildren",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "PriceMin",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "PriceMax",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "AsOf",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CoursePriceGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CoursePriceGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "CoursePrice (Office)"
        ],
        "summary": "Create a course price.",
        "description": "Creates a new course-price entry from the `CoursePricePost` body and returns the created\n`CoursePriceGet` with its generated id. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateCoursePriceOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CoursePricePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoursePriceGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/course-prices/{id}": {
      "get": {
        "tags": [
          "CoursePrice (Office)"
        ],
        "summary": "Get a single course price by id.",
        "description": "Returns a single course-price entry by its id as a `CoursePriceGet`. Returns `404` if no entry with\nthat id exists.",
        "operationId": "GetCoursePriceOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoursePriceGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "CoursePrice (Office)"
        ],
        "summary": "Partially update a course price (a price change is VERSIONED — see effectiveFrom).",
        "description": "Partially updates an existing course-price entry: only the fields present in the `CoursePricePatch`\nbody are changed, the rest stay as they are. Existing courses keep the price they were created with.\n\n**A change to `price` does not overwrite the amount — it opens a new validity period.**\n`effectiveFrom` says from which day the new amount applies and defaults to **TOMORROW**, so the row\nread back today still reports the OLD amount, with `pendingChangeFrom`/`pendingChangeAmount` naming\nthe announced change. Use `GET {id}/history` for the full Preisverlauf.\n\nTwo rules constrain the stichtag, both `400` when broken:\n* it may not fall into a PAST MONTH (that is what the month-end close freezes);\n* if it is today or earlier it is RETROACTIVE — it restates amounts that were already used — and must\n  carry `confirmRetroactive: true`. Enforced here, not only in the UI, so the confirmation cannot be\n  bypassed by calling this endpoint directly. `changeReason` is stored on the period.\n\nReturns the updated `CoursePriceGet`. Returns `404` if the entry does not exist and `400` on\nvalidation errors.",
        "operationId": "UpdateCoursePriceOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CoursePricePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoursePriceGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "CoursePrice (Office)"
        ],
        "summary": "Delete a course price (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a course-price entry. By default this is a soft delete — the entry is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404`\nif the entry does not exist.",
        "operationId": "DeleteCoursePriceOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/course-prices/{id}/history": {
      "get": {
        "tags": [
          "CoursePrice (Office)"
        ],
        "summary": "Preisverlauf: the validity periods of one price-matrix cell.",
        "description": "Returns the price history of a single matrix cell as `PriceVersionGet` entries, newest first: what the\namount was, from which day (`validFrom`, inclusive) until which day (`validUntil`, EXCLUSIVE — null\nmeans still in force), who changed it and the note they gave.\n\nA price change never overwrites the amount, it opens a new period, so this is the audit trail behind\nevery billed lesson. Exactly one entry has `isCurrent=true`; entries with `isScheduled=true` are\nannounced changes that have not started yet. Soft-deleted cells still report their history — that is\nthe point of keeping it.\n\nFilter with `onDay` (returns only the period in force on that day, so at most one entry) and\n`validFromMin`. `searchTerm` and `showRemoved` are not supported and are ignored: a period carries no\ntext, and periods are never soft-deleted — a correction is a new period.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.\n\nReturns `404` if no cell with that id exists.",
        "operationId": "GetCoursePriceHistoryOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ValidFromMin",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "OnDay",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PriceVersionGet"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PriceVersionGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/office/course-prices/{id}/restore": {
      "post": {
        "tags": [
          "CoursePrice (Office)"
        ],
        "summary": "Restore a soft-deleted course price.",
        "description": "Restores a previously soft-deleted course-price entry so it appears in normal listings again.\nReturns `204`, or `404` if no such entry exists.",
        "operationId": "RestoreCoursePriceOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/price-keys/activate-due": {
      "post": {
        "tags": [
          "PriceKeys (Office)"
        ],
        "summary": "Bring price changes announced for today into force.",
        "description": "Recomputes the CURRENT amount of every course price, salary rate and course from its validity periods,\nso a change announced for a future day becomes the current one once that day arrives. Returns how many\nrows each part touched.\n\n**This changes no money.** Every calculation resolves its amount from the validity periods by the day\nthe thing was used, and the read paths re-derive the displayed amount as well — the denormalised column\nthis refreshes exists only so the list filters and `orderBy` keep working. A run that is late or missed\ntherefore leaves nothing wrong.\n\nIt runs automatically shortly after midnight inside the API process. This endpoint exists because that\nprocess is not reachable from a test (and because \"wait until tomorrow\" is a poor way to check a price\nlist). It is CONVERGENT — it recomputes rather than steps forward — so calling it repeatedly, at any\ntime, is safe and the second call reports zero.\n\nIt also normalises what the best-effort delete hooks may have missed: a REMOVED matrix cell must not\nkeep an open period, or an `asOf` view of a later day would report a price the cell no longer had.\nCourses are deliberately left alone there — a removed course still has lessons that were held.\n\nRequires the `office` role; `401` when unauthenticated, `403` for any other portal role.",
        "operationId": "ActivateDuePriceVersionsOffice",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PriceActivationResult"
                }
              }
            }
          }
        }
      }
    },
    "/office/orders": {
      "get": {
        "tags": [
          "Order (Office)"
        ],
        "summary": "List orders (office).",
        "description": "Returns all material orders in the system (office view — not row-restricted), each as an `OrderGet`\nwith the ordering student and their customer, the current status, whether it has been paid (`isPaid`),\nthe ordered material items and computed totals (item count and total cost).\nSoft-deleted orders are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches student name, customer name and comment), `statusId` (resolvable via the order-status\nlookup), `studentId`, `customerId`, `isPaid`, and a `createdDateFrom`/`createdDateTo` date range.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetOrdersOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StudentId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CustomerDisplayFilter",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "IsPaid",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CreatedDateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "CreatedDateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "ItemStatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "DeliveryMethodId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "BilledSeparately",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrderGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrderGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Order (Office)"
        ],
        "summary": "Create an order.",
        "description": "Creates a new material order from the `OrderPost` body (the ordering student and the list of material\nitems) and returns the created `OrderGet` with its generated id and computed totals.\nReturns `400` with validation details if the body is invalid.",
        "operationId": "CreateOrderOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/orders/{id}": {
      "get": {
        "tags": [
          "Order (Office)"
        ],
        "summary": "Get a single order by id.",
        "description": "Returns a single order by its id as an `OrderGet`, including its material items and computed totals.\nReturns `404` if no order with that id exists.",
        "operationId": "GetOrderOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Order (Office)"
        ],
        "summary": "Partially update an order.",
        "description": "Partially updates an existing order: only the fields present in the `OrderPatch` body are changed,\nthe rest stay as they are (for example to update the status, payment flag or comment). Returns the\nupdated `OrderGet`. `404` if no such order exists; `400` on validation errors.",
        "operationId": "UpdateOrderOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Order (Office)"
        ],
        "summary": "Delete an order (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes an order. By default this is a soft delete — the order is hidden from normal listings but can\nbe restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if it does not exist.",
        "operationId": "DeleteOrderOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/orders/{id}/restore": {
      "post": {
        "tags": [
          "Order (Office)"
        ],
        "summary": "Restore a soft-deleted order.",
        "description": "Restores a previously soft-deleted order so it appears in normal listings again. Returns `204`,\nor `404` if no such order exists.",
        "operationId": "RestoreOrderOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/packages": {
      "get": {
        "tags": [
          "Package (Office)"
        ],
        "summary": "List packages (office).",
        "description": "Returns all sellable packages (office view — not row-restricted), each as a `PackageGet` with its\ntitle, billing title, description, sales price and the credit amount (in CHF) it grants for billing.\nSoft-deleted packages are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches title, billing title and description) and the `minPrice`/`maxPrice` and `minCredit`/`maxCredit`\nrange parameters.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetPackagesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "MinPrice",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxPrice",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MinCredit",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxCredit",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PackageGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PackageGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Package (Office)"
        ],
        "summary": "Create a package.",
        "description": "Creates a new package from the `PackagePost` body and returns the created `PackageGet` with its\ngenerated id. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreatePackageOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackagePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackageGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/packages/{id}": {
      "get": {
        "tags": [
          "Package (Office)"
        ],
        "summary": "Get a single package by id.",
        "description": "Returns a single package by its id as a `PackageGet`. Returns `404` if no package with that id exists.",
        "operationId": "GetPackageOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackageGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Package (Office)"
        ],
        "summary": "Partially update a package.",
        "description": "Partially updates an existing package: only the fields present in the `PackagePatch` body are changed,\nthe rest stay as they are. Returns the updated `PackageGet`. `404` if it does not exist; `400` on\nvalidation errors.",
        "operationId": "UpdatePackageOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackagePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackageGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Package (Office)"
        ],
        "summary": "Delete a package (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a package. By default this is a soft delete — the package is hidden from normal listings but\ncan be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if it does not exist.",
        "operationId": "DeletePackageOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/packages/{id}/restore": {
      "post": {
        "tags": [
          "Package (Office)"
        ],
        "summary": "Restore a soft-deleted package.",
        "description": "Restores a previously soft-deleted package so it appears in normal listings again. Returns `204`,\nor `404` if no such package exists.",
        "operationId": "RestorePackageOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/package-orders": {
      "get": {
        "tags": [
          "PackageOrder (Office)"
        ],
        "summary": "List package orders (office).",
        "description": "Returns all package purchases in the system (office view — not row-restricted), each as a\n`PackageOrderGet`: the purchasing customer, the purchased package, current status, any refund\ndetails, the pass-on assignment (personal / passed on to another customer / received), per-student\ncredit usage and the resulting used and remaining credit.\nSoft-deleted package orders are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches customer name and package title), `statusId`, `packageId`, `customerId`, and the\n`minUsedCredit`/`maxUsedCredit` range.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetPackageOrdersOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "PackageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "MinUsedCredit",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxUsedCredit",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PackageOrderGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PackageOrderGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/office/package-orders/{id}": {
      "get": {
        "tags": [
          "PackageOrder (Office)"
        ],
        "summary": "Get a single package order by id.",
        "description": "Returns a single package order by its id as a `PackageOrderGet`, including its credit usage breakdown\nand remaining credit. Returns `404` if no package order with that id exists.",
        "operationId": "GetPackageOrderOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackageOrderGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "PackageOrder (Office)"
        ],
        "summary": "Partially update a package order.",
        "description": "Partially updates an existing package order: only the fields present in the `PackageOrderPatch` body\nare changed, the rest stay as they are (for example to change the status or record a refund). Returns\nthe updated `PackageOrderGet`. `404` if it does not exist; `400` on validation errors.\n\n`paidAt` is the day the payment arrived, and it decides what this package pays for: it covers\nlessons FROM that day on, nothing before it. Settable and correctable, because a payment arrives on\none day and is booked on another — the days in between would otherwise lose their coverage. Setting\nthe status to Paid WITHOUT a date stamps today. A date in the future is rejected with `400`.\n\nThe BENEFICIARY has two shapes and only ever one at a time. `assignedToCustomerEmail` is the address\nwhile no customer has been resolved for it; saving one that DOES belong to a customer assigns the\norder to them (`assignedToCustomerId`) and clears the address, which is what makes the package\nvisible in that customer's portal. `removeAssignedToCustomerId` undoes the assignment (the address\nis not restored — it was consumed when the assignment was resolved), `removeAssignedToCustomerEmail`\nclears a pending address. The assignment type (`passedOnType`) is DERIVED from the result on every\nwrite, so a value sent for it is overwritten unless it agrees. Assigning the order to the BUYING\ncustomer's own address is rejected with `400`.",
        "operationId": "UpdatePackageOrderOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackageOrderPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackageOrderGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "PackageOrder (Office)"
        ],
        "summary": "Delete a package order (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a package order. By default this is a soft delete — the package order is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404`\nif it does not exist.",
        "operationId": "DeletePackageOrderOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/package-orders/{id}/restore": {
      "post": {
        "tags": [
          "PackageOrder (Office)"
        ],
        "summary": "Restore a soft-deleted package order.",
        "description": "Restores a previously soft-deleted package order so it appears in normal listings again. Returns\n`204`, or `404` if no such package order exists.",
        "operationId": "RestorePackageOrderOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/package-purchases": {
      "get": {
        "tags": [
          "PackagePurchase (Office)"
        ],
        "summary": "List package purchases (office).",
        "description": "Returns the package purchases in the system (office view — not row-restricted), each as a\n`PackagePurchaseGet`: the buying customer, when it was purchased, where it stands in the\nprepayment / invoicing lifecycle, and the member package orders (the line items bought together\nin one checkout) with computed item count and total price. Because packages are prepaid, one\npurchase corresponds to exactly one invoice. Purchases with no remaining orders (all removed) are\nnever listed. Soft-deleted purchases are excluded unless you pass `showRemoved=true`. Filter with\n`searchTerm` (matches the buying customer name), `statusId` (resolvable via\n`/lookups/package-purchase-status`), `customerId`, `packageId` (purchases containing an order for\nthat package) and a `purchasedFrom`/`purchasedTo` date range (ISO-8601; matches on the purchase date).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetPackagePurchasesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "PackageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "PurchasedFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "PurchasedTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PackagePurchaseGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PackagePurchaseGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "PackagePurchase (Office)"
        ],
        "summary": "Create a package purchase on behalf of a customer (checkout of one or more packages).",
        "description": "Creates a package purchase for the customer named in the `PackagePurchasePost` body from its list\nof items (one per package, each optionally assigned to a beneficiary by email). All package orders\nare created atomically under the new purchase header, which starts in the `Draft` status; the\nprepayment invoice is raised out of band. Returns the created `PackagePurchaseGet` with its\ngenerated id and member orders. Returns `400` with validation details if the body is invalid.\n\nAn item's `beneficiaryCustomerEmail` is RESOLVED at checkout: if the address belongs to a customer,\nthe order is assigned to them (`assignedToCustomerId`, which is what makes the package visible in\nthat customer's portal) and the address is cleared; if it belongs to nobody, it is kept as a\npending note and completed later, when a customer is created with — or renamed to — that address.\nThe assignment type (`passedOnType`) is DERIVED from the result and needs not be sent.\nAssigning an item to the BUYING customer's own address is rejected with `400`.",
        "operationId": "CreatePackagePurchaseOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackagePurchasePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackagePurchaseGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/package-purchases/{id}": {
      "get": {
        "tags": [
          "PackagePurchase (Office)"
        ],
        "summary": "Get a single package purchase by id.",
        "description": "Returns a single package purchase by its id as a `PackagePurchaseGet`, including its member\npackage orders. Returns `404` if no purchase with that id exists.",
        "operationId": "GetPackagePurchaseOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackagePurchaseGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "PackagePurchase (Office)"
        ],
        "summary": "Update a package purchase (set its lifecycle status).",
        "description": "Partially updates a package purchase. Currently the editable field is the lifecycle status\n(`statusId`, resolvable via `/lookups/package-purchase-status`): Draft → Invoiced → Paid →\nCancelled. Only the fields present in the `PackagePurchasePatch` body are changed. Returns the\nupdated `PackagePurchaseGet`. `404` if no such purchase exists; `400` on validation errors.",
        "operationId": "UpdatePackagePurchaseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackagePurchasePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PackagePurchaseGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "PackagePurchase (Office)"
        ],
        "summary": "Delete a package purchase (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a package purchase. By default this is a soft delete — the purchase is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently (only possible once its\nmember package orders have been removed). Returns `204`, or `404` if it does not exist.",
        "operationId": "DeletePackagePurchaseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/package-purchases/{id}/restore": {
      "post": {
        "tags": [
          "PackagePurchase (Office)"
        ],
        "summary": "Restore a soft-deleted package purchase.",
        "description": "Restores a previously soft-deleted package purchase so it appears in normal listings again. Returns\n`204`, or `404` if no such purchase exists.",
        "operationId": "RestorePackagePurchaseOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/students": {
      "get": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "List students (office).",
        "description": "Returns all students (office view â€” not row-restricted), each as a `StudentGet` with the customer they\nbelong to, personal and contact details, address, lifecycle status, the subjects (languages and\nlevels) they learn, their enrolled courses, attended lessons, received materials, office notes, exam\nrecords and computed values such as age and whether they are a child.\nSoft-deleted students are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches first name, last name and email), `customerId`, `nativeLanguageId`, `subjectLanguageId`,\n`isChild`, and `status` (Active / Inactive / Invited).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetStudentsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "NativeLanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "IsChild",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "SubjectLanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfEStudentStatus"
            }
          },
          {
            "name": "AccountStatus",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfEAccountStatus"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "Create a student.",
        "description": "Creates a new student from the `StudentPost` body (including the owning customer and the subjects to\nlearn) and returns the created `StudentGet` with its generated id. Returns `400` with validation\ndetails if the body is invalid.",
        "operationId": "CreateStudentOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudentPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/students/{id}": {
      "get": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "Get a single student by id.",
        "description": "Returns a single student by its id as a `StudentGet`, including subjects, courses, notes and exam\nrecords. Returns `404` if no student with that id exists.",
        "operationId": "GetStudentOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "Partially update a student.",
        "description": "Partially updates an existing student: only the fields present in the `StudentPatch` body are changed,\nthe rest stay as they are. Returns the updated `StudentGet`. `404` if it does not exist; `400` on\nvalidation errors.",
        "operationId": "UpdateStudentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudentPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "Delete a student (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a student. By default this is a soft delete â€” the student is hidden from normal listings but\ncan be restored; pass `?hard=true` to remove them permanently. Returns `204`, or `404` if they do\nnot exist.",
        "operationId": "DeleteStudentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/students/{id}/resend-invitation": {
      "post": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "Re-send the student's password-setup mail.",
        "description": "Triggers the onboarding (\"magic link\") mail again for a student who has not completed sign-up, and\nrepairs a provisioning run that did not finish â€” a missing login account or a missing realm role is\ncreated on the way, which is how a student whose `accountStatus` reads `Failed` is fixed. The mail\nis rendered in the student's correspondence language.\n\nReturns `204` on success. `404` if no such student exists, `400` if the student has no email\naddress (children often have none), `409` if the account already completed onboarding (a forgotten\npassword is reset by the user through the sign-in page, not from here) or if the email belongs to a\nlogin of the other portal, and `503` when no identity provider is configured for this environment.",
        "operationId": "ResendStudentInvitationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/students/{id}/set-password": {
      "post": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "Set a one-time password for the student's login.",
        "description": "Sets a one-time password on the student's login account and forces them to choose their own at the\nnext sign-in. This is the way IN for a student who has **no email address** — no magic link can\nreach them, so they sign in with their `loginNumber` and the password set here — and it is the\npassword RESET for any student, since the identity provider's self-service reset needs a mailbox.\n\nType the password and pass it on to the student directly; nothing is mailed. Works for every\nstudent, not only the ones without an address.\n\nReturns `204` on success. `400` if the password is missing or shorter than 8 characters (the\nrealm's own policy applies on top), `404` if no such student exists, `409` if the student has no\nlogin account yet, and `502` if the identity provider could not be reached.",
        "operationId": "SetStudentPasswordOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetPasswordPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "502": {
            "description": "Bad Gateway",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/students/{id}/restore": {
      "post": {
        "tags": [
          "Student (Office)"
        ],
        "summary": "Restore a soft-deleted student.",
        "description": "Restores a previously soft-deleted student so they appear in normal listings again. Returns `204`,\nor `404` if no such student exists.",
        "operationId": "RestoreStudentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/interests": {
      "get": {
        "tags": [
          "Interest (Office)"
        ],
        "summary": "List interests (office).",
        "description": "Returns all interests in the system (office view — not row-restricted), each as an `InterestGet`.\nAn interest is a learning request raised by a customer for one or more students: the desired\nlanguage, teaching level and interest type, the requested time period and lesson frequency, the\nstudent's weekly availability slots, an optional preferred location, an estimated price and the\nteacher applications received for it. Soft-deleted interests are excluded unless you pass\n`showRemoved=true`. Filter with `searchTerm` (matches student, language and level) and by\n`languageId`, `levelId`, `interestTypeId`, `statusId`, `studentId`, and a `dateFrom`/`dateTo`\nrange (interests whose period overlaps it); the enum ids come from the matching `/lookups/...`\nendpoints.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetInterestsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "LanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "LevelId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "InterestTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StudentId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "DateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "DateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InterestGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InterestGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Interest (Office)"
        ],
        "summary": "Create an interest.",
        "description": "Creates a new interest from the `InterestPost` body (requesting customer and students, language,\nlevel, interest type, period, frequency and availability) and returns the created `InterestGet`\nwith its generated id. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateInterestOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InterestPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterestGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/interests/{id}": {
      "get": {
        "tags": [
          "Interest (Office)"
        ],
        "summary": "Get a single interest by id.",
        "description": "Returns a single interest by its id as an `InterestGet`, including its availability time slots and\nthe teacher applications received for it. Returns `404` if no interest with that id exists.",
        "operationId": "GetInterestOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterestGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Interest (Office)"
        ],
        "summary": "Partially update an interest.",
        "description": "Partially updates an existing interest: only the fields present in the `InterestPatch` body are\nchanged, the rest stay as they are (this is also how the office records a decline, with status and\ndecline reason). Returns the updated `InterestGet`. Returns `404` if the interest does not exist\nand `400` on validation errors.",
        "operationId": "UpdateInterestOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InterestPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterestGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Interest (Office)"
        ],
        "summary": "Delete an interest (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes an interest. By default this is a soft delete — the interest is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the\ninterest does not exist.",
        "operationId": "DeleteInterestOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/interests/{id}/restore": {
      "post": {
        "tags": [
          "Interest (Office)"
        ],
        "summary": "Restore a soft-deleted interest.",
        "description": "Restores a previously soft-deleted interest so it appears in normal listings again. Returns `204`,\nor `404` if no such interest exists.",
        "operationId": "RestoreInterestOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/matching-interests": {
      "get": {
        "tags": [
          "MatchingInterest (Office)"
        ],
        "summary": "List matching interests (office).",
        "description": "Returns open interests matched against a teacher's qualifications, each as an `InterestGet` — the\ncandidate assignments a teacher could apply for. This view is teacher-driven: pass a `teacherId` to\nget the interests matching that teacher (without it the office route has no teacher to match against\nand returns no results). Soft-deleted interests are excluded unless you pass `showRemoved=true`.\nFilter further with `searchTerm` (matches student, language and level) and by `languageId`,\n`levelId` and `interestTypeId`, resolvable via the matching `/lookups/...` endpoints.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetMatchingInterestsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "LanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "LevelId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "InterestTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "TeacherId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InterestGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InterestGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "MatchingInterest (Office)"
        ],
        "summary": "Create a matching interest.",
        "description": "Creates a new interest from the `InterestPost` body and returns the created `InterestGet` with its\ngenerated id. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateMatchingInterestOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InterestPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterestGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/matching-interests/{id}": {
      "get": {
        "tags": [
          "MatchingInterest (Office)"
        ],
        "summary": "Get a single matching interest by id.",
        "description": "Returns a single matching interest by its id as an `InterestGet`, including its availability time\nslots and teacher applications. Returns `404` if no interest with that id exists.",
        "operationId": "GetMatchingInterestOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterestGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "MatchingInterest (Office)"
        ],
        "summary": "Partially update a matching interest.",
        "description": "Partially updates an existing interest: only the fields present in the `InterestPatch` body are\nchanged, the rest stay as they are. Returns the updated `InterestGet`. Returns `404` if the interest\ndoes not exist and `400` on validation errors.",
        "operationId": "UpdateMatchingInterestOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InterestPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterestGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "MatchingInterest (Office)"
        ],
        "summary": "Delete a matching interest (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes an interest. By default this is a soft delete — the interest is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the\ninterest does not exist.",
        "operationId": "DeleteMatchingInterestOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/matching-interests/{id}/restore": {
      "post": {
        "tags": [
          "MatchingInterest (Office)"
        ],
        "summary": "Restore a soft-deleted matching interest.",
        "description": "Restores a previously soft-deleted interest so it appears in normal listings again. Returns `204`,\nor `404` if no such interest exists.",
        "operationId": "RestoreMatchingInterestOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/enrollment-requests": {
      "get": {
        "tags": [
          "EnrollmentRequest (Office)"
        ],
        "summary": "List course enrollment requests (office).",
        "description": "Returns all customer-submitted course enrollment requests (office view — not row-restricted), each a\n`CourseEnrollmentRequestGet` with its status (Requested, Accepted, Declined, Withdrawn), request\ndate, the requesting customer, the requested students, any notes and decline reason, and the parent\ncourse. This is the office review queue: filter to `statusId` = Requested to see what awaits a\ndecision. Soft-deleted requests are excluded unless you pass `showRemoved=true`. Filter with\n`searchTerm` (matches notes and the requester name), `courseId`, `requestingCustomerId` and\n`statusId` (resolvable via `/lookups/course-enrollment-status`).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50, `-50`\n= last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name of the\nreturned object, case-insensitive) and `desc` query parameters. The body is a plain JSON array; the\ntotal count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`). Status\nis `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetEnrollmentRequestsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "RequestingCustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CourseEnrollmentRequestGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CourseEnrollmentRequestGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/office/enrollment-requests/{id}": {
      "get": {
        "tags": [
          "EnrollmentRequest (Office)"
        ],
        "summary": "Get a single course enrollment request by id (office).",
        "description": "Returns a single course enrollment request by its id as a `CourseEnrollmentRequestGet`, including the\nrequesting customer, the requested students and the parent course. Returns `404` if no request with\nthat id exists.",
        "operationId": "GetEnrollmentRequestOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseEnrollmentRequestGet2"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "EnrollmentRequest (Office)"
        ],
        "summary": "Accept or decline an enrollment request (office decision).",
        "description": "Records the office decision on a pending request via the `CourseEnrollmentRequestPatch` body: set\n`statusId` to the Accepted or Declined option (from `/lookups/course-enrollment-status`), and — when\ndeclining — a `declineReason`. Only the fields present are changed. Returns the updated\n`CourseEnrollmentRequestGet`; `404` if the request does not exist; `400` on validation errors.\n\nNOTE: accepting only sets the status. Issuing the resulting student invitations (email) and the\nsubsequent enrollment are a separate, later step — not performed here.",
        "operationId": "UpdateEnrollmentRequestOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CourseEnrollmentRequestPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CourseEnrollmentRequestGet2"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/customers": {
      "get": {
        "tags": [
          "Customer (Office)"
        ],
        "summary": "List customers (office).",
        "description": "Returns all customers in the system (office view â€” not row-restricted), each as a `CustomerGet`.\nA customer is a paying party â€” a company or a private person â€” with contact information, billing\naddress, active status and the students that belong to them. Soft-deleted customers are excluded\nunless you pass `showRemoved=true`. Filter with `searchTerm` (matches company name, contact first/\nlast name, email and phone) and by `customerTypeId`, `isActive`, and `city`/`postalCode`/`country`\nof the billing address.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetCustomersOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CustomerTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "IsActive",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "City",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "PostalCode",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Country",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "AccountStatus",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfEAccountStatus"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Customer (Office)"
        ],
        "summary": "Create a customer.",
        "description": "Creates a new customer from the `CustomerPost` body (company or private person, with contact and\nbilling details) and returns the created `CustomerGet` with its generated id. Returns `400` with\nvalidation details if the body is invalid.",
        "operationId": "CreateCustomerOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/customers/{id}": {
      "get": {
        "tags": [
          "Customer (Office)"
        ],
        "summary": "Get a single customer by id.",
        "description": "Returns a single customer by its id as a `CustomerGet`, including contact info, billing address and\nthe customer's students. Returns `404` if no customer with that id exists.",
        "operationId": "GetCustomerOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Customer (Office)"
        ],
        "summary": "Partially update a customer.",
        "description": "Partially updates an existing customer: only the fields present in the `CustomerPatch` body are\nchanged, the rest stay as they are. Returns the updated `CustomerGet`. Returns `404` if the customer\ndoes not exist and `400` on validation errors.",
        "operationId": "UpdateCustomerOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Customer (Office)"
        ],
        "summary": "Delete a customer (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a customer. By default this is a soft delete â€” the customer is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the\ncustomer does not exist.",
        "operationId": "DeleteCustomerOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/customers/{id}/resend-invitation": {
      "post": {
        "tags": [
          "Customer (Office)"
        ],
        "summary": "Re-send the customer's password-setup mail.",
        "description": "Triggers the onboarding (\"magic link\") mail again for a customer who has not completed sign-up, and\nrepairs a provisioning run that did not finish â€” a missing login account or a missing realm role is\ncreated on the way, which is how a customer whose `accountStatus` reads `Failed` is fixed. The mail\nis rendered in the customer's correspondence language.\n\nReturns `204` on success. `404` if no such customer exists, `400` if the contact has no email\naddress, `409` if the account already completed onboarding (a forgotten password is reset by the\nuser through the sign-in page, not from here) or if the email belongs to a login of the other\nportal, and `503` when no identity provider is configured for this environment.",
        "operationId": "ResendCustomerInvitationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/customers/{id}/restore": {
      "post": {
        "tags": [
          "Customer (Office)"
        ],
        "summary": "Restore a soft-deleted customer.",
        "description": "Restores a previously soft-deleted customer so it appears in normal listings again. Returns `204`,\nor `404` if no such customer exists.",
        "operationId": "RestoreCustomerOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/invoices": {
      "get": {
        "tags": [
          "Invoice (Office)"
        ],
        "summary": "List invoices (office).",
        "description": "Returns all invoices in the system (office view — not row-restricted), each as an `InvoiceGet`.\nAn invoice bills a customer for courses and lessons: it carries a title, invoice number, invoice and\ndue dates, status, line items and a computed total amount. By default results are ordered with the\nactionable statuses first (Draft, Overdue, Sent, then Paid, Cancelled) and newest invoice date\nfirst. Soft-deleted invoices are excluded unless you pass `showRemoved=true`. Filter with\n`searchTerm` (matches title, invoice number and customer name), by `statusId`, `customerId`,\n`invoiceNumberPrefix`, by the billing period via `periodYear` and/or `periodMonth` (each applied\nindependently — e.g. all invoices of a year, or of a given month), and by invoice-date, due-date\nand total-amount ranges; `statusId` values come from the matching `/lookups/...` endpoint.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetInvoicesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "InvoiceNumberPrefix",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "InvoiceDateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "InvoiceDateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "DueDateFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "DueDateTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "PeriodYear",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PeriodMonth",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "MinTotalAmount",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxTotalAmount",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InvoiceGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InvoiceGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Invoice (Office)"
        ],
        "summary": "Create an invoice.",
        "description": "Creates a new invoice from the `InvoicePost` body (the billed customer, dates, the billing period\nas `periodYear` + `periodMonth`, and line items) and returns the created `InvoiceGet` with its\ngenerated id and computed total. The billing period (which month/year is billed, distinct from the\ninvoice date) is required: `periodYear` 2000–2100 and `periodMonth` 1–12. Returns `400` with\nvalidation details if the body is invalid.",
        "operationId": "CreateInvoiceOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoicePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/invoices/{id}": {
      "get": {
        "tags": [
          "Invoice (Office)"
        ],
        "summary": "Get a single invoice by id.",
        "description": "Returns a single invoice by its id as an `InvoiceGet`, including its line items and computed total\namount. Returns `404` if no invoice with that id exists.",
        "operationId": "GetInvoiceOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Invoice (Office)"
        ],
        "summary": "Partially update an invoice.",
        "description": "Partially updates an existing invoice: only the fields present in the `InvoicePatch` body are\nchanged, the rest stay as they are (e.g. moving the status to Sent or Paid). Returns the updated\n`InvoiceGet`. Returns `404` if the invoice does not exist and `400` on validation errors.",
        "operationId": "UpdateInvoiceOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvoicePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvoiceGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Invoice (Office)"
        ],
        "summary": "Delete an invoice (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes an invoice. By default this is a soft delete — the invoice is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the\ninvoice does not exist.",
        "operationId": "DeleteInvoiceOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/invoices/{id}/restore": {
      "post": {
        "tags": [
          "Invoice (Office)"
        ],
        "summary": "Restore a soft-deleted invoice.",
        "description": "Restores a previously soft-deleted invoice so it appears in normal listings again. Returns `204`,\nor `404` if no such invoice exists.",
        "operationId": "RestoreInvoiceOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/budgets": {
      "get": {
        "tags": [
          "Budget (Office)"
        ],
        "summary": "List budgets (office).",
        "description": "Returns all budgets in the system (office view — not row-restricted), each as a `BudgetGet`.\nA budget is a sponsorship allocation a sponsor customer (typically a company) sets up for a\nbeneficiary customer; it tracks the total allocated amount together with the consumed, invoiced\nand remaining amounts and the consumption line items (lessons and materials) booked against it.\nSoft-deleted budgets are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches the description and the sponsor/beneficiary names), by `sponsorCustomerId` or\n`beneficiaryCustomerId`, and by total/consumed amount ranges.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetBudgetsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "SponsorCustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "BeneficiaryCustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "MinTotalAmount",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxTotalAmount",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MinConsumedAmount",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxConsumedAmount",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BudgetGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BudgetGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Budget (Office)"
        ],
        "summary": "Create a budget.",
        "description": "Creates a new budget from the `BudgetPost` body (sponsor and beneficiary customers, total amount\nand any initial line items) and returns the created `BudgetGet` with its generated id. Returns\n`400` with validation details if the body is invalid.",
        "operationId": "CreateBudgetOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BudgetPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BudgetGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/budgets/{id}": {
      "get": {
        "tags": [
          "Budget (Office)"
        ],
        "summary": "Get a single budget by id.",
        "description": "Returns a single budget by its id as a `BudgetGet`, including its consumption line items and the\ncomputed remaining amount. Returns `404` if no budget with that id exists.",
        "operationId": "GetBudgetOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BudgetGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Budget (Office)"
        ],
        "summary": "Partially update a budget.",
        "description": "Partially updates an existing budget: only the fields present in the `BudgetPatch` body are changed,\nthe rest stay as they are. Returns the updated `BudgetGet`. Returns `404` if the budget does not\nexist and `400` on validation errors.",
        "operationId": "UpdateBudgetOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BudgetPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BudgetGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Budget (Office)"
        ],
        "summary": "Delete a budget (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a budget. By default this is a soft delete — the budget is hidden from normal listings but\ncan be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if the budget\ndoes not exist.",
        "operationId": "DeleteBudgetOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/budgets/{id}/restore": {
      "post": {
        "tags": [
          "Budget (Office)"
        ],
        "summary": "Restore a soft-deleted budget.",
        "description": "Restores a previously soft-deleted budget so it appears in normal listings again. Returns `204`,\nor `404` if no such budget exists.",
        "operationId": "RestoreBudgetOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/student-invites": {
      "get": {
        "tags": [
          "StudentInvite (Office)"
        ],
        "summary": "List student invites (office).",
        "description": "Returns all student invitations to join a course (office view — not row-restricted), each as a\n`StudentInviteGet` with the invited student, the target course and schedule, current status, when it\nwas sent and responded to, the accepted/declined timestamps, and the material-choice workflow\n(per-material confirmation, chosen delivery method and delivery address).\nSoft-deleted invites are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches student name and course name), `courseId`, `studentId` and `statusId`.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetStudentInvitesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StudentId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentInviteGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StudentInviteGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "StudentInvite (Office)"
        ],
        "summary": "Create a student invite.",
        "description": "Creates a new student invite from the `StudentInvitePost` body (the student and the course to invite\nthem to) and returns the created `StudentInviteGet` with its generated id. Returns `400` with\nvalidation details if the body is invalid.",
        "operationId": "CreateStudentInviteOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudentInvitePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentInviteGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/student-invites/{id}": {
      "get": {
        "tags": [
          "StudentInvite (Office)"
        ],
        "summary": "Get a single student invite by id.",
        "description": "Returns a single student invite by its id as a `StudentInviteGet`, including its material choices and\ndelivery details. Returns `404` if no student invite with that id exists.",
        "operationId": "GetStudentInviteOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentInviteGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "StudentInvite (Office)"
        ],
        "summary": "Partially update a student invite.",
        "description": "Partially updates an existing student invite: only the fields present in the `StudentInvitePatch` body\nare changed, the rest stay as they are (for example to change the status or the material/delivery\nchoices). Returns the updated `StudentInviteGet`. `404` if it does not exist; `400` on validation errors.",
        "operationId": "UpdateStudentInviteOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StudentInvitePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StudentInviteGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "StudentInvite (Office)"
        ],
        "summary": "Delete a student invite (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a student invite. By default this is a soft delete — the invite is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if it does\nnot exist.",
        "operationId": "DeleteStudentInviteOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/student-invites/{id}/restore": {
      "post": {
        "tags": [
          "StudentInvite (Office)"
        ],
        "summary": "Restore a soft-deleted student invite.",
        "description": "Restores a previously soft-deleted student invite so it appears in normal listings again. Returns\n`204`, or `404` if no such student invite exists.",
        "operationId": "RestoreStudentInviteOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-invites": {
      "get": {
        "tags": [
          "TeacherInvite (Office)"
        ],
        "summary": "List teacher invites (office).",
        "description": "Returns all teacher invitations to teach a course (office view — not row-restricted), each as a\n`TeacherInviteGet` with the invited teacher, the target course and schedule, current status, and when\nit was sent and responded to.\nBy default only pending invites are returned; set `showPendingOnly=false` to include all statuses, or\npass a specific `statusId` (which takes precedence). Soft-deleted invites are excluded unless you pass\n`showRemoved=true`. Filter also with `searchTerm` (matches teacher name and course name), `courseId`\nand `teacherId`.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetTeacherInvitesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CourseId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "TeacherId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "StatusId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "ShowPendingOnly",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherInviteGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherInviteGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "TeacherInvite (Office)"
        ],
        "summary": "Create a teacher invite.",
        "description": "Creates a new teacher invite from the `TeacherInvitePost` body (the teacher and the course to invite\nthem to) and returns the created `TeacherInviteGet` with its generated id. Returns `400` with\nvalidation details if the body is invalid.",
        "operationId": "CreateTeacherInviteOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherInvitePost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherInviteGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-invites/{id}": {
      "get": {
        "tags": [
          "TeacherInvite (Office)"
        ],
        "summary": "Get a single teacher invite by id.",
        "description": "Returns a single teacher invite by its id as a `TeacherInviteGet`. Returns `404` if no teacher invite\nwith that id exists.",
        "operationId": "GetTeacherInviteOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherInviteGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "TeacherInvite (Office)"
        ],
        "summary": "Partially update a teacher invite.",
        "description": "Partially updates an existing teacher invite: only the fields present in the `TeacherInvitePatch` body\nare changed, the rest stay as they are (for example to change the status). Returns the updated\n`TeacherInviteGet`. `404` if it does not exist; `400` on validation errors.",
        "operationId": "UpdateTeacherInviteOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherInvitePatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherInviteGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "TeacherInvite (Office)"
        ],
        "summary": "Delete a teacher invite (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a teacher invite. By default this is a soft delete — the invite is hidden from normal listings\nbut can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404` if it does\nnot exist.",
        "operationId": "DeleteTeacherInviteOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-invites/{id}/restore": {
      "post": {
        "tags": [
          "TeacherInvite (Office)"
        ],
        "summary": "Restore a soft-deleted teacher invite.",
        "description": "Restores a previously soft-deleted teacher invite so it appears in normal listings again. Returns\n`204`, or `404` if no such teacher invite exists.",
        "operationId": "RestoreTeacherInviteOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-salaries": {
      "get": {
        "tags": [
          "TeacherSalary (Office)"
        ],
        "summary": "List teacher salaries (office).",
        "description": "Returns the teacher salary-rate configuration (office view — not row-restricted), each row as a\n`TeacherSalaryGet`: the hourly rate that applies for a given teaching level and course type, whether\nit is for children courses, an optional description, and — for user-defined rows — a custom product\nname. These rates drive how teacher payments are calculated.\nSoft-deleted rates are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches the description), `levelId` and `courseTypeId` (resolvable via the corresponding lookups),\n`isForChildren`, and the `hourlyRateMin`/`hourlyRateMax` range.\n\nRates are VERSIONED, and a lesson's salary is computed with the rate that was valid on the DAY of that\nlesson — so re-reading a past month reports the same figures however often the matrix has changed\nsince. Each row reports the rate valid today plus `effectiveFrom` and, for an announced change,\n`pendingChangeFrom`/`pendingChangeAmount`. Pass `asOf=YYYY-MM-DD` to see the matrix as of another day\n(soft-deleted cells included, and the rate range then applies to that day's rate).\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetTeacherSalariesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "LevelId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CourseTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "IsForChildren",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "HourlyRateMin",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "HourlyRateMax",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "AsOf",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherSalaryGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherSalaryGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "TeacherSalary (Office)"
        ],
        "summary": "Create a teacher salary.",
        "description": "Creates a new teacher salary rate from the `TeacherSalaryPost` body (teaching level, course type,\nchildren flag and hourly rate) and returns the created `TeacherSalaryGet` with its generated id.\nReturns `400` with validation details if the body is invalid.",
        "operationId": "CreateTeacherSalaryOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherSalaryPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherSalaryGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-salaries/{id}": {
      "get": {
        "tags": [
          "TeacherSalary (Office)"
        ],
        "summary": "Get a single teacher salary by id.",
        "description": "Returns a single teacher salary rate by its id as a `TeacherSalaryGet`. Returns `404` if no teacher\nsalary with that id exists.",
        "operationId": "GetTeacherSalaryOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherSalaryGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "TeacherSalary (Office)"
        ],
        "summary": "Partially update a teacher salary (a rate change is VERSIONED — see effectiveFrom).",
        "description": "Partially updates an existing teacher salary rate: only the fields present in the `TeacherSalaryPatch`\nbody are changed, the rest stay as they are.\n\n**A change to `hourlyRate` does not overwrite the rate — it opens a new validity period.**\n`effectiveFrom` says from which day it applies and defaults to **TOMORROW**, so lessons already taught\nkeep the salary they were computed with. The same two rules apply as for course prices, both `400`\nwhen broken: no stichtag in a past month, and a stichtag of today or earlier needs\n`confirmRetroactive: true`. `changeReason` is stored on the period; `GET {id}/history` returns it.\n\nReturns the updated `TeacherSalaryGet`. `404` if it does not exist; `400` on validation errors.",
        "operationId": "UpdateTeacherSalaryOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherSalaryPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherSalaryGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "TeacherSalary (Office)"
        ],
        "summary": "Delete a teacher salary (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a teacher salary rate. By default this is a soft delete — the rate is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404`\nif it does not exist.",
        "operationId": "DeleteTeacherSalaryOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-salaries/{id}/history": {
      "get": {
        "tags": [
          "TeacherSalary (Office)"
        ],
        "summary": "Ansatz-Verlauf: the validity periods of one salary-matrix cell.",
        "description": "Returns the rate history of a single salary matrix cell as `PriceVersionGet` entries, newest first:\nwhat the rate was, from which day (`validFrom`, inclusive) until which day (`validUntil`, EXCLUSIVE —\nnull means still in force), who changed it and why.\n\nThis is the audit trail behind every lesson salary and therefore behind the payroll: a rate change\nopens a new period instead of overwriting, so recomputing a past month yields the same figures.\nExactly one entry has `isCurrent=true`; `isScheduled=true` marks an announced change. Filter with\n`onDay` (at most one entry) and `validFromMin`; `searchTerm`/`showRemoved` are ignored.\n\nSupports the usual `Range`/`orderBy`/`desc` pagination (`206` + `Content-Range`, `416` on a bad range).\nReturns `404` if no cell with that id exists.",
        "operationId": "GetTeacherSalaryHistoryOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ValidFromMin",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "OnDay",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PriceVersionGet"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PriceVersionGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/office/teacher-salaries/{id}/restore": {
      "post": {
        "tags": [
          "TeacherSalary (Office)"
        ],
        "summary": "Restore a soft-deleted teacher salary.",
        "description": "Restores a previously soft-deleted teacher salary rate so it appears in normal listings again. Returns\n`204`, or `404` if no such teacher salary exists.",
        "operationId": "RestoreTeacherSalaryOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-payments": {
      "get": {
        "tags": [
          "TeacherPayment (Office)"
        ],
        "summary": "List teacher payments (office).",
        "description": "Returns the monthly teacher compensation records (office view — not row-restricted), each as a\n`TeacherPaymentGet`: the teacher, the payment month, the number of lessons and their line items, base\npay, supplements (vacation), the social-insurance deductions (AHV, ALV, KTG, NBU) with rates and\namounts, gross/net/actual pay, the child entitlement (with its config baseline and any override), and\nthe system-raised warning flags (additional travel cost, pension, Quellensteuer).\nSoft-deleted payments are excluded unless you pass `showRemoved=true`. Filter with `teacherId`, a\n`paymentMonthFrom`/`paymentMonthTo` range, and the `minTotalLessons`/`maxTotalLessons` and\n`minActualPay`/`maxActualPay` ranges. `searchTerm` matches the teacher's name.\n\nA payment belongs to its teacher through a plain foreign key (`teacherId`), so the list can also be\nORDERED by teacher: `orderBy=teacherDisplayName` sorts by their last name. Values computed per row —\nthe child-entitlement baseline, for instance — cannot be ordered and are answered with `400`.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetTeacherPaymentsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "TeacherId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "PaymentMonthFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "PaymentMonthTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "MinTotalLessons",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "MaxTotalLessons",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "MinActualPay",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "MaxActualPay",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherPaymentGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherPaymentGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "TeacherPayment (Office)"
        ],
        "summary": "Create a teacher payment.",
        "description": "Creates a new teacher payment from the `TeacherPaymentPost` body (the owning teacher, the payment\nmonth and its line items) and returns the created `TeacherPaymentGet` with its generated id and the\ncomputed compensation figures. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateTeacherPaymentOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherPaymentPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherPaymentGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-payments/{id}": {
      "get": {
        "tags": [
          "TeacherPayment (Office)"
        ],
        "summary": "Get a single teacher payment by id.",
        "description": "Returns a single teacher payment by its id as a `TeacherPaymentGet`, including its line items,\ndeduction breakdown and warning flags. Returns `404` if no teacher payment with that id exists.",
        "operationId": "GetTeacherPaymentOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherPaymentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "TeacherPayment (Office)"
        ],
        "summary": "Partially update a teacher payment.",
        "description": "Partially updates an existing teacher payment: only the fields present in the `TeacherPaymentPatch`\nbody are changed, the rest stay as they are (for example to override the child entitlement or adjust\nline items). Returns the updated `TeacherPaymentGet`. `404` if it does not exist; `400` on validation\nerrors.",
        "operationId": "UpdateTeacherPaymentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherPaymentPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherPaymentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "TeacherPayment (Office)"
        ],
        "summary": "Delete a teacher payment (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a teacher payment. By default this is a soft delete — the payment is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404`\nif it does not exist.",
        "operationId": "DeleteTeacherPaymentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-payments/{id}/restore": {
      "post": {
        "tags": [
          "TeacherPayment (Office)"
        ],
        "summary": "Restore a soft-deleted teacher payment.",
        "description": "Restores a previously soft-deleted teacher payment so it appears in normal listings again. Returns\n`204`, or `404` if no such teacher payment exists.",
        "operationId": "RestoreTeacherPaymentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-payments/{id}/acknowledge-warning": {
      "post": {
        "tags": [
          "TeacherPayment (Office)"
        ],
        "summary": "Acknowledge a specific warning on a teacher payment (?type=AdditionalTravelCost|Pension|Quellensteuer).",
        "description": "Marks one of the system-raised warnings on a teacher payment as acknowledged so staff can confirm it\nhas been reviewed. Select which warning with the required `type` query parameter — one of\n`AdditionalTravelCost`, `Pension` or `Quellensteuer`. Returns `204` once the acknowledgment is recorded.",
        "operationId": "AcknowledgeTeacherPaymentWarningOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/EPaymentWarningType"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          }
        }
      }
    },
    "/office/teacher-students": {
      "get": {
        "tags": [
          "TeacherStudent (Office)"
        ],
        "summary": "List teacher students (office).",
        "description": "Returns students as they appear to teachers (office view — not row-restricted), each as a\n`TeacherStudentGet`: a reduced student record (name, age/child flag, native language, contact and\nlearning subjects) enriched with the student's customer contact and address details, plus their\nenrolled courses, attended lessons, received materials, teacher notes and exam records.\nSoft-deleted rows are excluded unless you pass `showRemoved=true`. Filter with `searchTerm` (matches\nfirst name, last name, customer name and email), `customerId`, `nativeLanguageId`, `customerTypeId`,\n`isChild`, and `status`. The optional `teacherId` narrows the list to students taught by that teacher.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetTeacherStudentsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "NativeLanguageId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CustomerTypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "IsChild",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "CustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/NullableOfEStudentStatus"
            }
          },
          {
            "name": "TeacherId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherStudentGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherStudentGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "TeacherStudent (Office)"
        ],
        "summary": "Create a teacher student.",
        "description": "Creates a new teacher-student record from the `TeacherStudentPost` body and returns the created\n`TeacherStudentGet` with its generated id. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateTeacherStudentOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherStudentPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherStudentGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-students/{id}": {
      "get": {
        "tags": [
          "TeacherStudent (Office)"
        ],
        "summary": "Get a single teacher student by id.",
        "description": "Returns a single teacher-student record by its id as a `TeacherStudentGet`, including its customer\ncontact details, courses, notes and exam records. Returns `404` if no such record exists.",
        "operationId": "GetTeacherStudentOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherStudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "TeacherStudent (Office)"
        ],
        "summary": "Partially update a teacher student.",
        "description": "Partially updates an existing teacher-student record: only the fields present in the\n`TeacherStudentPatch` body are changed, the rest stay as they are. Returns the updated\n`TeacherStudentGet`. `404` if it does not exist; `400` on validation errors.",
        "operationId": "UpdateTeacherStudentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TeacherStudentPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherStudentGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "TeacherStudent (Office)"
        ],
        "summary": "Delete a teacher student (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a teacher-student record. By default this is a soft delete — the record is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404`\nif it does not exist.",
        "operationId": "DeleteTeacherStudentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-students/{id}/restore": {
      "post": {
        "tags": [
          "TeacherStudent (Office)"
        ],
        "summary": "Restore a soft-deleted teacher student.",
        "description": "Restores a previously soft-deleted teacher-student record so it appears in normal listings again.\nReturns `204`, or `404` if no such record exists.",
        "operationId": "RestoreTeacherStudentOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/homeworks": {
      "get": {
        "tags": [
          "Homework (Office)"
        ],
        "summary": "List homeworks (office). Filter by lessonId / due range.",
        "description": "Returns all homework assignments in the system (office view — not row-restricted), each as a\n`HomeworkGet` with its task description and due date, plus the owning lesson's start date and its\ncourse for context. Results are ordered by due date. Soft-deleted homeworks are excluded unless you\npass `showRemoved=true`. Filter with `searchTerm` (matches the description), by `lessonId` for a\nsingle lesson's homeworks, and by a `dueFrom`/`dueTo` due-date range.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetHomeworksOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "LessonId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "DueFrom",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "DueTo",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HomeworkGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HomeworkGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Homework (Office)"
        ],
        "summary": "Create a homework.",
        "description": "Creates a new homework assignment from the `HomeworkPost` body (the owning lesson, task description\nand due date) and returns the created `HomeworkGet` with its generated id. Returns `400` with\nvalidation details if the body is invalid.",
        "operationId": "CreateHomeworkOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HomeworkPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HomeworkGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/homeworks/{id}": {
      "get": {
        "tags": [
          "Homework (Office)"
        ],
        "summary": "Get a single homework by id.",
        "description": "Returns a single homework assignment by its id as a `HomeworkGet`, including its lesson and course\ncontext. Returns `404` if no homework with that id exists.",
        "operationId": "GetHomeworkOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HomeworkGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Homework (Office)"
        ],
        "summary": "Partially update a homework.",
        "description": "Partially updates an existing homework assignment: only the fields present in the `HomeworkPatch`\nbody are changed, the rest stay as they are. Returns the updated `HomeworkGet`. Returns `404` if the\nhomework does not exist and `400` on validation errors.",
        "operationId": "UpdateHomeworkOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HomeworkPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HomeworkGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Homework (Office)"
        ],
        "summary": "Delete a homework (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a homework assignment. By default this is a soft delete — the homework is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404`\nif the homework does not exist.",
        "operationId": "DeleteHomeworkOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/homeworks/{id}/restore": {
      "post": {
        "tags": [
          "Homework (Office)"
        ],
        "summary": "Restore a soft-deleted homework.",
        "description": "Restores a previously soft-deleted homework assignment so it appears in normal listings again.\nReturns `204`, or `404` if no such homework exists.",
        "operationId": "RestoreHomeworkOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/dashboard": {
      "get": {
        "tags": [
          "Dashboard (Office)"
        ],
        "summary": "Get the office dashboard aggregate.",
        "description": "Returns a single read-only snapshot object that powers the office home screen — everything needed\nto render it in one call, so you do not have to assemble it from the individual list endpoints.\n\nIt bundles the operationally relevant highlights for internal staff:\n- upcoming teacher birthdays and work anniversaries (next 30 days),\n- upcoming student exams (next 30 days),\n- a billable-hours and revenue overview for the current month,\n- customers whose students have been inactive for more than 18 months.\n\nThis is a company-wide view (not row-restricted). The figures are point-in-time and computed on\neach request from the current data.",
        "operationId": "GetOfficeDashboard",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OfficeDashboardGet"
                }
              }
            }
          }
        }
      }
    },
    "/office/notifications": {
      "get": {
        "tags": [
          "Notification (Office)"
        ],
        "summary": "List notifications (office).",
        "description": "Returns all notifications in the system (office view — not row-restricted), each as a\n`NotificationGet`. A notification is an inbox message addressed to EXACTLY ONE recipient, a\ncustomer or a student, with a message, issue date, category type, read flag and an optional\ndeep-link to the record it is about. Soft-deleted notifications are excluded unless you pass\n`showRemoved=true`.\n\nThe message and the deep-link URL are COMPOSED per request from the notification's key and the\nrecords it references (`targetId`, `relatedStudentId`, `relatedCustomerId`, `eventDate`), not\nstored — so a renamed person or course, or a changed portal route, is reflected in notifications\nthat already exist.\n\nFilter by `typeId`, `keyId`, `recipientCustomerId`, `recipientStudentId`, `relatedStudentId` and\n`isRead`; the lookup ids come from the matching `/lookups/...` endpoints. **`searchTerm` is not\nsupported here** and is ignored: since the message is composed rather than stored, there is no\ntext column to search, and filtering after the fact would break the pagination contract below.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (any returned\nproperty name, case-insensitive) and `desc` query parameters. The response body is a plain JSON\narray and the total count is returned in the `Content-Range` header (`items {start}-{end}/{total}`);\nthe status is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetNotificationsOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "TypeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "KeyId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "RecipientCustomerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "RecipientStudentId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "RelatedStudentId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "IsRead",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NotificationGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NotificationGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      },
      "post": {
        "tags": [
          "Notification (Office)"
        ],
        "summary": "Create a notification.",
        "description": "Creates a new notification from the `NotificationPost` body and returns the created\n`NotificationGet` with its generated id. Supply EXACTLY ONE recipient (customer or student), the\ncategory `typeId`, and the `keyId` of the event whose wording should be used — there is no message\ntext to send, because the wording follows from the key and is composed on read. Where that wording\nnames a person, a course or a date, supply the matching `relatedStudentId` /\n`relatedCustomerId` / `targetId` / `eventDate`. An omitted `keyId` stores the neutral `Other` key,\nwhich has no specified wording. Returns `400` with validation details if the body is invalid.",
        "operationId": "CreateNotificationOffice",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationPost"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationGet"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/notifications/{id}": {
      "get": {
        "tags": [
          "Notification (Office)"
        ],
        "summary": "Get a single notification by id.",
        "description": "Returns a single notification by its id as a `NotificationGet`, including its recipient(s) and read\nstatus. Returns `404` if no notification with that id exists.",
        "operationId": "GetNotificationOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "Notification (Office)"
        ],
        "summary": "Partially update a notification.",
        "description": "Partially updates an existing notification: only the fields present in the `NotificationPatch` body\nare changed, the rest stay as they are (e.g. marking it read). Returns the updated\n`NotificationGet`. Returns `404` if the notification does not exist and `400` on validation errors.",
        "operationId": "UpdateNotificationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Notification (Office)"
        ],
        "summary": "Delete a notification (soft by default; ?hard=true to hard-delete).",
        "description": "Deletes a notification. By default this is a soft delete — the notification is hidden from normal\nlistings but can be restored; pass `?hard=true` to remove it permanently. Returns `204`, or `404`\nif the notification does not exist.",
        "operationId": "DeleteNotificationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "hard",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/notifications/{id}/restore": {
      "post": {
        "tags": [
          "Notification (Office)"
        ],
        "summary": "Restore a soft-deleted notification.",
        "description": "Restores a previously soft-deleted notification so it appears in normal listings again. Returns\n`204`, or `404` if no such notification exists.",
        "operationId": "RestoreNotificationOffice",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/notification-triggers": {
      "get": {
        "tags": [
          "Notification triggers (Office)"
        ],
        "summary": "List the notification checks that can be run on demand.",
        "description": "Returns every available check as a `NotificationTriggerGet` (`key` + `description`). These are the\nnotifications that cannot be raised as a side effect of an action, because nothing happens when\nthey become true — a package falls below 20% because a lesson has taken place, i.e. because the\ndate changed. They run nightly on their own; this endpoint is the manual lever.\n\nRequires the office portal AND the `office-trigger-notifications` realm role; anyone else gets `403`.",
        "operationId": "GetNotificationTriggersOffice",
        "parameters": [
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NotificationTriggerGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NotificationTriggerGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/office/notification-triggers/{key}": {
      "post": {
        "tags": [
          "Notification triggers (Office)"
        ],
        "summary": "Run one notification check now.",
        "description": "Runs the check named by `key` (see the list endpoint) and returns what it changed as a\n`NotificationTriggerRunGet`: how many rows it touched — notifications raised, notifications\nwithdrawn again, and the markers that keep a check from repeating itself.\n\n**Safe to run repeatedly.** Every check decides from the CURRENT state plus a marker, so a second\nrun right after the first finds nothing new and changes nothing. It never produces a duplicate\nmessage for a situation that was already reported.\n\n`404` if no check by that key exists. Requires the office portal AND the `office-trigger-notifications`\nrealm role; anyone else gets `403`.",
        "operationId": "RunNotificationTriggerOffice",
        "parameters": [
          {
            "name": "key",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationTriggerRunGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/office/teacher-profiles": {
      "get": {
        "tags": [
          "TeacherProfile (Office)"
        ],
        "summary": "List teacher profiles (office).",
        "description": "Returns the read-only teacher profiles (office view — not row-restricted), each as a\n`TeacherProfileGet`. A profile is the non-sensitive subset of a teacher: personal info, contact,\naddress, teaching capabilities, teaching and spoken languages, children and availability — it\ndeliberately excludes all employment, insurance, salary and other HR data (use the teacher endpoints\nfor those).\nSoft-deleted profiles are excluded unless you pass `showRemoved=true`. Filter with `searchTerm`\n(matches first name, last name, email and city), `genderId`, `countryCodeId`, `city`,\n`lessonsToChildren` and `challengingStudents`.\n\nSupports pagination and sorting: send an optional `Range` request header (`0-49` = first 50,\n`-50` = last 50, `50` = from index 50; 0-based, end inclusive) plus the `orderBy` (a property name\nof the returned object, case-insensitive) and `desc` query parameters. The body is a plain JSON\narray; the total count is returned in the `Content-Range` response header (`items {start}-{end}/{total}`).\nStatus is `206` when a `Range` is sent, `416` if the range is invalid.",
        "operationId": "GetTeacherProfilesOffice",
        "parameters": [
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ShowRemoved",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "GenderId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "CountryCodeId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "City",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "LessonsToChildren",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ChallengingStudents",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Range",
            "in": "header",
            "description": "Pagination window (zero-based, end inclusive): `{start}-{end}` e.g. `0-49`; `-{n}` = last n; `{n}` = first n. When set, the response is 206 with a `Content-Range` header.",
            "schema": {
              "type": "string",
              "example": "0-49"
            }
          },
          {
            "name": "orderBy",
            "in": "query",
            "description": "Sort by this result property name (case-insensitive). Unknown property → 400.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "desc",
            "in": "query",
            "description": "Sort descending when true (default false). Applied before pagination.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherProfileGet"
                  }
                }
              }
            }
          },
          "206": {
            "description": "Partial Content — returned when a `Range` header is present. Body is the requested window.",
            "headers": {
              "Content-Range": {
                "description": "`items {start}-{end}/{total}` (empty page → `items */{total}`).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TeacherProfileGet"
                  }
                }
              }
            }
          },
          "416": {
            "description": "Range Not Satisfiable — the `Range` header is malformed or starts beyond the last item."
          }
        }
      }
    },
    "/office/teacher-profiles/{id}": {
      "get": {
        "tags": [
          "TeacherProfile (Office)"
        ],
        "summary": "Get a single teacher profile by id.",
        "description": "Returns a single teacher profile by its id as a `TeacherProfileGet` (the non-sensitive teacher subset,\nwithout any HR/insurance/salary data). Returns `404` if no teacher profile with that id exists.",
        "operationId": "GetTeacherProfileOfficeById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TeacherProfileGet"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AbsencePeriodGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          },
          "reason": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "AbsencePeriodPatch": {
        "type": "object",
        "properties": {
          "startDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "endDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "removeReason": {
            "type": "boolean"
          }
        }
      },
      "AbsencePeriodPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/AbsencePeriodPatch"
          }
        }
      },
      "AbsencePeriodPost": {
        "type": "object",
        "properties": {
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          },
          "reason": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "AddressInfoDto": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string"
          },
          "houseNumber": {
            "type": "string",
            "nullable": true
          },
          "additionalLine": {
            "type": "string",
            "nullable": true
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "poBox": {
            "type": "string",
            "nullable": true
          }
        },
        "nullable": true
      },
      "AddressInfoDto2": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string"
          },
          "houseNumber": {
            "type": "string",
            "nullable": true
          },
          "additionalLine": {
            "type": "string",
            "nullable": true
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "poBox": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "AttendanceRecordGet": {
        "type": "object",
        "properties": {
          "ownerRef": {
            "type": "string",
            "format": "uuid"
          },
          "ownerTypeName": {
            "type": "string"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEAttendanceStatus"
          },
          "absenceDocumentPath": {
            "type": "string",
            "nullable": true
          },
          "absenceDocumentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "absenceDocumentSizeBytes": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "AttendanceRecordPatch": {
        "type": "object",
        "properties": {
          "ownerRef": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "ownerTypeName": {
            "type": "string",
            "nullable": true
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "absenceDocumentPath": {
            "type": "string",
            "nullable": true
          },
          "absenceDocumentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeAbsenceDocument": {
            "type": "boolean"
          },
          "removeAbsenceDocumentPath": {
            "type": "boolean"
          }
        }
      },
      "AttendanceRecordPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/AttendanceRecordPatch"
          }
        }
      },
      "AttendanceRecordPost": {
        "type": "object",
        "properties": {
          "ownerRef": {
            "type": "string",
            "format": "uuid"
          },
          "ownerTypeName": {
            "type": "string"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          },
          "absenceDocumentPath": {
            "type": "string",
            "nullable": true
          },
          "absenceDocumentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "BudgetGet": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEBudgetStatus"
          },
          "totalAmount": {
            "type": "number",
            "format": "double"
          },
          "consumedAmount": {
            "type": "number",
            "format": "double"
          },
          "invoicedAmount": {
            "type": "number",
            "format": "double"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "sponsorCustomerId": {
            "type": "string",
            "format": "uuid"
          },
          "sponsorCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "beneficiaryCustomerId": {
            "type": "string",
            "format": "uuid"
          },
          "beneficiaryCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "lineItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BudgetLineItemGet"
            }
          },
          "remainingAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "itemCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "sponsorCustomerDisplay": {
            "type": "string",
            "nullable": true
          },
          "beneficiaryCustomerDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "BudgetLineItemGet": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfEBudgetLineItemType"
          },
          "lessonId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "lesson": {
            "$ref": "#/components/schemas/LessonRef2"
          },
          "courseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          },
          "unitPrice": {
            "type": "number",
            "format": "double"
          },
          "amount": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "BudgetLineItemPost": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          },
          "typeId": {
            "type": "string",
            "format": "uuid"
          },
          "lessonId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "lesson": {
            "$ref": "#/components/schemas/LessonRef2"
          },
          "courseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          },
          "unitPrice": {
            "type": "number",
            "format": "double"
          },
          "amount": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "BudgetPatch": {
        "type": "object",
        "properties": {
          "totalAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "removeDescription": {
            "type": "boolean"
          },
          "sponsorCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "beneficiaryCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "lineItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BudgetLineItemPost"
            },
            "nullable": true
          }
        }
      },
      "BudgetPost": {
        "type": "object",
        "properties": {
          "totalAmount": {
            "type": "number",
            "format": "double"
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "sponsorCustomerId": {
            "type": "string",
            "format": "uuid"
          },
          "beneficiaryCustomerId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "ChildInfoGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "childDob": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "childEntitledFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "childEntitledTo": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "childName": {
            "type": "string",
            "nullable": true
          },
          "childAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        }
      },
      "ChildInfoPatch": {
        "type": "object",
        "properties": {
          "childDob": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "removeChildDob": {
            "type": "boolean"
          },
          "childEntitledFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "removeChildEntitledFrom": {
            "type": "boolean"
          },
          "childEntitledTo": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "removeChildEntitledTo": {
            "type": "boolean"
          },
          "childName": {
            "type": "string",
            "nullable": true
          },
          "removeChildName": {
            "type": "boolean"
          },
          "childAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "removeChildAmount": {
            "type": "boolean"
          }
        }
      },
      "ChildInfoPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/ChildInfoPatch"
          }
        }
      },
      "ChildInfoPost": {
        "type": "object",
        "properties": {
          "childDob": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "childEntitledFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "childEntitledTo": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "childName": {
            "type": "string",
            "nullable": true
          },
          "childAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        }
      },
      "CompletedTrainingGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "trainingCourseId": {
            "type": "string",
            "format": "uuid"
          },
          "trainingCourse": {
            "$ref": "#/components/schemas/TrainingCourseRef"
          },
          "completionDate": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "CompletedTrainingPatch": {
        "type": "object",
        "properties": {
          "trainingCourseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "completionDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "CompletedTrainingPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/CompletedTrainingPatch"
          }
        }
      },
      "CompletedTrainingPost": {
        "type": "object",
        "properties": {
          "trainingCourseId": {
            "type": "string",
            "format": "uuid"
          },
          "completionDate": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "CourseColorEnumDto": {
        "type": "object",
        "properties": {
          "propertyName": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "enumValue": {
            "$ref": "#/components/schemas/ECourseColor"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CourseEnrollmentRequestGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseGet2"
          },
          "requestingCustomerId": {
            "type": "string",
            "format": "uuid"
          },
          "requestingCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "requestedStudentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "requestedStudents": {
            "type": "array",
            "items": { }
          },
          "requestDate": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseEnrollmentStatus2"
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "declineReason": {
            "type": "string",
            "nullable": true
          },
          "requesterDisplay": {
            "type": "string",
            "nullable": true
          },
          "studentsDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CourseEnrollmentRequestGet2": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseGet3"
          },
          "requestingCustomerId": {
            "type": "string",
            "format": "uuid"
          },
          "requestingCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "requestedStudentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "requestedStudents": {
            "type": "array",
            "items": { }
          },
          "requestDate": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseEnrollmentStatus2"
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "declineReason": {
            "type": "string",
            "nullable": true
          },
          "requesterDisplay": {
            "type": "string",
            "nullable": true
          },
          "studentsDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CourseEnrollmentRequestPatch": {
        "type": "object",
        "properties": {
          "requestedStudentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "declineReason": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CourseGet": {
        "type": "object",
        "properties": {
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseStatus"
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "color": {
            "$ref": "#/components/schemas/CourseColorEnumDto"
          },
          "isForChildren": {
            "type": "boolean"
          },
          "minStudents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "capacity": {
            "$ref": "#/components/schemas/EnumDtoOfECourseCapacity"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "isPriceLocked": {
            "type": "boolean"
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "totalMaterialCost": {
            "type": "number",
            "format": "double"
          },
          "hasTeacher": {
            "type": "boolean"
          },
          "studentCount": {
            "type": "integer",
            "format": "int32"
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "teacherIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "teachers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeacherRef2"
            },
            "nullable": true
          },
          "studentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "students": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentRef2"
            },
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            }
          },
          "roomId": {
            "type": "string",
            "format": "uuid"
          },
          "room": {
            "$ref": "#/components/schemas/RoomRef"
          },
          "pendingStudentInviteCount": {
            "type": "integer",
            "format": "int32"
          },
          "enrollmentRequests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CourseEnrollmentRequestGet"
            },
            "nullable": true
          },
          "pendingTeacherInviteCount": {
            "type": "integer",
            "format": "int32"
          },
          "requiredMaterialIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "requiredMaterials": {
            "type": "array",
            "items": { },
            "nullable": true
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LessonRef"
            },
            "nullable": true
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CourseGet2": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseStatus"
          },
          "capacity": {
            "$ref": "#/components/schemas/EnumDtoOfECourseCapacity2"
          },
          "color": {
            "$ref": "#/components/schemas/CourseColorEnumDto"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "weeklySchedule": {
            "type": "array",
            "items": { }
          },
          "room": {
            "$ref": "#/components/schemas/RoomRef"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "requiredMaterials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MaterialRef"
            },
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "isAvailable": {
            "type": "boolean"
          },
          "isEnrolled": {
            "type": "boolean"
          },
          "isRequested": {
            "type": "boolean"
          },
          "enrollmentStatus": {
            "$ref": "#/components/schemas/EnumDtoOfECourseEnrollmentStatus"
          },
          "enrolledStudents": {
            "type": "array",
            "items": { },
            "nullable": true
          },
          "enrollmentRequests": {
            "type": "array",
            "items": { },
            "nullable": true
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CourseLessonGet"
            },
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "studentCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "CourseGet3": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseStatus"
          },
          "capacity": {
            "$ref": "#/components/schemas/EnumDtoOfECourseCapacity2"
          },
          "color": {
            "$ref": "#/components/schemas/CourseColorEnumDto"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            }
          },
          "room": {
            "$ref": "#/components/schemas/RoomRef"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "requiredMaterials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MaterialRef"
            },
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "isAvailable": {
            "type": "boolean"
          },
          "isEnrolled": {
            "type": "boolean"
          },
          "isRequested": {
            "type": "boolean"
          },
          "enrollmentStatus": {
            "$ref": "#/components/schemas/EnumDtoOfECourseEnrollmentStatus"
          },
          "enrolledStudents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentRef2"
            },
            "nullable": true
          },
          "enrollmentRequests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CourseEnrollmentRequestGet"
            },
            "nullable": true
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CourseLessonGet"
            },
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "studentCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "CourseLessonDto": {
        "type": "object",
        "properties": {
          "tempId": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "durationMinutes": {
            "type": "integer",
            "format": "int32"
          },
          "dayOfWeek": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "display": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CourseLessonGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "room": {
            "$ref": "#/components/schemas/RoomRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfELessonStatus"
          },
          "isCancelled": {
            "type": "boolean"
          },
          "homeworks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HomeworkGet"
            },
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CoursePatch": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "removeDescription": {
            "type": "boolean"
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "subjectId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "courseColorId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isForChildren": {
            "type": "boolean",
            "nullable": true
          },
          "minStudents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "removeMinStudents": {
            "type": "boolean"
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "removeMaxStudents": {
            "type": "boolean"
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "confirmRetroactive": {
            "type": "boolean"
          },
          "changeReason": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "weeklyScheduleToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            },
            "nullable": true
          },
          "weeklyScheduleToRemove": {
            "type": "array",
            "items": { },
            "nullable": true
          },
          "roomId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "teacherId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "additionalTeacherIdsToAdd": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "additionalTeacherIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "studentIdsToAdd": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "studentIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "requiredMaterialIdsToAdd": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "requiredMaterialIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "CoursePost": {
        "type": "object",
        "properties": {
          "courseTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          },
          "subjectId": {
            "type": "string",
            "format": "uuid"
          },
          "levelId": {
            "type": "string",
            "format": "uuid"
          },
          "courseColorId": {
            "type": "string",
            "format": "uuid"
          },
          "isForChildren": {
            "type": "boolean"
          },
          "minStudents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            },
            "nullable": true
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CourseLessonDto"
            },
            "nullable": true
          },
          "roomId": {
            "type": "string",
            "format": "uuid"
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "additionalTeacherIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "studentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "requiredMaterialIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "CoursePriceGet": {
        "type": "object",
        "properties": {
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "isForChildren": {
            "type": "boolean"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "productName": {
            "type": "string",
            "nullable": true
          },
          "isCustomProduct": {
            "type": "boolean"
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pendingChangeFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pendingChangeAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CoursePricePatch": {
        "type": "object",
        "properties": {
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "courseTypeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isForChildren": {
            "type": "boolean",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "removeDescription": {
            "type": "boolean"
          },
          "productName": {
            "type": "string",
            "nullable": true
          },
          "removeProductName": {
            "type": "boolean"
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "confirmRetroactive": {
            "type": "boolean"
          },
          "changeReason": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CoursePricePost": {
        "type": "object",
        "properties": {
          "levelId": {
            "type": "string",
            "format": "uuid"
          },
          "courseTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "isForChildren": {
            "type": "boolean"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "productName": {
            "type": "string",
            "nullable": true
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "confirmRetroactive": {
            "type": "boolean"
          },
          "changeReason": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CourseRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "name": {
            "type": "string"
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseStatus"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "roomId": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            }
          }
        },
        "nullable": true
      },
      "CourseRef2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "name": {
            "type": "string"
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "subject": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfECourseStatus"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "roomId": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyScheduleSlotDto"
            }
          }
        }
      },
      "CustomerContactInfoGet": {
        "type": "object",
        "properties": {
          "birthdate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "salutation": {
            "type": "string",
            "nullable": true
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "gender": {
            "$ref": "#/components/schemas/EnumDtoOfEGender2"
          },
          "email": {
            "type": "string"
          },
          "mobilePhone": {
            "type": "string"
          },
          "phone": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CustomerContactInfoPatch": {
        "type": "object",
        "properties": {
          "birthdate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "genderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeGenderId": {
            "type": "boolean"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "mobilePhone": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          }
        },
        "nullable": true
      },
      "CustomerContactInfoPost": {
        "type": "object",
        "properties": {
          "birthdate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "genderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "email": {
            "type": "string"
          },
          "mobilePhone": {
            "type": "string"
          },
          "phone": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CustomerGet": {
        "type": "object",
        "properties": {
          "customerType": {
            "$ref": "#/components/schemas/EnumDtoOfECustomerType"
          },
          "isActive": {
            "type": "boolean"
          },
          "correspondenceLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "profileConfirmed": {
            "type": "boolean"
          },
          "accountStatus": {
            "$ref": "#/components/schemas/EnumDtoOfEAccountStatus"
          },
          "loginNumber": {
            "type": "string",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "contactDisplay": {
            "type": "string",
            "nullable": true
          },
          "addressDisplay": {
            "type": "string",
            "nullable": true
          },
          "companyName": {
            "type": "string",
            "nullable": true
          },
          "vatNumber": {
            "type": "string",
            "nullable": true
          },
          "contactInfo": {
            "$ref": "#/components/schemas/CustomerContactInfoGet"
          },
          "billingAddress": {
            "$ref": "#/components/schemas/AddressInfoDto2"
          },
          "students": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentRef2"
            }
          },
          "studentCount": {
            "type": "integer",
            "format": "int32"
          },
          "interest": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "CustomerInactivityItem": {
        "type": "object",
        "properties": {
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "customerName": {
            "type": "string"
          },
          "studentCount": {
            "type": "integer",
            "format": "int32"
          },
          "lastLessonDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "monthsInactive": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "CustomerPatch": {
        "type": "object",
        "properties": {
          "customerTypeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isActive": {
            "type": "boolean",
            "nullable": true
          },
          "correspondenceLanguageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "companyName": {
            "type": "string",
            "nullable": true
          },
          "removeCompanyName": {
            "type": "boolean"
          },
          "vatNumber": {
            "type": "string",
            "nullable": true
          },
          "removeVatNumber": {
            "type": "boolean"
          },
          "contactInfo": {
            "$ref": "#/components/schemas/CustomerContactInfoPatch"
          },
          "billingAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "interest": {
            "type": "string",
            "nullable": true
          },
          "removeInterest": {
            "type": "boolean"
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "removeNotes": {
            "type": "boolean"
          }
        }
      },
      "CustomerPost": {
        "type": "object",
        "properties": {
          "customerTypeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "correspondenceLanguageId": {
            "type": "string",
            "format": "uuid"
          },
          "companyName": {
            "type": "string",
            "nullable": true
          },
          "vatNumber": {
            "type": "string",
            "nullable": true
          },
          "contactInfo": {
            "$ref": "#/components/schemas/CustomerContactInfoPost"
          },
          "billingAddress": {
            "$ref": "#/components/schemas/AddressInfoDto2"
          },
          "interest": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CustomerRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "customerType": {
            "$ref": "#/components/schemas/EnumDtoOfECustomerType"
          },
          "isActive": {
            "type": "boolean"
          },
          "address": {
            "$ref": "#/components/schemas/AddressInfoDto"
          }
        },
        "nullable": true
      },
      "DayOfWeek": {
        "type": "integer"
      },
      "EAccountStatus": {
        "type": "integer"
      },
      "EAttendanceStatus": {
        "type": "integer"
      },
      "EBudgetLineItemType": {
        "type": "integer"
      },
      "EBudgetStatus": {
        "type": "integer"
      },
      "ECivilStatus": {
        "type": "integer"
      },
      "ECountryCode": {
        "type": "integer"
      },
      "ECourseCapacity": {
        "type": "integer"
      },
      "ECourseColor": {
        "type": "integer"
      },
      "ECourseEnrollmentStatus": {
        "type": "integer"
      },
      "ECourseStatus": {
        "type": "integer"
      },
      "ECourseType": {
        "type": "integer"
      },
      "ECustomerType": {
        "type": "integer"
      },
      "EDiscountType": {
        "type": "integer"
      },
      "EGender": {
        "type": "integer"
      },
      "EInterestStatus": {
        "type": "integer"
      },
      "EInterestType": {
        "type": "integer"
      },
      "EInviteMaterialStatus": {
        "type": "integer"
      },
      "EInviteStatus": {
        "type": "integer"
      },
      "EInvoiceStatus": {
        "type": "integer"
      },
      "ELanguage": {
        "type": "integer"
      },
      "ELessonStatus": {
        "type": "integer"
      },
      "EMaterialDeliveryMethod": {
        "type": "integer"
      },
      "EMaterialLevel": {
        "type": "integer"
      },
      "EMaterialType": {
        "type": "integer"
      },
      "ENotificationKey": {
        "type": "integer"
      },
      "ENotificationType": {
        "type": "integer"
      },
      "EnumDtoOfEAccountStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EAccountStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEAttendanceStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EAttendanceStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEBudgetLineItemType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EBudgetLineItemType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEBudgetStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EBudgetStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECivilStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECivilStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECountryCode": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECountryCode"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECourseCapacity": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseCapacity"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECourseCapacity2": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseCapacity"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfECourseEnrollmentStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseEnrollmentStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfECourseEnrollmentStatus2": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseEnrollmentStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECourseStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECourseType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECourseType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfECustomerType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ECustomerType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEDiscountType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EDiscountType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEGender": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EGender"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEGender2": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EGender"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfEInterestStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInterestStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEInterestType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInterestType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEInviteMaterialStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInviteMaterialStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfEInviteMaterialStatus2": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInviteMaterialStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEInviteStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInviteStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEInvoiceStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EInvoiceStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfELanguage": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ELanguage"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfELanguage2": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ELanguage"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfELessonStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ELessonStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEMaterialDeliveryMethod": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EMaterialDeliveryMethod"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfEMaterialLevel": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EMaterialLevel"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEMaterialType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EMaterialType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfENotificationKey": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ENotificationKey"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfENotificationType": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ENotificationType"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEOrderStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EOrderStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEPackageAssignment": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EPackageAssignment"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEPackageOrderStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EPackageOrderStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEPackagePurchaseStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EPackagePurchaseStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEPreferredLocation": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EPreferredLocation"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfEPreferredTeachingFormat": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EPreferredTeachingFormat"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfERoomStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ERoomStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfEStudentStatus": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/EStudentStatus"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfESwissCanton": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ESwissCanton"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "EnumDtoOfETeachingLevel": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ETeachingLevel"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EnumDtoOfETest": {
        "type": "object",
        "properties": {
          "enumValue": {
            "$ref": "#/components/schemas/ETest"
          },
          "displayName": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "EOrderStatus": {
        "type": "integer"
      },
      "EPackageAssignment": {
        "type": "integer"
      },
      "EPackageOrderStatus": {
        "type": "integer"
      },
      "EPackagePurchaseStatus": {
        "type": "integer"
      },
      "EPaymentWarningType": {
        "type": "integer"
      },
      "EPreferredLocation": {
        "type": "integer"
      },
      "EPreferredTeachingFormat": {
        "type": "integer"
      },
      "ERoomStatus": {
        "type": "integer"
      },
      "EStudentStatus": {
        "type": "integer"
      },
      "ESwissCanton": {
        "type": "integer"
      },
      "ETeachingLevel": {
        "type": "integer"
      },
      "ETest": {
        "type": "integer"
      },
      "ExamRecordGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "examDate": {
            "type": "string",
            "format": "date-time"
          },
          "result": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ExamRecordPatch": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "nullable": true
          },
          "examDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "result": {
            "type": "string",
            "nullable": true
          },
          "removeResult": {
            "type": "boolean"
          }
        }
      },
      "ExamRecordPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/ExamRecordPatch"
          }
        }
      },
      "ExamRecordPost": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          },
          "examDate": {
            "type": "string",
            "format": "date-time"
          },
          "result": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "HomeworkGet": {
        "type": "object",
        "properties": {
          "lessonId": {
            "type": "string",
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "dueDate": {
            "type": "string",
            "format": "date"
          },
          "lessonStartDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "HomeworkPatch": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          }
        }
      },
      "HomeworkPost": {
        "type": "object",
        "properties": {
          "lessonId": {
            "type": "string",
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "dueDate": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "HomeworkRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "dueDate": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "HttpValidationProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "IFormFile": {
        "type": "string",
        "format": "binary"
      },
      "InterestGet": {
        "type": "object",
        "properties": {
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "studentRef": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "requestingCustomerId": {
            "type": "string",
            "format": "uuid"
          },
          "requestingCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "requestedStudentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "requestedStudents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentRef2"
            },
            "nullable": true
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "interestType": {
            "$ref": "#/components/schemas/EnumDtoOfEInterestType"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInterestStatus"
          },
          "declinedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "declineReason": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          },
          "lessonsPerWeek": {
            "type": "integer",
            "format": "int32"
          },
          "lessonDurationMinutes": {
            "type": "integer",
            "format": "int32"
          },
          "numberOfLessons": {
            "type": "integer",
            "format": "int32"
          },
          "preferredLocation": {
            "$ref": "#/components/schemas/EnumDtoOfEPreferredLocation"
          },
          "preferredAddress": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "estimatedPrice": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "timeSlots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSlotDto"
            }
          },
          "teacherApplications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeacherApplicationGet"
            }
          },
          "teacherApplicationCount": {
            "type": "integer",
            "format": "int32"
          },
          "hasTeacherApplications": {
            "type": "boolean"
          },
          "studentName": {
            "type": "string",
            "nullable": true
          },
          "studentAge": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "InterestPatch": {
        "type": "object",
        "properties": {
          "requestingCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "requestedStudentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "languageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "interestTypeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "declineReason": {
            "type": "string",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "endDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lessonsPerWeek": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lessonDurationMinutes": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "numberOfLessons": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "preferredLocationId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "preferredAddress": {
            "type": "string",
            "nullable": true
          },
          "removePreferredAddress": {
            "type": "boolean"
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "removeNotes": {
            "type": "boolean"
          },
          "timeSlotsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSlotDto"
            },
            "nullable": true
          },
          "timeSlotsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSlotPatchWithId"
            },
            "nullable": true
          },
          "timeSlotIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "teacherApplicationsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeacherApplicationPost"
            },
            "nullable": true
          },
          "teacherApplicationIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "InterestPost": {
        "type": "object",
        "properties": {
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "requestingCustomerId": {
            "type": "string",
            "format": "uuid"
          },
          "requestedStudentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "languageId": {
            "type": "string",
            "format": "uuid"
          },
          "levelId": {
            "type": "string",
            "format": "uuid"
          },
          "interestTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date-time"
          },
          "endDate": {
            "type": "string",
            "format": "date-time"
          },
          "lessonsPerWeek": {
            "type": "integer",
            "format": "int32"
          },
          "lessonDurationMinutes": {
            "type": "integer",
            "format": "int32"
          },
          "numberOfLessons": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "preferredLocationId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "preferredAddress": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "timeSlots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSlotDto"
            },
            "nullable": true
          }
        }
      },
      "InviteMaterialChoiceGet": {
        "type": "object",
        "properties": {
          "materialId": {
            "type": "string",
            "format": "uuid"
          },
          "material": {
            "$ref": "#/components/schemas/MaterialRef2"
          },
          "alreadyInPossession": {
            "type": "boolean"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInviteMaterialStatus2"
          },
          "deliveryMethod": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialDeliveryMethod"
          },
          "answeredAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "InviteMaterialChoicePost": {
        "type": "object",
        "properties": {
          "materialId": {
            "type": "string",
            "format": "uuid"
          },
          "alreadyInPossession": {
            "type": "boolean"
          },
          "deliveryMethodId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "InvoiceGet": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "invoiceDate": {
            "type": "string",
            "format": "date-time"
          },
          "periodYear": {
            "type": "integer",
            "format": "int32"
          },
          "periodMonth": {
            "type": "integer",
            "format": "int32"
          },
          "dueDate": {
            "type": "string",
            "format": "date-time"
          },
          "invoiceNumber": {
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInvoiceStatus"
          },
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "customer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "lineItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoiceLineItemGet"
            }
          },
          "lastEmailSentDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "totalAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "itemCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "customerDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "InvoiceLineItemGet": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          },
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "lessonIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LessonRef"
            },
            "nullable": true
          },
          "units": {
            "type": "integer",
            "format": "int32"
          },
          "pricePerUnit": {
            "type": "number",
            "format": "double"
          },
          "discountType": {
            "$ref": "#/components/schemas/EnumDtoOfEDiscountType"
          },
          "discountValue": {
            "type": "number",
            "format": "double"
          },
          "amount": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "InvoiceLineItemPost": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string"
          },
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "lessonIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LessonRef"
            },
            "nullable": true
          },
          "units": {
            "type": "integer",
            "format": "int32"
          },
          "pricePerUnit": {
            "type": "number",
            "format": "double"
          },
          "discountTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "discountValue": {
            "type": "number",
            "format": "double"
          },
          "amount": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "InvoicePatch": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "invoiceDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "periodYear": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "periodMonth": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "dueDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "invoiceNumber": {
            "type": "string",
            "nullable": true
          },
          "removeInvoiceNumber": {
            "type": "boolean"
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "customerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "lineItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoiceLineItemPost"
            },
            "nullable": true
          }
        }
      },
      "InvoicePost": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "invoiceDate": {
            "type": "string",
            "format": "date-time"
          },
          "periodYear": {
            "type": "integer",
            "format": "int32"
          },
          "periodMonth": {
            "type": "integer",
            "format": "int32"
          },
          "dueDate": {
            "type": "string",
            "format": "date-time"
          },
          "invoiceNumber": {
            "type": "string"
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          },
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "lineItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvoiceLineItemPost"
            },
            "nullable": true
          }
        }
      },
      "LessonGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "roomId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "room": {
            "$ref": "#/components/schemas/RoomRef"
          },
          "hasOwnRoom": {
            "type": "boolean"
          },
          "durationMinutes": {
            "type": "integer",
            "format": "int32"
          },
          "courseDisplay": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfELessonStatus"
          },
          "teachingSalary": {
            "type": "number",
            "format": "double"
          },
          "travelAllowance": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "isCancelled": {
            "type": "boolean"
          },
          "isInvoiced": {
            "type": "boolean"
          },
          "homeworks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HomeworkGet"
            },
            "nullable": true
          },
          "nextLessonStartDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "grammar": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "attendanceRecords": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AttendanceRecordGet"
            },
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "LessonPatch": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string",
            "nullable": true
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string",
            "nullable": true
          },
          "roomId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeRoom": {
            "type": "boolean"
          },
          "isCancelled": {
            "type": "boolean",
            "nullable": true
          },
          "grammar": {
            "type": "string",
            "nullable": true
          },
          "removeGrammar": {
            "type": "boolean"
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "removeNotes": {
            "type": "boolean"
          },
          "travelAllowance": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "removeTravelAllowance": {
            "type": "boolean"
          },
          "teacherId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "attendanceRecordsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AttendanceRecordPost"
            },
            "nullable": true
          },
          "attendanceRecordsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AttendanceRecordPatchWithId"
            },
            "nullable": true
          },
          "attendanceRecordIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "LessonPost": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "roomId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isCancelled": {
            "type": "boolean"
          },
          "grammar": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "travelAllowance": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "attendanceRecords": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AttendanceRecordPost"
            },
            "nullable": true
          }
        }
      },
      "LessonRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "isCancelled": {
            "type": "boolean"
          },
          "isInvoiced": {
            "type": "boolean"
          },
          "travelAllowance": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "courseDisplay": {
            "type": "string"
          },
          "lessonPrice": {
            "type": "number",
            "format": "double"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfELessonStatus"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "homeworks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HomeworkRef"
            },
            "nullable": true
          }
        }
      },
      "LessonRef2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "startDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "isCancelled": {
            "type": "boolean"
          },
          "isInvoiced": {
            "type": "boolean"
          },
          "travelAllowance": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "courseDisplay": {
            "type": "string"
          },
          "lessonPrice": {
            "type": "number",
            "format": "double"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfELessonStatus"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "homeworks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HomeworkRef"
            },
            "nullable": true
          }
        },
        "nullable": true
      },
      "LocationAddressGet": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string"
          },
          "houseNumber": {
            "type": "string",
            "nullable": true
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "canton": {
            "$ref": "#/components/schemas/EnumDtoOfESwissCanton"
          }
        }
      },
      "LocationAddressPatch": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string",
            "nullable": true
          },
          "houseNumber": {
            "type": "string",
            "nullable": true
          },
          "removeHouseNumber": {
            "type": "boolean"
          },
          "postalCode": {
            "type": "string",
            "nullable": true
          },
          "city": {
            "type": "string",
            "nullable": true
          },
          "cantonId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeCantonId": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "LocationAddressPost": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string"
          },
          "houseNumber": {
            "type": "string",
            "nullable": true
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "cantonId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "LocationGet": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "$ref": "#/components/schemas/LocationAddressGet"
          },
          "addressDisplay": {
            "type": "string",
            "nullable": true
          },
          "arrivalDescription": {
            "type": "string",
            "nullable": true
          },
          "parkingDescription": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "LocationGet2": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "$ref": "#/components/schemas/LocationAddressGet"
          },
          "addressDisplay": {
            "type": "string",
            "nullable": true
          },
          "arrivalDescription": {
            "type": "string",
            "nullable": true
          },
          "parkingDescription": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "LocationPatch": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "removeDescription": {
            "type": "boolean"
          },
          "address": {
            "$ref": "#/components/schemas/LocationAddressPatch"
          },
          "arrivalDescription": {
            "type": "string",
            "nullable": true
          },
          "removeArrivalDescription": {
            "type": "boolean"
          },
          "parkingDescription": {
            "type": "string",
            "nullable": true
          },
          "removeParkingDescription": {
            "type": "boolean"
          }
        }
      },
      "LocationPost": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "$ref": "#/components/schemas/LocationAddressPost"
          },
          "arrivalDescription": {
            "type": "string",
            "nullable": true
          },
          "parkingDescription": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "MaterialGet": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "isbn": {
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialLevel"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialType"
          },
          "citizenship": {
            "type": "boolean"
          },
          "storageAmount": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "MaterialPatch": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "removeDescription": {
            "type": "boolean"
          },
          "isbn": {
            "type": "string",
            "nullable": true
          },
          "languageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "typeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "citizenship": {
            "type": "boolean",
            "nullable": true
          },
          "storageAmount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "MaterialPost": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "isbn": {
            "type": "string"
          },
          "languageId": {
            "type": "string",
            "format": "uuid"
          },
          "levelId": {
            "type": "string",
            "format": "uuid"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "typeId": {
            "type": "string",
            "format": "uuid"
          },
          "citizenship": {
            "type": "boolean"
          },
          "storageAmount": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MaterialRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "isbn": {
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialLevel"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialType"
          }
        }
      },
      "MaterialRef2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "isbn": {
            "type": "string"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialLevel"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialType"
          }
        },
        "nullable": true
      },
      "MiniListDataOfCustomerInactivityItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomerInactivityItem"
            }
          },
          "viewAllUrl": {
            "type": "string",
            "nullable": true
          },
          "maxItems": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MiniListDataOfTeacherAnniversaryItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeacherAnniversaryItem"
            }
          },
          "viewAllUrl": {
            "type": "string",
            "nullable": true
          },
          "maxItems": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MiniListDataOfTeacherBirthdayItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeacherBirthdayItem"
            }
          },
          "viewAllUrl": {
            "type": "string",
            "nullable": true
          },
          "maxItems": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MiniListDataOfUpcomingExamItem": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UpcomingExamItem"
            }
          },
          "viewAllUrl": {
            "type": "string",
            "nullable": true
          },
          "maxItems": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "MonthlyHoursOverview": {
        "type": "object",
        "properties": {
          "month": {
            "type": "string",
            "format": "date-time"
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32"
          },
          "billableHours": {
            "type": "number",
            "format": "double"
          },
          "billableAmount": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "NotificationGet": {
        "type": "object",
        "properties": {
          "recipientCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "recipientCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "recipientStudentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "recipientStudent": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "relatedStudentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "relatedStudent": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "relatedCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "relatedCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "date": {
            "type": "string",
            "format": "date-time"
          },
          "message": {
            "type": "string"
          },
          "eventDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "isRead": {
            "type": "boolean"
          },
          "targetId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "targetUrl": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/EnumDtoOfENotificationType"
          },
          "key": {
            "$ref": "#/components/schemas/EnumDtoOfENotificationKey"
          },
          "recipientDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "NotificationPatch": {
        "type": "object",
        "properties": {
          "recipientCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "recipientStudentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "relatedStudentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "relatedCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "eventDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "isRead": {
            "type": "boolean",
            "nullable": true
          },
          "targetId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "typeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "keyId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "NotificationPost": {
        "type": "object",
        "properties": {
          "recipientCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "recipientStudentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "relatedStudentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "relatedCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date-time"
          },
          "isRead": {
            "type": "boolean"
          },
          "targetId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "eventDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "typeId": {
            "type": "string",
            "format": "uuid"
          },
          "keyId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "NotificationTriggerGet": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "NotificationTriggerRunGet": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "changes": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "NullableOfDayOfWeek": {
        "type": "integer",
        "nullable": true
      },
      "NullableOfEAccountStatus": {
        "type": "integer"
      },
      "NullableOfEStudentStatus": {
        "type": "integer"
      },
      "NullableOfETeachingLevel": {
        "type": "integer"
      },
      "OfficeDashboardGet": {
        "type": "object",
        "properties": {
          "upcomingBirthdays": {
            "$ref": "#/components/schemas/MiniListDataOfTeacherBirthdayItem"
          },
          "upcomingAnniversaries": {
            "$ref": "#/components/schemas/MiniListDataOfTeacherAnniversaryItem"
          },
          "upcomingExams": {
            "$ref": "#/components/schemas/MiniListDataOfUpcomingExamItem"
          },
          "currentMonthHours": {
            "$ref": "#/components/schemas/MonthlyHoursOverview"
          },
          "inactiveCustomers": {
            "$ref": "#/components/schemas/MiniListDataOfCustomerInactivityItem"
          }
        }
      },
      "OrderGet": {
        "type": "object",
        "properties": {
          "createdDate": {
            "type": "string",
            "format": "date-time"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEOrderStatus"
          },
          "isPaid": {
            "type": "boolean"
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "courseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "billedSeparately": {
            "type": "boolean"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderItemDto"
            }
          },
          "studentDisplay": {
            "type": "string",
            "nullable": true
          },
          "customerDisplay": {
            "type": "string",
            "nullable": true
          },
          "itemCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "totalCost": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "courseDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "OrderItemDto": {
        "type": "object",
        "properties": {
          "materialId": {
            "type": "string",
            "format": "uuid"
          },
          "material": {
            "$ref": "#/components/schemas/MaterialRef2"
          },
          "unitPrice": {
            "type": "number",
            "format": "double"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInviteMaterialStatus"
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "deliveryMethod": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialDeliveryMethod"
          },
          "deliveryMethodId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "OrderPatch": {
        "type": "object",
        "properties": {
          "createdDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "courseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "billedSeparately": {
            "type": "boolean",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "removeComment": {
            "type": "boolean"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderItemDto"
            },
            "nullable": true
          }
        }
      },
      "OrderPost": {
        "type": "object",
        "properties": {
          "createdDate": {
            "type": "string",
            "format": "date-time"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          },
          "courseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "billedSeparately": {
            "type": "boolean"
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderItemDto"
            },
            "nullable": true
          }
        }
      },
      "PackageGet": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "billingTitle": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "credit": {
            "type": "number",
            "format": "double"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "PackageGet2": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "billingTitle": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "credit": {
            "type": "number",
            "format": "double"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        },
        "nullable": true
      },
      "PackageOrderGet": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEPackageOrderStatus"
          },
          "paidAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "refundRequestedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "refundedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "refundReason": {
            "type": "string",
            "nullable": true
          },
          "packageId": {
            "type": "string",
            "format": "uuid"
          },
          "packageRef": {
            "$ref": "#/components/schemas/PackageGet2"
          },
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "customerRef": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "assignedToCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "assignedToCustomer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "assignedToCustomerEmail": {
            "type": "string",
            "nullable": true
          },
          "passedOnType": {
            "$ref": "#/components/schemas/EnumDtoOfEPackageAssignment"
          },
          "usageByStudent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PackageStudentUsageDto"
            }
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "customerName": {
            "type": "string",
            "nullable": true
          },
          "usedCredit": {
            "type": "number",
            "format": "double"
          },
          "purchasedPrice": {
            "type": "number",
            "format": "double"
          },
          "purchasedCredit": {
            "type": "number",
            "format": "double"
          },
          "remainingCredit": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "PackageOrderPatch": {
        "type": "object",
        "properties": {
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "refundReason": {
            "type": "string",
            "nullable": true
          },
          "paidAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "passedOnTypeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "assignedToCustomerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeAssignedToCustomerId": {
            "type": "boolean"
          },
          "assignedToCustomerEmail": {
            "type": "string",
            "nullable": true
          },
          "removeAssignedToCustomerEmail": {
            "type": "boolean"
          }
        }
      },
      "PackagePatch": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "nullable": true
          },
          "billingTitle": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "credit": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        }
      },
      "PackagePost": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "billingTitle": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "credit": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "PackagePurchaseGet": {
        "type": "object",
        "properties": {
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "customerRef": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "purchasedAt": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEPackagePurchaseStatus"
          },
          "invoiceId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "orders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PackageOrderGet"
            }
          },
          "customerName": {
            "type": "string",
            "nullable": true
          },
          "itemCount": {
            "type": "integer",
            "format": "int32"
          },
          "totalPrice": {
            "type": "number",
            "format": "double"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "PackagePurchaseItemPost": {
        "type": "object",
        "properties": {
          "packageId": {
            "type": "string",
            "format": "uuid"
          },
          "beneficiaryCustomerEmail": {
            "type": "string",
            "nullable": true
          },
          "passedOnTypeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "PackagePurchasePatch": {
        "type": "object",
        "properties": {
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "PackagePurchasePost": {
        "type": "object",
        "properties": {
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PackagePurchaseItemPost"
            }
          }
        }
      },
      "PackageStudentUsageDto": {
        "type": "object",
        "properties": {
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "usedCredit": {
            "type": "number",
            "format": "double"
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "PaymentLineItemGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "lessonIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LessonRef"
            },
            "nullable": true
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32"
          },
          "rate": {
            "type": "number",
            "format": "double"
          },
          "lineTotal": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "PaymentLineItemPatch": {
        "type": "object",
        "properties": {
          "lessonIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "rate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "lineTotal": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        }
      },
      "PaymentLineItemPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/PaymentLineItemPatch"
          }
        }
      },
      "PaymentLineItemPost": {
        "type": "object",
        "properties": {
          "lessonIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32"
          },
          "rate": {
            "type": "number",
            "format": "double"
          },
          "lineTotal": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "PriceActivationResult": {
        "required": [
          "coursePrices",
          "teacherSalaries",
          "courses",
          "normalised"
        ],
        "type": "object",
        "properties": {
          "coursePrices": {
            "type": "integer",
            "format": "int32"
          },
          "teacherSalaries": {
            "type": "integer",
            "format": "int32"
          },
          "courses": {
            "type": "integer",
            "format": "int32"
          },
          "normalised": {
            "type": "integer",
            "format": "int32"
          },
          "total": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "PriceVersionGet": {
        "type": "object",
        "properties": {
          "ownerId": {
            "type": "string",
            "format": "uuid"
          },
          "amount": {
            "type": "number",
            "format": "double"
          },
          "validFrom": {
            "type": "string",
            "format": "date-time"
          },
          "validUntil": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "isCurrent": {
            "type": "boolean"
          },
          "isScheduled": {
            "type": "boolean"
          },
          "changedByName": {
            "type": "string",
            "nullable": true
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "RoomGet": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "sizeInSquareMeters": {
            "type": "number",
            "format": "double"
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfERoomStatus"
          },
          "locationId": {
            "type": "string",
            "format": "uuid"
          },
          "location": {
            "$ref": "#/components/schemas/LocationGet2"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "RoomPatch": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "sizeInSquareMeters": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "locationId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "RoomPost": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "sizeInSquareMeters": {
            "type": "number",
            "format": "double"
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32"
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          },
          "locationId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "RoomRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "maxStudents": {
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfERoomStatus"
          }
        },
        "nullable": true
      },
      "SetPasswordPost": {
        "type": "object",
        "properties": {
          "password": {
            "type": "string"
          }
        }
      },
      "SpokenLanguageGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          }
        }
      },
      "SpokenLanguagePatch": {
        "type": "object",
        "properties": {
          "languageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "SpokenLanguagePatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/SpokenLanguagePatch"
          }
        }
      },
      "SpokenLanguagePost": {
        "type": "object",
        "properties": {
          "languageId": {
            "type": "string",
            "format": "uuid"
          },
          "levelId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "StudentGet": {
        "type": "object",
        "properties": {
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "customer": {
            "$ref": "#/components/schemas/CustomerRef"
          },
          "lastName": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "birthdate": {
            "type": "string",
            "format": "date-time"
          },
          "joinDate": {
            "type": "string",
            "format": "date-time"
          },
          "nativeLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "gender": {
            "$ref": "#/components/schemas/EnumDtoOfEGender2"
          },
          "correspondenceLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage2"
          },
          "preferredTeachingFormat": {
            "$ref": "#/components/schemas/EnumDtoOfEPreferredTeachingFormat"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEStudentStatus"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "accountStatus": {
            "$ref": "#/components/schemas/EnumDtoOfEAccountStatus"
          },
          "loginNumber": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "useCustomerAddress": {
            "type": "boolean"
          },
          "address": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "subjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubjectGet"
            }
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "courseIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "courses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CourseRef2"
            },
            "nullable": true
          },
          "lessonIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LessonRef"
            },
            "nullable": true
          },
          "materialIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "materials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MaterialRef"
            },
            "nullable": true
          },
          "studentNotes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentNoteGet"
            },
            "nullable": true
          },
          "examRecords": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExamRecordGet"
            },
            "nullable": true
          },
          "age": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isChild": {
            "type": "boolean",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "customerDisplay": {
            "type": "string",
            "nullable": true
          },
          "contactDisplay": {
            "type": "string",
            "nullable": true
          },
          "subjectsDisplay": {
            "type": "string",
            "nullable": true
          },
          "courseCount": {
            "type": "integer",
            "format": "int32"
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32"
          },
          "materialCount": {
            "type": "integer",
            "format": "int32"
          },
          "noteCount": {
            "type": "integer",
            "format": "int32"
          },
          "examRecordCount": {
            "type": "integer",
            "format": "int32"
          },
          "currentLevelsDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "StudentInviteGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "student": {
            "$ref": "#/components/schemas/StudentRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInviteStatus"
          },
          "invitedAt": {
            "type": "string",
            "format": "date-time"
          },
          "respondedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "materialChoices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InviteMaterialChoiceGet"
            }
          },
          "deliveryMethod": {
            "$ref": "#/components/schemas/EnumDtoOfEMaterialDeliveryMethod"
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "acceptedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "declinedDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "isPending": {
            "type": "boolean"
          },
          "materialListComplete": {
            "type": "boolean"
          },
          "courseInfo": {
            "type": "string",
            "nullable": true
          },
          "scheduleInfo": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "StudentInvitePatch": {
        "type": "object",
        "properties": {
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "respondedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "materialChoices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InviteMaterialChoicePost"
            },
            "nullable": true
          },
          "deliveryMethodId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "deliveryAddress": {
            "$ref": "#/components/schemas/AddressInfoDto"
          }
        }
      },
      "StudentInvitePost": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "StudentNoteGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "authorName": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "text": {
            "type": "string"
          }
        }
      },
      "StudentNotePost": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        }
      },
      "StudentPatch": {
        "type": "object",
        "properties": {
          "customerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "birthdate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "joinDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "nativeLanguageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "genderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeGender": {
            "type": "boolean"
          },
          "correspondenceLanguageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removeCorrespondenceLanguage": {
            "type": "boolean"
          },
          "preferredTeachingFormatId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "removePreferredTeachingFormat": {
            "type": "boolean"
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "removeEmail": {
            "type": "boolean"
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "removePhone": {
            "type": "boolean"
          },
          "useCustomerAddress": {
            "type": "boolean",
            "nullable": true
          },
          "address": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "removeAddress": {
            "type": "boolean"
          },
          "subjectsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubjectPost"
            },
            "nullable": true
          },
          "subjectsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubjectPatchWithId"
            },
            "nullable": true
          },
          "subjectIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "removeNotes": {
            "type": "boolean"
          },
          "studentNotesToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StudentNotePost"
            },
            "nullable": true
          },
          "studentNoteIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "examRecordsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExamRecordPost"
            },
            "nullable": true
          },
          "examRecordsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExamRecordPatchWithId"
            },
            "nullable": true
          },
          "examRecordIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "StudentPost": {
        "type": "object",
        "properties": {
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "lastName": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "birthdate": {
            "type": "string",
            "format": "date-time"
          },
          "joinDate": {
            "type": "string",
            "format": "date-time"
          },
          "nativeLanguageId": {
            "type": "string",
            "format": "uuid"
          },
          "genderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "correspondenceLanguageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "preferredTeachingFormatId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "useCustomerAddress": {
            "type": "boolean"
          },
          "address": {
            "$ref": "#/components/schemas/AddressInfoDto"
          },
          "subjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubjectPost"
            },
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "StudentRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "nativeLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "isChild": {
            "type": "boolean",
            "nullable": true
          },
          "age": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "nullable": true
      },
      "StudentRef2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "displayName": {
            "type": "string"
          },
          "nativeLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "isChild": {
            "type": "boolean",
            "nullable": true
          },
          "age": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "SubjectGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          }
        }
      },
      "SubjectPatch": {
        "type": "object",
        "properties": {
          "languageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "SubjectPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/SubjectPatch"
          }
        }
      },
      "SubjectPost": {
        "type": "object",
        "properties": {
          "languageId": {
            "type": "string",
            "format": "uuid"
          },
          "levelId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "TeacherAnniversaryItem": {
        "type": "object",
        "properties": {
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "joinDate": {
            "type": "string",
            "format": "date-time"
          },
          "years": {
            "type": "integer",
            "format": "int32"
          },
          "daysUntil": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "TeacherApplicationGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "teacherRef": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "proposedTimeSlots": {
            "type": "array",
            "items": { }
          },
          "appliedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TeacherApplicationPost": {
        "type": "object",
        "properties": {
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "proposedTimeSlots": {
            "type": "array",
            "items": { }
          }
        }
      },
      "TeacherBirthdayItem": {
        "type": "object",
        "properties": {
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "birthDate": {
            "type": "string",
            "format": "date-time"
          },
          "daysUntil": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "TeacherGet": {
        "type": "object",
        "properties": {
          "gender": {
            "$ref": "#/components/schemas/EnumDtoOfEGender"
          },
          "birthDate": {
            "type": "string",
            "format": "date-time"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "accountStatus": {
            "$ref": "#/components/schemas/EnumDtoOfEAccountStatus"
          },
          "loginNumber": {
            "type": "string",
            "nullable": true
          },
          "privateEmail": {
            "type": "string",
            "nullable": true
          },
          "mobilePhone": {
            "type": "string"
          },
          "landlinePhone": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string"
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "countryCode": {
            "$ref": "#/components/schemas/EnumDtoOfECountryCode"
          },
          "joinDate": {
            "type": "string",
            "format": "date-time"
          },
          "leftSoftLandingDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "inactive": {
            "type": "boolean"
          },
          "nationality": {
            "type": "string",
            "nullable": true
          },
          "civilStatus": {
            "$ref": "#/components/schemas/EnumDtoOfECivilStatus"
          },
          "ahvNumber": {
            "type": "string"
          },
          "quellensteuer": {
            "type": "boolean"
          },
          "quellensteuerFreibetrag": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ahv": {
            "type": "boolean"
          },
          "alv": {
            "type": "boolean"
          },
          "nbu": {
            "type": "boolean"
          },
          "ktg": {
            "type": "boolean"
          },
          "bvg": {
            "type": "boolean"
          },
          "bvgDeductionAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "flatSalary": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "iban": {
            "type": "string"
          },
          "accountHolder": {
            "type": "string",
            "nullable": true
          },
          "lessonsToChildren": {
            "type": "boolean"
          },
          "challengingStudents": {
            "type": "boolean"
          },
          "einbuergerungsprogramm": {
            "type": "boolean"
          },
          "testPreparation": {
            "type": "boolean"
          },
          "teachingLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeachingLanguageGet"
            }
          },
          "teachingLanguagesDisplay": {
            "type": "string",
            "nullable": true
          },
          "spokenLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpokenLanguageGet"
            }
          },
          "spokenLanguagesDisplay": {
            "type": "string",
            "nullable": true
          },
          "hasChildren": {
            "type": "boolean"
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChildInfoGet"
            }
          },
          "weeklyTimeSlots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyTimeSlotGet"
            }
          },
          "absencePeriods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AbsencePeriodGet"
            }
          },
          "completedTrainings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompletedTrainingGet"
            }
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "TeacherInviteGet": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "course": {
            "$ref": "#/components/schemas/CourseRef"
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "status": {
            "$ref": "#/components/schemas/EnumDtoOfEInviteStatus"
          },
          "invitedAt": {
            "type": "string",
            "format": "date-time"
          },
          "respondedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "isPending": {
            "type": "boolean"
          },
          "courseInfo": {
            "type": "string",
            "nullable": true
          },
          "scheduleInfo": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "TeacherInvitePatch": {
        "type": "object",
        "properties": {
          "statusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "respondedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "TeacherInvitePost": {
        "type": "object",
        "properties": {
          "courseId": {
            "type": "string",
            "format": "uuid"
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "statusId": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "TeacherNoteGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "teacherName": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "text": {
            "type": "string"
          }
        }
      },
      "TeacherNotePost": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        }
      },
      "TeacherPatch": {
        "type": "object",
        "properties": {
          "genderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "birthDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "privateEmail": {
            "type": "string",
            "nullable": true
          },
          "removePrivateEmail": {
            "type": "boolean"
          },
          "mobilePhone": {
            "type": "string",
            "nullable": true
          },
          "landlinePhone": {
            "type": "string",
            "nullable": true
          },
          "removeLandlinePhone": {
            "type": "boolean"
          },
          "address": {
            "type": "string",
            "nullable": true
          },
          "postalCode": {
            "type": "string",
            "nullable": true
          },
          "city": {
            "type": "string",
            "nullable": true
          },
          "countryCodeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "joinDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "leftSoftLandingDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "removeLeftSoftLandingDate": {
            "type": "boolean"
          },
          "inactive": {
            "type": "boolean",
            "nullable": true
          },
          "nationality": {
            "type": "string",
            "nullable": true
          },
          "removeNationality": {
            "type": "boolean"
          },
          "civilStatusId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "ahvNumber": {
            "type": "string",
            "nullable": true
          },
          "quellensteuer": {
            "type": "boolean",
            "nullable": true
          },
          "quellensteuerFreibetrag": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "removeQuellensteuerFreibetrag": {
            "type": "boolean"
          },
          "ahv": {
            "type": "boolean",
            "nullable": true
          },
          "alv": {
            "type": "boolean",
            "nullable": true
          },
          "nbu": {
            "type": "boolean",
            "nullable": true
          },
          "ktg": {
            "type": "boolean",
            "nullable": true
          },
          "bvg": {
            "type": "boolean",
            "nullable": true
          },
          "bvgDeductionAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "removeBvgDeductionAmount": {
            "type": "boolean"
          },
          "flatSalary": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "removeFlatSalary": {
            "type": "boolean"
          },
          "iban": {
            "type": "string",
            "nullable": true
          },
          "accountHolder": {
            "type": "string",
            "nullable": true
          },
          "removeAccountHolder": {
            "type": "boolean"
          },
          "lessonsToChildren": {
            "type": "boolean",
            "nullable": true
          },
          "challengingStudents": {
            "type": "boolean",
            "nullable": true
          },
          "einbuergerungsprogramm": {
            "type": "boolean",
            "nullable": true
          },
          "testPreparation": {
            "type": "boolean",
            "nullable": true
          },
          "teachingLanguagesToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeachingLanguagePost"
            },
            "nullable": true
          },
          "teachingLanguagesToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeachingLanguagePatchWithId"
            },
            "nullable": true
          },
          "teachingLanguageIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "spokenLanguagesToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpokenLanguagePost"
            },
            "nullable": true
          },
          "spokenLanguagesToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpokenLanguagePatchWithId"
            },
            "nullable": true
          },
          "spokenLanguageIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "childrenToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChildInfoPost"
            },
            "nullable": true
          },
          "childrenToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChildInfoPatchWithId"
            },
            "nullable": true
          },
          "childIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "weeklyTimeSlotsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyTimeSlotPost"
            },
            "nullable": true
          },
          "weeklyTimeSlotsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyTimeSlotPatchWithId"
            },
            "nullable": true
          },
          "weeklyTimeSlotIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "absencePeriodsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AbsencePeriodPost"
            },
            "nullable": true
          },
          "absencePeriodsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AbsencePeriodPatchWithId"
            },
            "nullable": true
          },
          "absencePeriodIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "completedTrainingsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompletedTrainingPost"
            },
            "nullable": true
          },
          "completedTrainingsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompletedTrainingPatchWithId"
            },
            "nullable": true
          },
          "completedTrainingIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "TeacherPaymentGet": {
        "type": "object",
        "properties": {
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "teacher": {
            "$ref": "#/components/schemas/TeacherRef"
          },
          "teacherDisplayName": {
            "type": "string",
            "nullable": true
          },
          "paymentMonth": {
            "type": "string",
            "format": "date-time"
          },
          "totalLessons": {
            "type": "integer",
            "format": "int32"
          },
          "lineItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentLineItemGet"
            }
          },
          "basePay": {
            "type": "number",
            "format": "double"
          },
          "vacationSupplementRate": {
            "type": "number",
            "format": "double"
          },
          "vacationSupplementAmount": {
            "type": "number",
            "format": "double"
          },
          "grossPay": {
            "type": "number",
            "format": "double"
          },
          "ahvRate": {
            "type": "number",
            "format": "double"
          },
          "ahvAmount": {
            "type": "number",
            "format": "double"
          },
          "alvRate": {
            "type": "number",
            "format": "double"
          },
          "alvAmount": {
            "type": "number",
            "format": "double"
          },
          "ktgRate": {
            "type": "number",
            "format": "double"
          },
          "ktgAmount": {
            "type": "number",
            "format": "double"
          },
          "nbuRate": {
            "type": "number",
            "format": "double"
          },
          "nbuAmount": {
            "type": "number",
            "format": "double"
          },
          "netPay": {
            "type": "number",
            "format": "double"
          },
          "travelExpenses": {
            "type": "number",
            "format": "double"
          },
          "actualPay": {
            "type": "number",
            "format": "double"
          },
          "childEntitlement": {
            "type": "number",
            "format": "double"
          },
          "childEntitlementFromConfig": {
            "type": "number",
            "format": "double"
          },
          "childEntitlementComment": {
            "type": "string",
            "nullable": true
          },
          "isChildEntitlementOverridden": {
            "type": "boolean"
          },
          "hasAdditionalTravelCostWarning": {
            "type": "boolean"
          },
          "hasPensionWarning": {
            "type": "boolean"
          },
          "hasQuellensteuerWarning": {
            "type": "boolean"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "TeacherPaymentPatch": {
        "type": "object",
        "properties": {
          "teacherId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "paymentMonth": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "totalLessons": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lineItemsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentLineItemPost"
            },
            "nullable": true
          },
          "lineItemsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentLineItemPatchWithId"
            },
            "nullable": true
          },
          "lineItemIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "basePay": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "vacationSupplementRate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "vacationSupplementAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "grossPay": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ahvRate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ahvAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "alvRate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "alvAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ktgRate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ktgAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "nbuRate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "nbuAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "netPay": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "travelExpenses": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "actualPay": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "childEntitlement": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "childEntitlementComment": {
            "type": "string",
            "nullable": true
          },
          "removeChildEntitlementComment": {
            "type": "boolean"
          },
          "resetChildEntitlementToConfig": {
            "type": "boolean"
          }
        }
      },
      "TeacherPaymentPost": {
        "type": "object",
        "properties": {
          "teacherId": {
            "type": "string",
            "format": "uuid"
          },
          "paymentMonth": {
            "type": "string",
            "format": "date-time"
          },
          "totalLessons": {
            "type": "integer",
            "format": "int32"
          },
          "lineItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentLineItemPost"
            },
            "nullable": true
          },
          "basePay": {
            "type": "number",
            "format": "double"
          },
          "vacationSupplementRate": {
            "type": "number",
            "format": "double"
          },
          "vacationSupplementAmount": {
            "type": "number",
            "format": "double"
          },
          "grossPay": {
            "type": "number",
            "format": "double"
          },
          "ahvRate": {
            "type": "number",
            "format": "double"
          },
          "ahvAmount": {
            "type": "number",
            "format": "double"
          },
          "alvRate": {
            "type": "number",
            "format": "double"
          },
          "alvAmount": {
            "type": "number",
            "format": "double"
          },
          "ktgRate": {
            "type": "number",
            "format": "double"
          },
          "ktgAmount": {
            "type": "number",
            "format": "double"
          },
          "nbuRate": {
            "type": "number",
            "format": "double"
          },
          "nbuAmount": {
            "type": "number",
            "format": "double"
          },
          "netPay": {
            "type": "number",
            "format": "double"
          },
          "travelExpenses": {
            "type": "number",
            "format": "double"
          },
          "actualPay": {
            "type": "number",
            "format": "double"
          },
          "childEntitlement": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "childEntitlementComment": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "TeacherPost": {
        "type": "object",
        "properties": {
          "genderId": {
            "type": "string",
            "format": "uuid"
          },
          "birthDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "privateEmail": {
            "type": "string",
            "nullable": true
          },
          "mobilePhone": {
            "type": "string"
          },
          "landlinePhone": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string"
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "countryCodeId": {
            "type": "string",
            "format": "uuid"
          },
          "joinDate": {
            "type": "string",
            "format": "date-time"
          },
          "nationality": {
            "type": "string",
            "nullable": true
          },
          "civilStatusId": {
            "type": "string",
            "format": "uuid"
          },
          "ahvNumber": {
            "type": "string"
          },
          "quellensteuer": {
            "type": "boolean"
          },
          "quellensteuerFreibetrag": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "ahv": {
            "type": "boolean"
          },
          "alv": {
            "type": "boolean"
          },
          "nbu": {
            "type": "boolean"
          },
          "ktg": {
            "type": "boolean"
          },
          "bvg": {
            "type": "boolean"
          },
          "bvgDeductionAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "flatSalary": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "iban": {
            "type": "string"
          },
          "accountHolder": {
            "type": "string",
            "nullable": true
          },
          "lessonsToChildren": {
            "type": "boolean"
          },
          "challengingStudents": {
            "type": "boolean"
          },
          "einbuergerungsprogramm": {
            "type": "boolean"
          },
          "testPreparation": {
            "type": "boolean"
          },
          "teachingLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeachingLanguagePost"
            }
          },
          "spokenLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpokenLanguagePost"
            }
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChildInfoPost"
            }
          },
          "weeklyTimeSlots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyTimeSlotPost"
            }
          },
          "absencePeriods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AbsencePeriodPost"
            }
          },
          "completedTrainings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompletedTrainingPost"
            }
          }
        }
      },
      "TeacherProfileGet": {
        "type": "object",
        "properties": {
          "gender": {
            "$ref": "#/components/schemas/EnumDtoOfEGender"
          },
          "birthDate": {
            "type": "string",
            "format": "date-time"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "privateEmail": {
            "type": "string",
            "nullable": true
          },
          "mobilePhone": {
            "type": "string"
          },
          "landlinePhone": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string"
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "countryCode": {
            "$ref": "#/components/schemas/EnumDtoOfECountryCode"
          },
          "lessonsToChildren": {
            "type": "boolean"
          },
          "challengingStudents": {
            "type": "boolean"
          },
          "teachingLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeachingLanguageGet"
            }
          },
          "spokenLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpokenLanguageGet"
            }
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChildInfoGet"
            }
          },
          "weeklyTimeSlots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WeeklyTimeSlotGet"
            }
          },
          "absencePeriods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AbsencePeriodGet"
            }
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "hasChildren": {
            "type": "boolean"
          },
          "teachingLanguagesDisplay": {
            "type": "string",
            "nullable": true
          },
          "spokenLanguagesDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "TeacherRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "mobilePhone": {
            "type": "string"
          },
          "lessonsToChildren": {
            "type": "boolean"
          },
          "inactive": {
            "type": "boolean"
          },
          "teachingLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnumDtoOfELanguage"
            }
          }
        },
        "nullable": true
      },
      "TeacherRef2": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "displayName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "mobilePhone": {
            "type": "string"
          },
          "lessonsToChildren": {
            "type": "boolean"
          },
          "inactive": {
            "type": "boolean"
          },
          "teachingLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnumDtoOfELanguage"
            }
          }
        }
      },
      "TeacherSalaryGet": {
        "type": "object",
        "properties": {
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "courseType": {
            "$ref": "#/components/schemas/EnumDtoOfECourseType"
          },
          "isForChildren": {
            "type": "boolean"
          },
          "hourlyRate": {
            "type": "number",
            "format": "double"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "productName": {
            "type": "string",
            "nullable": true
          },
          "isCustomProduct": {
            "type": "boolean"
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pendingChangeFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "pendingChangeAmount": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "TeacherSalaryPatch": {
        "type": "object",
        "properties": {
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "courseTypeId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isForChildren": {
            "type": "boolean",
            "nullable": true
          },
          "hourlyRate": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "removeDescription": {
            "type": "boolean"
          },
          "productName": {
            "type": "string",
            "nullable": true
          },
          "removeProductName": {
            "type": "boolean"
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "confirmRetroactive": {
            "type": "boolean"
          },
          "changeReason": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "TeacherSalaryPost": {
        "type": "object",
        "properties": {
          "levelId": {
            "type": "string",
            "format": "uuid"
          },
          "courseTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "isForChildren": {
            "type": "boolean"
          },
          "hourlyRate": {
            "type": "number",
            "format": "double"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "productName": {
            "type": "string",
            "nullable": true
          },
          "effectiveFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "confirmRetroactive": {
            "type": "boolean"
          },
          "changeReason": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "TeacherStudentGet": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "age": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "isChild": {
            "type": "boolean",
            "nullable": true
          },
          "nativeLanguage": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "subjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubjectGet"
            }
          },
          "customerId": {
            "type": "string",
            "format": "uuid"
          },
          "customerDisplayName": {
            "type": "string"
          },
          "customerType": {
            "$ref": "#/components/schemas/EnumDtoOfECustomerType"
          },
          "customerEmail": {
            "type": "string",
            "nullable": true
          },
          "customerPhone": {
            "type": "string",
            "nullable": true
          },
          "customerStreet": {
            "type": "string",
            "nullable": true
          },
          "customerPostalCode": {
            "type": "string",
            "nullable": true
          },
          "customerCity": {
            "type": "string",
            "nullable": true
          },
          "customerCountry": {
            "type": "string",
            "nullable": true
          },
          "courses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CourseRef2"
            },
            "nullable": true
          },
          "lessons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LessonRef"
            },
            "nullable": true
          },
          "materials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MaterialRef"
            },
            "nullable": true
          },
          "teacherNotes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeacherNoteGet"
            },
            "nullable": true
          },
          "examRecords": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExamRecordGet"
            },
            "nullable": true
          },
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "subjectsDisplay": {
            "type": "string",
            "nullable": true
          },
          "contactDisplay": {
            "type": "string",
            "nullable": true
          },
          "customerAddressDisplay": {
            "type": "string",
            "nullable": true
          },
          "courseCount": {
            "type": "integer",
            "format": "int32"
          },
          "lessonCount": {
            "type": "integer",
            "format": "int32"
          },
          "materialCount": {
            "type": "integer",
            "format": "int32"
          },
          "noteCount": {
            "type": "integer",
            "format": "int32"
          },
          "examRecordCount": {
            "type": "integer",
            "format": "int32"
          },
          "currentLevelsDisplay": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "TeacherStudentPatch": {
        "type": "object",
        "properties": {
          "teacherNotesToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TeacherNotePost"
            },
            "nullable": true
          },
          "teacherNoteIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "examRecordsToAdd": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExamRecordPost"
            },
            "nullable": true
          },
          "examRecordsToUpdate": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExamRecordPatchWithId"
            },
            "nullable": true
          },
          "examRecordIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "TeacherStudentPost": {
        "type": "object"
      },
      "TeachingLanguageGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "language": {
            "$ref": "#/components/schemas/EnumDtoOfELanguage"
          },
          "level": {
            "$ref": "#/components/schemas/EnumDtoOfETeachingLevel"
          },
          "testPreparations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnumDtoOfETest"
            }
          },
          "testExaminers": {
            "type": "array",
            "items": { }
          }
        }
      },
      "TeachingLanguagePatch": {
        "type": "object",
        "properties": {
          "languageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "levelId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "testPreparationIdsToAdd": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "testPreparationIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "testExaminerIdsToAdd": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "testExaminerIdsToRemove": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        }
      },
      "TeachingLanguagePatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/TeachingLanguagePatch"
          }
        }
      },
      "TeachingLanguagePost": {
        "type": "object",
        "properties": {
          "languageId": {
            "type": "string",
            "format": "uuid"
          },
          "levelId": {
            "type": "string",
            "format": "uuid"
          },
          "testPreparationIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "testExaminerIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        }
      },
      "TimeSlotDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "day": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          }
        }
      },
      "TimeSlotPatch": {
        "type": "object",
        "properties": {
          "day": {
            "$ref": "#/components/schemas/NullableOfDayOfWeek"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string",
            "nullable": true
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string",
            "nullable": true
          }
        }
      },
      "TimeSlotPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/TimeSlotPatch"
          }
        }
      },
      "TrainingCourseGet": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "points": {
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "removed": {
            "type": "boolean"
          }
        }
      },
      "TrainingCoursePatch": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "points": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "TrainingCoursePost": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "points": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "TrainingCourseRef": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "points": {
            "type": "integer",
            "format": "int32"
          }
        },
        "nullable": true
      },
      "UpcomingExamItem": {
        "type": "object",
        "properties": {
          "studentId": {
            "type": "string",
            "format": "uuid"
          },
          "studentName": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "examDate": {
            "type": "string",
            "format": "date-time"
          },
          "daysUntil": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "UploadedDocument": {
        "required": [
          "id",
          "fileName",
          "sizeBytes"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "fileName": {
            "type": "string"
          },
          "sizeBytes": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "WeeklyScheduleSlotDto": {
        "type": "object",
        "properties": {
          "day": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          }
        }
      },
      "WeeklyTimeSlotGet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "dayOfWeek": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          }
        }
      },
      "WeeklyTimeSlotPatch": {
        "type": "object",
        "properties": {
          "dayOfWeek": {
            "$ref": "#/components/schemas/NullableOfDayOfWeek"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string",
            "nullable": true
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string",
            "nullable": true
          }
        }
      },
      "WeeklyTimeSlotPatchWithId": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "patch": {
            "$ref": "#/components/schemas/WeeklyTimeSlotPatch"
          }
        }
      },
      "WeeklyTimeSlotPost": {
        "type": "object",
        "properties": {
          "dayOfWeek": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "startTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          },
          "endTime": {
            "pattern": "^-?(\\d+\\.)?\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,7})?$",
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "keycloak": {
        "type": "oauth2",
        "description": "Log in via Keycloak (Authorization Code + PKCE). Uses the public 'swagger-ui' client.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://auth.triskela.com/realms/softlanding/protocol/openid-connect/auth",
            "tokenUrl": "https://auth.triskela.com/realms/softlanding/protocol/openid-connect/token",
            "scopes": {
              "openid": "OpenID Connect",
              "profile": "User profile",
              "email": "User email"
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "keycloak": [
        "openid",
        "profile",
        "email"
      ]
    }
  ],
  "tags": [
    {
      "name": "Teacher (Office)"
    },
    {
      "name": "Location (Office)"
    },
    {
      "name": "Room (Office)"
    },
    {
      "name": "Material (Office)"
    },
    {
      "name": "TrainingCourse (Office)"
    },
    {
      "name": "Lesson (Office)"
    },
    {
      "name": "AttendanceDocument (Office)"
    },
    {
      "name": "Course (Office)"
    },
    {
      "name": "CoursePrice (Office)"
    },
    {
      "name": "PriceKeys (Office)"
    },
    {
      "name": "Order (Office)"
    },
    {
      "name": "Package (Office)"
    },
    {
      "name": "PackageOrder (Office)"
    },
    {
      "name": "PackagePurchase (Office)"
    },
    {
      "name": "Student (Office)"
    },
    {
      "name": "Interest (Office)"
    },
    {
      "name": "MatchingInterest (Office)"
    },
    {
      "name": "EnrollmentRequest (Office)"
    },
    {
      "name": "Customer (Office)"
    },
    {
      "name": "Invoice (Office)"
    },
    {
      "name": "Budget (Office)"
    },
    {
      "name": "StudentInvite (Office)"
    },
    {
      "name": "TeacherInvite (Office)"
    },
    {
      "name": "TeacherSalary (Office)"
    },
    {
      "name": "TeacherPayment (Office)"
    },
    {
      "name": "TeacherStudent (Office)"
    },
    {
      "name": "Homework (Office)"
    },
    {
      "name": "Dashboard (Office)"
    },
    {
      "name": "Notification (Office)"
    },
    {
      "name": "Notification triggers (Office)"
    },
    {
      "name": "TeacherProfile (Office)"
    }
  ]
}